Linux 为什么set-uid程序永远不应该创建由程序所有者拥有且可由其他用户写入的文件?

Linux 为什么set-uid程序永远不应该创建由程序所有者拥有且可由其他用户写入的文件?,linux,setuid,Linux,Setuid,从Linux编程接口 如果设置了用户ID,则根程序必须创建一个最初必须拥有的文件,但 该文件最终将由另一个用户拥有,因此应创建该文件 它最初不可由其他用户写入,或者使用合适的模式 参数,或者在调用open()之前设置进程umask。之后,程序可以使用fchown()更改其所有权,然后更改其 权限,如有必要,使用fchmod()。关键的一点是,一个设置用户ID的程序应该确保它不会创建一个属于该程序的文件 所有者,甚至可以由其他用户暂时写入。 我想知道为什么“一个设置用户ID的程序应该确保它永远不会

从Linux编程接口

如果设置了用户ID,则根程序必须创建一个最初必须拥有的文件,但 该文件最终将由另一个用户拥有,因此应创建该文件 它最初不可由其他用户写入,或者使用合适的模式 参数,或者在调用open()之前设置进程umask。之后,程序可以使用fchown()更改其所有权,然后更改其 权限,如有必要,使用fchmod()。关键的一点是,一个设置用户ID的程序应该确保它不会创建一个属于该程序的文件 所有者,甚至可以由其他用户暂时写入。


我想知道为什么“一个设置用户ID的程序应该确保它永远不会创建一个属于程序所有者的文件,甚至是其他用户可以瞬间写入的文件”

如果该文件是其他用户可以瞬间写入的,在您着手更改文件所有权之前,可能会有一个敌对过程将其自身用途的数据写入文件。这种情况表示可能的权限提升攻击的开始,或者至少是一个本来不应该有任何机会破坏文件的进程破坏了预期的数据

假设我想从一个非特权进程中获得根权限。我可以坐在那里等待你的应用程序以root身份运行,开始创建root拥有的文件。我一看到它,我的进程就开始将我的rootkit二进制文件写入该文件。我利用了另一个有缺陷的特权进程,该进程允许我以某种方式翻转文件上设置的用户id位——所有这些都是在您改变所有权之前完成的。现在我可以快速执行我的setuidrootkit二进制文件,我在其中编写的代码正在以root身份运行!我已经获得了不应该被允许的全部特权

非常小心地编写您的特权应用程序,以免打开漏洞,使系统有可能被利用