fortify源代码扫描问题分析汇总

编号

漏洞名称

漏洞危害

 修复建议

1

Dynamic Code Evaluation: Unsafe Deserialization

动态代码评估:不安全的反序列化

Actuator正是Spring Boot提供的对应用系统的监控和管理的集成功能,可以查看应用配置的详细信息,例如自动化配置信息、创建的Spring beans信息、系统环境变量的配置信以及Web请求的详细信息等。在使用Actuator时,不正确的使用或者一些不经意的疏忽,就会造成严重的信息泄露等安全隐患。

1、禁用/env接口:endpoints.env.enabled= false

2、如果只想打开一两个接口,那就先禁用全部接口,然后启用需要的接口:

endpoints.enabled = false endpoints.metrics.enabled = true

3、引入spring-boot-starter-security依赖:

    org.springframework.boot

    spring-boot-starter-security


详情可参考:https://xz.aliyun.com/t/223

2

SQL Injection: MyBatis Mapper

SQL注入漏洞

使用来自不受信任来源的输入来构造动态SQL语句,可能会使攻击者修改该语句的含义或执行任意SQL命令

使用参数化的SQL语句:#{}

3

Weak Encryption

弱加密算法

错误使用加密算法可能会导致敏感数据泄露,密钥泄漏,身份验证失败,会话不安全和欺骗攻击。已知有一些加密或哈希算法很弱,因此不再建议使用它们,例如MD5和RC4。

除了正确选择安全加密或哈希算法之外,正确使用参数还可以确保安全级别。例如,不建议在对称加密中使用ECB(电子密码簿)模式。

1、当使用AES128和AES256时,初始化向量必须是随机且不可预测的。例如,在Java中,“ java.util.Random”被视为弱随机数生成器。应该使用"java.security.SecureRandom”代替“ java.util.Random”

2、当在加密中使用RSA时,建议使用最佳非对称加密填充(OAEP)模式

3、在签名中使用RSA时,建议使用PSS填充

4、不应使用弱哈希/加密算法,例如MD5,RC4,DES,Blowfish,SHA1。1024位RSA或DSA,160位ECDSA(椭圆曲线),80/112位2TDEA(两个关键的三重DES)

5、最小密钥长度要求:

密钥交换:至少2048位的Diffie-Hellman密钥交换 消息完整性:HMAC-SHA2 消息哈希:SHA2 256位 对称加密:RSA 2048位 对称密钥算法:AES 128位 密码哈希:PBKDF2,Scrypt,Bcrypt ECDH,ECDSA: 256位
6、不应使用SSH,CBC模式
7、使用对称加密算法时,不应使用ECB(电子密码簿)模式
8、当PBKDF2用于哈希密码,迭代的参数,建议超过10000次迭代。另外,禁止将MD5哈希函数与PBKDF2WithHmacMD5等PBKDF2一起使用

详情参考:https://www.owasp.org/index.php/Testing_for_Weak_Encryption_(OTG-CRYPST-004)

4

Dynamic Code Evaluation: Code Injection

动态代码注入

许多现代编程语言都允许动态解析源代码指令。这使得程序员可以执行基于用户输入的动态指令。当程序员错误地认为由用户直接提供的指令仅会执行一些无害的操作时(如对当前的用户对象进行简单的计算或修改用户的状态),就会出现 code injection 漏洞。然而,若不经过适当的验证,用户指定的操作可能并不是程序员最初所期望的。 在任何时候,都应尽可能地避免解析动态代码。如果程序必须动态地解释代码,必须对用户输入内容进行过滤:尽可能限制程序中动态执行的代码数量,将代码限制到基本编程语言的程序特定的和上下文特定的子集。程序绝对不能直接解析和执行未经验证的用户输入。而应采用间接方法:创建一份合法操作和数据对象列表,用户可以指定其中的内容,并且只能从中进行选择。利用这种方法,就绝不会直接执行由用户提供的输入。
5

