CWE

常见的弱点枚举

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

2021 CWE最重要的硬件的弱点
CWE最危险的弱点
>CWE前25名> 2010
ID

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


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


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

文档版本:1.08 (pdf)

日期:2010年3月29日

项目协调员:

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

文档编辑器:

史蒂夫Christey(斜方)

介绍
介绍

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

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

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

2010年的前25名实质性的改进2009年的名单,但精神和目标保持不变。名单已经被修改的结构来区分缓解措施从更具体的弱点和通用安全编程原则。今年的排名前25位的条目优先来自20多个不同组织的使用输入评估每个弱点基于普遍性和重要性。新版本介绍重点概要文件允许开发人员和其他用户选择部分的前25位最相关的他们的担忧。新列表还添加了少量的最有效的应对“怪物”,帮助开发者减少或消除整个团体排名前25位的弱点,以及许多其他的800 CWE记录的弱点。最后,许多高层的弱点2009名单已经取代低级变异更可行的。

表的内容
表的内容

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

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

用户 活动
程序员新安全 读了简短的清单,然后检查怪物移植部分看到少量的变化在你的实践可以在前25名中有很大的影响。检查重点概要文件,来确定哪些问题你想要集中精力。

如果25项太多,选择个体集中配置文件,例如弱点的语言教育的重点。选择最适合您的需求的优先级方案,如的配置文件重视的重要性在流行软件的客户,这可能是有用的。如果你的软件是基于web的,看到前25和之间的比较OWASP十大2010 RC1

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

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

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

如果你正在考虑建立一个定制的“n”名单,适合你的需要和实践,参考附录C看到它是如何完成今年的前25位。开发自己的候选人名单的弱点,用你自己的普遍性和重要性因素和其他因素,你可能希望,那么建立一个度量和比较结果与你的同事,这可能会产生一些富有成果的讨论。
软件项目经理 治疗前25作为早期介入更大努力实现软件安全。战略可能性是覆盖等措施BSIMM,SAFECode,OpenSAMM,微软SDL,asv

仔细的研究重点概要文件找到最适合你的概要文件。特别是检查资料,确定哪些自动和手工技术用于检测的缺点,最好和他们是否固定设计和实现阶段软件开发生命周期。检查配置文件,它提供了一个崩溃的语言。还审查这个概要文件,队伍主要由弱点重要性因为这可能是最重要的客户软件。检查怪物移植部分,以确定哪些方法可能是最合适的采取,或建立自己的怪物移植和绘制出排名前25位的处理。

考虑建立一个定制的“n”名单,适合你的需要和实践;咨询附录C建设和评分的前25位。开发自己的候选人名单的弱点,用你自己的普遍性和重要性因素——或其他更重要的因素,那么分数结果,并将它们与你的同事比较,这可能会产生一些富有成果的讨论。
软件测试人员 读了简短的清单并考虑如何将这些弱点的知识集成到你的测试。检查重点概要文件帮助你决定哪些问题需要关注。如果你在一个友好的竞争与开发人员,您可能会发现一些惊喜处于条目,或者其他的CWE

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

查阅重点概要弱点的排名的重要性看到这弱点,是最重要的,独立于他们是多么普遍。你使用的软件产品,密切关注公开报道这些产品中的安全漏洞。看看他们反映的任何相关弱点在前25名,如果是这样,请联系您的供应商确定处理供应商承担风险降到最低,这些缺点将继续引入代码。

使用设计和实现配置文件,以确定哪些弱点只可以在设计阶段。这通常意味着,如果发现设计相关的弱点在您购买的软件,它可能需要很长时间的供应商提供一个修复。看到处于总结其他弱点,并没有使最后的前25名;这将包括弱点,只是开始生长在普遍性和重要性,所以他们可能会在将来成为你的问题。
教育工作者 读了简短的清单,然后复习重点概要文件,来确定哪些问题你可能想要盖,特别是教育的重点概要文件。一些培训材料也可用。
用户2009年前25名 看到什么改变了部分;虽然发生了很多变化从表面上看,今年的努力是结构良好的。查阅重点概要文件并选择最适合你,或者创建自己的。

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

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

注:其他16个弱点被认为包含在前25名中,但是他们一般分数不够高。他们中列出处于重点概要文件。

