在 solaris 的内核模块代码中获取数据作为 pfiles

get data as pfiles within kernel module code in solaris

当我在 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)信息?

在查看 struct proc 时,我找不到能给我这些数据的东西。

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

我也执行了 truss pfiles /proc/PROCESSID 但找不到确切的调用

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

走那个结构不是微不足道的。只是 look at what the proc filesystem code has to do to look up the attributes of just one open file descriptor。需要很多锁定 - 你不能简单地在数据结构 运行ning 时遍历数据结构。

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

不管它的价值如何,你所做的都是行不通的。它在技术上和法律上都存在根本性缺陷。

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

Shared credentials and accounts violate nonrepudiation. 在使用您的自定义内核跟踪可能产生的任何数据时,这是您无法克服的法律缺陷 - 即使您设法产生了一个万无一失的系统,这不太可能。

如果我登录的是共享帐户,你可以永远证明我运行的代码是运行故意的。

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

但是如果你已经有了完善的审计,你就不需要编写内核模块来尝试实现它。

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

看到问题了吗?

我们马上回到 "You CAN'T prove I did it intentionally."

您最好使用 OS 提供的审计服务。无论你想出什么,都不会对证明 "who did it" 对于任何聪明的坏人有用 - 比如想出一种方法将恶意代码插入另一个用户会话的人。 OS 审计将足以抓住任何不知道如何掩盖他们踪迹的人。

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

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

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

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

如果您要保护的数据很重要,那么让您通过编写自定义内核模块来解决问题的人就需要开动脑筋并解决真正的问题 - 共享用户帐户。摆脱他们。

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