网络安全参考 | UNIX参考 | GPS参考 | 无线参考 | 在线手册 | OSBUG.ORG | SUNNY-NETWORK.COM
网站地图 RSS订阅
高级搜索 收藏本站
Home | 业界动态 | 防火墙 | IDS/IPS | VPN | PKI | Honeypot | Hacker/Intruder | 黑客技术 | 破解技术 | 加密技术 | 病毒防护 | 木马 | 反垃圾邮件 | 反流氓软件 | 漏洞 | 无线安全 | UNIX | Windows | 安全编程 | 安全软件 | TPM/TCG | 数据恢复 | 企业信息安全 | 个人信息安全
 当前位置: Home > 安全编程 > 文章  
安全编程: 警惕输入
文章来源: IBM developerWorks 文章作者: David A. Wheeler 发布时间: 2006-07-10   字体: [ ]
 
 

常见的输入源

 

下面的章节将讨论一些常见的输入以及如何处理这些输入。当您编写程序的时候这些输入每一个都应该考虑,如果它们不可信,一定要谨慎对它们进行过滤。

 

环境变量

 

环境变量可能令人难以置信地危险,尤其是对那些 setuid/setgid 程序及它们调用的程序。危险的原因在于以下三个方面:

 

许多库和程序由环境变量以非常含糊的方式控制着 —— 实际上,很多都完全没有文档化。命令 shell /bin/sh 使用 PATH IFS 等环境变量,程序加载器 ld.so (/lib/ld-linux.so.2) 使用 LD_LIBRARY_PATH LD_PRELOAD 等环境变量,很多程序使用 TERM HOME SHELL 环境变量 —— 所有这些环境变量都可用于开发程序。这样的环境变量数不胜数;对调试来说它们很多都是晦涩的变量,并且将它们全部列出也是无济于事的。实际上,您不可能了解全部环境变量,因为有一些并没有文档化。

 

环境变量是继承而来的。如果程序 A 调用 B,而 B 调用 CC 调用 D,那么程序 D 将获得的环境变量就是程序 A 所获得的环境变量,除非有一些程序在这个过程中对其进行了改动。这就意味着,如果 A 是一个安全的程序,而 D 的开发者为了调试方便而增加了一个没有文档化的环境变量,那么程序 D 的这个附加的环境变量就会成为程序 A 的一个漏洞!这种继承不是偶然的 —— 这是为了使环境变量有用 —— 但是这也使之成为一个严重的安全问题。

 

环境变量可以被本地运行的攻击者 完全控制,而且攻击者可以用不同寻常的方式来利用这一点。如 environ(5) 手册页(参阅 参考资料)中所描述,环境变量在内部作为字符指针数组来存储(数组以一个 NULL 指针结束),每一个字符指针指向一个形式为 NAME=value (这里 NAME 是环境变量名) 的以零字符结尾的(NIL-terminated)字符串。这一细节的重要性何在?这是因为攻击者可能会做一些不合常理的事情,例如为同一个环境变量名创建多个值(比如两个不同的 LD_LIBRARY_PATH 值)。这可以很容易地导致库使用环境变量去做意想不到的事情,有可能被利用。GNU glibc 库对此有防范的例程,但是使用环境变量的其他库和任何例程可能很快陷入困境。

 

有一些情形下,程序经过了修改,以使得难以利用它们来使用环境变量。历史上,很多攻击利用的是命令 shell 处理 IFS 环境变量的方法,但是当今大部分的 shell(包括 GNU bash)已经经过了修改,从而使 IFS 难以利用。

 

不幸的是,尽管这一加固措施是一个好主意,但它还是不够 —— 您还是需要谨慎地去处理环境变量。在 Unix 类系统上所有的程序如何运行,这是一个特别重要的(虽然难以理解)例子。Unix 类系统(包括 GNU/Linux)首先通过系统加载器来运行程序(在大部分 GNU/Linux 系统中这个加载器是 /lib/ld-linux.so.2),它可以定位并加载所需要的共享库。这个加载器通常由环境变量来控制。

 

