CWE TOP 25威胁

CWE TOP 25

Top-1 CWE-119 缓冲区错误
软件在内存缓冲区上执行操作,但是它可以读取或写入缓冲区的预定边界以外的内存位置。
某些语言允许直接访问内存地址,但是不能自动确认这些内存地址是有效的内存缓冲区。这可能导致在与其他变量、数据结构或内部程序数据相关联的内存位置上执行读/写操作。

危害如下:
机密性、完整性和可用性。攻击者可能执行任意代码、修改预定的控制流、读取敏感信息或导致系统崩溃。

如何防范:
1.编写代码时注意越界问题
2.设置检测关卡监视内存使用情况

Top-2 CWE-79 跨站脚本
在用户控制的输入放置到输出位置之前软件没有对其中止或没有正确中止,这些输出用作向其他用户提供服务的网页。

危害如下:
(1)不可信数据进入网络应用程序,通常通过网页请求;
(2)网络应用程序动态地生成一个带有不可信数据的网页;
(3)在网页生成期间,应用程序不能阻止Web浏览器可执行的内容数据,例如JavaScript,HTML标签,HTML属性、鼠标事件、Flash、ActiveX等;
(4)受害者通过浏览器访问的网页包含带有不可信数据的恶意脚本;
(5)由于脚本来自于通过web服务器发送的网页,因此受害者的web浏览器会在web服务器域的上下文中执行恶意脚本;
(6)违反web浏览器的同源策略,同源策略是一个域中的脚本不能访问或运行其他域中的资源或代码。

如何防范:
1.控制脚本注入的语法要素。比如:JavaScript离不开:“<”、“>”、“(”、“)”、“;”…等等,我们只需要在输入或输出时对其进行字符过滤或转义处理就即可。一般我们会采用转义的方式来处理,转义字符是会使用到HTML的原始码,因为原始码是可以被浏览器直接识别的,所以使用起来非常方便。允许可输入的字符串长度限制也可以一定程度上控制脚本注入。
2.所有的过滤、检测、限制等策略,建议在Web Server那一端去完成,而不是使用客户端的JavaScript或者VBScript去做简单的检查。因为真正的攻击者可以绕过你精心设计制作的客户端进行过滤、检测或限制手段。

Top-3 CWE-20 输入验证不当
产品没有验证或者错误地验证可以影响程序的控制流或数据流的输入。

危害如下:
当软件不能正确地验证输入时,攻击者能够伪造非应用程序所期望的输入。这将导致系统接收部分非正常输入,攻击者可能利用该漏洞修改控制流、控制任意资源和执行任意代码。

如何防范:
1.此问题多为程序员编写代码时不够严谨导致,对判定的条件更加精细化

Top-4 CWE-200 信息泄露
信息泄露是指有意或无意地向没有访问该信息权限者泄露信息。

危害如下:
导致用户的个人信息外泄

如何防范:
1.此类漏洞是由于软件中的一些不正确的设置造成的信息泄漏,对程序的代码进行测试,减少用户能访问的部分。

Top-5 CWE-125 越界读取
软件读取缓冲区之前或者之后的数据。

危害如下:
通常,这会允许攻击者从其它内存位置读取敏感信息或导致崩溃。假定存在用于停止读取操作(如字符串中的nul)的哨兵变量时,当代码读取可变数量的数据时候可能会发生崩溃。预期的哨兵可能不在越界内存边界之内,导致读取过多数据,引发“分段错误”或“缓冲区溢出”。软件可以修改索引或执行指针运算,该索引或运算结果指向缓冲区边界之外的内存位置。随后的读取操作将产生未定义或意外的结果。

如何防范:
1.针对数组判定条件进行更严格的判定

Top-6 CWE-89 SQL注入
软件使用来自上游组件的受外部影响的输入构造全部或部分SQL命令,但是没有过滤或没有正确过滤掉其中的特殊元素,这些元素可以修改发送给下游组件的预期SQL命令。