Privacy Violation

隐私侵犯

错误处理私人信息(例如客户密码或社会安全号码)会损害用户隐私,并且通常是非法的。

在以下情况下发生侵犯隐私的行为:

  1. 私人用户信息进入程序。
  2. 数据被写入外部位置,例如控制台,文件系统或网络

1、将私有信息存储在本地控制的资源中,如数据库、本地文件、Appolo等

2、用户敏感数据禁止发送到外部环境或者存储在日志中

6

Path Manipulation

路径操纵

允许用户输入控制文件系统操作所用的路径会导致攻击者能够访问或修改其他受保护的系统资源 使用黑名单+白名单双重过滤路径,可参考:https:/blog.csdn.net/chdyiboke/article/details/68064243
7

Key Management: Hardcoded Encryption Key

硬编码key

将密码、秘钥等凭证信息硬编码到源代码中,存在被泄露的风险 将密码、秘钥等信息放至华为KMS服务托管,或者放至Appolo中,禁止明文写在源代码中

Cross-Site Scripting: Reflected

反射式XSS

可能造成cookie等敏感信息泄露,还可能被网络钓鱼等

1、避免使用客户端数据,尽量在服务器端使用动态页面来实现;

2、分析和强化客户端JS代码,在输出变量到页面时先进行编码转义,如输出到HTML则进行HTML编码、输出到JS则进行JS编码。

Open Redirect

未经验证的重定向和转发

Web开发人员最常见且最容易被忽视的漏洞之一是开放重定向(Open Redirect)(也称为“未经验证的重定向和转发”)。当HTTP GET请求中的参数值(URL中“?”之后的部分)允许将用户重定向到新网站而无需任何重定向目标验证的信息时,网站很容易受到Open Redirect的攻击。根据易受攻击的网站的体系结构,重定向可能在某些操作(例如登录)之后发生,有时可能在加载页面后立即发生。此漏洞的主要用途之一是使网络钓鱼攻击更加可信和有效。 使用URL白名单控制跳转
10

Cross-Site Scripting: DOM

DOM型XSS

可能造成cookie等敏感信息泄露,还可能被网络钓鱼等

1、避免使用客户端数据,尽量在服务器端使用动态页面来实现;

2、分析和强化客户端JS代码,在输出变量到页面时先进行编码转义,如输出到HTML则进行HTML编码、输出到JS则进行JS编码。
11

Insecure SSL: Overly Broad Certificate Trust

不安全的SSL:过度广泛的证书信任

证书颁发机构(CA)为每个公开密钥发放一个数字证书,证书对于通用网络通信工具是必需的,而盗用证书颁发机构的数量正在不断增加,这导致即使由CA签名的证书也可能是恶意的,当程序默认接受由CA颁发的证书而屏蔽了安全校验逻辑,拥有盗用证书的攻击者可能会拦截这些CA的SSL/TLS信息流进行中间人攻击。

做证书校验

请参考:https://www.jianshu.com/p/af2de5da34a3

https://www.anquanke.com/post/id/186597

12

Cross-Site Scripting: Persistent

存储式XSS

可能造成cookie等敏感信息泄露,还可能被网络钓鱼等

1、避免使用客户端数据,尽量在服务器端使用动态页面来实现;

2、分析和强化客户端JS代码,在输出变量到页面时先进行编码转义,如输出到HTML则进行HTML编码、输出到JS则进行JS编码。
13

Insecure Transport: Mail Transmission

不安全传输:邮件传输

建立与邮件服务器的未加密连接可以使攻击者进行中间人攻击并读取所有邮件传输。

使用SSL / TLS与SMTP服务器通信

详情参考:https://netsecurity.51cto.com/art/201901/591123.htm

14

Null Dereference

空指针异常

可能会引发NullPointerException,攻击者可能能够使用产生的异常来绕过安全逻辑或使应用程序揭示有价值的调试信息

增加代码健全性校验或者捕获异常