在大部分 Unix 类系统中,加载器通常在环境变量 LD_LIBRARY_PATH 中列出的目录中开始搜索库。我应该说明一下, LD_LIBRARY_PATH 被很多 Unix 类系统使用,但不是全部都用;HP-UX 用的是环境变量 SHLIB_PATH AIX 用的是 LIBPATH 。而且,在 GNU-based 系统(包括 GNU/Linux)中,环境变量 LD_PRELOAD 所列出的库首先加载,并且优先于所有其他的库。

 

问题是,如果攻击者可以控制程序用到的底层库,那么攻击者就可以控制整个程序。例如,假设攻击者可以运行 /usr/bin/passwd(一个可以改变您的口令的特权程序),但却用环境变量去改变这个程序用到的库。攻击者可以编写自己的口令加密函数 crypt(3) 然后当特权程序尝试调用这个库时,攻击者可以让这个程序来做任何事情 —— 包括允许永久地、无限制地控制整个系统。当前,加载器通过检测程序是否设置了 setuid/setgid 来防范这一问题,如果设置了,它们就会忽略 LD_PRELOAD LD_LIBRARY_PATH 环境变量。

 

那么,我们安全了吗?没有。如果恶意的 LD_PRELOAD 或者 LD_LIBRARY_PATH 值没有被 setuid/setgid 程序清除,它将被传递到其他程序,并导致出现加载器试图去防范的问题。因而,虽然加载器让编写安全的程序成为 可能,但您还不得不去防范恶意的环境变量。而且,这还不能处理那些没有文档化的环境变量的问题。

 

对于安全的 setudi/setgid 程序来说,惟一可靠的办法是,始终在程序开始时提取并清除环境变量:

 

l         提取出您确实需要的环境变量(如果有)。

l         清除所有的环境变量。在 C/C++ 中,通过包含 <unistd.h> 并将 environ 变量设为 NULL 可以清除环境变量(尽早做这些事情,特别是在创建线程之前)。

l         只将您所需要的环境变量设置为可靠的值。您几乎肯定要重新添加的一个环境值是 PATH ,它是搜索程序的目录列表。典型的 PATH 应该只是设置为 /bin:/usr/bin,或者一些类似的值。不要向 PATH 中添加当前路径“.”,或者甚至一个空条目(这样在开始和结束的冒号可被利用)。典型的,您还需要设置 IFS (设置为它默认的“ \t\n” —— 空格、制表符和新行)和 TZ(时区)。其他您可能需要设置的是 HOME SHELL 。您的应用程序可能还需要更多,但是要限制它们 —— 除非是特别需要,否则不要接受潜在的攻击者的数据。

 
推荐文章
·洪水攻击原理及代码实现全攻略(
·原始套接字透析之综合实例:网络
·原始套接字透析之实现IP地址欺骗
·原始套接字透析之ARP欺骗
·原始套接字透析之实现包分析
·原始套接字透析之实现sniffer
·原始套接字透析之实现路由欺骗
·原始套接字透析之ICMP拒绝服务攻
·原始套接字透析之实现Ping
·原始套接字透析之Raw Socket基础
·黑客之旅 -- 原始套接字透析之前
·QQ尾巴病毒的Visual C++实现探讨
·安全编程: 安全地调用组件
·安全编程: 验证输入
 

 
共6页: 上一页 [1] 2 [3] [4] [5] [6] 下一页
↑返回顶部   打印本页   关闭窗口↓  

Google
 
Web oldhand.org unixreference.net meshmea.org
热点文章
·原始套接字透析之Raw So
·原始套接字透析之ARP欺
·洪水攻击原理及代码实现
·原始套接字透析之综合实
·原始套接字透析之实现Pi
·黑客之旅 -- 原始套接字
·使用 OpenSSL API 进行
·使用 OpenSSL API 进行
相关分类
相关文章
·安全编程: 验证输入
·安全编程: 最小化特权
·安全编程: 开发安全的程
·安全编程: 防止缓冲区溢
·非安全编程演示之高级缓
·安全编程: 安全地调用组
·使用 OpenSSL API 进行
·使用 OpenSSL API 进行
更多...
 
 

Copyright(c) 2001-2008 OLDHAND ORGANIZATION, All Rights reserved.
Power by DedeCms 织梦内容管理系统
$Id: article_article.html,v 1.3 2007/02/10 12:00:37 yjs Exp $