危害如下:
如果在用户可控输入中没有充分删除或引用SQL语法,生成的SQL查询可能会导致这些输入被解释为SQL命令而不是普通用户数据。利用SQL注入可以修改查询逻辑以绕过安全检查,或者插入修改后端数据库的其他语句,如执行系统命令。
通过这些语句能够测试出用户的密码进而导致用户数据被泄露。

如何防范:
1.普通用户与系统管理员用户的权限要有严格的区分
2.强迫使用参数化语句
3.加强对用户输入的验证
4.多多使用SQL Server数据库自带的安全参数
5.设置陷阱账号

Top-7 CWE-416 释放后重用
释放内存后再引用内存导致程序崩溃、使用意外值或执行代码

危害如下:
由内存管理不当导致的问题是 C/C++ 程序中常见的漏洞。释放后使用会导致可被利用的潜在风险,包括程序异常终止、任意代码执行和拒绝服务攻击等。

如何防范:
1.释放内存时请务必置空指针,虽然这种方法针对多重或复杂数据结构利用的有效性有限,但可以从一定程度上规避一部分问题。
2.在循环语句中进行内存分配或释放时,需谨慎确认是否存在问题。
3.使用源代码静态分析工具进行自动化的检测

Top-8 CWE-190 整数溢出或环绕
当尝试去存储一个大于这个固定的最大值时,将会导致一个整数溢出

危害如下:
整数溢出是不能被立即察觉,因此没有办法去用一个应用程序来判断先前计算的结果是否实际上也是正确的。如果是用来计算缓冲区的大小或者计算数组索引排列的距离,会出现错误。当然很多整数溢出并不是都是可利用的,因为并没有直接改写内存,但是有时,他们可导致其他类型的bugs,缓冲区溢出等。而且整数溢出很难被发现。

如何防范:
1.编写检查溢出的代码进行自检
2.优化算法防止运用过大整型

Top-9 CWE-352 跨站请求伪造
挟制用户在当前已登录的Web应用程序上执行非本意的操作

危害如下:
添加管理员账号、修改网络配置、直接写入webshell等

如何防范:

  1. 检查Referer字段
  2. 添加校验token

Top-10 CWE-22 路径遍历
软件使用外部输入构造一个路径名,该路径名用于标识位于受限制父目录下的文件或目录,但软件没有正确地中和路径名内的特殊元素,这些元素可能导致路径名解析到受限制目录外的位置。

危害如下:
执行未经授权的代码或命令;修改文件或目录;读取文件或目录;DoS:崩溃/退出/重新启动

如何防范:

  1. 输入验证。执行输入验证时,请考虑所有可能相关的属性,包括长度、输入类型、可接受值的完整范围、缺少或额外输入、语法、相关字段之间的一致性以及与业务规则的一致性。
  2. 对于在客户端执行的任何安全检查,确保这些检查在服务器端再做一次

Top-11 CWE-78 OS命令注入
软件使用来自上游组件的受外部影响的输入构造全部或部分操作系统命令,但是没有过滤或没有正确过滤掉其中的特殊元素,这些元素可以修改发送给下游组件的预期操作系统命令。此类漏洞允许攻击者在操作系统上直接执行意外的危险命令。

危害如下:
执行未经授权的代码或命令;DoS:崩溃/退出/重新启动;读取文件或目录;修改文件或目录;读取应用程序数据;修改应用程序数据;隐藏活动

如何防范:

  1. 使用库调用而不是外部进程来重新创建所需的功能
  2. 减少攻击面,对于将用于生成要执行的命令的任何数据,尽可能多地使这些数据不受外部控制
  3. 使用经过审核的库或框架

Top-12 CWE-787 越界写入
软件在预期缓冲区的末尾或开头之前写入数据。通常会导致数据损坏、崩溃或代码执行。软件可以修改索引或执行指针运算,该指针运算引用缓冲区边界之外的存储器位置。随后的写操作将产生未定义或意外的结果。

危害如下:
修改内存;DoS:崩溃、退出或重新启动;执行未经授权的代码或命令