排名 分数 ID 的名字
[1] 346年 cwe - 79 中和不当输入在Web页面生成(“跨站点脚本编制”)
[2] 330年 cwe - 89 不当使用中和特殊元素在一个SQL命令(SQL注入)
[3] 273年 cwe - 120 缓冲区复制没有检查输入的大小(经典的缓冲区溢出)
[4] 261年 cwe - 352 跨站请求伪造(CSRF)
[5] 219年 cwe - 285 不适当的授权
[6] 202年 cwe - 807 依赖不可信的输入在一个安全的决定
[7] 197年 CWE-22 不当限制限制目录的路径名(“路径遍历”)
[8] 194年 cwe - 434 无限制上传文件与危险的类型
[9] 188年 cwe - 78 不当使用中和特殊元素在一个操作系统命令(OS命令注入)
[10] 188年 cwe - 311 失踪的敏感数据的加密
[11] 176年 cwe - 798 使用硬编码的凭证
[12] 158年 cwe - 805 缓冲区长度值不正确的访问
[13] 157年 cwe - 98 不当控制包括/需要声明在PHP程序的文件名(PHP文件包含)
[14] 156年 cwe - 129 不当的验证数组索引
[15] 155年 cwe - 754 不适当的检查异常或异常情况
[16] 154年 cwe - 209 通过一个错误消息公开的信息
[17] 154年 cwe - 190 整数溢出或概括的
[18] 153年 cwe - 131 不正确的缓冲区大小的计算
[19] 147年 cwe - 306 失踪的身份验证的重要功能
[20] 146年 cwe - 494 下载的代码没有完整性检查
[21] 145年 cwe - 732 不正确的权限分配的关键资源
[22] 145年 cwe - 770 资源配置没有限制或节流
[23] 142年 cwe - 601 URL重定向不可信的网站(“开放重定向”)
[24] 141年 cwe - 327 使用损坏或危险的密码算法
[25] 138年 cwe - 362 使用共享资源与不当同步并发执行(“竞争条件”)

跨站点脚本、SQL注入2010年1 - 2拳的安全弱点。即使一个软件包不主要运行在网络上,有一个好机会,它有一个基于web的管理界面或基于html输出格式,允许跨站点脚本。数据丰富的应用软件,SQL注入的手段窃取王国的钥匙。在第三个经典的缓冲区溢出来,而更复杂的缓冲区溢位变体洒在前25名。

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

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

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

安全组件之间的交互

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

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

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

有风险的资源管理

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

排名 CWE ID 的名字
[3] cwe - 120 缓冲区复制没有检查输入的大小(经典的缓冲区溢出)
[7] CWE-22 不当限制限制目录的路径名(“路径遍历”)
[12] cwe - 805 缓冲区长度值不正确的访问
[13] cwe - 754 不适当的检查异常或异常情况
[14] cwe - 98 不当控制包括/需要声明在PHP程序的文件名(PHP文件包含)
[15] cwe - 129 不当的验证数组索引
[16] cwe - 190 整数溢出或概括的
[18] cwe - 131 不正确的缓冲区大小的计算
[20] cwe - 494 下载的代码没有完整性检查
[22] cwe - 770 资源配置没有限制或节流

多孔防御

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

排名 CWE ID 的名字
[5] cwe - 285 不当访问控制(授权)
[6] cwe - 807 依赖不可信的输入在一个安全的决定
[10] cwe - 311 失踪的敏感数据的加密
[11] cwe - 798 使用硬编码的凭证
[19] cwe - 306 失踪的身份验证的重要功能
[21] cwe - 732 不正确的权限分配的关键资源
[24] cwe - 327 使用损坏或危险的密码算法

重点概要文件
重点概要文件

物品一般排名前25位的列表的优先级是——一般。排名,甚至选择哪些项目应该包括,可以相差很大取决于上下文。理想情况下,每个组织可以决定如何排名的弱点根据自己的标准,而不是依赖于一个通用的列表。

一个单独的文档提供了几个“重点概要”用自己的标准选择和排名,这可能是更有用的比一般的列表。

的名字 描述

处于:缺点,没有2010年的前25位
从最初的候选人41 CWE提交条目的列表,选择了前25名。这个“尖端”概要文件包含剩余的16个弱点,不使它成为最后的前25位。
教育的重点 此概要排名很重要的弱点在学校或大学从教育的角度看语境。它关注CWE条目,毕业的学生应该知道,包括历史上重要的弱点。
弱点的语言 这个配置文件指定哪些弱点出现在哪些编程语言。发现大多数缺点都是独立于语言的,尽管他们可能在一种语言更普遍。
弱点通常固定在设计或实现 这个概要文件列表的弱点通常是固定在设计或实现。
自动与手动分析 这个概要文件突出弱点可以使用自动和手动检测分析。目前,很少有公共权威的信息关于这些方法的有效性及其效用。有许多相互竞争的观点,即使在专家。因此,这些评级应该只被视为指导方针,而不是规则。
为开发人员和软件安全实践 这个概要文件的开发人员已经建立的安全实践。它使用的选票主要开发人员造成了前25名。
排名的重要性,对于软件的客户 此概要行列的弱点主要是基于其重要性,确定从基地投票数据用于创建列表。患病率是包含在分数,但它有很多不如重要性权重。
弱点由技术的影响 这个概要文件列表根据他们的技术弱点的影响,即。,攻击者可以实现利用每个弱点。

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

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

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

支持信息

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

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

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

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

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

1 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年

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

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

讨论

这些天,似乎软件都是关于数据:到数据库,从数据库中拉,按摩到信息,并将其发送给其他地方为了好玩和利润。如果攻击者可以影响SQL,您使用与数据库通信,然后突然你所有的乐趣和利润属于他们。如果您使用SQL查询认证等安全控制,攻击者可能会改变这些查询的逻辑绕过安全。他们可以修改查询来偷,腐败,或者改变你的基础数据。他们甚至会偷一次一个字节的数据如果他们,和他们有耐心和知识。

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

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

例如,考虑使用持久性层如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年

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 - 352:跨站点请求伪造(CSRF)

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

讨论

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

5 cwe - 285:不适当的授权

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

讨论

假设你举办聚会几个亲密的朋友和他们的客人。你邀请大家进入你的客厅,但是当你赶上你的一个朋友,其中一个客人袭击你的冰箱,偷看到你的药箱,思考你藏在你的床旁边的床头柜上。软件面临类似的授权问题,可能会导致更严重的后果。如果你不确保您的软件的用户只有做他们允许,那么攻击者会试图利用你的授权和不当锻炼未经授权的功能,你只用于限制用户。

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

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

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

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

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

CAPEC-IDs:(查看所有)
1,13,17,39,45,51,59,60,76年,77年,87年,104年

6 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年

7 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年

8 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年

9 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年

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

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

讨论

每当敏感数据被存储或传送任何地方在你的控制之外,攻击者可能会寻找方法。小偷可能在任何地方——嗅探你的数据包,读你的数据库和筛选你的文件系统。如果你的软件通过网络发送敏感信息,如私人数据或身份验证凭证,在途信息横跨许多不同的节点到它的目的地。攻击者可以嗅这些数据正确的线,它不需要很多的努力。所有他们需要做的就是控制一个节点最终目的地的路径,控制任何节点在同一网络的交通节点,或插入一个可用的接口。如果你的软件将敏感信息存储在一个本地文件或数据库,可能会有其他方法对攻击者的文件。他们可能会受益于宽松的权限,开发另一个漏洞,或物理磁盘的盗窃。你知道那些巨大的信用卡盗窃你听到吗?他们中的许多人是由于未加密存储。

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

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

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

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

讨论

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

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

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

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

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

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

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

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

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

12 cwe - 805:缓冲区访问与不正确的长度值

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

讨论

一个受欢迎的侮辱是:“带一长一短离开码头。”One programming equivalent for this insult is to access memory buffers using an incorrect length value. Whether you're reading or writing data as you march down that pier, once you've passed the boundaries of the buffer, you'll wind up in deep water.

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

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

例如,执行自己的内存管理的多种语言,比如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字符串。

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

如果有必要,所有输入字符串截断合理长度之前他们复制和连接功能。
架构和设计
对于任何一个在客户端执行安全检查,确保这些检查复制在服务器端,为了避免cwe - 602。攻击者可以绕过客户端检查通过修改值后,检查执行,或通过改变客户端完全删除客户端检查。然后,这些修改的值将被提交到服务器。
操作
使用功能地址空间布局随机化(本)。

有效性:深度防御

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

有效性:深度防御

注:这不是一个完整的解决方案,因为缓冲区溢位可以用来覆盖附近的变量以危险的方式修改软件的状态。此外,它不能用于变为无效来情况下,代码是必需的。最后,仍可能导致拒绝服务的攻击,因为典型的反应是退出应用程序。
架构和设计,操作
使用所需的最低特权运行您的代码来完成必要的任务。如果可能的话,创建独立帐户权限有限,只用于一个任务。这样,一个成功的攻击不会立即给攻击者访问其他软件或其环境。例如,数据库应用程序很少需要作为数据库管理员运行,特别是在日常操作。
架构和设计,操作
运行您的代码在一个“监狱”或类似沙箱环境,执行严格的流程和操作系统之间的边界。这可能有效地限制哪些文件可以在一个特定的目录或访问哪些命令可以执行您的软件。

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

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

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

有效性:有限

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

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

13 cwe - 98:不当控制包括/需要声明在PHP程序的文件名(PHP文件包含)

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

讨论

不是很多排名前25位的弱点是独一无二的一个编程语言,但这只是表明这个是多么的特别。想法很简单:你可以做很多更小的部分文档(或程序),然后将它们组合在一起变成一个大文档(或程序)通过“包括”或“需要”这些小的碎片。这是一种普遍的方式来构建项目。结合允许攻击者的共同趋势影响文档的位置(或程序)——甚至attacker-controlled网站,如果你不幸——突然攻击者可以读取任何文档(或运行任何程序)在您的web服务器上。此功能已被删除或明显有限在以后版本的PHP,但尽管证据表明一切都变了在互联网上每2年,代码是永恒的。

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

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

有效性:温和

注:应用程序防火墙不可能涵盖所有可能的输入向量。此外,攻击技术可能可以绕过保护机制,比如使用畸形的输入,仍然可以由组件接收处理这些输入。根据功能的不同,应用程序防火墙可能会无意中拒绝或修改合法请求。最后,一些手动工作可能需要定制。
操作,实现
开发和运行您的代码在最近的可用的PHP版本,最好是PHP 6或更高版本。许多高风险的特性在PHP解释器早些时候已被移除,限制或禁用默认情况下。
操作,实现
如果您使用的是PHP配置您的应用程序,以便它不使用register_globals。在实现,开发应用程序,以便它不依赖于这个特性,但是小心实现register_globals的模拟cwe - 95等弱点,cwe - 621,和类似的问题。

通常,程序员不保护直接访问文件只包含核心程序。这些包括文件可能假设关键变量已经被调用程序初始化。因此,register_globals的使用结合的能力直接访问包含文件可能允许攻击者进行文件包含攻击。这仍然是一个非常常见的2009年模式。
操作
allow_url_fopen设置为false,这限制了包括文件从远程位置的能力。

有效性:高

注:请注意,PHP的一些版本仍将接受ftp://和其他URI方案。此外,这个设置不保护的代码路径遍历的攻击(CWE-22),也经常成功的对脆弱的代码,允许远程文件包含。
相关的连续波
CWE-22 不当限制限制目录的路径名(“路径遍历”)
cwe - 73 外部控制文件名或路径
相关的攻击模式

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

14 cwe - 129:数组索引不正确验证

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

讨论

如果你使用不可信计算指数时输入一个数组,那么攻击者可以提供一个索引超出了数组界限。如果你分配100对象数组或结构,和攻击者提供了一个索引,是-23或978,然后“异常行为”的委婉语是接下来会发生什么。

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

预防和缓解措施
架构和设计
使用一个输入验证框架如Struts或OWASP ESAPI验证API。如果你使用Struts,注意缺陷由cwe - 101类别。
架构和设计
对于任何一个在客户端执行安全检查,确保这些检查复制在服务器端,为了避免cwe - 602。攻击者可以绕过客户端检查通过修改值后,检查执行,或通过改变客户端完全删除客户端检查。然后,这些修改的值将被提交到服务器。

即使客户端对服务器端安全检查提供最小的好处,他们仍然有用。首先,他们可以支持入侵检测。如果服务器接收输入,应该已经被客户拒绝,那么它可能是一个攻击的迹象。第二,客户端错误检查可以提供有用的反馈给用户预期的有效输入。第三,可能会有意外的服务器端处理时间的减少输入错误,虽然这通常是一个小的储蓄。
需求
使用一种语言,不允许这个弱点或发生提供了结构,使这个弱点更容易避免的。

例如,Ada允许程序员约束变量的值和语言比如Java和Ruby允许程序员处理异常时禁止入内的索引访问。
操作
使用功能地址空间布局随机化(本)。

有效性:深度防御

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

有效性:深度防御

注:这不是一个完整的解决方案,因为缓冲区溢位可以用来覆盖附近的变量以危险的方式修改软件的状态。此外,它不能用于变为无效来情况下,代码是必需的。最后,仍可能导致拒绝服务的攻击,因为典型的反应是退出应用程序。
实现
假设所有的输入是恶意的。使用一个“接受良好的“输入验证策略,即。,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.

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

当访问一个用户控制数组索引,使用严格的目标数组内的值的范围。确保你不允许使用负值。即验证最小和最大可接受的值的范围内。
实现
特别注意验证输入调用代码,跨越语言边界时,如从本机代码的解释型语言。这将创建一个意想不到的语言边界之间的交互。确保你没有违反任何期望的语言接口。例如,尽管Java可能不是容易缓冲区溢出,提供一个大型参数调用本地代码可能会触发一个溢出。
架构和设计,操作
使用所需的最低特权运行您的代码来完成必要的任务。如果可能的话,创建独立帐户权限有限,只用于一个任务。这样,一个成功的攻击不会立即给攻击者访问其他软件或其环境。例如,数据库应用程序很少需要作为数据库管理员运行,特别是在日常操作。
架构和设计,操作
运行您的代码在一个“监狱”或类似沙箱环境,执行严格的流程和操作系统之间的边界。这可能有效地限制哪些文件可以在一个特定的目录或访问哪些命令可以执行您的软件。

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

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

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

有效性:有限

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

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

15 cwe - 754:不适当的检查不寻常或异常情况

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

讨论

墨菲定律说,任何可能出错,就会出错。然而这是人的本性总是相信不好的事情不可能发生,至少不会给你。安明智,愤世嫉俗是值得的。如果你总是期待最糟糕,那么你将更好地准备攻击者试图造成最糟糕的。根据定义,他们试图使用你的软件你不希望的方式。

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

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

选择语言的特性,比如异常处理强迫程序员预测不同寻常的条件,可能会产生异常。自定义异常处理不寻常的业务逻辑可能需要开发条件。小心不要通过敏感异常返回给用户(cwe cwe - 209 - 248)。
实现
检查结果的返回值的函数,并验证预期的值。

有效性:高

注:检查函数的返回值通常是足够了,不过小心的竞态条件(cwe - 362)在并发环境中。
实现
如果使用异常处理、捕获和抛出具体的异常而不是过大的异常(cwe cwe - 396 - 397)。尽可能在本地捕获和处理异常,异常不传播太远调用堆栈(cwe - 705)。避免未经检查或未捕获的异常,可行的(cwe - 248)。

有效性:高

指出:使用特定异常,检查并确保异常,帮助程序员可以预见并妥善处理过许多不寻常的事件发生。
实现
确保错误消息只包含最小的细节,是有用的目标受众,并没有其他人。消息需要罢工之间的平衡过于神秘,不够的。他们应该不一定揭示的方法被用来确定错误。如此详细的信息可以用来改进原攻击来增加成功的机会。

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

暴露潜在攻击者的额外信息上下文的异常条件可以帮助攻击者确定向量是最可能成功的人除了DoS攻击。
实现
假设所有的输入是恶意的。使用一个“接受良好的“输入验证策略,即。,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 - 252 不返回值
cwe - 476 空指针废弃
相关的攻击模式

CAPEC-IDs:(查看所有)

16 cwe - 209通过一个错误消息:信息风险

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

讨论

如果你使用的错误消息,然后他们可以披露秘密任何攻击者敢于滥用您的软件。秘密可以覆盖大范围的有价值的数据,包括个人身份信息(PII)认证证书和服务器配置。有时,他们看似无害的秘密,是方便用户和管理员,如您的软件的安装路径。即使是这些小秘密可以极大地简化更协调一致的攻击,产量更大的回报,这是在现实世界的攻击。这是一个关心你是否发送临时错误消息返回给用户或如果你永久记录在一个日志文件中。

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

预防和缓解措施
实现
确保错误消息只包含最小的细节,是有用的目标受众,并没有其他人。消息需要罢工之间的平衡过于神秘,不够的。他们应该不一定揭示的方法被用来确定错误。如此详细的信息可以用来改进原攻击来增加成功的机会。

如果必须跟踪错误在某些细节,捕捉他们的日志消息,但想想可能发生如果日志消息可以被攻击者。避免任何形式的记录高度敏感的信息,如密码。避免不一致的消息可能会意外地提示攻击者对内部状态,如用户名是否有效。
实现
内部处理异常和不显示错误可能包含敏感信息给用户。
实现
使用命名约定和强劲的类型更容易发现敏感数据时使用。当创建结构,对象,或其他复杂的实体,独立的敏感和不敏感数据尽可能多。

有效性:深度防御

注:这使得它更容易在代码点地方未加密的数据被使用。
实现,构建和编译
调试信息不应使其进入生产。
系统配置
可用的地方,配置环境少用详细的错误消息。例如,在PHP中,禁用display_errors设置在配置期间,或者在运行时使用error_reporting()函数。
系统配置
创建默认的错误页面或信息不泄露任何信息。
相关的连续波
cwe - 204 响应差异信息曝光
cwe - 210 信息曝光生成的错误消息
cwe - 538 文件和目录信息
相关的攻击模式

CAPEC-IDs:(查看所有)
7,54,214年,215年

17 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年

18 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.

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

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

讨论

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

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

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

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

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

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

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

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

20. 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年

21 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年

22 cwe - 770:没有限制或节流的资源分配

总结
弱点患病率 后果 拒绝服务
修复的成本 低到高 方便检测 温和的
攻击频率 很少 攻击者的意识

讨论

假设你在披萨店工作。如果有人打电话和地方的订单一千比萨饼(凤尾鱼)立即交付,你会很快停止,无稽之谈。但一个计算机程序,如果任其自生自灭,愉快地试图填补这一秩序。而软件通常的硬限制下运行系统(内存、磁盘空间、CPU)——它不是特别有礼貌,当它使用所有这些资源排除一切。通常,只有一点是将分配给任何一个人或任务。缺乏控制的资源分配是一个途径导致拒绝服务攻击其他用户的软件,可能整个系统,在某些情况下,这可以用来进行其他更具破坏性的攻击。

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

