CWE

常见的弱点枚举

一个由社区开发的软件&硬件缺陷类型的列表

新CWE吗?点击这里!
CWE最重要的硬件的弱点
CWE最危险的弱点
>CWE前25名> 2011
ID

得分连续波

2011年CWE / SANS最危险的软件错误


注意:这是一个以前的版本的前25位。为最新版本在这里


manbetx客户端首页
版权©2011
http://cwe.mitre.org/top25/

文档版本:1.0.3 (pdf)

日期:2011年9月13日

项目协调员:

Bob Martin(斜方)
梅森布朗(无)
艾伦·佩拉(无)
丹尼斯·柯比(无)

文档编辑器:

史蒂夫Christey(斜方)

介绍
介绍

2011年CWE / SANS最危险的软件错误的列表是最普遍和重要错误,都会导致严重的安全漏洞的软件。他们往往容易找到,容易利用。他们是危险的,因为他们会经常允许攻击者完全接管软件,窃取数据,或者防止软件工作。

排名前25位的列表是教育和意识的工具来帮助程序员为了防止瘟疫软件行业的各种漏洞,通过识别和避免人人皆知的软件是发货之前出现的错误。软件客户可以使用相同的列表来帮助他们寻求更安全的软件。研究人员在软件安全可以使用前25的集中在一个狭窄的但重要的子集所有已知的安全漏洞。最后,软件经理和首席信息官可以使用排名前25位的列表作为一个标尺的进步努力获得他们的软件。

