如何解决不可信输入带来的安全问题

高质量程序设计艺术》样章连载——3.5 不可信输入


原书名:Code Quality: The Open Source Perspective

<o:p></o:p>

<!---->1.         <!---->深入剖析著名开源软件的质量问题<o:p></o:p>

<!---->2.         <!---->全面阐述CC++Java代码中的常见编程错误<o:p></o:p>

<!---->3.         <!---->指导你编写优秀代码的圣经<o:p></o:p>

<o:p> 如何解决不可信输入带来的安全问题</o:p>

更多详细信息http://www.china-pub.com/37661<o:p></o:p>

----------------------------------------------------------------------------------------------------------------------<o:p></o:p> 
3.5  不可信输入

通常,当程序接受并且使用来自不可信数据源的输入时,就有安全漏洞问题。看看telnet守护程序(Windows中的术语是服务telnetd,该程序使用DARPA设计的TELNET协议提供远程终端访问服务。这个守护程序通常以超级用户(管理员)的特权运行,并且可以从远端接受环境变量的值,这些环境变量允许远端用户指定一些设置,例如编辑器和打印机的偏好以及终端设置等。但是,有一些环境变量会从根本上改变程序运行的方式。特别是以下这些,PATH环境变量指定了某些函数,例如popen搜索程序的目录列表;IFS指定了命令行解释器在解析命令行输入时将哪个字符视作空格;而LIBPATH则指定了寻找动态库的目录列表。所有这些环境变量都可以被恶意设置,欺骗特权程序去以提升了的权限运行恶意代码。为了避免这些问题,本书提供的源代码集中的telnetd程序的代码特别设计了一个函数,该函数会从用户提供的(不可信)环境中剔除可能会被误用的值(见图3-7<!---->[1]<!---->)。这种方法被称为黑名单blacklisting),在安全领域通常来说是一种不太合适的策略。因为在列出可能会被利用的元素时,很容易就会漏过一些。

<!---->

<!---->

<!---->[1]<!----> netbsdsrc/libexec/telnetd/sys_term.c:1855-1868

<o:p> 如何解决不可信输入带来的安全问题</o:p>

<!----><!----><!----><!----><!----><!---->不幸的是,telnetd实现就有这个问题,在相关的NetBSD安全建议<!---->[1]<!---->中有所解释。例如,通过指定终端设置存在于某个文件中(而不是直接指定终端设置),攻击者可以欺骗系统泄漏某个本来应该不可读的文件的内容。这种情况下,较安全的方法是白名单whitelisting),只允许设置确信安全的环境变量值。在telnetd的正确实现<!---->[2]<!---->中综合使用了这两种方法,如图3-8所示。将TERMCAP的值设置为文件名是被明确禁止的(TERMCAP还有非常重要的合法用途),而且只有一小部分明确无害的变量被允许从远端设置。

<!----><!----><!---->环境变量并不是唯一能够导致安全问题的不可信数据源。它之所以在一些安全问题中特别突出,原因很简单,因为程序员们常常会忽略环境变量也是输入源这一事实。例如,任何来自于潜在的恶意用户或者不安全的网络连接的不可信输入都有可能导致安全问题。不过,没有经过充分验证的输入导致安全问题的典型情况是,输入的数据在后续处理中被用在重要的用途上。例如,IFS环境变量会修改命令行解释器的命令行解析过程,而LIBPATH变量则修改了动态库被加载的方式(这两个变量都是在运行时被解析的)。这种非直接的处理还应用于SQL语句、正则表达式、printf格式指定符、命令行解释器的各种命令以及HTML代码。

此类漏洞的典型例子就是基于SQL的注入攻击(injection attack),请看如下语句:<!---->[3]<!---->

<!---->

<!---->

<!---->[1]<!----> ftp://ftp.NetBSD.org/pub/NetBSD/security/advisories/NetBSD-SA2000-017.txt.asc

<!---->[2]<!----> ftp://ftp.NetBSD.org/pub/NetBSD/misc/security/patches/20001220-krb

<!---->[3]<!----> hsqlbd/src/org/hsqldb/jdbcDatabaseMetaData.java:2946

如何解决不可信输入带来的安全问题

如何解决不可信输入带来的安全问题

如何解决不可信输入带来的安全问题

如何解决不可信输入带来的安全问题

如何解决不可信输入带来的安全问题

<o:p></o:p>

行身份鉴别,而这三者都很容易被人操纵和伪造,因此是绝对不能信任的。在检查操作此类数据的代码时,还是应该确认一下这些数据没有被用于身份鉴别,当然了,直接检查身份鉴别是如何进行的可能更容易一些。

练习3.10  检查dhclient的实现<!---->[1]<!---->构造配置脚本的过程。对于所有依赖于服务器响应的脚本命令,解释攻击者可以如何利用它们来获得特权访问,以及现有实现是如何防卫此类攻击的。

练习3.11  引用特定的源代码路径,讨论伪造的DNS响应是如何被用来实现攻击的。

[1]<!----> netbsdsrc/usr.sbin/dhcp/client

<!----><!---->

本文仅供学习交流使用,严禁抄袭和转载,如果将本文内容用于商业用途,将追究法律责任!<o:p></o:p>

好书推荐,精彩明天继续······<o:p></o:p>

 对于一位Developer而言,如何编写高质量的代码也许是一个永恒的话题,这是一门艺术,需要从实践中总结经验。下面我向朋友们推荐两本集大成之作,希望能对您有所启发!<o:p></o:p>

1.修改代码的艺术》(原书名:Working Effectively with Legacy Code<o:p></o:p>

<o:p> 如何解决不可信输入带来的安全问题</o:p>

<!---->(1)       <!---->修改代码的集大成之作<o:p></o:p>

<!---->(2)       <!---->Amazon全五星图书<o:p></o:p>

<!---->(3)       <!---->适用于各种语言或平台<o:p></o:p>

<!---->(4)       <!---->著译双馨的佳作<o:p></o:p>

更多详细信息:http://www.china-pub.com/36363

<o:p></o:p>

2.《重构——改善既有代码的设计》(原书名:Refactoring: Improving the Design of Existing Code

 

如何解决不可信输入带来的安全问题

<o:p></o:p>

<!---->(1)       <!---->修改代码的集大成之作软件开发的不朽经典<o:p></o:p>

<!---->(2)       <!---->生动阐述重构原理和具体做法<o:p></o:p>

<!---->(3)       <!---->新添大量重构方法,使你与时俱进<o:p></o:p>

<!---->(4)       <!---->丰富的词汇和背景注释,助你轻松读经典<o:p></o:p>

<o:p> </o:p>更多详细信息:http://www.china-pub.com/37793

 

你可能感兴趣的:(sql,编程,正则表达式,脚本,Security)