最近在学代码静态分析相关的内容,就阅读了这本书,因为时间有限读得比较快速,并且第三章内容跟目前实验室关系不大所以直接跳过,选择了一些对我自己比较有意义的点做了记录。
关于输入合法性
本章讲到程序员应该保持一种怀疑一切输入正确合法性的态度。不仅仅是来自用户的输入,程序代码之外的任何资源文件都应该被怀疑。
通常需要验证的输入包括:
- 配置文件
程序的配置文件一旦被恶意修改,而程序员在使用的时候默认其合法,就可能会对整个程序造成巨大的灾难。
Apache1.3.29的mod_regex模块包含了一个缓冲区溢出漏洞,导致这个漏洞的原因是程序员过分相信自己的程序配置。
- 数据库查询
程序员通常也会默认数据库来的数据是合法的,但实际上恶意攻击者可能使数据库的部分功能失效,比如使数据库中存在key值相同的两行,从而伪造一些数据。所以程序应该在读取数据库之以后对结果进行合法性检查。
- 网络服务
毋庸置疑,网络数据是不可信的。但是网络数据不仅仅局限于来自网上用户的数据,有时候程序员会忘记网络服务是不可信的,例如DNS服务器和IP地址。一定不能依赖DNS服务或者IP地址进行认证。
OS X操作系统曾经的软件更新程序运行只通过发送一个简单的“GET“请求来调用swscan.apple.com网站上的数据,这种不尽行认证的方式使得其他人伪装成Apple的服务器非常容易
- 命令行参数