列表是SANS研究所之间的合作的结果,斜接,很多顶尖的软件安全专家在美国和欧洲。它利用经验的发展无排名前20位的攻击向量(http://www.sans.org/top20/)、斜方的共同弱点枚举(CWE) (http://cwe.mitre.org/)。斜方维护CWE网站,在美国国土安全部的支持的国家网络安全部门,提供详细描述的前25位为减轻和避免编程错误以及权威的指导。CWE站点包含超过800的数据编程错误,设计错误,和建筑的错误会导致可利用的漏洞。

2011年的前25名改进2010年的名单,但精神和目标保持不变。今年的排名前25位的条目优先来自20多个不同组织的使用输入基于患病率评估每个弱点,重要性,利用的可能性。它使用共同的弱点评分系统(水煤浆)得分和排名最后的结果。排名前25位的列表包括一个小的最有效应对“怪物”,帮助开发者减少或消除整个团体排名前25位的弱点,以及许多的数以百计的弱点CWE所记录的。

表的内容
表的内容

前25名的简要清单
前25名的简要清单

这是一个简短的清单的前25项,使用一般的排名。

注:其他16个弱点被认为包含在前25名中,但是他们一般分数不够高。他们是在一个单独的上市“尖端”页面。

排名 分数 ID 的名字
[1] 93.8 cwe - 89 不当使用中和特殊元素在一个SQL命令(SQL注入)
[2] 83.3 cwe - 78 不当使用中和特殊元素在一个操作系统命令(OS命令注入)
[3] 79.0 cwe - 120 缓冲区复制没有检查输入的大小(经典的缓冲区溢出)
[4] 77.7 cwe - 79 中和不当输入在Web页面生成(“跨站点脚本编制”)
[5] 76.9 cwe - 306 失踪的身份验证的重要功能
[6] 76.8 cwe - 862 失踪的授权
[7] 75.0 cwe - 798 使用硬编码的凭证
[8] 75.0 cwe - 311 失踪的敏感数据的加密
[9] 74.0 cwe - 434 无限制上传文件与危险的类型
[10] 73.8 cwe - 807 依赖不可信的输入在一个安全的决定
[11] 73.1 cwe - 250 执行与不必要的特权
[12] 70.1 cwe - 352 跨站请求伪造(CSRF)
[13] 69.3 CWE-22 不当限制限制目录的路径名(“路径遍历”)
[14] 68.5 cwe - 494 下载的代码没有完整性检查
[15] 67.8 cwe - 863 错误的授权
[16] 66.0 cwe - 829 包含的功能不受信任的控制范围
[17] 65.5 cwe - 732 不正确的权限分配的关键资源
[18] 64.6 cwe - 676 潜在的危险函数的使用
[19] 64.1 cwe - 327 使用损坏或危险的密码算法
[20] 62.4 cwe - 131 不正确的缓冲区大小的计算
[21] 61.5 cwe - 307 不当限制过度的身份验证
[22] 61.1 cwe - 601 URL重定向不可信的网站(“开放重定向”)
[23] 61.0 cwe - 134 不受控制的格式字符串
[24] 60.3 cwe - 190 整数溢出或概括的
[25] 59.9 cwe - 759 使用单向散列没有盐

cwe - 89 - SQL注入了2011年安全漏洞的重拳出击。数据丰富的应用软件,SQL注入的手段窃取王国的钥匙。cwe - 78, OS命令注入,就是应用程序与操作系统交互。经典的缓冲区溢出(cwe - 120)第三,仍然有害毕竟这些几十年。跨站点脚本(cwe - 79)到处都是web应用程序的克星。排在前5是失踪的身份验证(cwe - 306)为关键功能。

指导使用前25名
指导使用前25名

这里有一些指导前25位的不同类型的用户。

用户 活动
程序员新安全 读了简短的清单,然后检查怪物移植部分看到少量的变化在你的实践可以在前25名中有很大的影响。

选择少量的弱点与第一,看看的CWE的详细描述在疲软的更多信息,包括代码示例和具体的措施之一。
有经验的程序员在安全 使用一般的前25位的清单提醒和注意问题最近才变得更加普遍。查阅看到处于页面的其他缺点并没有使最后的前25名;这包括弱点才开始患病率增长或重要性。

如果您已经熟悉特定的弱点,然后查阅CWE的详细描述看看“相关连续波”链接你可能没有充分考虑的变体。

构建自己的怪物移植部分,这样你有一个清晰的理解,自己的减排实践是最有效的,和你的差距所在。

考虑建立一个定制的“n”名单,适合你的需要和实践。查阅常见的弱点风险分析框架(CWRAF)页面的总体框架为构建头n个列表,看看附录C的描述,它是如何完成今年的前25位。开发自己的候选人名单的弱点,用你自己的普遍性和重要性因素和其他因素,你可能希望,那么建立一个度量和比较结果与你的同事,这可能会产生一些富有成果的讨论。
软件项目经理 治疗前25作为早期介入更大努力实现软件安全。战略可能性是覆盖等措施构建安全成熟度模型(BSIMM),SAFECode,OpenSAMM,微软SDL,OWASP asv

检查怪物移植部分,以确定哪些方法可能是最合适的采取,或建立自己的怪物移植和绘制出排名前25位的处理。

考虑建立一个定制的“n”名单,适合你的需要和实践。查阅常见的弱点风险分析框架(CWRAF)页面的总体框架为构建头n个列表,看看附录C的描述,它是如何完成今年的前25位。开发自己的候选人名单的弱点,用你自己的普遍性和重要性因素和其他因素,你可能希望,那么建立一个度量和比较结果与你的同事,这可能会产生一些富有成果的讨论。
软件测试人员

读了简短的清单并考虑如何将这些弱点的知识集成到你的测试。如果你在一个友好的竞争与开发人员,您可能会发现一些惊喜处于条目,或者其他的CWE

在每个indvidual CWE条目细节部分中,您可以获得更多的信息从“技术细节”链接检测方法。回顾CAPEC id的想法的攻击类型,可以推出针对弱点。
软件客户 认识到,市场压力经常推动供应商提供功能丰富的软件,和安全可能不是一个认真的考虑。作为一个客户,你有权利影响供应商提供更安全的产品,让他们知道安全是很重要的。使用前25名帮助设定最低预期由于软件厂商的关注。考虑使用前25作为合同的一部分,语言软件收购过程中。的无应用程序安全采购语言来源于网站提供以客户为中心的语言OWASP安全软件合同附件”,它提供了一个框架,讨论期望和谈判的责任”在客户和供应商之间。国土安全部的其他信息是可用的采购和外包工作小组

查阅常见的弱点风险分析框架(CWRAF)页面的总体框架构建一个头n个列表适合您自己的需要。

你使用的软件产品,密切关注公开报道这些产品中的安全漏洞。看看他们反映的任何相关的弱点在前25名(或您自己的自定义列表),如果是这样,请联系您的供应商确定处理供应商承担风险降到最低,这些缺点将继续引入代码。

看到处于总结其他弱点,并没有使最后的前25名;这将包括弱点,只是开始生长在普遍性和重要性,所以他们可能会在将来成为你的问题。
教育工作者 开始简短的清单。一些培训材料也可用。
用户2010年前25名

看到什么改变了部分;虽然发生了很多变化从表面上看,今年的努力是结构良好的。

Category-Based排名前25位的观点
Category-Based排名前25位的观点

本节类条目到三个高级类别中使用了2009年前25:

  • 安全组件之间的交互
  • 有风险的资源管理
  • 多孔防御

安全组件之间的交互

这些弱点有关不安全的方式发送和接收数据之间单独的组件,模块,程序,进程,线程,或系统。

对于每一个弱点,它的排名一般列表中提供了方括号。

排名 CWE ID 的名字
[1] cwe - 89 不当使用中和特殊元素在一个SQL命令(SQL注入)
[2] cwe - 78 不当使用中和特殊元素在一个操作系统命令(OS命令注入)
[4] cwe - 79 中和不当输入在Web页面生成(“跨站点脚本编制”)
[9] cwe - 434 无限制上传文件与危险的类型
[12] cwe - 352 跨站请求伪造(CSRF)
[22] cwe - 601 URL重定向不可信的网站(“开放重定向”)

有风险的资源管理

这个类别中的弱点有关软件的方式不正确管理创建、使用、转让、或破坏重要系统资源。

排名 CWE ID 的名字
[3] cwe - 120 缓冲区复制没有检查输入的大小(经典的缓冲区溢出)
[13] CWE-22 不当限制限制目录的路径名(“路径遍历”)
[14] cwe - 494 下载的代码没有完整性检查
[16] cwe - 829 包含的功能不受信任的控制范围
[18] cwe - 676 潜在的危险函数的使用
[20] cwe - 131 不正确的缓冲区大小的计算
[23] cwe - 134 不受控制的格式字符串
[24] cwe - 190 整数溢出或概括的

多孔防御

这个类别中的弱点有关防守技术经常被误用,滥用,或仅仅是忽略。

排名 CWE ID 的名字
[5] cwe - 306 失踪的身份验证的重要功能
[6] cwe - 862 失踪的授权
[7] cwe - 798 使用硬编码的凭证
[8] cwe - 311 失踪的敏感数据的加密
[10] cwe - 807 依赖不可信的输入在一个安全的决定
[11] cwe - 250 执行与不必要的特权
[15] cwe - 863 错误的授权
[17] cwe - 732 不正确的权限分配的关键资源
[19] cwe - 327 使用损坏或危险的密码算法
[21] cwe - 307 不当限制过度的身份验证
[25] cwe - 759 使用单向散列没有盐

组织的前25位
组织的前25位

为每个单独的弱点条目,提供的额外信息。主要的观众是为了软件程序员和设计师。

排名 一般的弱点列表的排名。
分数汇总 总结个人的评级和分数都给这个弱点,包括流行、重要性和调整分。
CWE ID和名称 CWE标识符和短名称的弱点
支持信息 补充的弱点可能对决策者有用的信息进一步优化条目。
讨论 短,非正式的讨论弱点的性质和它的后果。避免过于深入挖掘技术细节的讨论。
预防和缓解措施 开发人员可以采取的措施来减轻或消除弱点。开发人员可以选择一个或多个这些变化以适应自己的需要。注意,这些技术的有效性不同,和多种技术可能更大的深度防护相结合。
相关的连续波 其他CWE条目相关的前25位的弱点。注意:这个清单是说明性的,而不是全面的。
一般的父母 一个或多个指针一般CWE条目,所以你可以看到问题的广度和深度。
相关的攻击模式 CAPEC条目的攻击可能成功地进行了反对的弱点。注意:不一定是完整的列表。
其他指针 链接到更多的细节包括源代码示例演示疲软,检测方法等。

支持信息

每个排名前25位的条目包括支持数据字段的普遍弱点,技术的影响,和其他信息。每个条目还包括以下数据字段。

描述
攻击频率 频率的缺点出现在漏洞被攻击者利用。
方便检测 攻击者很容易找到这个弱点。
修复的成本 所需的努力修复的弱点。
攻击者的意识 攻击者的可能性将会意识到这个缺点,为检测方法,开发的方法。

看到附录A为更多的细节。

CWE的详细描述
CWE的详细描述

本节提供细节为每个单独的CWE条目,随着更多信息的链接。看到组织的前25位部分解释的各个领域。

1 cwe - 89:不当中和特殊元素中使用一个SQL命令(SQL注入)

总结
弱点患病率 后果 数据丢失、安全旁路
修复的成本 方便检测 容易
攻击频率 经常 攻击者的意识

讨论

这些天,似乎软件都是关于数据:到数据库,从数据库中拉,按摩到信息,并将其发送给其他地方为了好玩和利润。如果攻击者可以影响SQL,您使用与数据库通信,然后突然你所有的乐趣和利润属于他们。如果您使用SQL查询认证等安全控制,攻击者可能会改变这些查询的逻辑绕过安全。他们可以修改查询来偷,腐败,或者改变你的基础数据。他们甚至会偷一次一个字节的数据如果他们,和他们有耐心和知识。2011年,SQL注入负责许多知名组织的妥协,包括索尼、PBS, MySQL.com,安全公司HBGary Federal,和许多其他人。

技术细节|代码示例|检测方法|引用

预防和缓解措施
架构和设计
使用审查库或框架不允许这个弱点发生或提供了结构,使这个弱点更容易避免的。

例如,考虑使用持久性层如Hibernate或Enterprise Java bean,它可以提供重要的防止SQL注入如果使用得当。
架构和设计
如果可用,使用结构化机制自动执行数据和代码之间的分离。这些机制可以提供相关的引用,编码,自动验证,而不是依赖于开发人员提供此功能在每一个点生成输出。

过程使用预处理语句的SQL查询,参数化查询或存储过程。这些特性应该接受和支持强类型参数或变量。不能动态地构建和执行查询字符串内使用“执行”或类似的功能,这些功能你可能重新引入SQL注入的可能性。
架构和设计,操作
使用所需的最低特权运行您的代码来完成必要的任务。如果可能的话,创建独立帐户权限有限,只用于一个任务。这样,一个成功的攻击不会立即给攻击者访问其他软件或其环境。例如,数据库应用程序很少需要作为数据库管理员运行,特别是在日常操作。

具体来说,遵循最小特权原则在创建SQL数据库用户帐户。数据库用户应该只有必要的最低特权使用他们的帐户。如果系统的需求表明,用户可以阅读和修改自己的数据,然后限制他们的特权,所以他们不能读/写别人的数据。尽可能使用最严格的权限对所有数据库对象,例如execute-only存储过程。
架构和设计
对于任何一个在客户端执行安全检查,确保这些检查复制在服务器端,为了避免cwe - 602。攻击者可以绕过客户端检查通过修改值后,检查执行,或通过改变客户端完全删除客户端检查。然后,这些修改的值将被提交到服务器。
实现
如果你需要使用动态生成的查询字符串或命令尽管风险,正确引用参数和任何特殊字符转义在这些参数。最保守的方法是逃跑或者过滤所有字符,不通过一个极其严格的白名单(如一切不是字母数字或空白)。如果仍然需要一些特殊字符,如空格,每个参数封装在引号转义后/过滤步骤。小心论证注入(cwe - 88)。

而不是建立自己的实现,这些特性可用的数据库或编程语言。例如,Oracle DBMS_ASSERT包可以检查或强制参数有一定的属性,使他们更容易受到SQL注入。对于MySQL, mysql_real_escape_string () API函数可用于C和PHP。
实现
假设所有的输入是恶意的。使用一个“接受良好的“输入验证策略,即。,use a whitelist of acceptable inputs that strictly conform to specifications. Reject any input that does not strictly conform to specifications, or transform it into something that does. Do not rely exclusively on looking for malicious or malformed inputs (i.e., do not rely on a blacklist). However, blacklists can be useful for detecting potential attacks or determining which inputs are so malformed that they should be rejected outright.

当执行输入验证,考虑所有可能相关的属性,包括长度,类型的输入,可接受的值的全系列,缺失或额外的输入,语法,一致性相关领域,符合业务规则。作为业务规则逻辑的一个例子,在语法上“船”可能是有效的,因为它只包含字母数字字符,但它不是有效的如果你期望的颜色,如“红”或“蓝色”。

当构造SQL查询字符串,使用严格的白名单,限制字符集基于请求中的参数的期望值。这将间接限制的范围攻击,但这种技术没有适当的重要输出编码和逃避。

注意,适当的输出编码、逃避和引用防止SQL注入的是最有效的解决方案,尽管输入验证可能提供一些深度防护。这是因为它有效地限制了将出现在输出。输入验证不会总是阻止SQL注入,尤其是如果您需要支持自由格式的文本字段可以包含任意字符。例如,”O ' reilly”这个名字可能会通过验证步骤,因为它是一种常见的英语姓氏。但是,它不能直接插入到数据库,因为它包含了““撇号的角色,这将需要转义或以其他方式处理。在这种情况下,剥离撇号可能减少SQL注入的风险,但是它会产生不正确的行为,因为错误的名字将被记录下来。

在可行的情况下,它可能是最安全的完全禁止元字符,而不是逃避它们。这将提供一些深度防御。数据进入数据库后,后来过程可能忽视逃避元字符前使用,,你可能没有控制这些流程。
架构和设计
组接受对象时,如文件名或url,是有限的或已知,从一组固定的输入值创建一个映射(比如数字id)实际的文件名或url,并拒绝所有其他输入。
实现
确保错误消息只包含最小的细节,是有用的目标受众,并没有其他人。消息需要罢工之间的平衡过于神秘,不够的。他们应该不一定揭示的方法被用来确定错误。如此详细的信息可以用来改进原攻击来增加成功的机会。

如果必须跟踪错误在某些细节,捕捉他们的日志消息,但想想可能发生如果日志消息可以被攻击者。避免任何形式的记录高度敏感的信息,如密码。避免不一致的消息可能会意外地提示攻击者对内部状态,如用户名是否有效。

在SQL注入的情况下,错误消息显示SQL查询的结构可以帮助攻击者成功攻击裁缝字符串。
操作
使用应用程序防火墙,可以检测到攻击这个弱点。它可以是有益的情况下,代码不能固定(因为它是由第三方控制),作为一项紧急预防措施,更全面的软件保证措施被应用,或者提供深度防御。

有效性:温和

注:应用程序防火墙不可能涵盖所有可能的输入向量。此外,攻击技术可能可以绕过保护机制,比如使用畸形的输入,仍然可以由组件接收处理这些输入。根据功能的不同,应用程序防火墙可能会无意中拒绝或修改合法请求。最后,一些手动工作可能需要定制。
操作,实现
如果您使用的是PHP配置您的应用程序,以便它不使用register_globals。在实现,开发应用程序,以便它不依赖于这个特性,但是小心实现register_globals的模拟cwe - 95等弱点,cwe - 621,和类似的问题。
相关的连续波
cwe - 90 不当使用中和特殊元素在LDAP查询(LDAP注入)
cwe - 564 SQL注入:冬眠
cwe - 566 授权旁路通过用户控制SQL主键
cwe - 619 悬空数据库游标(光标注入)
相关的攻击模式

CAPEC-IDs:(查看所有)
7,66年,108年,109年,110年

2 cwe - 78:不当中和特殊元素中使用一个操作系统命令(OS命令注入)

总结
弱点患病率 媒介 后果 代码执行
修复的成本 媒介 方便检测 容易
攻击频率 经常 攻击者的意识

讨论

你的软件通常是一个局外人在网络之间的桥梁,您的操作系统的内部。当您调用另一个程序上的操作系统,但你让不受信任的输入输入的命令字符串生成的执行计划,那么你就邀请攻击者穿过那座桥到土地财富的执行自己的命令,而不是你的。

技术细节|代码示例|检测方法|引用

预防和缓解措施
架构和设计
如果可能的话,使用库调用而不是外部流程重建所需的功能。
架构和设计,操作
运行您的代码在一个“监狱”或类似沙箱环境,执行严格的流程和操作系统之间的边界。这可能有效地限制哪些文件可以在一个特定的目录或访问哪些命令可以执行您的软件。

操作系统的例子包括Unix chroot监狱,AppArmor对,SELinux。在一般情况下,托管代码可能会提供一些保护。例如,java。在Java SecurityManager FilePermission允许您指定文件操作的限制。

这可能不是一个可行的解决方案,它只限制对操作系统的影响;应用程序的其余部分可能仍然接受妥协。

应该注意避免cwe - 243和相关弱点监狱。

有效性:有限

指出:这种缓解的有效性取决于特定的沙盒或监狱的预防功能使用,只可能有助于减少攻击的范围,比如限制某些系统调用或限制的攻击者可以访问文件系统的一部分。
架构和设计
对于任何数据将被用来生成一个命令执行,让尽可能多的数据的外部控制。例如,在web应用程序中,这可能需要将数据存储在会话的状态,而不是发送到客户端在一个隐藏的表单字段。
架构和设计
对于任何一个在客户端执行安全检查,确保这些检查复制在服务器端,为了避免cwe - 602。攻击者可以绕过客户端检查通过修改值后,检查执行,或通过改变客户端完全删除客户端检查。然后,这些修改的值将被提交到服务器。
架构和设计
使用审查库或框架不允许这个弱点发生或提供了结构,使这个弱点更容易避免的。

例如,考虑使用ESAPI编码控制或类似的工具,库或框架。这些将帮助程序员编码输出的方式不容易错误。
实现
如果你需要使用动态生成的查询字符串或命令尽管风险,正确引用参数和任何特殊字符转义在这些参数。最保守的方法是逃跑或者过滤所有字符,不通过一个极其严格的白名单(如一切不是字母数字或空白)。如果仍然需要一些特殊字符,如空格,每个参数封装在引号转义后/过滤步骤。小心论证注入(cwe - 88)。
实现
如果要执行的程序允许参数被指定在一个输入文件或标准输入,那么考虑使用模式传递参数,而不是命令行。
架构和设计
如果可用,使用结构化机制自动执行数据和代码之间的分离。这些机制可以提供相关的引用,编码,自动验证,而不是依赖于开发人员提供此功能在每一个点生成输出。

一些语言提供多种功能,可用于调用命令。在可能的情况下,识别任何函数调用命令shell使用一个字符串,并替换函数,需要个人参数。这些函数通常执行适当的引用和过滤参数。例如,在C语言中,系统()函数接受一个字符串,该字符串包含整个执行命令,而execl (), execve(),和其他需要一个字符串数组,每个参数。在Windows中,CreateProcess()只接受一个命令。在Perl中,如果系统()提供了一组参数,那么它将引用的每个参数。
实现
假设所有的输入是恶意的。使用一个“接受良好的“输入验证策略,即。,use a whitelist of acceptable inputs that strictly conform to specifications. Reject any input that does not strictly conform to specifications, or transform it into something that does. Do not rely exclusively on looking for malicious or malformed inputs (i.e., do not rely on a blacklist). However, blacklists can be useful for detecting potential attacks or determining which inputs are so malformed that they should be rejected outright.

当执行输入验证,考虑所有可能相关的属性,包括长度,类型的输入,可接受的值的全系列,缺失或额外的输入,语法,一致性相关领域,符合业务规则。作为业务规则逻辑的一个例子,在语法上“船”可能是有效的,因为它只包含字母数字字符,但它不是有效的如果你期望的颜色,如“红”或“蓝色”。

当构建操作系统命令字符串,使用严格的白名单限制字符集基于请求中的参数的期望值。这将间接限制的范围攻击,但这种技术没有适当的重要输出编码和逃避。

注意,适当的输出编码、逃避和引用是防止OS命令注入最有效的解决方法,尽管输入验证可能提供一些深度防护。这是因为它有效地限制了将出现在输出。输入验证不会总是阻止OS命令注入,尤其是当你需要支持自由格式的文本字段可以包含任意字符。例如,当调用一个邮件程序中,您可能需要允许主题字段包含危险输入”;“和”>“字符,否则需要转义或处理。在这种情况下,剥离的字符可能会降低OS命令注入的风险,但是它会产生不正确的行为,因为主题字段将不会记录为用户的目的。这可能似乎是一个小小的不便,但它可能是更重要的是当程序依赖于结构良好的主题行,以将消息传递给其他组件。

即使你犯了一个错误在你的验证(如100年忘记一个输入字段),适当的编码仍可能会保护你免受喷射的攻击。只要不是做隔离,输入验证仍然是一个有用的技术,因为它可能会大大降低你的攻击面,让你发现一些攻击,并提供其他安全的好处,适当的编码并没有解决。
架构和设计
组接受对象时,如文件名或url,是有限的或已知,从一组固定的输入值创建一个映射(比如数字id)实际的文件名或url,并拒绝所有其他输入。
操作
运行代码的一个执行自动的环境污染传播,防止使用受污染的任何命令执行变量,比如Perl的“t”开关。这将迫使你执行验证步骤,消除污染,尽管你必须小心正确验证您的输入,这样你就不会意外危险的输入标记为未染污的(见cwe - 183和cwe - 184)。
实现
确保错误消息只包含最小的细节,是有用的目标受众,并没有其他人。消息需要罢工之间的平衡过于神秘,不够的。他们应该不一定揭示的方法被用来确定错误。如此详细的信息可以用来改进原攻击来增加成功的机会。

如果必须跟踪错误在某些细节,捕捉他们的日志消息,但想想可能发生如果日志消息可以被攻击者。避免任何形式的记录高度敏感的信息,如密码。避免不一致的消息可能会意外地提示攻击者对内部状态,如用户名是否有效。

在OS命令注入,错误信息返回给用户可能揭示是否正在执行一个操作系统命令,并可能正在使用哪个命令。
操作
使用运行时策略实施来创建一个允许命令的白名单,然后避免使用任何命令,不出现在白名单中。技术,如AppArmor对可用。
操作
使用应用程序防火墙,可以检测到攻击这个弱点。它可以是有益的情况下,代码不能固定(因为它是由第三方控制),作为一项紧急预防措施,更全面的软件保证措施被应用,或者提供深度防御。

有效性:温和

注:应用程序防火墙不可能涵盖所有可能的输入向量。此外,攻击技术可能可以绕过保护机制,比如使用畸形的输入,仍然可以由组件接收处理这些输入。根据功能的不同,应用程序防火墙可能会无意中拒绝或修改合法请求。最后,一些手动工作可能需要定制。
架构和设计,操作
使用所需的最低特权运行您的代码来完成必要的任务。如果可能的话,创建独立帐户权限有限,只用于一个任务。这样,一个成功的攻击不会立即给攻击者访问其他软件或其环境。例如,数据库应用程序很少需要作为数据库管理员运行,特别是在日常操作。
操作,实现
如果您使用的是PHP配置您的应用程序,以便它不使用register_globals。在实现,开发应用程序,以便它不依赖于这个特性,但是小心实现register_globals的模拟cwe - 95等弱点,cwe - 621,和类似的问题。
相关的连续波
cwe - 88 参数注入或修改
相关的攻击模式

CAPEC-IDs:(查看所有)
6,15,43,88年,108年

3 cwe - 120:没有检查大小的缓冲区拷贝输入(经典的缓冲区溢出)

总结
弱点患病率 后果 代码执行拒绝服务,数据丢失
修复的成本 方便检测 容易
攻击频率 经常 攻击者的意识

讨论

缓冲区溢出是大自然母亲的小提醒,物理定律说:如果你想把更多的东西放到一个容器超过它所能容纳的量,你会搞得一团糟。几十年来C应用程序的祸害,缓冲区溢位已经消除。然而,复制一个不可信的输入没有检查的大小,输入是最简单的错误在的时候有更有趣的,以避免错误。这就是为什么这种类型的缓冲区溢出通常被称为“经典”。It's decades old, and it's typically one of the first things you learn about in Secure Programming 101.

技术细节|代码示例|检测方法|引用

预防和缓解措施
需求
使用一种语言,不允许这个弱点或发生提供了结构,使这个弱点更容易避免的。

例如,执行自己的内存管理的多种语言,比如Java和Perl,不受缓冲区溢出。其他语言,比如Ada和c#,通常提供溢出保护,但保护由程序员可以禁用。

警惕,语言的接口本地代码仍有可能溢出,即使语言本身在理论上是安全的。
架构和设计
使用审查库或框架不允许这个弱点发生或提供了结构,使这个弱点更容易避免的。

例子包括安全C字符串库(SafeStr)混乱和Viega Strsafe系列。图书馆从微软h。这些库提供的安全版本overflow-prone字符串处理函数。

注:这不是一个完整的解决方案,因为许多缓冲区溢位字符串并不相关。
构建和编译
使用功能或运行或编译软件扩展自动提供一个保护机制,减轻或消除缓冲区溢出。

例如,某些编译器和扩展提供自动缓冲区溢出检测机制,构建到编译后的代码。例子包括Microsoft Visual Studio / GS标志,Fedora / Red Hat FORTIFY_SOURCE GCC国旗,StackGuard, ProPolice。

有效性:深度防御

注:这个不一定是一个完整的解决方案,因为这些机制只能检测某些类型的溢出。此外,仍有可能导致拒绝服务的攻击,因为典型的反应是退出应用程序。
实现
考虑遵守以下规则,分配和管理应用程序的内存:

仔细检查你的缓冲区一样大你指定。

当使用函数接受一个复制的字节数,如strncpy(),请注意,如果目的地缓冲区大小等于源缓冲区大小,不得NULL-terminate字符串。

检查缓冲边界如果访问一个循环缓冲区和确保你不是写过去的危险分配空间。

如果有必要,所有输入字符串截断合理长度之前他们复制和连接功能。
实现
假设所有的输入是恶意的。使用一个“接受良好的“输入验证策略,即。,use a whitelist of acceptable inputs that strictly conform to specifications. Reject any input that does not strictly conform to specifications, or transform it into something that does. Do not rely exclusively on looking for malicious or malformed inputs (i.e., do not rely on a blacklist). However, blacklists can be useful for detecting potential attacks or determining which inputs are so malformed that they should be rejected outright.

当执行输入验证,考虑所有可能相关的属性,包括长度,类型的输入,可接受的值的全系列,缺失或额外的输入,语法,一致性相关领域,符合业务规则。作为业务规则逻辑的一个例子,在语法上“船”可能是有效的,因为它只包含字母数字字符,但它不是有效的如果你期望的颜色,如“红”或“蓝色”。
架构和设计
对于任何一个在客户端执行安全检查,确保这些检查复制在服务器端,为了避免cwe - 602。攻击者可以绕过客户端检查通过修改值后,检查执行,或通过改变客户端完全删除客户端检查。然后,这些修改的值将被提交到服务器。
操作
使用功能地址空间布局随机化(本)。

有效性:深度防御

注:这不是一个完整的解决方案。然而,它迫使攻击者猜测一个未知值,改变每一个程序执行。此外,仍有可能导致拒绝服务的攻击,因为典型的反应是退出应用程序。
操作
使用一个CPU和操作系统提供数据执行保护(NX)或其等价的。

有效性:深度防御

注:这不是一个完整的解决方案,因为缓冲区溢位可以用来覆盖附近的变量以危险的方式修改软件的状态。此外,它不能用于变为无效来情况下,代码是必需的。最后,仍可能导致拒绝服务的攻击,因为典型的反应是退出应用程序。
构建和编译、操作
大多数减轻技术迄今为止在编译器或操作系统级别的地址只有一个子集的缓冲区溢位问题,甚至很少提供完整的保护,子集。是一种很好的做法来实现策略来增加攻击者的工作负载,比如让攻击者猜测一个未知值,改变每一个程序执行。
实现
取代无限复制函数具有类似的功能,支持长度参数,如拷贝字符串strncpy。创建这些如果他们不是可用的。

有效性:温和

指出:这种方法仍然是容易计算错误,包括“从一开始”问题,如错误(cwe - 193)和错误地计算缓冲区长度(cwe - 131)。
架构和设计
组接受对象时,如文件名或url,是有限的或已知,从一组固定的输入值创建一个映射(比如数字id)实际的文件名或url,并拒绝所有其他输入。
架构和设计,操作
使用所需的最低特权运行您的代码来完成必要的任务。如果可能的话,创建独立帐户权限有限,只用于一个任务。这样,一个成功的攻击不会立即给攻击者访问其他软件或其环境。例如,数据库应用程序很少需要作为数据库管理员运行,特别是在日常操作。
架构和设计,操作
运行您的代码在一个“监狱”或类似沙箱环境,执行严格的流程和操作系统之间的边界。这可能有效地限制哪些文件可以在一个特定的目录或访问哪些命令可以执行您的软件。

操作系统的例子包括Unix chroot监狱,AppArmor对,SELinux。在一般情况下,托管代码可能会提供一些保护。例如,java。在Java SecurityManager FilePermission允许您指定文件操作的限制。

这可能不是一个可行的解决方案,它只限制对操作系统的影响;应用程序的其余部分可能仍然接受妥协。

应该注意避免cwe - 243和相关弱点监狱。

有效性:有限

指出:这种缓解的有效性取决于特定的沙盒或监狱的预防功能使用,只可能有助于减少攻击的范围,比如限制某些系统调用或限制的攻击者可以访问文件系统的一部分。
相关的连续波
cwe - 129 不当的验证数组索引
cwe - 131 不正确的缓冲区大小的计算
相关的攻击模式

CAPEC-IDs:(查看所有)
8,9,10,14,24,42,44,45,46,47,67年,92年,One hundred.

4 cwe - 79:中和不当输入在Web页面生成(“跨站点脚本编制”)

总结
弱点患病率 后果 代码执行,安全旁路
修复的成本 方便检测 容易
攻击频率 经常 攻击者的意识

讨论

跨站点脚本(XSS)是一种最普遍、最顽固,和危险的漏洞在web应用程序中。这是几乎不可避免的,当你把HTTP无状态的本质,数据和脚本的混合物在HTML中,很多网站之间的数据传递,不同的编码方案,和功能丰富的web浏览器。如果你不小心,攻击者可以注入Javascript或其他browser-executable内容应用程序生成一个web页面。然后由其他用户访问网页,浏览器的执行恶意脚本好像来自你(因为,毕竟,它* *来自你)。突然,你的网站是你没有写的代码。攻击者可以使用各种技术来获得直接输入到您的服务器,或者使用一个不知情的受害者的中间人技术版本的“你为什么一直打自己?”游戏。

技术细节|代码示例|检测方法|引用

预防和缓解措施
架构和设计
使用审查库或框架不允许这个弱点发生或提供了结构,使这个弱点更容易避免的。

库和框架的例子更容易生成正确编码输出包括微软的Anti-XSS图书馆,OWASP ESAPI编码模块,和Apache Wicket。
实现,架构和设计
理解的上下文将使用您的数据编码,将预期。这是特别重要的不同组件之间传送数据的时候,或者当生成输出可以包含多个编码同时,如web页面或多部分邮件。研究所有预期的通信协议以及数据表现方式来决定所需要的编码策略。

任何数据,输出到另一个网页,特别是收到任何数据从外部输入,使用适当的编码在所有非字母数字的字符。

部分相同的输出文档可能需要不同的编码,这将取决于是否输出是:

HTML的身体

元素属性(如src = " XYZ ")

uri

JavaScript部分

层叠样式表和样式属性

等等。注意HTML实体编码只适合身体的HTML。

查阅XSS预防备忘单[REF-16]更多细节所需类型的编码和逃避。
架构和设计,实现
理解所有潜在的地区不受信任的输入可以输入软件:参数或参数,饼干,任何从网络读取环境变量,反向DNS查找,查询结果,请求头,URL组件、电子邮件、文件、文件名、数据库,以及任何外部系统提供数据的应用程序。记住,这样的投入可以获得间接通过API调用。

有效性:有限

指出:这种技术效果有限,但可以帮助时可以在服务器端存储客户端状态和敏感信息而不是饼干,头,隐藏的表单字段,等等。
架构和设计
对于任何一个在客户端执行安全检查,确保这些检查复制在服务器端,为了避免cwe - 602。攻击者可以绕过客户端检查通过修改值后,检查执行,或通过改变客户端完全删除客户端检查。然后,这些修改的值将被提交到服务器。
架构和设计
如果可用,使用结构化机制自动执行数据和代码之间的分离。这些机制可以提供相关的引用,编码,自动验证,而不是依赖于开发人员提供此功能在每一个点生成输出。
实现
为每一个web页面生成、使用和指定一个字符编码,如iso - 8859 - 1或utf - 8。如果不指定一个编码,web浏览器可能会选择不同的编码通过猜测哪些编码实际上是使用的web页面。这可能会导致web浏览器来治疗某些特殊序列,开放客户端微妙的XSS攻击。看到cwe - 116更多的移植相关编码/逃离。
实现
使用Struts,你应该写所有的数据表单bean与bean的过滤器属性设置为true。
实现
帮助减轻XSS攻击用户的会话cookie, HttpOnly设置会话cookie。在浏览器支持HttpOnly特性(比如最近版本的Internet Explorer和Firefox),这个属性可以防止用户的会话cookie访问恶意使用。com的客户端脚本。这不是一个完整的解决方案,因为HttpOnly不是所有浏览器都支持的。更重要的是,XMLHTTPRequest和其他强大的浏览器技术提供读访问HTTP头信息,包括set - cookie HttpOnly标志设置的标题。

有效性:深度防御
实现
假设所有的输入是恶意的。使用一个“接受良好的“输入验证策略,即。,use a whitelist of acceptable inputs that strictly conform to specifications. Reject any input that does not strictly conform to specifications, or transform it into something that does. Do not rely exclusively on looking for malicious or malformed inputs (i.e., do not rely on a blacklist). However, blacklists can be useful for detecting potential attacks or determining which inputs are so malformed that they should be rejected outright.

当执行输入验证,考虑所有可能相关的属性,包括长度,类型的输入,可接受的值的全系列,缺失或额外的输入,语法,一致性相关领域,符合业务规则。作为业务规则逻辑的一个例子,在语法上“船”可能是有效的,因为它只包含字母数字字符,但它不是有效的如果你期望的颜色,如“红”或“蓝色”。

当动态地构建web页面,使用严格的白名单,限制字符集基于请求中的参数的期望值。所有输入都应该验证和洁净,不仅仅是用户应该指定参数,但请求中所有数据,包括隐藏字段,饼干,标题、URL本身,等等。一个常见的错误导致持续的XSS漏洞仅是验证字段将被显示的网站。通常看到的数据请求所反映的应用服务器或应用程序开发团队没有预料到。一个字段,目前不是反映未来的开发人员可以使用。因此,建议验证HTTP请求的所有部分。

注意,适当的输出编码、逃避和防止XSS的引用是最有效的解决方案,尽管输入验证可能提供一些深度防护。这是因为它有效地限制了将出现在输出。输入验证不会总是防止XSS,尤其是如果您需要支持自由格式的文本字段可以包含任意字符。例如,在一个聊天应用程序,心表情符号(< 3)可能会通过验证步骤,因为它是常用的。但是,它不能直接插入到web页面,因为它包含了“<”性格,这需要转义或以其他方式处理。在这种情况下,剥离“<”可能降低XSS的风险,但它会产生不正确的行为,因为表情符号不会被记录下来。这可能似乎是一个小小的不便,但更重要的在一个数学论坛,想代表不平等。

即使你犯了一个错误在你的验证(如100年忘记一个输入字段),适当的编码仍可能会保护你免受喷射的攻击。只要不是做隔离,输入验证仍然是一个有用的技术,因为它可能会大大降低你的攻击面,让你发现一些攻击,并提供其他安全的好处,适当的编码并没有解决。

确保您在应用程序中定义良好的接口执行输入验证。这将有助于保护应用程序即使某个组件的重用或搬地方了。
架构和设计
组接受对象时,如文件名或url,是有限的或已知,从一组固定的输入值创建一个映射(比如数字id)实际的文件名或url,并拒绝所有其他输入。
操作
使用应用程序防火墙,可以检测到攻击这个弱点。它可以是有益的情况下,代码不能固定(因为它是由第三方控制),作为一项紧急预防措施,更全面的软件保证措施被应用,或者提供深度防御。

有效性:温和

注:应用程序防火墙不可能涵盖所有可能的输入向量。此外,攻击技术可能可以绕过保护机制,比如使用畸形的输入,仍然可以由组件接收处理这些输入。根据功能的不同,应用程序防火墙可能会无意中拒绝或修改合法请求。最后,一些手动工作可能需要定制。
操作,实现
如果您使用的是PHP配置您的应用程序,以便它不使用register_globals。在实现,开发应用程序,以便它不依赖于这个特性,但是小心实现register_globals的模拟cwe - 95等弱点,cwe - 621,和类似的问题。
相关的连续波
cwe - 82 不当中和脚本属性IMG标记的Web页面
cwe - 85 翻了一番个性XSS操作
cwe - 87 中和不当交替XSS语法
cwe - 692 跨站点脚本编制不完整的黑名单
相关的攻击模式

CAPEC-IDs:(查看所有)
18,19,32,63年,85年,86年,91年,106年,198年,199年,209年,232年,243年,244年,245年,246年,247年

5 cwe - 306:失踪的关键函数的身份验证

总结
弱点患病率 常见的 后果 安全绕过
修复的成本 低到高 方便检测 温和的
攻击频率 有时 攻击者的意识

讨论

在无数的动作片,恶棍闯进了一戒备森严的建筑通过加热管道或管道爬行,缩放电梯井,或隐藏在一个移动的车。这工作,因为通路进入大楼没有那些好管闲事的保安要求出示证件。软件可能使某些关键功能的假设,没有人会认为试图做任何事情,但在前门。但是攻击者知道如何联合和找出替代的方式进入系统。

技术细节|代码示例|检测方法|引用

预防和缓解措施
架构和设计
将软件分为匿名的,正常的,特权和行政区域。确定哪些领域需要验证用户身份,并使用一个集中的身份验证功能。

识别所有潜在的沟通渠道,或其他的与软件的交互手段,确保所有通道是适当的保护。开发人员有时执行身份验证的主要渠道,但打开一个二级频道,被认为是私有的。例如,登录机制可能是监听一个网络端口,但成功的身份验证之后,它可能会打开一个端口,等待连接,但避免了身份验证,因为它假定只有经过身份验证的党将连接到端口。

一般来说,如果软件或协议允许单个会话或用户状态持续多个连接或渠道,需要使用身份验证和适当的凭证管理。
架构和设计
对于任何一个在客户端执行安全检查,确保这些检查复制在服务器端,为了避免cwe - 602。攻击者可以绕过客户端检查通过修改值后,检查执行,或通过改变客户端完全删除客户端检查。然后,这些修改的值将被提交到服务器。
架构和设计
在可能的情况下,避免实施定制的身份验证例程和考虑使用身份验证周边框架提供的功能,操作系统,或环境。这些可能更容易提供一个清晰的分离验证任务和授权的任务。

在万维网等环境中,身份验证和授权的界限有时是模糊的。如果需要自定义的身份验证例程,而不是那些提供的服务器,那么这些例程必须适用于每一个页面,因为这些页面可以直接要求。
架构和设计
使用审查库或框架不允许这个弱点发生或提供了结构,使这个弱点更容易避免的。

例如,考虑使用与身份验证功能,如OpenSSL库或ESAPI身份。
相关的连续波
cwe - 302 认证绕过Assumed-Immutable数据
cwe - 307 不当限制过度的身份验证
相关的攻击模式

CAPEC-IDs:(查看所有)
12,36,40,62年,225年

6 cwe - 862:失踪的授权

总结
弱点患病率 后果 安全绕过
修复的成本 低到中等 方便检测 温和的
攻击频率 经常 攻击者的意识

讨论

假设你举办聚会几个亲密的朋友和他们的客人。你邀请大家进入你的客厅,但是当你赶上你的一个朋友,其中一个客人袭击你的冰箱,偷看到你的药箱,思考你藏在你的床旁边的床头柜上。软件面临类似的授权问题,可能会导致更严重的后果。如果你不确保您的软件的用户只有做他们允许,那么攻击者会试图利用你的授权和不当锻炼未经授权的功能,你只用于限制用户。2011年5月,花旗集团(Citigroup)显示,它已经被黑客可以盗取的成千上万的银行账户信息通过改变帐户信息出现在URL字段;授权会检查用户的权限来访问指定的账户。前,一个类似缺少授权攻击被用来窃取私人信息的iPad用户从一个美国电话电报公司(AT&T)的网站。

技术细节|代码示例|检测方法|引用

预防和缓解措施
架构和设计
将应用程序划分为匿名的,正常的,特权和行政区域。减少攻击表面通过仔细映射角色的数据和功能。使用基于角色的访问控制(RBAC)执行的角色在适当的界限。

注意,这个方法可能不是防止水平授权,即。,它不会保护用户免受攻击别人用同样的角色。
架构和设计
确保您执行访问控制检查相关的业务逻辑。这些检查可能是不同的访问控制检查适用于更一般的资源(如文件、连接、进程、内存和数据库记录。例如,一个数据库可能限制医疗记录到一个特定的数据库的访问用户,但每个记录可能只是为了访问病人和病人的医生。
架构和设计
使用审查库或框架不允许这个弱点发生或提供了结构,使这个弱点更容易避免的。

例如,考虑使用授权框架如JAAS授权框架和OWASP ESAPI访问控制功能。
架构和设计
对于web应用程序,确保访问控制机制是正确的每一页都在服务器端执行。用户不能访问任何未经授权的功能或信息,只需请求直接访问该页面。

要做到这一点的方法之一是确保包含敏感信息的所有页面不缓存,,所有此类页面限制访问请求都伴随着一个活跃的和经过身份验证的会话令牌关联到一个用户所需的权限访问该页面。
系统配置、安装
使用您的操作系统的访问控制功能和服务器环境,并相应地定义访问控制列表。使用“默认否认”政策在定义这些acl。
相关的连续波
cwe - 425 直接请求(“强迫浏览”)
cwe - 639 授权旁路通过用户控制的关键
cwe - 732 不正确的权限分配的关键资源
cwe - 749 暴露危险的方法或函数
相关的攻击模式

CAPEC-IDs:(查看所有)
1,17,58,122年,180年

7 cwe - 798:使用硬编码的凭证

总结
弱点患病率 媒介 后果 安全绕过
修复的成本 中等到高 方便检测 温和的
攻击频率 很少 攻击者的意识

讨论

硬编码密码或cryptograpic键进入您的程序是一种不好的习惯,即使它使它非常方便,对熟练反向工程师。虽然它可能缩小您的测试和支持预算,它可以减少灰尘的安全你的客户。如果密码是相同的所有您的软件,然后每一位客户成为脆弱如果相反,当你密码就知道。因为它是硬编码的,它通常是一个巨大的疼痛让系统管理员解决。你知道他们有多爱不便凌晨2点时网络被攻击,相当于你会喜欢对一群愤怒的客户和大量的负面新闻,如果你的小秘密应该出去。大多数CWE的前25名可以被解释为一个诚实的错误;然而,对于这个问题,许多客户不这么看。高调的Stuxnet蠕虫病毒,导致伊朗核站点运营问题,使用硬编码的凭证来传播。硬编码的凭证产生的另一种方式是通过未加密或混淆存储在一个配置文件,注册表键,或其他位置,只是为了可以给管理员。虽然这是礼貌多埋在二进制程序,它不能被修改,它变成了一个坏主意对外公开此文件通过宽松的权限或其他方式。

技术细节|代码示例|检测方法|引用

预防和缓解措施
架构和设计
出站身份验证:存储密码,钥匙,和其他凭证代码之外的强烈保护,加密配置文件或数据库受访问的所有外人,包括其他本地用户在同一个系统上。适当的保护(cwe - 320)的关键。如果你不能使用加密来保护文件,然后确保尽可能严格的权限。

在Windows环境中,加密文件系统(EFS)可能会提供一些保护。
架构和设计
入站认证:而不是硬编码一个默认的用户名和密码,钥匙,或其他身份验证凭证登录,首次利用“第一次登录”模式,要求用户输入一个独特的强密码或密钥。
架构和设计
如果软件必须包含硬编码的凭证或者他们不能被删除掉,执行访问控制检查,限制哪些实体可以访问功能,需要硬编码的凭证。例如,一个特性可能只有通过系统控制台,而不是通过一个网络连接。
架构和设计
对于入站使用密码身份验证:强大的单向散列适用于你的密码并将这些散列存储在一个配置文件或数据库以适当的访问控制。这样,窃取文件/数据库仍然需要攻击者试图破解密码。在处理期间传入密码身份验证,密码的哈希和比较哈希,你救了。

使用随机分配为每个单独的散列,生成盐。这增加的计算量,攻击者需要进行强力攻击,这可能限制彩虹表法的有效性。
架构和设计
前端到后端连接:三个解决方案是可行的,尽管没有人完成。

生成的第一个建议是使用密码或密钥自动改变,必须在给定的时间间隔输入系统管理员。这些密码将在内存中,只有有效的时间间隔。

接下来,密码或密钥只能有限在后端执行操作有效的前端,而不是完整的访问。

最后,发送的消息应该标记和校验和值,以防止replay-style攻击时间敏感。
相关的连续波
cwe - 259 使用硬编码的密码
cwe - 321 使用硬编码的加密密钥
相关的攻击模式

CAPEC-IDs:(查看所有)
70年,188年,189年,190年,191年,192年,205年

8 cwe - 311:失踪的敏感数据的加密

总结
弱点患病率 后果 数据丢失
修复的成本 媒介 方便检测 容易
攻击频率 有时 攻击者的意识

讨论

每当敏感数据被存储或传送任何地方在你的控制之外,攻击者可能会寻找方法。小偷可能在任何地方——嗅探你的数据包,读你的数据库和筛选你的文件系统。如果你的软件通过网络发送敏感信息,如私人数据或身份验证凭证,在途信息横跨许多不同的节点到它的目的地。攻击者可以嗅这些数据正确的线,它不需要很多的努力。所有他们需要做的就是控制一个节点最终目的地的路径,控制任何节点在同一网络的交通节点,或插入一个可用的接口。如果你的软件将敏感信息存储在一个本地文件或数据库,可能会有其他方法对攻击者的文件。他们可能会受益于宽松的权限,开发另一个漏洞,或物理磁盘的盗窃。你知道那些巨大的信用卡盗窃你听到吗?他们中的许多人是由于未加密存储。2011年,许多违反客户电子邮件和密码使攻击者的工作更容易通过存储关键信息没有加密。 Once the attacker got access to the database, it was game over. In June 2011, the LulzSec group grabbed headlines by grabbing and publishing unencrypted data.

技术细节|代码示例|检测方法|引用

预防和缓解措施
需求
足够清楚地指定数据或资源是有价值的,他们应该受到加密保护。要求任何传输或存储的数据/资源应该用严格的审查加密算法。
架构和设计
使用威胁建模以及其他技术,假设您的数据可以通过一个单独的漏洞和弱点,妥协和确定加密将是最有效的。确保数据你相信应该不是无意中暴露私人使用的弱点等不安全的权限(cwe - 732)。
架构和设计
确保适当的加密集成到系统设计,包括但并不限于:

加密需要存储或传输私有数据的用户系统

加密保护系统本身需要从未经授权的披露或篡改

确定加密的独立需求和环境:

单向(即。,only the user or recipient needs to have the key). This can be achieved using public key cryptography, or other techniques in which the encrypting party (i.e., the software) does not need to have access to a private key.

双向(即。,the encryption can be automatically performed on behalf of a user, but the key must be available so that the plaintext can be automatically recoverable by that user). This requires storage of the private key in a format that is recoverable only by the user (or perhaps by the operating system) in a way that cannot be recovered by others.
架构和设计
选择一个严格的审查算法,目前被认为是强大的由该领域的专家,并选择经过良好测试的实现。正如所有加密机制,应该用于分析源代码。

例如,美国政府系统需要FIPS 140 - 2认证。

不开发自己的加密算法。他们可能会暴露于攻击易于理解的密码。逆向工程技术是成熟的。如果可以攻破你的算法如果攻击者了解它是如何工作的,那么它尤其薄弱。

定期确保您不使用过时的加密。一些老算法,一度被认为需要十亿年的计算时间,现在可以打破在几天或几小时。这包括MD4 MD5、SHA1 DES和其他曾被认为是强大的算法。
架构和设计
划分系统“安全”领域信任边界可以明确。不允许走出信任边界和敏感数据时总是小心与舱外的安全区域。
实现,架构和设计
当你使用有技术,你需要正确地使用它们。不偷工减料,跳过资源密集型步骤(cwe - 325)。这些步骤通常是必不可少的预防常见的攻击。
实现
使用命名约定和强劲的类型更容易发现敏感数据时使用。当创建结构,对象,或其他复杂的实体,独立的敏感和不敏感数据尽可能多。

有效性:深度防御

注:这使得它更容易在代码点地方未加密的数据被使用。
相关的连续波
cwe - 312 明文存储的敏感信息
cwe - 319 明文传输的敏感信息
相关的攻击模式

CAPEC-IDs:(查看所有)
31日,37,65年,117年,155年,157年,167年,204年,205年,258年,259年,260年,383年,384年,385年,386年,387年,388年,389年

9 cwe - 434:无限制上传文件与危险的类型

总结
弱点患病率 常见的 后果 代码执行
修复的成本 媒介 方便检测 温和的
攻击频率 有时 攻击者的意识 媒介

讨论

你可能会认为你允许上传无辜的图片(图片,不会损害您的系统,互联网不是很无辜的在一些地方)。但是上传文件的名称可以包含一个危险的扩展等。php gif,或其他信息(如内容类型)可能会导致您的服务器将形象像一个大honkin”计划。因此,而不是看到你最喜欢的好莱坞明星的最新狗仔队拍摄在一个折中的位置,你会被泄露的一个服务器。

技术细节|代码示例|检测方法|引用

预防和缓解措施
架构和设计
生成自己的文件名上传文件的用户提供的文件名,这样根本没有使用外部输入。
架构和设计
组接受对象时,如文件名或url,是有限的或已知,从一组固定的输入值创建一个映射(比如数字id)实际的文件名或url,并拒绝所有其他输入。
架构和设计
考虑存储上传文件之外的web文档根完全。然后,使用其他机制来动态交付文件。
实现
假设所有的输入是恶意的。使用一个“接受良好的“输入验证策略,即。,use a whitelist of acceptable inputs that strictly conform to specifications. Reject any input that does not strictly conform to specifications, or transform it into something that does. Do not rely exclusively on looking for malicious or malformed inputs (i.e., do not rely on a blacklist). However, blacklists can be useful for detecting potential attacks or determining which inputs are so malformed that they should be rejected outright.

当执行输入验证,考虑所有可能相关的属性,包括长度,类型的输入,可接受的值的全系列,缺失或额外的输入,语法,一致性相关领域,符合业务规则。作为业务规则逻辑的一个例子,在语法上“船”可能是有效的,因为它只包含字母数字字符,但它不是有效的如果你期望的颜色,如“红”或“蓝色”。

例如,限制文件名字母数字字符限制的引入可以帮助意想不到的文件扩展名。
架构和设计
只允许定义一组非常有限的扩展和生成文件名,以这些扩展。考虑XSS (cwe - 79)的可能性在你允许. html或. htm文件类型。
实现
确保只使用一个扩展的文件名。一些web服务器,包括一些版本的Apache,可能过程文件基于这样“filename.php内部扩展。gif”是PHP解释器。
实现
当运行在web服务器上支持区分大小写的文件名,确保您执行不区分大小写的扩展所提供的评估。
架构和设计
对于任何一个在客户端执行安全检查,确保这些检查复制在服务器端,为了避免cwe - 602。攻击者可以绕过客户端检查通过修改值后,检查执行,或通过改变客户端完全删除客户端检查。然后,这些修改的值将被提交到服务器。
实现
不完全依赖健康检查文件内容,确保预期的文件类型和大小。攻击者可能隐藏代码在某些文件片段,仍将由服务器执行。例如,GIF图像可能包含一个自由格式的注释字段。
实现
不要完全依赖MIME内容类型或文件名属性在确定如何呈现一个文件。验证MIME内容类型,并确保它匹配扩展只能解决部分问题。
架构和设计,操作
使用所需的最低特权运行您的代码来完成必要的任务。如果可能的话,创建独立帐户权限有限,只用于一个任务。这样,一个成功的攻击不会立即给攻击者访问其他软件或其环境。例如,数据库应用程序很少需要作为数据库管理员运行,特别是在日常操作。
架构和设计,操作
运行您的代码在一个“监狱”或类似沙箱环境,执行严格的流程和操作系统之间的边界。这可能有效地限制哪些文件可以在一个特定的目录或访问哪些命令可以执行您的软件。

操作系统的例子包括Unix chroot监狱,AppArmor对,SELinux。在一般情况下,托管代码可能会提供一些保护。例如,java。在Java SecurityManager FilePermission允许您指定文件操作的限制。

这可能不是一个可行的解决方案,它只限制对操作系统的影响;应用程序的其余部分可能仍然接受妥协。

应该注意避免cwe - 243和相关弱点监狱。

有效性:有限

指出:这种缓解的有效性取决于特定的沙盒或监狱的预防功能使用,只可能有助于减少攻击的范围,比如限制某些系统调用或限制的攻击者可以访问文件系统的一部分。
相关的连续波

一个也没有。

相关的攻击模式

CAPEC-IDs:(查看所有)
1,122年

10 cwe - 807:依赖不可信的输入在一个安全的决定

总结
弱点患病率 后果 安全绕过
修复的成本 媒介 方便检测 温和的
攻击频率 经常 攻击者的意识

讨论

在有最小年龄的国家购买酒,调酒师通常是将验证购买者的年龄检查驾照或其他合法接受时代的证据。但是如果有人看起来年龄喝酒,那酒保完全可以跳过检查许可。这是一件好事对于未成年顾客碰巧看起来老。驾照可能需要仔细识别假执照,或确定一个人是用别人的许可。软件开发人员往往依赖于不可信的输入以同样的方式,当这些输入用于决定是否授权访问受限资源,麻烦就在拐角处。

技术细节|代码示例|检测方法|引用

预防和缓解措施
架构和设计
在服务器端存储状态信息和敏感数据。

确保系统明确地和明确地跟踪自己的状态和用户状态和为合法的状态转换规则定义。不允许任何应用程序用户以任何方式直接影响国家除了通过合法的行动导致状态转换。

如果信息必须存储在客户端,不没有加密和完整性检查,或者在服务器端有一个机制篡改。使用一个消息身份验证代码(MAC)算法,如散列消息验证码(HMAC)。应用此反国家或敏感数据公开,可以保证数据的完整性,即。数据没有被修改。确保您使用一个算法强大的哈希函数(cwe - 328)。
架构和设计
使用审查库或框架不允许这个弱点发生或提供了结构,使这个弱点更容易避免的。

无状态的协议(例如,HTTP,使用一个框架,为你保持状态。

例子包括ASP。网络视图状态和OWASP ESAPI会话管理功能。

小心提供政府支持的语言特性,因为这些可能是为了方便程序员提供,不得考虑安全。
架构和设计
对于任何一个在客户端执行安全检查,确保这些检查复制在服务器端,为了避免cwe - 602。攻击者可以绕过客户端检查通过修改值后,检查执行,或通过改变客户端完全删除客户端检查。然后,这些修改的值将被提交到服务器。
操作,实现
如果您使用的是PHP配置您的应用程序,以便它不使用register_globals。在实现,开发应用程序,以便它不依赖于这个特性,但是小心实现register_globals的模拟cwe - 95等弱点,cwe - 621,和类似的问题。
架构和设计,实现
理解所有潜在的地区不受信任的输入可以输入软件:参数或参数,饼干,任何从网络读取环境变量,反向DNS查找,查询结果,请求头,URL组件、电子邮件、文件、文件名、数据库,以及任何外部系统提供数据的应用程序。记住,这样的投入可以获得间接通过API调用。

识别所有输入用于安全决策和确定您可以修改设计,这样你不需要依靠提交输入。例如,您可以保留关键信息在服务器端用户的会话,而不是在外部数据记录。
相关的连续波

一个也没有。

相关的攻击模式

CAPEC-IDs:(查看所有)
232年

11 cwe - 250:执行不必要的特权

总结
弱点患病率 媒介 后果 代码执行
修复的成本 媒介 方便检测 温和的
攻击频率 有时 攻击者的意识

讨论

蜘蛛侠,著名的漫画英雄,生活的座右铭“大国意识到有很大的责任。”Your software may need special privileges to perform certain operations, but wielding those privileges longer than necessary can be extremely risky. When running with extra privileges, your application has access to resources that the application's user can't directly reach. For example, you might intentionally launch a separate program, and that program allows its user to specify a file to open; this feature is frequently present in help utilities or editors. The user can access unauthorized files through the launched program, thanks to those extra privileges. Command execution can happen in a similar fashion. Even if you don't launch other programs, additional vulnerabilities in your software could have more serious consequences than if it were running at a lower privilege level.

技术细节|代码示例|检测方法|引用

预防和缓解措施
架构和设计,操作
使用所需的最低特权运行您的代码来完成必要的任务。如果可能的话,创建独立帐户权限有限,只用于一个任务。这样,一个成功的攻击不会立即给攻击者访问其他软件或其环境。例如,数据库应用程序很少需要作为数据库管理员运行,特别是在日常操作。
架构和设计
识别功能,需要额外的特权,比如访问特权操作系统资源。包装和集中这个功能如果可能的话,尽可能和隔离特权的代码与其他代码。尽可能晚地提高你的特权,尽快,为了避免cwe - 271。避免弱点例如cwe - 288和cwe - 420保护所有可能的沟通渠道,与特权代码交互,如第二套接字,你只打算被管理员访问。
实现
执行广泛的输入验证任何特权的代码必须暴露给用户并拒绝任何不适合您的严格要求。
实现
当你放弃特权,确保你已经成功地把它们以避免cwe - 273。保护机制的环境变得更强壮,privilege-dropping调用可能会失败,即使它似乎他们总是成功。
实现
如果环境迫使你运行额外的特权,然后确定必要的最低访问级别。首先识别软件的不同的权限和用户需要执行他们的行为,如文件读写权限,网络套接字权限,等等。然后明确允许这些行为而否定一切。执行广泛的输入验证和规范化引入一个单独的漏洞的可能性降到最低。这种缓解比放弃更容易出错的特权。
操作系统配置
确保您的软件运行正常在联邦桌面核心配置(FDCC)或一个等价的硬化配置指南,许多组织使用限制部署软件的攻击表面和潜在风险。
相关的连续波
cwe - 272 最小特权违反
cwe - 273 检查了不当的特权
cwe - 653 划分不足
相关的攻击模式

CAPEC-IDs:(查看所有)
69年,104年

12 cwe - 352:跨站点请求伪造(CSRF)

总结
弱点患病率 后果 数据丢失、代码执行
修复的成本 方便检测 温和的
攻击频率 经常 攻击者的意识 媒介

讨论

你知道比在机场接受一个陌生人的一个包。它可能包含危险的内容。另外,如果出了任何差错,那么它会看起来好像是你做的,因为你的包当你登机。跨站点请求伪造就是这样奇怪的包,除了攻击者技巧用户进入你的网站的激活请求。由于脚本和web的工作方式在一般情况下,用户可能不知道请求被发送。但是一旦请求到达服务器,它看起来好像来自用户,而不是攻击者。这可能似乎不是一件大事,但攻击者已经基本上伪装合法用户获得了所有潜在的用户访问。这一点尤其方便当用户有管理员权限,从而产生一个完整的应用程序的功能的妥协。当结合XSS,可以广泛的和毁灭性的结果。如果你听说过XSS蠕虫蜂拥到非常大的网站在几分钟内(比如Facebook),通常CSRF喂养它们。

技术细节|代码示例|检测方法|引用

预防和缓解措施
架构和设计
使用审查库或框架不允许这个弱点发生或提供了结构,使这个弱点更容易避免的。

例如,使用anti-CSRF包如OWASP CSRFGuard。

另一个例子是ESAPI会话管理控制,其中包括CSRF的组件。
实现
确保您的应用程序是免费的跨站点脚本问题(cwe - 79),因为大多数CSRF防御可以绕过使用attacker-controlled脚本。
架构和设计
生成唯一nonce对于每一个形式,把临时的形式,并验证表单的nonce收到。确保nonce没有可预测的(cwe - 330)。

注:请注意,这可以绕过使用XSS (cwe - 79)。
架构和设计
确定特别危险操作。当用户执行一个危险的操作时,发送一个单独的确认请求,以确保用户要执行该操作。

注:请注意,这可以绕过使用XSS (cwe - 79)。
架构和设计
使用“double-submitted饼干”方法被法尔顿和西。

这种技术需要Javascript,所以它可能不适合禁用Javascript的浏览器。

注:请注意,这可能可以绕过使用XSS (cwe - 79)。
架构和设计
不要使用GET方法触发状态改变的任何请求。
实现
检查HTTP引用页头是否起源于一个预期的页面请求。这可能破坏合法功能,因为用户或代理可能会禁用发送推荐人原因隐私。

注:请注意,这可以绕过使用XSS (cwe - 79)。攻击者可以使用XSS来生成一个推荐人,或者生成一个恶意请求一个页面的引用页将被允许。
相关的连续波
cwe - 346 起源验证错误
cwe - 441 意想不到的代理/中介
相关的攻击模式

CAPEC-IDs:(查看所有)
62年,111年

13 CWE-22:不当限制限制目录的路径名(“路径遍历”)

总结
弱点患病率 广泛的 后果 代码执行,数据丢失,拒绝服务
修复的成本 方便检测 容易
攻击频率 经常 攻击者的意识

讨论

尽管数据经常使用交换文件,有时你不打算公开每个文件系统上而这样做。当你使用一个局外人的输入而构建一个文件名,由此产生的路径可以点以外的目的目录。攻击者可以将多个“. .”或相似的序列导致操作系统限制的目录导航,进入系统的其余部分。

技术细节|代码示例|检测方法|引用

预防和缓解措施
实现
假设所有的输入是恶意的。使用一个“接受良好的“输入验证策略,即。,use a whitelist of acceptable inputs that strictly conform to specifications. Reject any input that does not strictly conform to specifications, or transform it into something that does.

当执行输入验证,考虑所有可能相关的属性,包括长度,类型的输入,可接受的值的全系列,缺失或额外的输入,语法,一致性相关领域,符合业务规则。作为业务规则逻辑的一个例子,在语法上“船”可能是有效的,因为它只包含字母数字字符,但它不是有效的如果输入预计仅包含颜色,如“红”或“蓝色”。

不完全依赖寻找恶意或畸形的输入(即。不依赖黑名单)。黑名单有可能错过至少有一个不受欢迎的输入,特别是如果代码的环境变化。这可以让攻击者有足够的空间绕过验证。然而,黑名单可以用于检测潜在攻击或确定哪些输入是畸形的,应该直接驳回。

当验证文件名,使用严格的白名单,限制使用的字符集。如果可行,只允许一个“。”字符的文件名,以避免CWE-23等弱点,并排除目录分隔符“/”等,以避免CWE-36。使用白名单允许文件扩展名,这将有助于避免cwe - 434。

不完全依赖一个过滤机制,消除潜在的危险人物。这相当于一个黑名单,这可能是不完整的(cwe - 184)。例如,过滤保护“/”是不够的,如果文件系统还支持使用作为目录分隔符“\”。另一个可能的错误可能发生过滤时,仍然会产生危险的数据(cwe - 182)。例如,如果“. ./“序列是远离“……/ /字符串以顺序的方式,两个实例“. ./”将从原始字符串中删除,但其余字符仍将形成“. ./”字符串。
架构和设计
对于任何一个在客户端执行安全检查,确保这些检查复制在服务器端,为了避免cwe - 602。攻击者可以绕过客户端检查通过修改值后,检查执行,或通过改变客户端完全删除客户端检查。然后,这些修改的值将被提交到服务器。
实现
输入应该解码和规范化应用程序当前的内部表示之前(cwe - 180)进行验证。确保应用程序不会解码相同的输入(cwe - 174)的两倍。这些错误可以用来绕过白名单验证方案通过引入危险的输入后检查。

使用一个内置的路径规范化功能(如realpath (C))产生规范版本的路径名,有效地消除了“. .”序列和符号链接(CWE-23 CWE-59)。这包括:

在C realpath ()

在Java getCanonicalPath ()

GetFullPath()在ASP.NET

在Perl realpath()或abs_path ()

在PHP realpath ()
架构和设计
使用审查库或框架不允许这个弱点发生或提供了结构,使这个弱点更容易避免的。
操作
使用应用程序防火墙,可以检测到攻击这个弱点。它可以是有益的情况下,代码不能固定(因为它是由第三方控制),作为一项紧急预防措施,更全面的软件保证措施被应用,或者提供深度防御。

有效性:温和

注:应用程序防火墙不可能涵盖所有可能的输入向量。此外,攻击技术可能可以绕过保护机制,比如使用畸形的输入,仍然可以由组件接收处理这些输入。根据功能的不同,应用程序防火墙可能会无意中拒绝或修改合法请求。最后,一些手动工作可能需要定制。
架构和设计,操作
使用所需的最低特权运行您的代码来完成必要的任务。如果可能的话,创建独立帐户权限有限,只用于一个任务。这样,一个成功的攻击不会立即给攻击者访问其他软件或其环境。例如,数据库应用程序很少需要作为数据库管理员运行,特别是在日常操作。
架构和设计
组接受对象时,如文件名或url,是有限的或已知,从一组固定的输入值创建一个映射(比如数字id)实际的文件名或url,并拒绝所有其他输入。

例如,ID 1可以映射到“收件箱。txt”和ID 2可以映射到“profile.txt”。特性如ESAPI AccessReferenceMap提供此功能。
架构和设计,操作
运行您的代码在一个“监狱”或类似沙箱环境,执行严格的流程和操作系统之间的边界。这可能有效地限制哪些文件可以在一个特定的目录或访问哪些命令可以执行您的软件。

操作系统的例子包括Unix chroot监狱,AppArmor对,SELinux。在一般情况下,托管代码可能会提供一些保护。例如,java。在Java SecurityManager FilePermission允许您指定文件操作的限制。

这可能不是一个可行的解决方案,它只限制对操作系统的影响;应用程序的其余部分可能仍然接受妥协。

应该注意避免cwe - 243和相关弱点监狱。

有效性:有限

指出:这种缓解的有效性取决于特定的沙盒或监狱的预防功能使用,只可能有助于减少攻击的范围,比如限制某些系统调用或限制的攻击者可以访问文件系统的一部分。
架构和设计,操作
存储库,包括和实用程序文件之外的web文档根,如果可能的话。否则,将它们存储在一个单独的目录,并使用web服务器的访问控制功能,防止攻击者直接请求。一个常见的做法是定义一个固定的常数在每个调用程序,然后检查存在的恒定在图书馆/包含文件;如果持续的不存在,那么直接请求的文件,它可以立即退出。

这会显著减少的机会攻击者能够绕过任何保护机制的基础程序但不包括文件。它还将减少你的攻击表面。
实现
确保错误消息只包含最小的细节,是有用的目标受众,并没有其他人。消息需要罢工之间的平衡过于神秘,不够的。他们应该不一定揭示的方法被用来确定错误。如此详细的信息可以用来改进原攻击来增加成功的机会。

如果必须跟踪错误在某些细节,捕捉他们的日志消息,但想想可能发生如果日志消息可以被攻击者。避免任何形式的记录高度敏感的信息,如密码。避免不一致的消息可能会意外地提示攻击者对内部状态,如用户名是否有效。

的上下文路径遍历,错误消息披露路径信息可以帮助攻击者起草相应的攻击字符串通过文件系统层次结构。
操作,实现
如果您使用的是PHP配置您的应用程序,以便它不使用register_globals。在实现,开发应用程序,以便它不依赖于这个特性,但是小心实现register_globals的模拟cwe - 95等弱点,cwe - 621,和类似的问题。
相关的连续波

一个也没有。

相关的攻击模式

CAPEC-IDs:(查看所有)
23,64年,76年,78年,79年,139年

14 cwe - 494:下载的代码没有完整性检查

总结
弱点患病率 媒介 后果 代码执行
修复的成本 中等到高 方便检测 温和的
攻击频率 很少 攻击者的意识

讨论

你不需要成为一个专家意识到,如果您下载代码并执行它,你相信这些代码的来源并不是恶意的。也许你只访问一个下载站点,你的信任,但攻击者可以执行各种各样的技巧来修改代码之前到达你。黑客下载网站,冒充DNS欺骗或缓存中毒,让系统重定向到一个不同的网站,甚至修改代码在运输途中穿过网络。这个场景甚至适用于案件中,下载并安装自己的更新自己的产品。当这种情况发生时,您的软件将会运行代码,它不期望,这是对你有害,但对攻击者。

技术细节|代码示例|检测方法|引用

预防和缓解措施
实现
执行适当的正向和反向DNS查找检测DNS欺骗。

指出:这只是一个部分解决方案,因为它不会阻止你的代码被修改的托管站点或在运输途中。
架构和设计,操作
加密传输之前代码与可靠的加密方案。

这只会是一个部分解决方案,因为它不会检测DNS欺骗,它不会阻止您的代码修改托管网站。
架构和设计
使用审查库或框架不允许这个弱点发生或提供了结构,使这个弱点更容易避免的。

Speficially,它可能有助于使用工具或框架来对传播执行完整性检查代码。

如果你提供下载的代码,比如自动更新你的软件,然后使用加密签名为你下载代码并修改客户来验证签名。确保您的实现不包含cwe - 295, cwe - 320, cwe - 347,和相关的弱点。

使用代码签名Authenticode等技术。看到引用。
架构和设计,操作
使用所需的最低特权运行您的代码来完成必要的任务。如果可能的话,创建独立帐户权限有限,只用于一个任务。这样,一个成功的攻击不会立即给攻击者访问其他软件或其环境。例如,数据库应用程序很少需要作为数据库管理员运行,特别是在日常操作。
架构和设计,操作
运行您的代码在一个“监狱”或类似沙箱环境,执行严格的流程和操作系统之间的边界。这可能有效地限制哪些文件可以在一个特定的目录或访问哪些命令可以执行您的软件。

操作系统的例子包括Unix chroot监狱,AppArmor对,SELinux。在一般情况下,托管代码可能会提供一些保护。例如,java。在Java SecurityManager FilePermission允许您指定文件操作的限制。

这可能不是一个可行的解决方案,它只限制对操作系统的影响;应用程序的其余部分可能仍然接受妥协。

应该注意避免cwe - 243和相关弱点监狱。

有效性:有限

指出:这种缓解的有效性取决于特定的沙盒或监狱的预防功能使用,只可能有助于减少攻击的范围,比如限制某些系统调用或限制的攻击者可以访问文件系统的一部分。
相关的连续波
cwe - 247 依赖DNS查找在一个安全的决定
cwe - 292 相信自我报告的DNS名称
cwe - 346 起源验证错误
cwe - 350 不可信的反向DNS
相关的攻击模式

CAPEC-IDs:(查看所有)
184年,185年,186年,187年

15 cwe - 863:不正确的授权

总结
弱点患病率 后果 安全绕过
修复的成本 低到中等 方便检测 温和的
攻击频率 经常 攻击者的意识

讨论

虽然缺乏授权更危险(见其他排名前25位的),不正确的授权都有问题。开发人员可能试图控制访问某些资源,但实现它的方式可以忽略。例如,一个人一旦登录到一个web应用程序,开发人员可能的权限存储在一个cookie。通过修改饼干,攻击者可以访问其他资源。交替,开发人员可能由交付执行授权代码执行的web客户端,但攻击者可以使用一个定制的客户端,完全消除了检查。

技术细节|代码示例|检测方法|引用

预防和缓解措施
架构和设计
将应用程序划分为匿名的,正常的,特权和行政区域。减少攻击表面通过仔细映射角色的数据和功能。使用基于角色的访问控制(RBAC)执行的角色在适当的界限。

注意,这个方法可能不是防止水平授权,即。,它不会保护用户免受攻击别人用同样的角色。
架构和设计
确保您执行访问控制检查相关的业务逻辑。这些检查可能是不同的访问控制检查适用于更一般的资源(如文件、连接、进程、内存和数据库记录。例如,一个数据库可能限制医疗记录到一个特定的数据库的访问用户,但每个记录可能只是为了访问病人和病人的医生。
架构和设计
使用审查库或框架不允许这个弱点发生或提供了结构,使这个弱点更容易避免的。

例如,考虑使用授权框架如JAAS授权框架和OWASP ESAPI访问控制功能。
架构和设计
对于web应用程序,确保访问控制机制是正确的每一页都在服务器端执行。用户不能访问任何未经授权的功能或信息,只需请求直接访问该页面。

要做到这一点的方法之一是确保包含敏感信息的所有页面不缓存,,所有此类页面限制访问请求都伴随着一个活跃的和经过身份验证的会话令牌关联到一个用户所需的权限访问该页面。
系统配置、安装
使用您的操作系统的访问控制功能和服务器环境,并相应地定义访问控制列表。使用“默认否认”政策在定义这些acl。
相关的连续波
cwe - 425 直接请求(“强迫浏览”)
cwe - 639 授权旁路通过用户控制的关键
cwe - 732 不正确的权限分配的关键资源
cwe - 749 暴露危险的方法或函数
相关的攻击模式

CAPEC-IDs:(查看所有)
1,17,58,122年,180年

16 cwe - 829:包含功能来自不受信任的控制范围

总结
弱点患病率 后果 安全绕过
修复的成本 低到中等 方便检测 温和的
攻击频率 经常 攻击者的意识

讨论

这个想法似乎很简单(更不用说够酷):你可以做很多更小的部分文档(或程序),然后将它们组合在一起变成一个大文档(或程序)通过“包括”或“需要”这些小的碎片。这是一种普遍的方式来构建项目。结合允许攻击者的共同趋势影响这些碎片的位置——甚至从攻击者自己的服务器,然后突然你导入别人的代码。在这些Web 2.0天,也许只是“网络的工作方式,但如果安全是一个考虑。

技术细节|代码示例|检测方法|引用

预防和缓解措施
架构和设计
使用审查库或框架不允许这个弱点发生或提供了结构,使这个弱点更容易避免的。
架构和设计
组接受对象时,如文件名或url,是有限的或已知,从一组固定的输入值创建一个映射(比如数字id)实际的文件名或url,并拒绝所有其他输入。

例如,ID 1可以映射到“收件箱。txt”和ID 2可以映射到“profile.txt”。特性如ESAPI AccessReferenceMap提供此功能。
架构和设计
对于任何一个在客户端执行安全检查,确保这些检查复制在服务器端,为了避免cwe - 602。攻击者可以绕过客户端检查通过修改值后,检查执行,或通过改变客户端完全删除客户端检查。然后,这些修改的值将被提交到服务器。
架构和设计,操作
运行您的代码在一个“监狱”或类似沙箱环境,执行严格的流程和操作系统之间的边界。这可能有效地限制哪些文件可以在一个特定的目录或访问哪些命令可以执行您的软件。

操作系统的例子包括Unix chroot监狱,AppArmor对,SELinux。在一般情况下,托管代码可能会提供一些保护。例如,java。在Java SecurityManager FilePermission允许您指定文件操作的限制。

这可能不是一个可行的解决方案,它只限制对操作系统的影响;应用程序的其余部分可能仍然接受妥协。

应该注意避免cwe - 243和相关弱点监狱。

有效性:有限

指出:这种缓解的有效性取决于特定的沙盒或监狱的预防功能使用,只可能有助于减少攻击的范围,比如限制某些系统调用或限制的攻击者可以访问文件系统的一部分。
架构和设计,操作
使用所需的最低特权运行您的代码来完成必要的任务。如果可能的话,创建独立帐户权限有限,只用于一个任务。这样,一个成功的攻击不会立即给攻击者访问其他软件或其环境。例如,数据库应用程序很少需要作为数据库管理员运行,特别是在日常操作。
实现
假设所有的输入是恶意的。使用一个“接受良好的“输入验证策略,即。,use a whitelist of acceptable inputs that strictly conform to specifications. Reject any input that does not strictly conform to specifications, or transform it into something that does. Do not rely exclusively on looking for malicious or malformed inputs (i.e., do not rely on a blacklist). However, blacklists can be useful for detecting potential attacks or determining which inputs are so malformed that they should be rejected outright.

当执行输入验证,考虑所有可能相关的属性,包括长度,类型的输入,可接受的值的全系列,缺失或额外的输入,语法,一致性相关领域,符合业务规则。作为业务规则逻辑的一个例子,在语法上“船”可能是有效的,因为它只包含字母数字字符,但它不是有效的如果你期望的颜色,如“红”或“蓝色”。

对于文件名,使用严格的白名单,限制使用的字符集。如果可行,只允许一个“。”字符的文件名,以避免CWE-23等弱点,并排除目录分隔符“/”等,以避免CWE-36。使用白名单允许文件扩展名,这将有助于避免cwe - 434。
架构和设计,操作
存储库,包括和实用程序文件之外的web文档根,如果可能的话。否则,将它们存储在一个单独的目录,并使用web服务器的访问控制功能,防止攻击者直接请求。一个常见的做法是定义一个固定的常数在每个调用程序,然后检查存在的恒定在图书馆/包含文件;如果持续的不存在,那么直接请求的文件,它可以立即退出。

这会显著减少的机会攻击者能够绕过任何保护机制的基础程序但不包括文件。它还将减少你的攻击表面。
架构和设计,实现
理解所有潜在的地区不受信任的输入可以输入软件:参数或参数,饼干,任何从网络读取环境变量,反向DNS查找,查询结果,请求头,URL组件、电子邮件、文件、文件名、数据库,以及任何外部系统提供数据的应用程序。记住,这样的投入可以获得间接通过API调用。

文件包含许多问题发生,因为程序员假定某些输入不能修改,特别是对饼干和URL的组件。
操作
使用应用程序防火墙,可以检测到攻击这个弱点。它可以是有益的情况下,代码不能固定(因为它是由第三方控制),作为一项紧急预防措施,更全面的软件保证措施被应用,或者提供深度防御。

有效性:温和

注:应用程序防火墙不可能涵盖所有可能的输入向量。此外,攻击技术可能可以绕过保护机制,比如使用畸形的输入,仍然可以由组件接收处理这些输入。根据功能的不同,应用程序防火墙可能会无意中拒绝或修改合法请求。最后,一些手动工作可能需要定制。
相关的连续波
cwe - 425 直接请求(“强迫浏览”)
cwe - 639 授权旁路通过用户控制的关键
cwe - 732 不正确的权限分配的关键资源
cwe - 749 暴露危险的方法或函数
相关的攻击模式

CAPEC-IDs:(查看所有)
35,38,101年,103年,111年,175年,181年,184年,185年,186年,187年,193年,222年,251年,252年,253年

17 cwe - 732:关键资源的不正确的权限分配

总结
弱点患病率 媒介 后果 数据丢失、代码执行
修复的成本 低到高 方便检测 容易
攻击频率 经常 攻击者的意识

讨论

非常粗鲁的东西未经许可,但用户(也就是不礼貌的。,攻击者)愿意花一点时间看看他们能侥幸。如果你有关键程序,数据存储,或配置文件的权限,让你的资源可读或写的世界——好吧,这就是他们会成为什么。虽然这可能不被认为是在实现或设计问题,有时需要应用的解决方案。让一个忙碌的sysadmin注意到并做出适当的改变远非最佳,有时是不可能的。

技术细节|代码示例|检测方法|引用

预防和缓解措施
实现
当使用临界资源,如一个配置文件,检查资源是否有不安全的权限(如被任何普通用户可以修改),并生成一个错误,甚至退出软件如果有可能资源可能被未经授权的修改。
架构和设计
将应用程序划分为匿名的,正常的,特权和行政区域。减少攻击表面通过仔细定义不同的用户组,特权和/或角色。地图这些对数据、功能和相关资源。然后设置相应的权限。这将允许您维护更细粒度的控制你的资源。

有效性:温和

注:这可能是一个很有效的策略。然而,在实践中,它可能难以或者耗费时间来定义这些领域有很多不同的资源或当用户类型,或者应用程序特性变化迅速。
架构和设计,操作
运行您的代码在一个“监狱”或类似沙箱环境,执行严格的流程和操作系统之间的边界。这可能有效地限制哪些文件可以在一个特定的目录或访问哪些命令可以执行您的软件。

操作系统的例子包括Unix chroot监狱,AppArmor对,SELinux。在一般情况下,托管代码可能会提供一些保护。例如,java。在Java SecurityManager FilePermission允许您指定文件操作的限制。

这可能不是一个可行的解决方案,它只限制对操作系统的影响;应用程序的其余部分可能仍然接受妥协。

应该注意避免cwe - 243和相关弱点监狱。

有效性:温和

指出:这种缓解的有效性取决于特定的沙盒或监狱的预防功能使用,只可能有助于减少攻击的范围,比如限制某些系统调用或限制的攻击者可以访问文件系统的一部分。
实施、安装
在程序启动时,显式地设置默认的权限或umask最为严格的设置。在程序安装设置适当的权限。这将阻止你继承安全权限的任何用户安装或运行程序。

有效性:高
系统配置
所有配置文件、可执行文件和库,确保他们只可读和可写软件的管理员。

有效性:高
文档
不建议在你的文档中不安全的配置更改,特别是如果这些配置可以扩展到资源和其他软件,软件超出了你的范围。
安装
不要认为系统管理员将手动更改配置设置,你推荐的手册。
操作系统配置
确保您的软件运行正常在联邦桌面核心配置(FDCC)或一个等价的硬化配置指南,许多组织使用限制部署软件的攻击表面和潜在风险。
相关的连续波
cwe - 276 不正确的默认权限
cwe - 277 不安全的继承权限
cwe - 279 不正确的Execution-Assigned权限
cwe - 285 不适当的授权
相关的攻击模式

CAPEC-IDs:(查看所有)
1,17,60,61年,62年,122年,180年,232年,234年

18 cwe - 676:使用有潜在危险的功能

总结
弱点患病率 后果 数据丢失、代码执行
修复的成本 媒介 方便检测 容易
攻击频率 很少 攻击者的意识

讨论

在处理电动工具安全是至关重要的。程序员的工具箱是充满力量的工具,包括库或API函数,假设他们将如何被使用,如果他们没有安全保障滥用。如果有潜在危险的功能不能正常使用,那么事情可能会变得真正的混乱的快。

技术细节|代码示例|检测方法|引用

预防和缓解措施
构建和编译,实现
识别一个禁止列表API函数和禁止开发人员使用这些功能,提供更安全的替代方案。在某些情况下,自动代码分析工具或编译器可以指示点使用禁止功能,比如“禁止。从微软的SDL h”包含文件。
相关的连续波
cwe - 329 不使用一个随机IV与CBC模式
cwe - 331 熵不足
cwe - 334 小空间的随机值
cwe - 336 同样的种子PRNG
cwe - 337 可预测的种子在PRNG
cwe - 338 使用密码地PRNG疲软
cwe - 341 预测从可观察到的状态
相关的攻击模式

CAPEC-IDs:(查看所有)

19 cwe - 327:使用损坏或危险的密码算法

总结
弱点患病率 后果 数据丢失、安全旁路
修复的成本 中等到高 方便检测 温和的
攻击频率 很少 攻击者的意识 媒介

讨论

如果你处理敏感数据或需要保护通信通道,你可以使用加密,以防止攻击者阅读它。你可能会开发自己的加密方案,希望使攻击者难以破解。这样的一小块加密是一个受欢迎的视线攻击者。加密是困难的。如果全球杰出的数学家和计算机科学家不能正确(和他们总是打破自己的东西),然后你也不会。你可能认为您创建了一个全新的算法,没有人会算出,但更有可能的是,你重新发明轮子脱落前游行即将开始。

技术细节|代码示例|检测方法|引用

预防和缓解措施
架构和设计
选择一个严格的审查算法,目前被认为是强大的由该领域的专家,并选择经过良好测试的实现。正如所有加密机制,应该用于分析源代码。

例如,美国政府系统需要FIPS 140 - 2认证。

不开发自己的加密算法。他们可能会暴露于攻击易于理解的密码。逆向工程技术是成熟的。如果可以攻破你的算法如果攻击者了解它是如何工作的,那么它尤其薄弱。

定期确保您不使用过时的加密。一些老算法,一度被认为需要十亿年的计算时间,现在可以打破在几天或几小时。这包括MD4 MD5、SHA1 DES和其他曾被认为是强大的算法。
架构和设计
设计你的软件,这样你可以用另一个代替一个密码算法。这将使它更容易升级到更强的算法。
架构和设计
精心管理和保护的密钥(见cwe - 320)。如果键可以猜测或被盗,那么密码本身的强度是无关紧要的。
架构和设计
使用审查库或框架不允许这个弱点发生或提供了结构,使这个弱点更容易避免的。

行业标准的实现可以节省开发时间和更有可能避免错误可能发生在加密算法的实现。考虑到ESAPI加密功能。
实现,架构和设计
当你使用有技术,你需要正确地使用它们。不偷工减料,跳过资源密集型步骤(cwe - 325)。这些步骤通常是必不可少的预防常见的攻击。
相关的连续波
cwe - 320 密钥管理错误
cwe - 329 不使用一个随机IV与CBC模式
cwe - 331 熵不足
cwe - 338 使用密码地PRNG疲软
相关的攻击模式

CAPEC-IDs:(查看所有)
20.,97年

20. cwe - 131:不正确的缓冲区大小的计算

总结
弱点患病率 后果 代码执行拒绝服务,数据丢失
修复的成本 方便检测 容易温和
攻击频率 经常 攻击者的意识

讨论

在语言如C,内存管理是程序员的责任,有很多错误的机会。如果程序员不正确计算缓冲区的大小,然后包含数据的缓冲区可能太小,程序员编写的计划——即使输入正确验证。任意数量的问题可能产生不正确的计算,但是当也说了,该做的也做了,你将会运行艰难可怕的缓冲区溢出。

技术细节|代码示例|检测方法|引用

预防和缓解措施
实现
如果你分配一个缓冲区为目的的转换,转换,或编码输入,确保您分配足够的内存来处理的最大可能的编码。For example, in a routine that converts "&" characters to "&" for HTML entity encoding, you will need an output buffer that is at least 5 times as large as the input buffer.
实现
了解编程语言的基本表示形式,以及它如何与数值计算(cwe - 681)。密切关注字节大小差异,精度,签署/无符号的区别,截断,类型之间的转换和铸造,“不是一个数字”计算,和你的语言如何处理数字太大或太小的底层表示。

也要小心占32位,64位,和其他潜在的差异可能影响数字表示。
实现
对任何数字输入执行输入验证,确保它是在预期的范围内。执行输入同时满足最小和最大预期范围的需求。
架构和设计
对于任何一个在客户端执行安全检查,确保这些检查复制在服务器端,为了避免cwe - 602。攻击者可以绕过客户端检查通过修改值后,检查执行,或通过改变客户端完全删除客户端检查。然后,这些修改的值将被提交到服务器。
实现
当处理结构化的数据包含大小字段紧随其后的是原始数据,确保您识别并解决之间的任何不一致字段和数据的实际尺寸大小(cwe - 130)。
实现
分配内存时,它使用哨兵马克的数据结构——例如NUL字节字符串——确保你在计算还包括哨兵必须分配内存的总量。
实现
取代无限复制函数具有类似的功能,支持长度参数,如拷贝字符串strncpy。创建这些如果他们不是可用的。

有效性:温和

指出:这种方法仍然是容易计算错误,包括“从一开始”问题,如错误(cwe - 193)和错误地计算缓冲区长度(cwe - 131)。

此外,这只解决了潜在的溢出问题。资源消耗/疲劳问题仍然是可能的。
实现
使用sizeof()在适当的数据类型,以避免cwe - 467。
实现
使用适当的类型所需的行动。例如,在C / c++中,只使用无符号类型值,不可能是负的,如高度、宽度、或其他数字与数量有关。这将简化你的健康检查,减少意外与意想不到的铸件。
架构和设计
使用审查库或框架不允许这个弱点发生或提供了结构,使这个弱点更容易避免的。

使用库或框架更容易处理数字没有意想不到的后果,或缓冲区分配例程自动跟踪缓冲区大小。

例子包括安全整数处理包如SafeInt (c++)或IntegerLib (C或c++)。
构建和编译
使用功能或运行或编译软件扩展自动提供一个保护机制,减轻或消除缓冲区溢出。

例如,某些编译器和扩展提供自动缓冲区溢出检测机制,构建到编译后的代码。例子包括Microsoft Visual Studio / GS标志,Fedora / Red Hat FORTIFY_SOURCE GCC国旗,StackGuard, ProPolice。

有效性:深度防御

注:这个不一定是一个完整的解决方案,因为这些机制只能检测某些类型的溢出。此外,仍有可能导致拒绝服务的攻击,因为典型的反应是退出应用程序。
操作
使用功能地址空间布局随机化(本)。

有效性:深度防御

注:这不是一个完整的解决方案。然而,它迫使攻击者猜测一个未知值,改变每一个程序执行。此外,仍有可能导致拒绝服务的攻击,因为典型的反应是退出应用程序。
操作
使用一个CPU和操作系统提供数据执行保护(NX)或其等价的。

有效性:深度防御

注:这不是一个完整的解决方案,因为缓冲区溢位可以用来覆盖附近的变量以危险的方式修改软件的状态。此外,它不能用于变为无效来情况下,代码是必需的。最后,仍可能导致拒绝服务的攻击,因为典型的反应是退出应用程序。
实现
检查编译器警告密切并消除潜在的安全隐患问题,如签署/无符号不匹配在内存中操作,或使用未初始化的变量。即使很少被利用的弱点,一个单一的故障可能会导致整个系统的妥协。
架构和设计,操作
使用所需的最低特权运行您的代码来完成必要的任务。如果可能的话,创建独立帐户权限有限,只用于一个任务。这样,一个成功的攻击不会立即给攻击者访问其他软件或其环境。例如,数据库应用程序很少需要作为数据库管理员运行,特别是在日常操作。
架构和设计,操作
运行您的代码在一个“监狱”或类似沙箱环境,执行严格的流程和操作系统之间的边界。这可能有效地限制哪些文件可以在一个特定的目录或访问哪些命令可以执行您的软件。

操作系统的例子包括Unix chroot监狱,AppArmor对,SELinux。在一般情况下,托管代码可能会提供一些保护。例如,java。在Java SecurityManager FilePermission允许您指定文件操作的限制。

这可能不是一个可行的解决方案,它只限制对操作系统的影响;应用程序的其余部分可能仍然接受妥协。

应该注意避免cwe - 243和相关弱点监狱。

有效性:有限

指出:这种缓解的有效性取决于特定的沙盒或监狱的预防功能使用,只可能有助于减少攻击的范围,比如限制某些系统调用或限制的攻击者可以访问文件系统的一部分。
相关的连续波
cwe - 120 缓冲区复制没有检查输入的大小(经典的缓冲区溢出)
cwe - 129 不当的验证数组索引
cwe - 805 缓冲区长度值不正确的访问
相关的攻击模式

CAPEC-IDs:(查看所有)
47,One hundred.

21 cwe - 307:不当限制过度认证尝试

总结
弱点患病率 后果
修复的成本 方便检测
攻击频率 攻击者的意识

讨论

一个常用短语是“如果一开始你没有成功,尝试,再试一次。”一个ttackers may try to break into your account by writing programs that repeatedly guess different passwords. Without some kind of protection against brute force techniques, the attack will eventually succeed. You don't have to be advanced to be persistent.

技术细节|代码示例|检测方法|引用

预防和缓解措施
架构和设计
常见的保护机制包括:

断开少数失败的尝试后的用户

实现一个超时

锁定一个目标帐户

需要计算用户的任务。
架构和设计
使用审查库或框架不允许这个弱点发生或提供了结构,使这个弱点更容易避免的。

考虑使用与身份验证功能,如OpenSSL库或ESAPI身份。
相关的连续波
cwe - 302 认证绕过Assumed-Immutable数据
cwe - 306 失踪的身份验证的重要功能
相关的攻击模式

CAPEC-IDs:(查看所有)
16,49,55,70年,112年

22 cwe - 601:URL重定向不可信的网站(“开放重定向”)

总结
弱点患病率 后果 代码执行,数据丢失,拒绝服务
修复的成本 媒介 方便检测 容易
攻击频率 有时 攻击者的意识 媒介

讨论

尽管万维网的力量是在分享和网站之间的链接后,通常有一个假设,一个用户可以点击一个链接或执行其他操作之前发送到不同的网站。许多web应用程序实现了重定向功能,允许攻击者指定任意URL链接,和web客户端自动这。这可能是另一个的特性”只是网络的工作方式,“但是如果任其发展,它可能是有用的,攻击者在几个重要方面。首先,受害者可能autoamtically重定向到一个恶意网站,试图攻击受害者通过web浏览器。交替,可以进行钓鱼攻击技巧受害者访问恶意网站冒充合法网站。不管怎样,一个不受控制的重定向将您的用户,他们不想去的地方。

技术细节|代码示例|检测方法|引用

预防和缓解措施
实现
假设所有的输入是恶意的。使用一个“接受良好的“输入验证策略,即。,use a whitelist of acceptable inputs that strictly conform to specifications. Reject any input that does not strictly conform to specifications, or transform it into something that does. Do not rely exclusively on looking for malicious or malformed inputs (i.e., do not rely on a blacklist). However, blacklists can be useful for detecting potential attacks or determining which inputs are so malformed that they should be rejected outright.

当执行输入验证,考虑所有可能相关的属性,包括长度,类型的输入,可接受的值的全系列,缺失或额外的输入,语法,一致性相关领域,符合业务规则。作为业务规则逻辑的一个例子,在语法上“船”可能是有效的,因为它只包含字母数字字符,但它不是有效的如果你期望的颜色,如“红”或“蓝色”。

使用白名单的批准用于重定向url或域。
架构和设计
使用一个中间免责声明页面,为用户提供了一个明确的警告,他们离开你的网站。实现一个长期超时重定向发生之前,或迫使用户点击链接。小心避免XSS问题(cwe - 79)在生成免责声明页面。
架构和设计
组接受对象时,如文件名或url,是有限的或已知,从一组固定的输入值创建一个映射(比如数字id)实际的文件名或url,并拒绝所有其他输入。

例如,ID 1可以映射到“/登录。asp”和ID 2可以映射到“http://www.example.com/”。特性如ESAPI AccessReferenceMap提供此功能。
架构和设计,实现
理解所有潜在的地区不受信任的输入可以输入软件:参数或参数,饼干,任何从网络读取环境变量,反向DNS查找,查询结果,请求头,URL组件、电子邮件、文件、文件名、数据库,以及任何外部系统提供数据的应用程序。记住,这样的投入可以获得间接通过API调用。

许多开放重定向问题出现,因为程序员假定某些输入不能修改,如饼干和隐藏的表单字段。
操作
使用应用程序防火墙,可以检测到攻击这个弱点。它可以是有益的情况下,代码不能固定(因为它是由第三方控制),作为一项紧急预防措施,更全面的软件保证措施被应用,或者提供深度防御。

有效性:温和

注:应用程序防火墙不可能涵盖所有可能的输入向量。此外,攻击技术可能可以绕过保护机制,比如使用畸形的输入,仍然可以由组件接收处理这些输入。根据功能的不同,应用程序防火墙可能会无意中拒绝或修改合法请求。最后,一些手动工作可能需要定制。
相关的连续波

一个也没有。

相关的攻击模式

CAPEC-IDs:(查看所有)
194年

23 cwe - 134:不受控制的格式字符串

总结
弱点患病率 后果
修复的成本 方便检测
攻击频率 攻击者的意识

讨论

咒语是成功的关系取决于沟通清楚,这也适用于软件。格式字符串通常被用来发送或接收数据格式良好的。通过控制一个格式字符串,攻击者可以控制输入或输出以意想不到的方式,有时,甚至执行代码。

技术细节|代码示例|检测方法|引用

预防和缓解措施
需求
选择一种语言,不受这一缺陷。
实现
确保所有格式字符串函数通过一个静态的字符串不能由用户控制,适当的数量的参数总是发送到该函数。如果可能的话,使用功能不支持格式化字符串% n运营商。

构建:注意编译器和连接器的警告,因为他们可能会提醒你不当使用。
相关的连续波

一个也没有。

相关的攻击模式

CAPEC-IDs:(查看所有)
67年

24 cwe - 190:整数溢出或概括

总结
弱点患病率 常见的 后果 代码执行拒绝服务,数据丢失
修复的成本 方便检测 容易
攻击频率 有时 攻击者的意识

讨论

在现实世界中,255 + 1 = 256。但是对于一个计算机程序,有时255 + 1 = 0,或0 - 1 = 65535,或者40000 + 40000 = 14464。你不必是一个数学天才闻可疑的东西。实际上,这种行为已经持续了几十年,有一个完全理性和极其无聊的解释。最终,它深埋在DNA计算机,不能数到无穷大,即使有时感觉他们需要很长时间才能完成一项重要任务。当程序员忘记电脑不做数学就像人一样,不好的事情接踵而来,在崩溃,错误的价格计算,无限循环,执行代码。

技术细节|代码示例|检测方法|引用

预防和缓解措施
需求
确保所有协议都严格定义,这样所有禁止入内的行为可以被识别简单,并要求严格的一致性协议。
需求
使用一种语言,不允许这个弱点或发生提供了结构,使这个弱点更容易避免的。

如果可能的话,选择一种语言或编译器执行自动范围检查。
架构和设计
使用审查库或框架不允许这个弱点发生或提供了结构,使这个弱点更容易避免的。

使用库或框架更容易处理数字没有意想不到的后果。

例子包括安全整数处理包如SafeInt (c++)或IntegerLib (C或c++)。
实现
对任何数字输入执行输入验证,确保它是在预期的范围内。执行输入同时满足最小和最大预期范围的需求。

尽可能使用无符号整数。这使它更容易为整数溢出进行健康检查。如果你必须使用整数签署,确保你检查范围包括最小值和最大值。
实现
了解编程语言的基本表示形式,以及它如何与数值计算(cwe - 681)。密切关注字节大小差异,精度,签署/无符号的区别,截断,类型之间的转换和铸造,“不是一个数字”计算,和你的语言如何处理数字太大或太小的底层表示。

也要小心占32位,64位,和其他潜在的差异可能影响数字表示。
架构和设计
对于任何一个在客户端执行安全检查,确保这些检查复制在服务器端,为了避免cwe - 602。攻击者可以绕过客户端检查通过修改值后,检查执行,或通过改变客户端完全删除客户端检查。然后,这些修改的值将被提交到服务器。
实现
检查编译器警告密切并消除潜在的安全隐患问题,如签署/无符号不匹配在内存中操作,或使用未初始化的变量。即使很少被利用的弱点,一个单一的故障可能会导致整个系统的妥协。
相关的连续波
cwe - 191 整数下溢(包装或概括)
相关的攻击模式

CAPEC-IDs:(查看所有)
92年

25 cwe - 759:使用单向散列没有盐

总结
弱点患病率 媒介 后果 安全绕过
修复的成本 中等到高 方便检测 温和的
攻击频率 很少 攻击者的意识

讨论

盐可能不适合你的饮食,但它可以适合你的密码安全。而不是存储在纯文本密码,常见的做法是使用单向散列,有效随机输出,可以使它更加困难,如果(或什么时候?)攻击者获取你的密码数据库。如果你不加入少许盐散列,那么您的应用程序的健康危险。

技术细节|代码示例|检测方法|引用

预防和缓解措施
架构和设计
生成一个随机的盐每次处理一个新密码。加入盐的明文密码散列前。当你储存的散列,也存储盐。不使用相同的盐对每个密码流程(cwe - 760)。
架构和设计
使用单向散列技术,允许您配置大量的轮,如bcrypt。处理传入的身份验证请求时这可能会增加费用,但是如果哈希密码被盗,这大大增加了努力进行蛮力攻击,包括彩虹表。能够配置轮的数量,你可以增加数量的轮每当CPU速度或攻击技术变得更有效率。
实现,架构和设计
当你使用有技术,你需要正确地使用它们。不偷工减料,跳过资源密集型步骤(cwe - 325)。这些步骤通常是必不可少的预防常见的攻击。
相关的连续波
cwe - 259 使用硬编码的密码
cwe - 321 使用硬编码的加密密钥
相关的攻击模式

CAPEC-IDs:(查看所有)
16,20.,49,55,97年

怪物移植
怪物移植

这些缓解措施将有效地消除或减少的严重程度排名前25位。这些气候变化还将解决许多弱点,甚至在前25名。如果你采用这些措施之一,你正在你的方式使更安全的软件。

一个怪物缓解矩阵也可用来展示这些移植适用于弱点在前25名中。

ID 描述
M1 建立和维护控制你所有的输入。
平方米 建立和维护控制你所有的输出。
M3 锁定您的环境。
M4 假设外部组件可以被颠覆,和任何人都可以阅读你的代码。
M5 使用行业认可的安全特性,而不是发明你自己的。
GP1中 (一般)使用库和框架,使其更容易避免引入的弱点。
GP2 (一般)安全集成到整个软件开发生命周期。
GP3 (一般)使用广泛的混合方法,全面查找和避免缺点。
GP4 (一般)允许锁定客户与您的软件进行交互。

看到怪物缓解矩阵地图被排名前25位的弱点。

附录A:选择标准和支持字段
附录A:选择标准和支持字段

条目在2011前25位选择使用三个主要标准:普遍弱点,重要性,利用的可能性。

患病率

患病率平均有效投票贡献者提供的值是2010年排名前25位的列表。这反映了选民的评估通常遇到的问题是如何在他们的环境。例如,软件供应商评估患病率相对于他们自己的软件;顾问评估流行基于他们的经验在评价别人的软件。

可接受的等级是:

广泛的 这个弱点更频繁地遇到比几乎所有其他的弱点。注意:对于一般列表中的选择,所使用的“广泛”评级不能超过4次。
经常遇到这个弱点,但这不是普遍的。
常见的 定期遇到这个弱点。
有限的 遇到这个弱点很少或从来没有。

重要性

重要性有效平均投票贡献者提供的值是2011年排名前25位的列表。这反映了选民的评估环境的问题是多么的重要。

评级的重要性是:

至关重要的 这个弱点是更重要的比其他任何的弱点,或者它是最重要的之一。它应该尽快解决,可能需要投入资源,通常会被分配到其他任务。(例如:缓冲区溢出可能会收到一个关键评级在非托管代码,因为代码执行的可能性。)注意:对于一般列表中的选择,所使用的“关键”评级不能超过4次。
这个弱点应该尽快解决,但它没有最关键的重要的弱点。(例如:在某些威胁模型,一个错误消息信息泄漏可能给予高度重视,因为它可以简化很多其他攻击。)
媒介 这个弱点应该解决,但只有在高和临界水平的弱点已经解决。
这不是迫切解决的弱点,或者并不重要。

附加字段

每个CWE列出条目还包括几个额外的字段,其值定义如下。

后果

当这个弱点出现在软件形成一个漏洞,利用典型的后果是什么吗?

代码执行 攻击者可以执行代码或命令
数据丢失 攻击者可以窃取、修改或腐败的敏感数据
拒绝服务 攻击者可以导致软件失败或放慢速度,防止合法用户能够使用它
安全绕过 攻击者可以绕过安全保护机制;结果取决于旨在保护的机制

攻击频率

多久这个弱点出现漏洞,一个熟练的目标,确定攻击者?

考虑一个“暴露主机”:一个面向internet服务器,一个即上网客户端,一个多用户系统与不受信任的用户或多层系统,跨越组织或信任边界。也考虑到熟练,确定攻击者可以结合攻击多个系统为了达到一个目标主机。

经常 一个暴露的主机可能会在每天看到这种攻击。
有时 一个暴露的主机可能会看到这种攻击超过每月一次。
很少 一个暴露的主机可能会看到这种攻击通常少于每月一次。

方便检测

技术有多容易,确定攻击者找到这个弱点,使用黑盒还是白盒方法,手动还是自动?

容易 自动化工具或技术存在检测这一弱点,或者它可以迅速找到使用简单的操作(比如在表单字段输入“<脚本>”来检测明显XSS)。
温和的

只有部分支持使用自动化工具或技术;可能需要一些程序逻辑的理解;可能只存在在罕见情况下可能不会直接攻击者控制(如低内存条件)。
困难 需要耗费时间,手工方法或智能自动化的支持,随着攻击者的专业知识。

修复的成本

资源密集型如何修复这一弱点时吗?这不能量化一般地,因为每个开发人员都是不同的。对于这个列表的目的,成本被定义为:

代码更改在一块或函数
媒介 代码或算法改变,可能当地的单个文件或组件
需要设计或结构上的重大改变,或脆弱的下游组件要求的行为,如库函数的设计问题

这个选择没有考虑其他成本因素,如程序补丁,测试,培训,补丁部署、质量保证等。

攻击者的意识

一个熟练的可能性,确定攻击者会意识到这个缺点,检测方法和开发方法。假设攻击者知道这配置或使用环境。

攻击者能够检测这种类型的弱点和编写可靠的流行平台利用或配置。
媒介 攻击者知道弱点通过定期监测安全邮件列表或数据库,但不一定探索密切,和自动利用框架或技术不一定是可用的。
攻击者没有意识到这个问题,并不关注它,或者弱点需要特殊的技术专长,攻击者并不一定(但可能获得)。

相关的连续波

这列出了一些CWE给定的条目相关的条目。这包括低级变异,或可能发生的连续波,当给定的条目也在场。

列表相关的连续波是说明性的,不是完整的。

相关的攻击模式

这提供了一个列表的攻击模式,可以成功地检测或利用给定的弱点。这是提供的常见的攻击模式枚举和分类(CAPEC) id。

附录B:改变了在2011年的前25位
附录B:改变了在2011年的前25位

发布的2009年和2010年排名前25位的努力导致了广泛的反馈开发人员、产品经理、安全业内专业人士,和其他人。斜方并无使用这个反馈,使几个2011年排名前25位的显著改善,虽然保留了和去年一样的精神和目标努力。

2011年的版本了类似的过程在2010年提名潜在的条目和收集票,今年除了水煤浆0.8使用,选民必须评估利用除了流行的可能性和重要性因素在2010年使用。更多的细节在附录C

类似于2010年的过程中,人们被要求今年提名潜在的弱点。41提名的名单。在投票阶段,选票评估每个弱点基于其患病率,重要性,利用的可能性。一个定制的常见的弱点评分系统(水煤浆)用于每个投票转换成水煤浆得分的弱点。每个弱点的成绩平均在一起为了确定最后的排名。(注意,更详细的得分分布数据。)

一些条目从2010换成了条目列表,在一个不同的抽象层次。2011排名前25位的条目更一致的抽象级别比之前的列表。

在2010年和2011年之间的变化

这个表总结了前25位最重要的变化在2010年和2011年之间。

2010年 2011年
cwe - 285 cwe - 862和cwe - 863取代,更具体。
cwe - 98 cwe - 829所取代,这是更普遍(cwe - 98只适用于PHP应用程序)。
新条目 新条目在今年排名前25名(不含cwe - 829, cwe - 862和cwe - 863,如前所述):cwe - 250, cwe - 676, cwe - 134和cwe - 759。

附录C:建筑、选择和得分的前25位
附录C:建筑、选择和得分的前25位

2011年版本的排名前25位的列表是使用一个过程生成类似于2010年。受访者从电子邮件请求,和参与者的前几年,被要求今年提名潜在的弱点。清单41从这些候选人提名草拟(巧合的是与2010年相同数量。)选民在投票阶段,调查评估每个弱点基于其患病率,重要性,利用的可能性。与2010年的投票,没有限制有多少“关键”或“普遍”的选票可以分配。

有28个选民,代表软件开发者,扫描工具厂商,安全顾问,政府代表和大学教授。表示是国际学生。

然后,水煤浆0.8被用来评估每个选民的候选人的评估,填写适当的权重患病率,重要性,和利用的可能性;剩下的15个因素都分配”“不适用”的价值观,从而减少这些因素的影响最终得分。由于水煤浆公式是如何构建的,使用“不适用”的值需要一步正常化的原始分数产生最后得分下降0到100的范围内。在水煤浆0.8公式,三个积极的因素,最后的得分是最有影响的重要性,然后患病率,然后利用的可能性。

为每个指定条目,收集所有的分数,平均起来生成最终的排名。(注意,更详细的得分分布数据。)

附录D: OWASP相比2010年十大
附录D: OWASP相比2010年十大

OWASP十大2010对于开发人员来说是一个有价值的文档。其重点是web应用程序,它描述问题的风险,而不是弱点。它还使用不同的指标选择。

一般来说,CWE /无2010排名前25位的覆盖更多的弱点,包括那些很少出现在web应用程序中,如缓冲区溢出。

下面的列表标识每个十大类别及其相关CWE条目。

OWASP十大2010 2011年排名前25位
A1 -注射 cwe cwe - 89 - 78
A2 -跨站脚本(XSS) cwe - 79
A3 -破碎的认证和会话管理 cwe cwe cwe - 306 - 307 - 798
A4 -不安全的直接对象引用 cwe cwe - 862——863年,CWE-22 cwe cwe - 434 - 829
A5,跨站请求伪造(CSRF) cwe - 352
A6——安全错误配置 cwe cwe - 250 - 732
A7 -不安全的加密存储 cwe cwe cwe - 327 - 311 - 759
A8——未能限制的URL访问 cwe cwe - 862 - 863
A9,传输层保护不足 cwe - 311
A10——用户重定向和转发 cwe - 601
(不是2010年OWASP前十名) 以下CWE条目不直接覆盖的OWASP十大2010:CWE - 120, CWE - 134, CWE - 807, CWE - 676, CWE CWE - 131 - 190。

附录E:排名前25位的其他资源
附录E:排名前25位的其他资源

虽然这是主文档,其他证明文件是可用的:

修改这个文档
修改这个文档
版本 日期 描述
1.0.3 2011年9月13日 更新OWASP十大官方2010年RC1版本的映射。

更新内容以匹配新的CWE 2.1版。
1.0.2中 2011年6月29日 更新OWASP排名前十的映射。

固定失效链接。
1.0.1 2011年6月27日 更新指导、附录、怪物移植。

修正了一些错误。

更新的怪物移植。
1.0 2011年6月27日 初始版本
页面最后更新:2021年7月22日