Python中的符号链接漏洞
在阅读关于 shell 脚本和临时文件处理的内容时,我遇到了符号链接漏洞。这个链接 http://www.linuxsecurity.com/content/view/115462/151/ 讲述了基本的概念。我想知道 Python 的 open() 函数在打开文件之前是否会检查它是否是一个符号链接,于是我尝试用 'w' 模式打开一个符号链接文件。令我惊讶的是,它打开了这个链接,并且覆盖了链接所指向的文件。现在,如果我的 Python 程序处理很多文件,并且处理方式是可预测的,攻击者是否有可能创建一个与我程序要创建的文件同名的链接,并将其指向一个重要的系统文件?这样就会覆盖系统文件,导致系统崩溃吗?我使用的是 Python 2.4。后续的 Python 版本是否解决了这个问题?
或者说,这根本算不算一个问题呢?
3 个回答
首先,运行这个脚本的用户不应该有权限去修改重要的系统文件。其次,这个问题不是Python需要解决的,而是脚本的开发者应该负责的。Python从2.3版本开始就提供了一个叫做 tempfile 的工具。
如果你的程序以更高的权限运行(比如说是管理员权限),那么你可以通过不在那些普通用户可以创建符号链接的文件夹中写文件,来防止这种攻击。
这个问题不是通过编程语言或运行库来解决的,而是要在程序运行的环境中来处理。
(注意,如果你的程序不是以更高的权限运行,那么用户创建符号链接也不会让他们做任何他们自己本来就能做的事情。)
这个问题只会在你创建临时文件的时候出现(其实就是写文件的时候),特别是当这些文件的名字是可以预测的,并且放在其他用户也能写入的目录里。所以,如果你的脚本只是在你的个人目录下写文件,那就没问题。
如果你需要在一个大家都能写的目录里创建临时文件,比如说 /tmp,你应该使用一些专门的工具,比如http://docs.python.org/library/tempfile.html。