一、引言

这篇文章解释了某种现象的本质,它已经在 2000 年的下半年震惊了整个安全社群。它就是“格式化字符串漏洞”,是一种被发现的新型漏洞,并且会导致一系列的可利用 bug,它们在各种程序中都有发现,从小型工具到大型服务器应用。

这篇文章尝试解释该漏洞的结构,并随后使用这个只是去构建复杂的利用,它会向你展示如何在 C 代码中发现格式化字符串漏洞,以及为什么这种新型漏洞比通常的缓冲区溢出漏洞更加危险。

这篇文章基于我在德国柏林进行的一个德语演讲“17th Chaos Communication Congress”。演讲之后,我收到了无数翻译它的请求,并收到了很多正面反馈。所有这些激励了我来复查这篇文档,更新和纠正细节,以及制作一个更加易用的 LaTeX 版本。

这篇文章涵盖了其它文章涉及的大多数东西,以及涉及到利用时的一些更多的技巧。在本文完成之时,它是最新的,并且欢迎反馈。所以在你读完之后,请向 [email protected] 发送反馈,建议和任何不是抱怨的东西。

这篇文章的第一个部分是格式化字符串漏洞的历史和认识,后面是如何在源码中发现和避免该漏洞的细节。之后,一些基本技巧为玩转该漏洞而开发,从中诞生了一些强有力的利用方式,这个方式之后被修改、改进和实际应用到特殊的场景中,允许你利用至今几乎所有类型的格式化字符串漏洞。

对于每个漏洞来说,它们都有一段时间了,而且新的技术的出现,通常由于旧技术在特定场景下不工作了。由于一些在文本中提到的技巧,一些人应当受到尊敬,并且极大影响了我的写作,他们是 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 的二进制审计演讲中有所展示。

results matching ""

    No results matching ""