18-发现程序所需的能力
39.9 发现程序所需的能力
假设现在有一个对能力一无所知的程序并且只有这个程序的二进制文件,或者假设程序的代码太多了以至于无法很容易地确定运行这个程序需要具备那些能力。如果这个程序需要特权,但又不是一个set-user-ID-root程序,那么如何确定将哪些许可能力使用setcap(8)赋给这个可执行文件呢?解答这个问题的答案有两个。
- 使用strace(1)(附录A)检查哪个系统调用的错误号是EPERM,因为这个错误号是用来标示缺乏所需的能力的。通过查阅系统调用的手册或内核的源代码可以推断出程序需要哪些能力。但这个方法不是很完美,因为偶尔会因为其他原因而引起EPERM错误,其中一些原因与程序缺乏相应的能力这个问题毫无关系。此外,程序可能会正常调用一个需要权限的系统调用,然后在确定没有权限执行某个特定操作之后改变自身的行为。而有些时候在试图确定一个可执行文件实际所需的能力时是难以区分这种“积极响应错误”的情况的。
- 使用一个内核探针在内核被要求执行能力检查时产生监控输出。[Hallyn, 2007](由其中一个文件能力模块的开发者撰写的一篇文章)提供了如何完成这个任务的一个示例。对于每个能力检查请求,文章中所指的探针都会记录被调用的内核函数、被请求的能力以及请求程序的名称。虽然这个方法比使用strace(1)需要做更多的工作,但它有助于更加精确地确定一个程序所需的能力。