文件
正如我在前一期文章中提到的,不要信任可以被攻击者设置的文件名。Linux 和 Unix 允许用任意的字符序列来作为文件名,所以,如果您正在使用一个来自攻击者的目录或者接受他的一个文件名,一定要有所准备。攻击者可以创建以“-”开头的文件名,或者含有“&”等特殊字符的文件名,等等。
不要信任可以被不可信用户控制的文件内容。这包括那些被程序浏览或编辑的可能是由攻击者寄来的文件。例如,著名的文本编辑器 vim 版本 5.7,当要编辑一个文件时,将查找一个内置的 statusline 命令来在它的状态行上设置信息,而那个命令又可以执行任意的 shell 程序。攻击者可以用电子邮件给受害者发送特别处理过的文件,如果受害者用 vim 来阅读或者编辑它,受害者就可能会去运行攻击者想要运行的任何程序!!!
避免从当前目录中获得配置信息,因为用户可能会浏览一个由攻击者控制的目录,攻击者在那里创建了一个恶意的配置文件(例如,攻击者可能已经发送了一个包括数据和恶意配置文件的压缩目录)。而应该从 /etc、用户的主目录和/或桌面环境的库中获得配置信息。通常,将配置信息以及其他信息存储在“~/. program-name”文件中是很方便的;文件名最前的句点是为了让它不影响正常的显示。如果您真正必须要从当前目录下得到配置信息,那么要非常严格地检查其中的所有数据。
不要让攻击者控制任何临时文件。我建议,如果一个用户是可信的,那么将临时目录放在那个用户的主目录下。如果这不可接受,那么要用安全的方法来创建和使用临时文件(我将在后一期文章中讨论如何安全地创建临时文件)。
文件描述符
不怀好意的攻击者可能启动一个程序而只是对它的标准输入、标准输出或者标准错误做一些奇怪的事情。例如,攻击者可能会关闭它们中的一个或多个,以使得您打开的下一个文件同时也是正常的输出位置。这对 setuid/setgid 程序来说尤其是一个问题。当前的一些 Unix 类系统已经可以防范这一问题,但不是所有的系统都可以。
setuid/setgid 程序防范这一攻击的一种方法是,使用 open() 反复打开 /dev/null 直到文件描述符的值大于 2(您必须在打开文件前做这件事情,最好是在程序初始化时)。然后,如果对 open() 的第一次调用返回的是 2 或者更小,那么不输出任何消息并退出。通过先反复打开 /dev/null,您自己保护了自己 —— 如果您偶尔试图去打开文件并输出错误消息时,不会再发生坏的事情。在这种情况下不需要输出错误消息,因为文件描述符 0 到 2 只是在攻击者试图去搅乱您的程序的时候才会被关闭。
命令行
程序启动时可以接受来自命令行的数据 —— 但是您可以相信这些数据吗?setuid/setgid 程序尤其不能。如果您不能相信这些数据,那就要自己做好一切准备,包括大的参数、大量的参数、不可知的字符,等等。注意,程序的名字只是命令行值的第 0 个参数 —— 不要相信程序名,因为攻击者会改变它。
不但如此,还要尽力去设计您的命令行语法,以使它更容易安全地使用。例如,支持用标准的“--”(双破折号)选项来表示“不再有选项”,这样脚本就可以使用这个选项来防止攻击者通过创建以破折号开头的文件名(如“-fr”)来攻击。否则,攻击者可以创建“-fr”文件,并让用户运行“yourcommand *”;这时您的程序可能会将文件名(“-fr”)曲解为一个选项。
共6页: 上一页 [1] [2] [3] 4 [5] [6] 下一页
|