2009年初,CWE/SANS联合发布了全球25个最危险的编程错误。这25个最危险的编程错误,它们可能导致严重的软件漏洞。这些错误频繁发生,往往容易被攻击者发现,且易于利用。Top25清单的主要目标是在软件发布之前,通过教育程序员如何消除十分常见的错误,从源头上阻止漏洞。
SANS (SysAdmin, Audit, Network, Security) 研究所是美国一个比较权威的信息安全培训与认证机构,CWE常见缺陷列表(Common Weakness Enumeration)是MITRE公司(一个非盈利机构)继CVE(Common Vulnerabilities and Exposures)之后的又一个安全漏洞词典。这份清单是SANS研究院、MITRE和许多在美国和欧洲的顶级软件安全专家的合作成果。它总结了在SANS的20大攻击向量和MITRE的常见缺陷列表(CWE)的开发中的经验。
Top25包含CWE的多个条目,可以分为以下三类:第一,组件间不安全的交互;第二,危险的资源管理;第三,可穿透的防范措施。组件间不安全的交互,包含了九个方面编程错误分析和解读。本期介绍其中的两个编程错误,即,不适当的输入验证,和不正确的编码或输出转义。
CWE-20: 不适当的输入验证
讨论
该漏洞是安全软件的头号杀手。如果你不对输入进行检查,那就是在自找麻烦。比如,如果你希望输入的只是一个数字的标识符,那么其中就不应该包含数字。或者,即便在今天的经济形式下,一辆轿车的价钱不应该只是1美元。正常的应用系统通常需要更加复杂的检查,如果攻击者以设计者不希望的方式任意输入数据,而没有对输入进行合理的验证,可能导致系统的漏洞。如果采取了合理的输入验证措施,现在许多常见的系统漏洞是可以消除的,或者至少可以减少许多。
防范与缓解
1.体系结构与设计
使用输入验证框架,比如Struts 或 OWASP ESAPI 验证API。如果使用Struts,留意一下CWE-101类。
要了解所有可能进入你软件的不可信输入的来源:参数、cookie、从网络上读取的任何数据、环境变量、请求头和请求内容、URL的各组成部分、Email、文件、数据库、以及向软件提供数据的任何外部系统。务必以定义完整的接口进行输入数据的检查。
假设所有的输入都是恶意的,可以使用“只接受已知为好的”输入验证策略(也就是说,使用白名单)。拒绝所有不符合规范的输入,同时可以使用黑名单的机制来拒绝非期望的输入并检测可能的攻击。
使用标准的输入验证机制来验证所有的输入,包括长度、类型、与反、业务规则(business rules),然后才能作进一步的处理。用一个例子说明什么是业务规则逻辑:输入的“boat”可能是符合语义的(假设你期望字母和数字的组合),但是如果你所期望是某种“颜色”,这个输入就是不符合业务规则的。
许多安全检查在客户端完成,但是要确保这些检查在服务器端还要再次检查一遍,以避免CWE-603中出现的用其他客户端软件绕过客户端的检查的情况。
尽管客户端的检查对服务器端的安全帮助不大,但还是有用的。首先客户端的检查对入侵的检测是有帮助的。如果服务器端收到了应该被客户端拒绝的输入,这可能是一种攻击的征兆。其次,客户端的错误检查对正常用户输入有效的数据是有帮助的;第三,客户端的检查可以减少服务器端的处理时间,尽管这种帮助不是很大。
不要依赖黑名单的验证机制去检测恶意的输入或者输出编码(CWE-184,黑名单是不完整的)。对同样的字符可能的编码方式太多,你可能漏掉一些编码的变型。
特别声明:本站注明稿件来源为其他媒体的文/图等稿件均为转载稿,本站转载出于非商业性的教育和科研之目的,并不意味着赞同其观点或证实其内容的真实性。如转载稿涉及版权等问题,请作者在两周内速来电或来函联系。