预防和缓解措施
需求
明确指定最小和最大预期功能,并决定哪些行为可以接受当资源分配达到极限。
架构和设计
限制访问的资源无特权的用户。设置每个用户对资源的限制。允许系统管理员定义这些限制。应该注意避免cwe - 410。
架构和设计
到系统架构设计节流机制。最好的保护是限制未经授权的用户可以引起的资源消耗。强大的身份验证和访问控制模型将有助于防止这种攻击发生在第一个地方,它会帮助管理员识别谁犯下虐待。登录应用程序应该尽可能DoS攻击的保护。限制数据库访问,也许通过缓存结果集,能够最大限度地减少资源消耗。进一步限制潜在的DoS攻击,考虑跟踪来自用户的请求速率和阻塞请求超过率定义阈值。
实现
假设所有的输入是恶意的。使用一个“接受良好的“输入验证策略,即。,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。攻击者可以绕过客户端检查通过修改值后,检查执行,或通过改变客户端完全删除客户端检查。然后,这些修改的值将被提交到服务器。
架构和设计
缓解资源耗尽攻击目标系统要求:

认识到攻击和否认用户进一步访问对于一个给定的时间,通常用增加时间延迟

统一扼杀所有请求,以使其更难以消耗资源的速度比可以再次被释放。

第一个解决方案本身就是一个问题,因为它可能允许攻击者,以防止系统通过一个特定的有效用户的使用。如果攻击者模仿合法用户,他可以阻止用户访问服务器的问题。