可参考:https:/xz.aliyun.com/t/2115https:/zhuanlan.zhihu.com/p/61773197
15

Often Misused: Boolean.getBoolean()

滥用Boolean.getBoolean()

在大多数情况下,Boolean.getBoolean()通常会误用对的调用,因为它假定返回由指定的字符串参数表示的布尔值。但是,如Javadoc Boolean.getBoolean(String)方法中所述,“仅当参数指定的系统属性存在且等于字符串'true'时,才返回true。” 

开发人员通常使用的是对Boolean.valueOf(String)或Boolean.parseBoolean(String)方法的调用
分清楚Boolean.getBoolean()、Boolean.valueOf(String)、Boolean.parseBoolean(String)方法的使用场景
16

Header Manipulation: Cookies

cookie操纵

在Cookie中包含未经验证的数据可能会导致HTTP响应标头操纵,并启用缓存中毒,跨站点脚本编写,跨用户污损,页面劫持,cookie操纵或开放重定向。

1、对用户传输过来的数据进行过滤,过滤回车换行符(%0d、\r、%0a、、\n)

2、不使用用户传输进来的数据

3、对数据进行白名单过滤

详情参考:https://vulncat.fortify.com/en/detail?id=desc.dataflow.java.header_manipulation_cookies

17

Cookie Security: Overly Broad Path

Cookie安全:过度宽泛的路径

开发人员通常将 Cookie 设置为可从根上下文路径“/”进行访问。这会使 Cookie 暴露在该域的所有 Web 应用程序下。由于 Cookie 通常包含敏感信息(如会话标识符),因此在应用程序之间共享 Cookie 可能会导致其中一个应用程序的漏洞危及其他应用程序安全 细化cookie中path的范围,path设置应该对应到具体的应用程序
18

Insecure Randomness

不安全的随机数

标准伪随机数生成器不能承受密码攻击,伪随机数生成器PRNG有两种类型:统计和加密。统计PRNG提供有用的统计属性,但是它们的输出是高度可预测的,并且形成易于重现的数字流,不适用于安全性取决于生成的值不可预测的情况。加密PRNG通过生成更难以预测的输出来解决此问题。为了使密码值安全,攻击者必须不可能或非常不可能区分它和真正的随机值。通常,如果未将PRNG算法发布为加密安全的,则它可能是统计PRNG,因此不应在对安全敏感的上下文中使用。 使用SecureRandom类生成加密强度高的伪随机数
19

Code Correctness: Double-Checked Locking

代码正确性:双重检查锁定

双重检查锁定是一种不正确的习惯用法,无法达到预期的效果 规范代码写法,避免双重锁定
20

Password Management: Password in Configuration File

在配置文件中编写密码

密码、秘钥直接写在源代码的配置文件中,存在泄漏的可能 密码、秘钥应该放置在华为KMS服务托管,或者数据库或Appolo中保管
21

Access Control: Database

数据库访问控制

操作数据库时没有进行相关身份校验,可能导致数据库任意访问,泄露数据库信息

1、做数据库访问权限控制

2、功能访问做权限校验

22

Unreleased Resource: Streams

未释放资源流

资源未释放,可能导致拒绝服务

关闭输入/输出流

可参考:https:/xz.aliyun.com/t/2115https:/zhuanlan.zhihu.com/p/61773197
23

Access Specifier Manipulation

access特异性操纵

AccessibleObject API允许程序员绕过Java访问说明符提供的访问控制检查。特别是,它使程序员能够允许所反映的对象绕过Java访问控制,并依次更改私有字段的值或调用私有方法(通常是不允许的行为) 使用攻击者无法设置的参数,通过有权限的类更改访问说明符。所有出现的访问说明符都应仔细检查。
24

Unreleased Resource: Database

未释放数据库资源

大多数未发布的资源问题都会导致一般的软件可靠性问题。但是,如果攻击者可以有意触发资源泄漏,则攻击者可以通过耗尽资源池来发起拒绝服务攻击。 有效的释放资源
25