如何防范:
1.选择无此问题的语言编写
2.检查缓冲区设置
3.使用随机排列程序可执行文件和库在内存中的位置的功能或扩展来运行或编译软件。

Top-13 CWE-287 授权不当
当一个参与者声称拥有一个给定的身份时,软件不能证明或者不能充分证明该声明是正确的。

危害如下:
读取应用程序数据;获得特权/假定身份;执行未经授权的代码或命令

如何防范:
1.使用有身份验证的框架或库

Top-14 CWE-476 跨站请求伪造
当应用程序取消引用它期望有效但为空的指针时,会发生空指针取消引用,通常会导致崩溃或退出。空指针解引用问题可以通过许多缺陷来发生,包括竞争条件和简单的编程遗漏。

危害如下:
空指针取消引用通常会导致进程失败,除非异常处理(在某些平台上)可用并实现。即使在使用异常处理时,仍然很难将软件返回到安全的操作状态。

如何防范:
1.使用前对所有可能已修改的指针进行了健全性检查
2.检查返回值的所有函数的结果,并在对其执行操作之前验证该值是否为非空
3.使用针对这类弱点的自动化静态分析工具

Top-15 CWE-732 对关键资源的权限分配错误
该产品指定安全关键资源的权限,允许非预期的参与者读取或修改该资源。 当资源被赋予一个权限设置以提供对比所需范围更广的参与者的访问时,它可能会导致敏感信息的暴露,或导致意外方修改该资源。当资源与程序配置、执行或敏感用户数据相关时,这尤其危险。

危害如下: 开发人员可能会对产品运行的环境做出某些假设—例如,软件运行在单个用户系统上,或者软件只能由受信任的管理员访问。当软件在不同的环境中运行时,权限将成为一个问题。由于系统管理员和用户并不总是阅读文档,这可能会导致不安全的权限保持不变。

如何防范:
1.使用关键资源(如配置文件)时,请检查该资源是否具有不安全的权限
2.将软件划分为匿名、正常、特权和管理区域

Top-16 CWE-434 未限制上传威胁类型的文件
允许攻击者上传或传输可在产品环境中自动处理的危险类型的文件。

危害如下:
可能传送恶意文件对系统造成损伤

如何防范:

  1. 为上载的文件生成一个新的、唯一的文件名,而不是使用用户提供的文件名,这样就根本不使用外部输入
  2. 使用“接受已知良好”输入验证策略,即使用严格符合规范的可接受输入列表
  3. 不要只依赖于查找恶意或格式错误的输入
  4. 定义一组非常有限的允许扩展名,并且只生成以这些扩展名结尾的文件名

Top-17 CWE-611 对XML外部实体引用限制不当
软件处理一个XML文档,该文档可以包含带有URL的XML实体,这些URL解析为预期控制范围之外的文档,从而导致产品将不正确的文档嵌入到其输出中。

危害如下:
如果攻击者能够包含精心编制的DTD,并且启用了默认实体解析程序,则攻击者可能能够访问系统上的任意文件。DTD可能包含服务器可能执行的任意HTTP请求。这可能会导致利用服务器与其他实体的信任关系的其他攻击。使用指向大文件的URI或总是返回/dev/random等数据的设备,软件可能会消耗过多的CPU周期或内存。

如何防范:

  1. 配置为禁用外部实体扩展

Top-18 CWE-94 代码注入
软件使用来自上游组件的外部影响的输入来构造代码段的全部或部分,但它不会中和或错误地中和可能修改预期代码段的语法或行为的特殊元素。 当软件允许用户的输入包含代码语法时,攻击者可能会以改变软件的预期控制流的方式编写代码。这种更改可能导致任意代码执行。

危害如下:
在某些情况下,可注入代码控制身份验证;这可能导致远程漏洞。注入的代码可以访问直接阻止攻击者访问的资源,代码注入攻击会导致数据完整性的损失

如何防范:

  1. 输入验证
  2. 使用严格的白名单来限制允许的构造

Top-19 CWE-798 使用硬编码凭据
包含硬编码凭据,如密码或加密密钥,用于其自身的入站身份验证、与外部组件的出站通信或内部数据加密。

