C - 在 Solaris 的内核模块代码中以 PFILE 的形式获取数据



当我在 solaris 11.0 上执行时:

pfiles /proc/PROCESSID

结果是过程信息,一小部分输出是我感兴趣的:

4: S_IFSOCK mode:0666 dev:543,0 ino:46228 uid:0 gid:0 size:0
O_RDWR|O_NONBLOCK
SOCK_STREAM
SO_REUSEADDR,SO_KEEPALIVE,SO_SNDBUF(49152),SO_RCVBUF(128480)
sockname: AF_INET6 ::ffff:10.10.50.28  port: 22
peername: AF_INET6 ::ffff:10.16.6.150  port: 55504

我 pfiles/proc/PROCESSID 的进程是 sshd 会话本身。

我的问题被赋予了一个进程 ID,我如何从内核代码中获取此 (pfiles) 信息?

在结构体过程中查找时,我找不到提供此数据的内容。

是否有指向结构的指针,该结构在进程的进程中保存进程占用的所有打开文件?

我还执行了桁架 pfiles/proc/PROCESSID,但找不到确切的调用

如果你看/usr/include/sys/user.h你会看到打开的文件信息可以在当前进程的p_user.u_finfo结构中找到。

走这个结构不是微不足道的。 只需看看proc文件系统代码必须做什么来查找一个打开的文件描述符的属性。 需要很多锁定 - 你不能在运行时简单地遍历数据结构。

而且,以下内容超出了问题的范围,但它很重要......

对于它的价值,你正在做的事情是行不通的。 它在技术和法律上都有根本性的缺陷。

无论如何,您正在尝试执行的操作 - 跟踪共享用户帐户的用户 - 都是毫无价值的。 您永远无法证明仅仅因为某个登录会话执行了某些代码,就执行了该代码,因为登录该会话的用户故意运行了该代码。因为有权访问该帐户的任何用户都可以修改共享帐户的环境,以便恶意软件由其他人运行。 他们可以使其看起来像键入的命令。

共享凭据和帐户违反不可否认性。 这是您在使用自定义内核跟踪可能产生的任何数据时无法克服的法律缺陷 - 即使您设法生产出一个万无一失的系统,这不太可能。

如果我登录到共享帐户,则永远无法证明我运行的代码是有意运行的。

好吧,这并不完全正确 - 如果你有完美的审计,你可以跟踪用户所做的每件事,直到磁盘上修改的字节,你可以。 在这种情况下,"完美"意味着这些用户无权更改审计系统的任何部分。

但是,如果您已经拥有完美的审计,则无需编写内核模块即可尝试实现它。

当然,不可能证明你有完美的审计,因为你无法证明你没有漏洞。

看到问题了吗?

我们又回到了"你不能证明我是故意的"。

您最好只使用操作系统提供的审计服务。 无论你想出什么,对于任何聪明的坏人来说,证明"谁做的"都没有用 - 就像想出一种方法将恶意代码插入另一个用户的会话的人一样。 操作系统审核将足以抓住任何不知道如何掩盖其踪迹的人。

但是,当涉及共享帐户时,您将无法证明任何知道自己在做什么的不良行为者。 如果你不能证明这一点,你甚至可能根本无法对你怀疑的人做任何事情。 因为真正知道自己在做什么的人将能够将明显的责任归咎于无辜的人——如果他们一开始就不能隐藏或销毁不良行为的证据。

如果您发现共享.profile文件中有一行,在特定日期后将敏感数据通过电子邮件发送到一次性电子邮件帐户,但仅当登录来自某个 IP 地址时,您将怎么做?

共享该帐户的任何一个用户都可以将其放在那里。

世界上没有审计系统可以解决这个问题,除非它是完美的跟踪每个文件更改。

如果您试图保护的数据很重要,那么无论谁要求您通过编写自定义内核模块来解决问题,都需要培养大脑并解决真正的问题 - 共享用户帐户。 摆脱它们。

每个安全指南都说不要使用共享帐户是有原因的,我见过的每个安全审核都会让任何使用共享帐户的人失败。

最新更新