安全编程: 警惕输入--找出并保护程序的入口

论坛 期权论坛     
选择匿名的用户   2021-5-30 01:10   564   0
<blockquote>
本文论述了数据进入您的程序的各种途径,重点是如何适当地对它们进行处理;您甚至可能还没有了解它们全部!本文首先论述了如何设 计程序来限制数据可以进入您的程序的途径,以及您的设计会如何影响哪些可以成为输入。然后论述了各种不同的输入通道以及如何使用这些通道,包括环境变量、 文件、文件描述符、命令行、图形用户界面(GUI)、网络数据以及其他的输入。
</blockquote>



<p>早在 2001 年,许多大公司安装了应用程序“SAP R/3 Web Application Server demo”,却没有发现它有一个致命的漏洞。这个应用程序中有一个名为 saposcol 的程序,没有能保护自己免受恶意输入值的攻击。攻击者可以通过设置 PATH 环境变量来改变 saposcol 寻找其他程序的位置,然后为 saposcol 创建一个恶意的“扩展”程序来运行。由于 saposcol 具有 setuid root 权限,这就意味着因为这一个编程上的失误,本地用户可以 (作为 root)很快地获得整个计算机系统的控制权(参阅 <a href="http://www.ibm.com/developerworks/cn/linux/l-sp/part3/index.html#resources">参考资料</a> 中的链接,以深入了解这一点及本文中提到的其他相关内容)。 </p>
<p> <a href="http://www.ibm.com/developerworks/cn/linux/l-sp/part2/index.html">本专栏的前一期文章</a> 指出了一些常见的输入数据类型以及检查它们的方法。但是如果您不知道所有的数据自何处而来,那么,只是知道如何检查数据类型是不够的。本文讨论了数据进入您的程序的各种不同途径 —— 有一些并不是显而易见的 —— 并着重讨论了如何适当地去处理它们。 </p>
<p><a name="N1006A"><span class="atitle">如果您不控制,攻击者就会来控制</span></a></p>
<p> 安全的程序中第一道防线是检查每一个不可信的输入。但是这是什么意思呢?可以归结为以下三点: </p>
<ol><li> <em>限制程序暴露的部分。</em>如 果您的程序分为若干块 —— 这通常是一个好主意 —— 那么尽量设计得让攻击者根本不能与大多数块通信。这包括不能让他们利用各块之间的通信路径。如果攻击者不能查看、修改或者插入他们自己的数据到那些通信路 径中(包括作为块间的中间人潜入),那是最好了。如果那不可能 —— 比如当块之间使用网络通信时 —— 那么使用加密等机制来防范攻击者。后续的文章将更深入地讨论这一问题。 </li><li> <em>限制暴露部分所允许的输入类型。</em>有时您可以修改设计以使只有少数的输入可以接受 —— 如果可以,那么就这样做吧。 </li><li> <em>严格检查不可信的输入。</em>真正“安全”的程序应该没有任何输入,但那种程序是没有用处的。因而,您需要对来自于不可信源的输入路径的数据进行严格的检查。 <a href="http://www.ibm.com/developerworks/library/l-sp2.html?S_TACT&#61;105AGX52&amp;S_CMP&#61;cn-a-l">前一期文章</a> 论述了如何检查各种不同类型的数据;本文将帮助您确定这些数据的来源。这并不是说您 <em>只</em>需检查进入您的程序的数据。通常明智的做法是检查多个位置的数据,但是您必须至少检查所有的数据一次,并且明智的做法是至少在数据第一次进入时进行一次检查。 </li></ol>
<br>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img alt="" height="1" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-05ac63f463130bd1876c1af927ae88a3.gif" width="100%"><br><img alt="" border="0" height="6" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-c6ccbc96c20bebb0d73e8e6368158ef5.gif" width="8"></td></tr></tbody></table>
<table align="right" cellpadding="0" cellspacing="0" class="no-print"><tbody><tr align="right"><td><img alt="" height="4" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-c6ccbc96c20bebb0d73e8e6368158ef5.gif" width="100%"><br>
    <table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><img alt="" border="0" height="16" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-c34923c5525c03e01818932f9002b251.gif" width="16"><br></td><td align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/l-sp/part3/index.html#main"><strong>回页首</strong></a></td></tr></tbody></table> </td></tr></tbody></table>
<br>
<br>
<p><a name="N1008F"><span class="atitle">程序的类型决定一切</span></a></p>
<p> 您必须检查所有不可信的输入 —— 但是什么是不可信的输入呢?其中一些取决于您的程序要做什么。如果您的程序是数据的浏览器或者编辑器(比如文字处理器或者图像显示器),而这些数据有可能 来自攻击者,所以那是不可信的输入。如果您的程序响应网络上的请求,那些请求可能正是来自攻击
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP