写点什么

CWE/SANS 评出 25 种最危险的编程错误

  • 2010-03-31
  • 本文字数:2767 字

    阅读完需:约 9 分钟

一般弱点列举( Common Weakness Enumeration CWE)是由美国国家安全局首先倡议的战略行动,该行动的组织最近发布了《2010 年CWE/SANS 最危险的程序设计错误(PDF)》一文,其中列举了作者认为最严重的25 种代码错误,同时也是软件最容易受到攻击的点。

曾在 InfoQ 中发布过 OWASP Top 10 列表,它所关注的是 web 应用程序的安全风险,而 CWE 的 Top 25 的覆盖范围更广,包括著名的缓冲区溢出缺陷。CWE 还为程序员提供了编写更安全的代码所需要的更详细的内容。

这个列表是 SANS 学院 MITRE 以及“美国和欧洲很多顶级软件安全专家”共同合作的成果。在 CWE 站点上列有 800 多个编程、设计和架构上的错误,CWE 文档首先列举的是针对程序员最重要的 25 项,从而帮助他们编写更安全的代码。同时文档还适用于软件设计师、架构师、甚至 CIO,他们应该了解这些可能出现的弱点,并采取恰当的措施。

根据 CWE 的列表,跨平台脚本攻击(XSS)和 SQL 注入被认为是软件最薄弱的环节,而位于第三位的是缓冲区溢出:

作者并不认为这个列表是放之四海而皆准的,他建议每个组织都应该基于自身的标准来创建自己的列表。文档提出了大量“关注热点”,其中之一是“语言的弱点”:

C/C++ Java PHP Perl CWE 条目 高 一般 高 高 CWE-22 : 不当地将路径名限制为受限的目录(路径穿透) 与语言无关,但是一般是在模拟环境中存在 高 一般 高 高 CWE-78 : 对 OS 命令中使用的特定元素处理不当(操作系统命令注入) 一般 高 高 高 CWE-79 : 网页架构保持失败 (跨平台脚本攻击) 高 高 高 高 CWE-89 : 对 SQL 命令中使用的特定元素处理不当(SQL 注入) 高 CWE-98 : 在 PHP 程序中,对 Include/Require 声明的文件名控制不当(PHP 文件包含漏洞) 从技术上来说这种问题会在大多数解释型语言中发生,但似乎在 PHP 中最为流行 高 有限 有限 有限 CWE-120 : 在没有检测输入大小的情况下就对缓冲区进行复制(经典的缓冲区溢出) 解释器和本地代码通常是使用 C/C++ 创建的,当我们可以使用更高级别的语言对其进行操作时,就很容易受到缓冲区溢出的影响,否则就显得比较“安全”。 高 有限 有限 有限 CWE-129 : 对数组索引验证不当 从技术上来说,这在很多不同的语言中都会发生,但是在 C/C++ 程序中最容易导致安全问题。 高 有限 有限 有限 CWE-131 : 对缓冲区大小计算错误 当更简单的缓冲区溢出情况被排除的时候,这个问题就会出现。解释器和本地代码通常是使用 C/C++ 创建的,当我们可以使用更高级别的语言对其进行操作时,就很容易受到缓冲区溢出的影响,否则就显得比较“安全”。 高 有限 有限 有限 CWE-190 : 整型溢出和环绕 从技术上来说这可能会在多种不同语言中出现,但是在 C/C++ 程序中最容易导致安全问题。 高 高 高 一般 CWE-209 : 通过错误消息透漏信息 这与语言无关,但经常会出现在基于 Web 的环境,或是出现在在外部自动执行错误报告的语言中。 高 高 高 高 CWE-285 : 不当的访问控制(授权) 一般 一般 一般 一般 CWE-306 : 对重要的资源赋权不当 在基于 Web 的环境中比较流行。 高 高 高 高 CWE-311 : 缺少对敏感数据的加密 高 高 高 一般 CWE-327 : 使用被破解或者有风险的加密算法 某些语言中没有内建的加密机制或者已经良好地确立了的库,开发者不得不创建或者集成他们自己的加密算法。 高 高 高 高 CWE-352 : 跨站点伪造请求(CSRF) 这是基于 Web 的问题,与语言无关。 高 高 一般 有限 CWE-362 : 竞争条件 这在所有语言中都是潜在的问题,它支持线程处理或者与操作系统资源交互。 有限 一般 高 有限 CWE-434 : 对危险类型文件的上载不加限制 有限 一般 一般 有限 CWE-494 : 下载代码却不做完整性检查 对于手机应用的代码最为普遍,尽管在任何管理自己的更新的软件中都可能存在。 一般 一般 一般 一般 CWE-601 : 重定向到不受信任站点的 URL(开放重定向) 这是基于 Web 的问题,与语言无关。很多 web 应用程序都不会使用重定向功能。 高 高 高 高 CWE-732 : 对重要的资源赋权不当 高 有限 高 高 CWE-754 : 对非正常或异常的条件检查不当 对于异常处理会强迫检查的语言,不容易出现此类问题。 高 一般 一般 高 CWE-770 : 分配资源,却不做限制和调节 对于内建资源管理的环境,不同意出现此类问题。 一般 一般 一般 一般 CWE-798 : 使用硬编码的证书 高 CWE-805 : 使用错误的长度值访问缓冲区 解释器和本地代码通常是使用 C/C++ 创建的,当我们可以使用更高级别的语言对其进行操作时,就很容易受到缓冲区溢出的影响,否则就是“安全的”代码。 高 高 高 高 CWE-807 : 在安全决策中信赖不被信任的输入 与语言无关,但在 web 应用中非常普遍。

对于每个弱点,作者都提供了大量信息,包括:排名,得分摘要,防止和缓解措施、相关的攻击模式、攻击频率、是否易于检测、修正成本等等。文档很大的一部分集中于对每个弱点细节的描述,包括技术细节、代码示例以及在架构、设计、实现或者操作级别上可以采取的预防措施。例如,对于列表中第一位的弱点,作者提供的信息摘录如下:

网页架构保持失败(跨站点脚本攻击)——在用户可控的输入被放在输出(这些输出会被用作为其他用户服务的网页)中之前,软件没有对其进行充分地验证、过滤、替换和编码。

弱点流行程度结果 绕过安全措施执行代码 矫正成本检测难易度攻击频率 经常 攻击者了解程度详细的技术细节包括三种主要的跨站点脚本攻击(XSS):反射 XSS(或被称为非持续的)、存储 XSS(或被称为持续的)以及基于 DOM 的 XSS。

下面是 JSP 的代码样例

<% String eid = request.getParameter(“eid”); %> …

Employee ID: <%= eid %>

检测方法,类似于自动静态分析和黑盒检测。

针对每个弱点,作者都列举了多种防止措施,如下所示:

你要了解你的数据会被用于何种环境,以及应该以何种方式对其进行编码。当在不同的组件之间传送数据的时候,或者生成可以同时包含多种编码的输出时尤为重要,比方说,web 页面或者由多个部分组成的邮件信息。你需要研究所有预期的通信协议以及数据表现方式来决定所需要的编码策略。 对于所有将被输出到另一 web 页面的数据,特别是所有从外部输入接收的数据来说,要在所有非字母数字的字符上使用编码。

相同输出文档的部分可能需要不同的编码格式,那会根据输出是否位于下列位置而不同:

HTML 体

元素属性(像 src=“XYZ”)

网址

JavaScript 脚本部分

层叠样式表(CSS)和样式属性

等等。注意 HTML 实体编码仅适用于 HTML 体。

你可以查阅 XSS 防骗部分(REF-16)来获取更多关于编码类型以及所需要的换码的细节。

2010 CWE/SANS 最危险的编程错误文档还描述了选择最危险的 25 项弱点所使用的标准,与 2009 年生成的相同列表的比较,与 OWASP 最危险的十项错误 2010 RC1 的比较,此外还有十项 web 应用中最危险的安全弱点。 查看英文原文: CWE/SANS Top 25 Programming Errors

2010-03-31 07:067134
用户头像

发布了 340 篇内容, 共 129.4 次阅读, 收获喜欢 13 次。

关注

评论

发布
暂无评论
发现更多内容

Android Studio开发Android APP

梦笔生花

Android Studio 开发环境 新建工程

为什么更推荐使用组合而非继承关系?

JAVA旭阳

Java 架构

设计模式之美——里式替换(LSP)

GalaxyCreater

设计模式

WEB21

Lenyi

网络安全 CTF ctfshow 爆破

SRE运维解密-应对过载

董哥的黑板报

微服务 SRE 限流 SRE实践

Web入门:CSS下拉图片

小院里的霍大侠

JavaScript Web 初学者 入门者

架构误区系列10:不合理的分层

agnostic

软件分层

架构实战营 3-4 架构设计后期随堂练习

西山薄凉

「架构实战营」

架构实战营 3-5 消息队列备选架构随堂练习

西山薄凉

「架构实战营」

2022-12-24:给定一个字符串s,其中都是英文小写字母, 如果s中的子串含有的每种字符都是偶数个, 那么这样的子串就是达标子串,子串要求是连续串。 返回s中达标子串的最大长度。 1 <= s的长

福大大架构师每日一题

Linux 算法 Shell 福大大

SAP MM SPED输出报错-No authorization for delivery from shipping point US##-之对策

SAP虾客

SAP MM SPED VL31N 公司间STO

OpenTelemetry系列 (四)| 如何使用Java Agent来实现无侵入的调用链

骑牛上青山

Java javaagent 调用链 OpenTelemetry 微服务调用链

基于Go的缓存实现

俞凡

架构

Java中Map集合的三种遍历方式

@下一站

Java 程序设计 map 12月日更 12月月更

模块三-外包学生管理系统的架构文档

悟空

学生管理系统架构

Flink 在米哈游的应用实践

Apache Flink

大数据 flink 实时计算

Zebec Chain缘何能成为新晋应用链,熊市下又为何值得我们关注?

股市老人

FFA 2022 主会场 Keynote:Flink Towards Streaming Data Warehouse

Apache Flink

大数据 flink 实时计算

学生管理系统

KING

运维进阶训练营 -W09H

赤色闪电

运维

【Java基础】Win10如何配置jdk环境变量(配置java环境变量)

No8g攻城狮

Java、 java 并发 Java IO

极客时间运维训练营第九周作业

好吃不贵

【web 开发基础】PHP 中的预定义数组详解之一 (47)

迷彩

数组 全局变量 PHP基础 预定义数组

2022年浪过的那些城市

SAP虾客

杭州 2022年 无锡 东莞 SAP项目

Flink 1.16:Hive SQL 如何平迁到 Flink SQL

Apache Flink

大数据 flink 实时计算

Web入门开发【二】

小院里的霍大侠

编程开发 初学者 入门实战 Web入门

MMEval正式支持OneFlow评测

OneFlow

机器学习 深度学习 算法

HTTP通用首部字段

穿过生命散发芬芳

HTTP 12月月更

设计模式之美——对扩展开放、对修改关闭

GalaxyCreater

设计模式

WEB23

Lenyi

网络安全 CTF ctfshow 爆破

CWE/SANS评出25种最危险的编程错误_Java_Abel Avram_InfoQ精选文章