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

时间:2018-09-08 19:10:03

标签: linux setuid

从Linux编程界面

  

如果set-user-ID-root程序必须创建一个最初必须拥有的文件,但是   最终将由另一个用户拥有,因此应创建该文件,以便   通过使用适当的模式,它最初不能被其他用户写入   open()的参数,或者通过在调用open()之前设置进程umask来实现。之后,该程序可以使用fchown()更改其所有权,然后更改其所有权。   权限(如有必要)使用fchmod()。关键点是设置用户ID程序应确保它永远不会创建该程序拥有的文件   所有者,甚至其他用户也可以暂时写入。

我想知道为什么“一个设置用户ID的程序应该确保它永远不会创建该程序所有者拥有的文件,并且甚至可以立即被其他用户写入”?

1 个答案:

答案 0 :(得分:1)

如果该文件可被其他用户暂时写入,则在进行更改文件所有权之前,可能会有对抗性过程将其自身目的的数据写入该文件。这种情况表明了可能的特权升级利用的开始,或者至少是由于本来应该没有机会破坏文件的进程破坏了预期的数据。

说我想从一个没有特权的进程中获得root特权。我可以坐在那里等待您的应用程序以root身份运行,以开始创建root拥有的文件。一看到它,我的进程便开始将rootkit二进制文件写入文件。我利用了另一个有漏洞的特权过程,该过程使我能够以某种方式翻转文件上的set-user-id位,而这一切都是在您更改所有权之前进行的。现在,我可以快速执行setuid rootkit二进制文件,并且写入其中的代码将以root身份运行!当我不应该被允许时,我已经获得了全部特权。

非常仔细地编写特权应用程序,以免造成漏洞,使系统可能被利用。