一尘不染

如何找出一个进程需要哪些Linux功能才能工作?

linux

我处在一个困难的情况下,我不知道一个进程需要什么Linux功能才能工作。最好的方法是什么,或者找出所需的上限的任何方法?

我现在唯一能想到的就是使用capsh并降低进程中的所有上限。然后,该过程失败,我开始添加上限(通过删除–drop = CAP_XZY),直到它起作用为止。

还有更好的建议吗?


阅读 257

收藏
2020-06-07

共1个答案

一尘不染

我之前在Brendan Gregg的这篇博客文章中遇到的另一种方法是使用功能跟踪器 功能

以下是示例输出:

$ sudo /usr/share/bcc/tools/capable
TIME      UID    PID    COMM             CAP  NAME                 AUDIT
11:31:54  0      2467   capable          21   CAP_SYS_ADMIN        1
11:31:54  0      2467   capable          21   CAP_SYS_ADMIN        1
11:31:59  1000   2468   ls               1    CAP_DAC_OVERRIDE     1
11:31:59  1000   2468   ls               2    CAP_DAC_READ_SEARCH  1
11:32:02  0      1421   timesync         25   CAP_SYS_TIME         1
11:32:05  1000   2469   sudo             7    CAP_SETUID           1
11:32:05  0      2469   sudo             6    CAP_SETGID           1

它具有记录内核针对给定进程进行的功能检查的显着优势。这样就可以根据应用程序实际需要的功能来分析应用程序,例如,缩小特权范围并以非特权用户身份执行它。

尽管 pscap 允许列出所有正在运行的进程的 有效 功能,但它不能提供一种可靠的方法来检查该进程实际上需要哪些功能,因为:

  • 进程可能在其允许的集合中具有能力X,并且仅在短时间内将其提升到有效的集合中才能执行特权操作。
  • 一个进程本可以从更广泛的功能集开始,进行需要提升特权的初始化,然后放弃某些(或全部)功能(例如ping打开原始套接字)。
  • 它仅适用于已经以基于功能的方式运行的进程。如果必须确定新开发的应用程序所需的最小功能集怎么办?
  • 它不允许将对应用程序进行的特权检查与它执行的操作相关联,并且 无法 获得每次检查的时间戳。

对于源
可在github上。对于BCC(包括安装说明
能力
)都可以在这里。有关进一步的描述,请参阅开头提到的博客文章,也请注意,该功能需要内核4.4+,博客文章中也提供了较旧内核的替代方法。

注意:我不是作者,也不以任何方式隶属于工具开发人员。我只是想将它带给更广泛的受众,因为我亲自使用它来为复杂的监视应用程序开发功能配置文件,该应用程序以前需要运行完整的root特权才能运行,并且发现此跟踪器有很大帮助。

2020-06-07