Often Misused: Authentication

缺少认证

许多 DNS 服务器都很容易被攻击者欺骗,所以应考虑到某天软件有可能会在有问题的 DNS 服务器环境下运行。如果允许攻击者进行 DNS 更新(有时称为 DNS 缓存中毒),则他们会通过自己的机器路由您的网络流量,或者让他们的 IP 地址看上去就在您的域中。勿将系统安全寄托在 DNS 名称上。通常从getLocalHost()函数进入程序。

如果通过域名检查的方式可以确保主机接受和发送的 DNS 记录的一致性,您可以更加信任这一方式。攻击者如若不能控制目标域的域名服务器,就无法同时欺骗接受和发送的 DNS 记录。虽然这种方法并不简单,但是:攻击者也许可以说服域注册者把域移交给一个恶意的域名服务器。依赖于 DNS 记录的 authentication 是有风险的。

密码系统提供了比较不错的安全性,但是这种安全性却易受密码选择不当、不安全的密码传送和 password management 失误的影响。类似于 SSL 的方法值得考虑,但是通常这样的方法过于复杂,以至于使用时会有运行出错的风险,而关键资源也随时面临着被窃取的危险。在大多数情况下,包括一个物理标记的多重 authentication 可以在合理的代价范围内提供最大程度的安全保障。

26 Server-Side Request Forgery SSRF是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统 设置URL白名单或者限制内网IP(使用gethostbyname()判断是否为内网IP)。可参考:https://xz.aliyun.com/t/2115
27 Portability Flaw: Locale Dependent Comparison 对可能与区域设置相关的数据进行比较时,应指定相应的区域设置。在使用不带区域设置的 java.lang.String.toUpperCase()时,其将使用默认的区域设置规则。使用土耳其区域设置 "title".toUpperCase()时将返回 "T\u0130TLE",其中 "\u0130" 是 "LATIN CAPITAL LETTER I WITH DOT ABOVE" 字符。这会导致生成意外结果.

请始终确保指定默认区域设置,或者指定可以接受这些字符(如 toUpperCase())并带有 API 的区域设置。 

如:tag.toUpperCase(Locale.ENGLISH).equals("SCRIPT")

tag.equalsIgnoreCase("SCRIPT")
如果 SCA 识别到java.util.Locale.setDefault() 可在应用程序中的任意位置进行调用,其会假定已执行了相应的区域设置,并且这些问题也不会出现
28

Spring Boot Misconfiguration: DevTools Enabled

Spring Boot错误配置:DevTools已启用

它允许您远程连接到您的应用程序,并仍然使用其大部分功能 在生产中运行时,不要使用DevTools
29

Password Management: Empty Password

空密码

如果使用空密码来对一个系统成功进行身份验证,则相应的帐户的安全性可能会受到影响,因为它接受了空密码。如果空密码只是一个占位符,直到可以为变量分配一个合法值,那么它就会使任何不熟悉代码的人感到困惑,并可能导致意外的控制流路径问题。 设置强密码
30 XML External Entity Injection 外部实体时,可以针对应用程序启动许多攻击。 这些攻击包括泄露本地系统文件,这些文件可能包含密码和私人用户数据等敏感数据,或利用各种方案的网络访问功能来操纵内部应用程序。 通过将这些攻击与其他实现缺陷相结合,这些攻击的范围可以扩展到客户端内存损坏,任意代码执行,甚至服务中断,具体取决于这些攻击的上下文

禁用外部实体或者过滤关键词: 可参考:https://xz.aliyun.com/t/3357#toc-21

