一、引言
译者:飞龙
日期:2001.9.1
版本:v1.2
这篇文章解释了某种现象的本质,它已经在 2000 年的下半年震惊了整个安全社群。它就是“格式化字符串漏洞”,是一种被发现的新型漏洞,并且会导致一系列的可利用 bug,它们在各种程序中都有发现,从小型工具到大型服务器应用。
这篇文章尝试解释该漏洞的结构,并随后使用这个只是去构建复杂的利用,它会向你展示如何在 C 代码中发现格式化字符串漏洞,以及为什么这种新型漏洞比通常的缓冲区溢出漏洞更加危险。
这篇文章基于我在德国柏林进行的一个德语演讲“17th Chaos Communication Congress”。演讲之后,我收到了无数翻译它的请求,并收到了很多正面反馈。所有这些激励了我来复查这篇文档,更新和纠正细节,以及制作一个更加易用的 LaTeX 版本。
这篇文章涵盖了其它文章涉及的大多数东西,以及涉及到利用时的一些更多的技巧。在本文完成之时,它是最新的,并且欢迎反馈。所以在你读完之后,请向 scut@team-teso.net 发送反馈,建议和任何不是抱怨的东西。
这篇文章的第一个部分是格式化字符串漏洞的历史和认识,后面是如何在源码中发现和避免该漏洞的细节。之后,一些基本技巧为玩转该漏洞而开发,从中诞生了一些强有力的利用方式,这个方式之后被修改、改进和实际应用到特殊的场景中,允许你利用至今几乎所有类型的格式化字符串漏洞。
对于每个漏洞来说,它们都有一段时间了,而且新的技术的出现,通常由于旧技术在特定场景下不工作了。由于一些在文本中提到的技巧,一些人应当受到尊敬,并且极大影响了我的写作,他们是 tf8,它编写了第一个格式化字符串利用,portal,它在它的文章中开发和研究了可利用性,DiGiT,它发现了至今为止大多数高危的远程格式化字符串漏洞,以及 smiler,它开发了复杂的爆破技巧。
虽然我在没有太大帮助的情况下,也贡献了一些技巧,一些评论和技巧,以理论或者漏洞利用的形式,由它们展示给我,否则这篇文章就不太可能完成。非常感谢,我也要感谢无数评论、复查和改进写篇文章的人。
更新和修正后的版本在 TESO 安全小组的主页上可以找到。
1.1 缓冲区溢出 vs 格式化字符串漏洞
由于过去几乎所有严重的漏洞都是某种缓冲区溢出,我们可以将这种严重并且低级的漏洞和这一新兴漏洞相比较。
缓冲区溢出 | 格式化字符串 | |
---|---|---|
发布时间 | 20 世纪 80 年代中期 | 1999 年 6 月 |
意识到危险 | 20 世纪 90 年代 | 2000 年 6 月 |
利用数量 | 几千 | 几十 |
被认为 | 安全威胁 | 编程的 Bug |
技巧 | 进化并且先进 | 基本的技巧 |
可见性 | 有时非常困难 | 简单 |
1.2 统计:2000 年重要的格式化字符串漏洞
为了强调格式化字符串漏洞在 2000 年的危险影响,我们在这里例举了最为可利用的公开漏洞。
应用 | 发现人 | 影响 | 年限 |
---|---|---|---|
wu-ftpd 2.* | security.is | 远程 root | > 6 |
Linux rpc.statd | security.is | 远程 root | > 4 |
IRIX telnetd | LSD | 远程 root | > 8 |
Qualcomm Popper 2.53 | security.is | 远程用户 | > 3 |
Apache + PHP3 | security.is | 远程用户 | > 2 |
NLS / locale | CORE SDI | 本地 root | ? |
screen | Jouko Pynnonen | 本地 root | > 5 |
BSD chpass | TESO | 本地 root | ? |
OpenBSD fstat | ktwo | 本地 root | ? |
在本文完成之时,还有很多未知或者未发现的漏洞,并且接下来的两到三年,格式化字符串漏洞会为已发现的新漏洞的统计做出贡献。我们已经看到,它们易于使用更加复杂的工具自动化发现,并且你可以假设,对于多数现在的漏洞,代码虽然没有公开,但是漏洞已经存在了。
也有一些在应用中发现这一类型咯多年过得方式,它们只在二进制中可用。为此,使用了一种更加通用的方式来寻找“参数缺失”,它在 Halvar Flakes 的二进制审计演讲中有所展示。