格式串问题
格式串问题,是当今世界为数不多的真正新的攻击,表面上近年。 第一个提到的格式串错误,是对2000年6月23日,在一个邮政所lamagra argamal ( www.securityfocus.com/archive/1/66842 ) ;帕斯卡尔布沙雷纳更清楚地解释,他们几乎是在一个月后( www.securityfocus 。 com/archive/1/70552 ) 。 早些时候后,由马克斯莱柯( www.securityfocus.com/archive/1/10383 )指出,一些基本的问题,但错过的能力格式字符串漏洞写记忆。 正如许多安全问题,根源格式串错误,是互相信任的用户提供的输入未经验证。 在炭/炭+ + ,格式串漏洞能够被用来写任意内存位置,而最危险的一面是,这可能发生在没有干扰邻近的内存块。 这细粒能力允许攻击者绕过堆栈保护措施,甚至修改非常小的部分记忆。 这个问题也可以发生时,格式字符串中读出一个不可信赖的地点攻击者控制。 这后一方面的问题,更趋于流行的unix和linux系统。 在windows系统中,应用字符串表,一般保持在该计划的可执行程序,或资源动态链接库( dll ) 。 如果攻击者可以重写主可执行文件或资源dll文件,攻击者可以执行许多较简单的攻击数量超过了格式字符串漏洞。 即使你不是在处理炭/炭+ + ,格式字符串攻击,还可以导致相当多的问题。 最明显的是,用户可以在被误导的,但在一定条件下,攻击者还可能发动跨站点脚本或sql注入攻击。 可利用这些舞弊或变换数据以及。 受语言最强烈的影响语言是炭/炭+ + 。 一个成功的攻击可导致立即执行任意代码,并以信息披露。 其他语言将没有通常允许执行任意代码,但其他类型的攻击是可能的,因为我们先前的说明。 perl是没有直接受到specifiers正在考虑由用户输入的,但它可能会受到攻击,如果格式字符串是只读的,从篡改数据。 罪恶解释格式化数据显示或存储可以是一个较为困难的任务。 因此,许多计算机语言包括套路轻易格式化数据。 在大多数语言,格式化的信息是描述使用某种形式的字符串,称为格式字符串。 格式字符串实际上是确定了利用有限的数据处理语言的设计,使用户能够描述输出格式。 但许多开发商制作一件容易失误,他们使用的数据来自不可信赖的用户作为格式字符串。 因此,攻击者可以写弦乐团,在数据处理语言,造成了很多问题。 设计炭/炭+使得这个特别危险:炭/炭+ + ' s设计使得它更难发现格式串问题,格式字符串中包括一些特别危险的命令(尤其% n )的,不存在其他一些语言'格式字符串的语言。 在炭/炭+ + ,一个函数可以宣布采取不同数目的参数,具体说明省略号( … … )作为最后一个(或只)的说法。 问题是,这个功能被称为是没有办法知道究竟有多少的争论正通过英寸最常见的一套功能采取可变长度的论据是printf家人说: printf , sprintf , snprintf , fprintf , vprintf ,等等对。 宽字符的职能,履行相同的功能有同样的问题。 让我们来看看一个例子: #包括<stdio.h> int ( int argc ,烧焦*定义argv [ ] ) 返回0 ; 相当简单的东西。 现在让我们看看什么是可以去错了。 程序员期待用户进入良性的东西,如一个hello world 。 如果你给它一个尝试,你会得到回你好世界。 现在让我们切换输入一个鲜为人知的尝试% x厘十。 对windows xp系统使用默认的命令行( cmd.exe ) ,你现在得到以下几点: e :在\项目\ 19_sins \ format_bug > format_bug.exe " % x厘× " 注意,如果你使用不同的作业系统,或是采用不同的命令行解释器,你可能需要作出一些改变,以得到这个确切字符串输入您的计划,效果也可能会有所不同。 为便于使用,你可以把论点到一个shell脚本或批处理文件。 发生了什么? 该printf函数了输入字符串造成它期望两个论点被人推落栈之前调用功能。 该% x specifiers使你阅读栈,四个字节,在一时间,就你所想。 人们不难想象,如果你有一个更复杂的功能,储存了一个秘密,在栈变量时,攻击者便可以阅读的秘密。 输出是这里的地址栈地点( 0x12ffc0 ) ,其次是代码的位置,这样做主要( )函数将返回到。 正如你可以想象,这两项都是非常重要件资料被泄露给攻击者。 你现在可能不知道如何攻击者使用格式串漏洞写记忆。 其中最少使用格式specifiers是%氮,其中写道数目字应已书面这么远到的地址变了,你作为相应的说法。 这里的应如何使用: 无符号int字节; 输出将是: e :在\项目\ 19_sins \ format_bug > format_bug2.exe : "有些随机输入" 一些随机输入 你的投入是17个字 对一个平台,与4个字节的整数, % n和specifier会写4个字节一时间,并%针会写两个字节。 现在,攻击者不仅要琢磨出如何得到解决,他们想在适当的位置,在栈,并调节场宽度specifiers直到字节数写的是什么,他们想。 现在,让我们只是假设,如果你让攻击者控制格式字符串在一个炭/炭+ +程序,它是一个时间的问题,才琢磨出如何使你运行代码。 一个特别恶劣的方面这种类型的攻击是之前发动攻击,他们可以试探栈和正确的攻击就飞。 事实上,在第一次作者展示了这次袭击,在公众,他用不同的命令行解释器比他i'd用于创建示范,也没有工作。 由于独特的灵活性,这次袭击中,这是可能纠正问题,并利用示例应用与观众收看。 大多数其他语言不支持的一个相当于% n和格式specifier的,他们并没有直接向弱势容易执行攻击者提供的代码,但你仍然会碰到的问题。 还有其他更为复杂的变体对这一袭击事件造成其他语言很容易。 如果攻击者可以指定一个格式字符串输出到一个日志文件或数据库中,这可能导致不正确或具误导性的原木。 此外,申请读原木可考虑他们信赖的投入,一旦这个假设是违反了,弱点在这方面应用的解析器,可能导致执行任意代码。 一个相关的问题是嵌入控制性状的日志文件- backspaces可以用来抹去的东西;线路终端可以模糊甚至消除攻击者的踪迹。 这不用说,但如果一个攻击者可以指定格式字符串美联储scanf或相近的职能,灾难,是对未来路向。 那双充满戾气的炭/炭+不像其他许多缺陷,我们将看看,这个人是比较容易被发现,作为代码缺陷。 这是非常简单的: printf ( user_input ) ; printf ( " %的" , user_input ) ; 一变就这个问题,许多程序员忽视的是,它是不足以做到这一点,正确只有一次。 有一些共同的守则,建构那里你可能需要使用sprintf ,以建立一个格式化字符串到一个缓冲区,然后再滑起来,做到这一点: fprintf (标准输出, err_msg ) ; 相关罪孽虽然最明显的攻击是一个主题相关的代码缺陷,它是一个普遍的做法提出申请弦乐团在外部文件中的国际化的目的。 如果您的申请已经sinned所未能保护档案,妥善,然后攻击者可以供应格式字符串,因为缺乏适当的文件访问。 另一项相关的罪过是未能妥善确认用户输入的数据。 对某些制度下,一个环境变量,指明现场资料,以及当地的,而且反过来又决定着目录特定语言的档案会被发现。 对有些制度中,攻击者甚至可能导致应用研究在任意目录。 发现单模式任何申请,需用户输入并通过它向格式化函数是有潜在危险。 一个非常普遍的,例如在本单刚巧与应用程序日志用户输入的数据。 此外,一些职能可以先实行内部格式化。 发现有人在单代码审查在炭/炭+ + ,找职能从printf家庭。 问题找正 printf ( user_input ) ; 如果你看到一个函数看起来像这样: fprintf (标准输出, msg_format , arg1 , arg2 ) ; 那么你需要核实那里字符串参考msg_format是储存以及效果如何,这是保障。 还有很多其他的系统调用和宣传短片,这也容易- syslog就是一个好例子。 任何时候你看到一个函数的定义,其中包括… …在参数列表,你正在寻找某种东西,这很可能是一个问题。 许多源代码扫描器,连词汇的老鼠和flawfinder ,能探测这一点。 甚至还有pscan ( www.striker.ottawa.on.ca/ 〜阿兰德/ pscan / ) ,它是专门为这本。 也有反制工具,可以建到编制过程。 例如,有的克里斯cowan的formatguard : http://lists.nas.nasa.gov/archives/ext/linux-security-audit/2001/05/msg00030.html 测试技术,以找出单通过格式化specifiers到应用,并看看十六进制值都回来了。 举例来说,如果你有一个应用程序,预计一个文件名,返回一个错误信息,其中载有输入时,该文件不能被发现,然后再试图使它档案名称一样notlikely % x厘x.txt 。 如果你得到一个错误信息的写法: " notlikely12fd234104587.txt不能找到" ,那么,你刚才发现了一个格式字符串漏洞。 这显然是有点语言依赖型;你应该通过在格式化specifiers正在使用的执行语言,你用最少的。 然而,由于许多语言来说倍落实到炭/炭+ + ,你应该是明智的,也请把炭/炭+格式化字符串命令侦查的情况下,你的背后馆内设有一个危险的漏洞。 注意,如果你的申请是基于网络和呼应你的用户输入还给你,另一个令人关注的将是跨站点脚本攻击 例如捷联惯导系统下列作品中,常见的脆弱性和风险( cve的) http:// cve.mitre.org的例子sql注入。 出188 cve的参赛作品参考格式字符串,这只是一个采样。 cve的- 2000年至0573年从cve的描述: " lreply功能武昌ftpd 2.6.0和更早并不适当清洗是一个不可信赖的格式字符串,允许远程攻击者执行任意指令通过本网站exec命令" 这是首次公开利用一个格式字符串漏洞。 标题的bugtraq上邮政突显了问题的严重性: "提供*远程*根至少从1994年以来" cve的- 2000年至0844年从cve的描述: "有些职能,落实现场子系统在unix不妥善清洗用户注入格式弦乐团,其中允许本地攻击者执行任意指令途经功能,如gettext和catopen " 全文原咨询,可在www.securityfocus.com/archive/1/80154 ,这个问题,尤其是有趣,因为它影响到核心系统空气污染指数,对于大多数unix的各种变种(包括linux ) ,除bsd的变因这一事实,即nlspath变数是忽略特权suid应用在bsd的。 这一咨询,像许多核心的空间数据基础设施的建议,尤其是写得好和翔实,并给出了一个十分彻底的解释整个问题 赎回步骤第一步是从来没有通过用户输入直接向格式化功能,也一定要做到这一点在每个层次的处理格式化输出。 作为一种额外说明,格式化的功能有显着的开销。 看看源泉_output如果你有兴趣的-它可能是方便写: fprintf (标准输出, buf ) ; 前面的代码行不仅是危险的,但它也消耗了不少额外的cpu周期。 第二步采取的是,以确保该格式字符串你的申请用途只是阅读从可信任的地方,并且该路径,以弦乐,无法控制犯罪分子。 如果你写的代码为unix和linux ,效法bsd的变种,并不顾nlspath变量,它可以用来指明该文件用于本地化信息,可以提供一些纵深防御。 炭/炭+赎回是不是还不止这些,这比本: printf ( " %的" , user_input ) ;额外的防御措施 检查,并限制现场,以有效价值。 (如需了解更多资讯,请参阅朱惠勒的"写它的安全:格式弦乐团及现场过滤" ,列在"其他资源"一节下文) 。 不使用printf家族的功能,如果你能避免。 例如,如果你是用c + + ,使用流操作,而是: #包括<iostream>其他资源
这是一篇文章说,由亨得拉芳
|
|||
|