07-小心信号和竞争条件
38.6 小心信号和竞争条件
用户可以向他启动的set-user-ID程序发送任意信号,其发送时间和发送频率也是任意的。当信号在程序执行过程中的任意时刻发送时需要考虑可能出现的竞争条件。在程序中合适的地方应该捕获、阻塞或忽略信号以防止可能存在的安全性问题。此外,信号处理器的设计应该尽可能简单以降低无意中创建竞争条件的风险。
这个问题与停止进程的信号(如SIGTSTP和SIGSTOP)特别相关。存在问题的场景如下所示。
1. 一个set-user-ID程序确定与其运行时环境有关的一些信息。
2. 用户需要停止运行程序的进程和修改运行时环境的细节。这样的变更可能包括修改文件的权限、改变符号链接的目标以及删除程序所依赖的文件。
3. 用户使用SIGCONT信号恢复进程。这时程序会假设原先的运行时环境没有发生变化并继续执行,但其实运行时环境已经发生了变化,因此在这种假设可能会破坏系统的安全性。
这里描述的情况确实只是检查时间(time-of-check)和使用时间(time-of-use)竞争条件的一种特殊情况。特权进程应该避免执行依赖于之前成立但现在已经不再成立的条件的操作(具体示例可参考第15.4.4节中对access()系统调用的讨论)。即使当用户无法向进程发送信号时也应该遵循这个指南。停止一个进程的能力仅仅允许一个用户扩大检查时间和使用时间之间的时间间隔。
虽然通过一次尝试就在检查时间和使用时间之间停止一个进程是比较困难的,但恶意用户可以重复地执行一个set-user-ID程序并使用另一个程序或一个shell脚本重复地向set-user-ID程序发送停止信号并修改运行时环境。