危害如下:
此弱点可能导致资源或功能暴露给意外的参与者,可能为攻击者提供敏感信息,甚至执行任意代码。如果使用硬编码密码,几乎可以肯定恶意用户将获得对该帐户的访问权限。

如何防范:

  1. 进行身份验证
  2. 涉及使用生成的密码或密钥,这些密码或密钥是自动更改的,必须由系统管理员按给定的时间间隔输入

Top-20 CWE-400 不受控制的资源消耗
软件无法正确控制有限资源的分配和维护,从而使参与者能够影响所消耗的资源量,最终导致可用资源的耗尽。

危害如下:
攻击者能够触发这些有限资源的分配,但资源的数量或大小不受控制,则攻击者可能会导致拒绝服务,从而消耗所有可用资源。这将阻止有效用户访问软件,并可能对周围环境产生影响。例如,针对应用程序的内存耗尽攻击可能会减慢应用程序及其主机操作系统的速度。

如何防范:
1.限制资源使用限度

Top-21 CWE-772 周期结束后未释放资源
软件在其有效生存期结束(即不再需要资源)后不会释放资源。 当资源在使用后未被释放时,攻击者可以通过在不触发资源释放的情况下分配资源来造成拒绝服务。经常受到影响的资源包括内存、CPU、磁盘空间、电源或电池等。

危害如下:
可能影响未正确释放的资源分配的攻击者可能会耗尽可用的资源池,并阻止所有其他进程访问同一类型的资源。

如何防范:

  1. 选择语言
  2. 在函数完成时分配要释放的资源,必须确保在该函数的所有出口点(包括错误条件)释放资源
  3. 使用操作系统或环境提供的资源限制设置

Top-22 CWE-426 不可信的搜索路径
应用程序使用外部提供的搜索路径搜索关键资源,该路径可以指向不受应用程序直接控制的资源。

危害如下:
如果应用程序使用搜索路径来定位关键资源(如程序),则攻击者可以修改该搜索路径以指向恶意程序,然后目标应用程序将执行恶意程序。该问题扩展到应用程序信任的任何类型的关键资源。

如何防范:

  1. 硬编码到一组已知安全值(如系统目录)的搜索路径,或者只允许管理员在配置文件中指定它们
  2. 在调用其他程序之前删除或限制所有环境设置

Top-23 CWE-502 不可信数据反序列化
应用程序反序列化不受信任的数据,而不充分验证生成的数据是否有效。

危害如下:
序列化对象以进行通信或保存它们以供以后使用通常很方便。但是如果反序列化的数据或代码不使用加密来保护自身,则通常可以在不使用提供的访问器函数的情况下对其进行修改。

如何防范:
1.对序列化对象进行完整性和加密处理
2.反序列化前执行严格的类型限制
3.监视反序列化进程

Top-24 CWE-269 权限管理不当
软件没有正确地分配、修改、跟踪或检查参与者的权限,从而为该参与者创建了一个意外的控制范围。

危害如下:
外部用户会获得管理权限,导致内部文件或系统受损

如何防范:

  1. 在软件中显式管理信任区域
  2. 在给软件系统中的实体分配访问权限时,遵循最小权限原则
  3. 考虑遵循特权分离原则

Top-25 CWE-295 证书验证不当
软件不验证或不正确地验证证书。当证书无效或恶意时,它可能允许攻击者通过干扰主机和客户端之间的通信路径来欺骗受信任的实体。软件可能会连接到恶意主机,同时认为它是受信任的主机,或者软件可能会被欺骗,接受看似来自受信任主机的欺骗数据。

危害如下:
当软件使用证书固定时,开发人员可能无法在固定证书之前正确验证证书的所有相关组件。这会使钉扎完成后的测试变得困难或昂贵。

如何防范:

  1. 应仔细管理和检查证书,以确保数据使用预期所有者的公钥加密
  2. 确保在固定证书(包括主机名)之前完全验证证书的所有相关属性

你可能感兴趣的:(软件安全)