第二个解决方案很难有效研究所——甚至当处理得当,它并没有提供一个完整的解决方案。它只是需要更多资源的攻击者。
架构和设计
确保协议的规模有特定的限制。
架构和设计,实现
如果程序失败,必须确保它优雅地失败(失败关闭)。可能存在一种诱惑,让项目失败不佳的情况下(如低内存条件,但攻击者可以断言控制之前,软件已经完全退出。或者,一个不受控制的失败可能会导致级联问题与其他下游组件;例如,这个项目可以发送一个信号给下游工序流程立即知道问题发生,有更好的机会复苏。

确保所有失败资源分配系统到一个安全的姿势。
实现
系统资源使用C时,考虑使用getrlimit()函数包含在sys /资源图书馆为了确定有多少文件目前允许打开的过程。
操作
使用的资源设置提供的操作系统或环境。例如,setrlimit()可用于设置限制对特定类型的资源。然而,这并不是在所有的操作系统都可用。

确保您的应用程序执行适当的错误检查和错误处理,以防资源不可用(cwe - 703)。
相关的连续波

一个也没有。

相关的攻击模式

CAPEC-IDs:(查看所有)
82年,99年,119年,121年,125年,130年,147年,197年,227年,228年,229年

23 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年

24 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年

25 cwe - 362:使用共享资源并发执行不当同步(“竞争条件”)

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

讨论

交通事故发生时,两辆车试图使用相同的资源在几乎相同的时间,即。,同样的路的一部分。竞争条件在你的软件没有多大区别,除了攻击者有意识地想要利用他们造成混乱或让您的应用程序咳出一些有价值的东西。在许多情况下,竞态条件可以包括多个进程中,攻击者完全控制一个过程。即使竞争条件发生在多个线程之间,攻击者可能会影响当一些线程执行。竞态条件你唯一的安慰是数据损坏和拒绝服务是常态。可靠的代码执行的技术还没有被开发出来,。至少不是对某些种类的竞态条件。小小的安慰。可以局部或全局的影响,取决于竞争条件影响,如状态变量或安全逻辑,无论是发生在多个线程,进程或系统。

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

预防和缓解措施
架构和设计
在支持它的语言,使用同步原语。只有将这些在关键代码尽量减少对性能的影响。
架构和设计
使用线程安全的功能,比如数据访问抽象在春天。
架构和设计
减少使用共享资源,从而消除尽可能多的复杂控制流和减少意外情况的发生的可能性。

此外,这将减少同步的必要,甚至可能有助于减少的可能性的拒绝服务攻击者可能会多次触发临界段(cwe - 400)。
实现
使用多线程和操作共享变量时,只使用线程安全的功能。
实现
使用共享变量的原子操作。警惕看上去无害的结构如“x + +”。这可能出现在代码层原子,但它实际上是非原子在指令层,因为它涉及到阅读,后跟一个计算,然后再写。
实现
使用互斥锁如果可用,但一定要避免等相关弱点cwe - 412。
实现
避免双重检查锁定(cwe - 609)和其他实现错误当试图避免出现同步的开销。
实现
禁用中断或信号在代码的关键部分,也是确保代码没有进入一个大型或无限循环。
实现
使用volatile类型修饰符为关键变量来避免意外的编译器优化或重新排序。这并不一定解决同步问题,但它可以帮助。
架构和设计,操作
使用所需的最低特权运行您的代码来完成必要的任务。如果可能的话,创建独立帐户权限有限,只用于一个任务。这样,一个成功的攻击不会立即给攻击者访问其他软件或其环境。例如,数据库应用程序很少需要作为数据库管理员运行,特别是在日常操作。
相关的连续波
cwe - 364 信号处理器竞态条件
cwe - 366 在一个线程竞争条件
cwe - 367 Time-of-check分时(TOCTOU)竞态条件
cwe - 370 缺少检查证书撤销后最初的检查
cwe - 421 在访问备用通道竞态条件
相关的攻击模式

CAPEC-IDs:(查看所有)
26,29日

怪物移植
怪物移植

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

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

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

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

条目在2010前25位选择使用两个主要标准:软弱患病率和重要性。

患病率

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

可接受的等级是:

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

重要性

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

评级的重要性是:

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

附加字段

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

后果

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

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

攻击频率

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

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

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

方便检测

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

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

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

修复的成本

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

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

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

攻击者的意识

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

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

相关的连续波

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

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

相关的攻击模式

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

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

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

2009的一般性质列表有时让读者很难确定窄选择最相关的弱点,他们的忧虑。因此,“集中配置文件”来处理不同的用例。

2009年排名列表没有任何项目,很大程度上是由于被用来创建它的过程中,和缺少定量数据的频率和严重程度的弱点在实际代码。2009年名单也试图基于单一威胁模型提供指导,这未必是最好的选择对于一个通用的列表。在2010年,而更多量化疲软数据是可用的,它并不一定代表;样本量太小;和相关的数据集不总是有不同程度的细节。28 2010年建成使用列表调查组织,谁排名根据他们的患病率和潜在的弱点的重要性,它提供了一些定量支持最终排名。

输入一些排名前25位的贡献者,它是决定给少强调问题的根源弱点,和更多的合成问题。这些根源问题给重叠概念的看法,因为他们通常是适用于其他条目在2009前25名,他们有时被认为是太高级了。因此,有时基本设计问题从2009年的名单,或其他地方。许多这些根源弱点被用作早期基础怪物移植部分。

在其他情况下,高级的弱点被替换为更具体的,可行的。

需求有显著改善细节减轻每一个弱点。这些在2009年持续不断的改进。2010年,提供更加一致的、详细的、全面的移植。为了避免太迷失在细节,还提供了应对“怪物”的摘要,显示产品经理和开发人员联系方式一般实践的弱点,他们的地址。应对这些怪物帮助开发者减少或消除整个团体排名前25位的弱点,以及许多其他的800的弱点中记录的共同弱点枚举(CWE)。

表2009年和2010年之间的变化

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

2009年 2010年
CWE-20 高层次的根源;现在覆盖着怪物移植
cwe - 116 高层次的根源;现在覆盖着怪物移植
cwe - 602 高层次的根源;现在覆盖着怪物移植
cwe - 250 高层次的根源;现在覆盖着怪物移植
cwe - 119 高层阶级;cwe取代低级cwe - 120——129年,cwe - 131和cwe - 805
cwe - 259 取而代之的是更高级的cwe - 798
cwe - 73 高层次的根源;现在覆盖着怪物移植
cwe - 642 高层次的根源;现在覆盖着怪物移植
cwe - 94 高层;CWE名称和描述还导致不当的解释它旨在覆盖类型的问题。
cwe - 404 高层;取而代之的是孩子cwe - 772和cwe - 672
cwe - 682 高层;取而代之的是孩子cwe - 131和cwe - 190
cwe - 319 替换为母公司,cwe - 311

而许多高层的弱点被替换为低级条目或重新安置措施之一部分,一些项目仍在名单上,特别是cwe - 285和cwe - 732。低层的孩子并不容易,可能反映了这样一个事实,访问控制通常是特定于域的。

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

2010年版的前25位列表建立在最初的2009年版。大约40软件安全专家提供反馈,包括软件开发人员、扫描工具厂商安全顾问,政府代表和大学教授。表示是国际学生。

沟通的主要方式是通过一个私人讨论名单,最活动发生的时间大约6周。2009年,有多个迭代的草稿。今年,讨论更多的是集中在一个或两个领域,和草稿较小的部分被张贴。

许多前25名贡献者提倡使用量化,数据驱动的方法。然而,尽管有更多的数据比2010年有2009年,它仍然没有足够的规模或精度。它仍然是令人振奋的看到更多的原始数据生成。

排名前25位的建设和发展发生在接下来的阶段。注意,这些阶段是近似的,因为有许多重叠的活动。

准备的候选人名单

  • 前25名参与者被要求重新评估2009年前25名。为每一个条目,他们被问到是否“保持”或“删除”进入了2010年榜单。
  • 前25名参与者给出的列表“尖端”项目从2009年前25名,以及额外的条目,近年来频繁出现在CVE数据
  • 前25名参与者可以表明新条目添加——无论是从“尖端”或自己的提名。
  • 2009年排名前25位的是重组一些原始条目移动到措施之一部分,并提供较低级别的条目,而不是抽象的。在某些情况下,这迫使新CWE的创建条目(见附录B详情)。
  • 如果有积极倡导任何潜在的条目,然后添加到候选人名单。

选择的因素进行评估

一些简短的讨论后,决定使用两个因素,患病率和重要性。虽然最初期望的为每一个严格的定义,创建更灵活的定义,允许不同的角色在软件安全社区。

患病率将会根据这个标准来进行评估:为每一个“项目”(是否一个软件包,笔测试、教育工作,等等),这一弱点多久发生或造成问题吗?

流行是评级:

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

重要性的标准是:“如果这个弱点出现在软件,你用的是什么优先级时建议你的消费群体?(如修复,减轻教育)”。

评级的重要性是:

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

候选人列表创建和投票

因素后决定创建和最后候选人名单(共有41项),参与者投票包含这些候选人的选票。对于每个候选人条目,选民的投票提供了空间提供一个流行评级,评级的重要性,和任何相关的评论。

  • 参与者进行了大约一个星期来评估项目和投票。这是最终延长三个额外的天。
  • 因为投票过程是由手工填写一个表单,发生一些不一致和不完整的结果。这将触发一个交换电子邮件,直到最后的选票被选中。争论的主要区域的局限性4评级为“关键”的重要性和广泛流行。
  • 投票规则的细化,以确保每个组织只提交一个投票,避免少数组织偏见的可能性结果太多了。一般来说,组织需要合并多个投票发现人运动信息澄清自己的perspectivesamongst对方。

选择的指标

  • 在投票期间,参与者提供了几种可能的方法得分选票和投票设计指标。一些建议添加了两个普遍性和重要性因素联系在一起。建议使用每个因素的广场。其它建议使用不同的权重或值范围。一些指标提出建议使用高值“广泛”患病率和“关键”的重要性,因为这些被人为限制4每个选民对每个因素的评价。
  • 所选指标被评估由技术熟练的使用几种方法包括卡方统计学家的有效性。
  • 最后选择指标发生一旦验证完成。

一般的选择最终名单(排名)

指标的选择后,剩下的选票统计,最后列表选择使用以下过程。

  • 对于每个候选人列表中的弱点,收集所有相关的选票。每一个投票有普遍性和重要性评级。一个创建sub-score投票使用选定的指标。对于每个弱点,小分都收集并加在一起。
  • 候选人名单是基于总分数排序。
  • 25的弱点最高分数从排序的列表中选择。
  • 剩下的弱点被添加到“尖端”列表。
  • 最初提议的一些指标被认为是用于额外的集中配置文件。

挑战

  • 选民想要选择范围的值,它反映意见的多样性和背景发生在许多前25名参与者的日常工作。这对于开发一个通用的指标提出了特殊的挑战。
  • 一些流行的数据是可用的。通常这些数据太高级,但有时太低级了。许多前25名贡献者提倡使用更精确的统计数据,但这些数据并不容易获得,深度和范围。大多数漏洞跟踪工作在高水平的抽象工作。例如,CVE趋势数据可以追踪缓冲区溢位,但公众脆弱性报告很少提及具体错误导致溢出。一些软件供应商可能跟踪弱点在低水平,但即使他们愿意分享这些信息,它代表了一个相当小的数据点。有希望在未来几年内,适当的类型的数据将变得更容易获得。

附录D:比较2010 RC1 OWASP前十名
附录D:比较2010 RC1 OWASP前十名

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

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

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

OWASP十大2010 RC1 2010年排名前25位
A1 -注射 cwe - 89 (SQL注入),cwe - 78 (OS命令注入)
A2 -跨站脚本(XSS) cwe - 79(跨站点脚本)
A3 -破碎的认证和会话管理 cwe cwe cwe - 306 - 307 - 798
A4 -不安全的直接对象引用 cwe - 285
A5,跨站请求伪造(CSRF) cwe - 352
A6——安全错误配置 没有直接的映射;cwe - 209是经常错误配置的结果。
A7 -未能限制的URL访问 cwe - 285
A8——用户重定向和转发 cwe - 601
A9——不安全的加密存储 cwe cwe - 327 - 311
A10,传输层保护不足 cwe - 311

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

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

修改这个文档
修改这个文档
版本 日期 描述
1.08 2011年3月29日 更新细节符合CWE 1.12的发布,主要是与气候变化和名称的变化。
1.07 2010年12月13日 更新的细节符合CWE 1.11的发布,主要与缓解措施和一些名称的变化。
1.06 2010年9月27日 更新的细节符合CWE 1.10的发布,主要是与移植。
1.05 2010年6月29日 修改列表的正式名称,取代“编程”与“软件”
1.04 2010年6月21日 更新的细节符合CWE 1.9的发布,主要是与移植。
1.03 2010年4月5日 更新细节与释放CWE 1.8.1是一致的,主要是通过改进移植和额外CAPEC映射。
1.02 2010年2月25日 固定cwe - 306年“绕过安全”的影响;添加指向无应用程序安全性的博客。
1.01 2010年2月17日, 添加链接到微软SDL,添加页码为PDF
1.0 2010年2月16日 初始版本
更多的信息是可用的,请选择一个不同的过滤器。
页面最后更新:2021年7月22日