31 System Information Leak: External 系统堆栈信息被发送至外部 应避免将系统数据发送到外部
32 Log Forging 1.数据从一个不可信赖的数据源进入应用程序。 在这种情况下,数据经由getParameter()到后台。 
2. 数据写入到应用程序或系统日志文件中。 这种情况下,数据通过info() 记录下来。为了便于以后的审阅、统计数据收集或调试,应用程序通常使用日志文件来储存事件或事务的历史记录。根据应用程序自身的特性,审阅日志文件可在必要时手动执行,也可以自动执行,即利用工具自动挑选日志中的重要事件或带有某种倾向性的信息。如果攻击者可以向随后会被逐字记录到日志文件的应用程序提供数据,则可能会妨碍或误导日志文件的解读。最理想的情况是,攻击者可能通过向应用程序提供包括适当字符的输入,在日志文件中插入错误的条目。如果日志文件是自动处理的,那么攻击者可以破坏文件格式或注入意外的字符,从而使文件无法使用。更阴险的攻击可能会导致日志文件中的统计信息发生偏差。通过伪造或其他方式,受到破坏的日志文件可用于掩护攻击者的跟踪轨迹,甚至还可以牵连第三方来执行恶意行为。最糟糕的情况是,攻击者可能向日志文件注入代码或者其他命令,利用日志处理实用程序中的漏洞。
创建一组与不同事件一一对应的合法日志条目,这些条目必须记录在日志中,并且仅记录该组条目。要捕获动态内容(如用户注销系统),请务必使用由服务器控制的数值,而非由用户提供的数据。这就确保了日志条目中绝不会直接使用由用户提供的输入。 
33 Header Manipulation: SMTP 攻击者可以在SMTP标头中包含未经验证的数据,从而使攻击者可以添加任意标头,例如CC或BCC,他们可以使用这些标头将邮件内容泄漏给自己或将邮件服务器用作垃圾邮件机器人 充分过滤用户输入内容,不允许新行字符(如:CR、LF 和 NULL )设置头文件
34

Privacy Violation: Heap Inspection

隐私违规:堆检查

如果在使用敏感数据(例如密码、社会保障号码、信用卡号等)后不清除内存,则存储在内存中的这些数据可能会泄漏。通常而言,String 是所用的存储敏感数据,然而,由于 String 对象不可改变,因此用户只能使用 JVM 垃圾收集器来从内存中清除 String 的值。除非 JVM 内存不足,否则系统不要求运行垃圾收集器,因此垃圾收集器何时运行并无保证。如果发生应用程序崩溃,则应用程序的内存转储操作可能会导致敏感数据泄漏。 应始终将安全敏感信息收集并存储在char数组中。
35 Portability Flaw: File Separator

不同的操作系统使用不同的字符作为文件分隔符。例如,Microsoft Windows 系统使用“\”,而 UNIX 系统则使用“/”。应用程序需要在不同的平台上运行时,使用硬编码文件分隔符会导致应用程序逻辑执行错误,并有可能导致 denial of service。以下代码使用硬编码文件分隔符来打开文件:

File file = new File(directoryName + "\\" + fileName);

使用独立于平台的 API 来指定文件分隔符:

File file = new File(directoryName + File.separator + fileName);
36 Path Manipulation: Zip Entry Overwrite 允许用户输入控制文件系统操作中使用的路径,可能会使攻击者任意覆盖系统上的文件 使用黑名单+白名单双重过滤路径,可参考https:/blog.csdn.net/chdyiboke/article/details/68064243
37

Formula Injection

公式注入

大多数电子表格应用程序(例如Microsoft Excel)都允许用户在单元格中创建公式。这使应用程序可以为您进行数学计算,这几乎是电子表格的主要目的。不幸的是,攻击者很容易利用此功能,结果可能是灾难性的。通过简单的注入,攻击者可以将文件的内容泄露到远程服务器,甚至可以在受害者的计算机上执行代码。CSV公式注入发生在将不受信任的输入嵌入到CSV文件中时,电子表格应用程序可以将其解释为公式被计算。 检查上传文件内容,拒绝文件内容包含:+、-、=、@四个字符中任一字符的文件上传

你可能感兴趣的:(JAVA代码审计,Web渗透测试)