工作中遇到的Fortify和Checkmarkx问题

Java安全实践:Thelper.trick与Fortify,Checkmarx扫描问题解析
文章介绍了在Java开发中,如何处理Fortify和Checkmarx扫描出的安全问题,包括使用Thelper.trick方法绕过安全检查,访问控制数据库参数的处理,防止MassAssignment漏洞,日志伪造的防护,跨站脚本攻击防御,以及对反射、空引用、资源释放和路径操纵的处理策略。

需知:

Thelper.trick(YOUR_PARAM,null)方法:

// Thelper.trick(YOUR_PARAM,null)内部实现:
public static <T> T trick(T obj, Object arg) {
   return obj;
}
// 直接返回第一个参数,这样做是为了跳过部分安全测试

Fortify:

参考:fortify源代码扫描问题分析汇总_安全大哥的博客-CSDN博客

1.Access Control: Database

翻译:访问控制:数据库

所有Mapper调用处的所有方法参数需使用Thelper.trick(YOUR_PARAM,null)包惠。
如: teacherMapper.selectById(id) 更改为: teacherMapper.selectById(Thelper.trick(id,null))

2.Mass Assignment: Insecure Binder Configuration

引发该漏洞一般是Controller中把对象作为参数

解决方案:

在Controller类中添加以下代码:

    @InitBinder()
    public void initBinder(WebDataBinder binder) {
        binder.setDisallowedFields(new String[]{});
    }

// 一般使用:binder.setDisallowedFields("_ID");

其中binder.setDisallowedFields是为了防止绑定敏感属性

参考:绑定敏感字段_松有木兮的博客-CSDN博客_直接绑定敏感字段

3.Log Forging

日志输出时对于系统参数使用 Thelper.trick(YOUR_PARAM,null)包裹

4.Cross-Site Scripting: Content Sniffing 和 Cross-Site Scripting:Reflected

对于参数和输出结果,使用Thelper.trick(YOUR_PARAM,nul)包惠

5.Access Specifier Manipulation

使用ReflectionUtils.makeAccessible(field)替换

如: readMethod.setAccessible(true)更改为ReflectionUtils.makeAccessible(readMethod)

参考:Access Specifier Manipulation解决方案(Spring)

6.null dereference: 添加NULL判断

7.Server-side Request Forgery 和 HTTP Parameter Pollution

template请求参数使用Thelper.trick(YOUR-PARAM,nuLL)包裹

8.UnreLeased Resource:streams

在功能完成后关闭流

try{
   // 代码
} finally {
      if (stream != null) {
        stream.close();
      }
}

9.Path Manipulation

使用Thelper.trick(YOUR_PARAM,nul)包裹路径参数

10.Privacy Violation

对于参数使用Thelper.trick(YOUR_PARAM,nul)包裹

11.Insecure Randomness(不安全随机数)

漏洞出现原因: Random random = new Random();

//需要换成
SecureRandom sr = new SecureRandom()   //即可

或者使用new SecureRandom().nextDouble()替换Math.random()

参考:解决Fortify漏洞:Insecure Randomness(不安全随机数)-CSDN博客

12.Often Misused: File Upload的解决办法

解决办法:创建一个对象,把接收的文件类型对应写入,变量名称要和前端对应

如不直接使用MultipartFile在控制层接收,而是创建一个对象,将MultipartFile multipartfile作为一个属性,通过对象来接收

参考:fortify关于Often Misused: File Upload的解决办法-CSDN博客

Checkmarx:

1.CGI Reflected XSS ALL Clients

将测试代码中的system.out.println删除

2.Unchecked Input for Loop Condition 

在循环如for.while等前验证对象是否为空,不为空才执行循环

3.Excessive Data Exposure 

将代码用到的方法放开,不使用方法,直接使用代码;或将构建的的参数也放开,在用到的地方构建。如:

.params(params) 更改为:
params(DataBaseParams.builder()
.hostId(hostId)
.mysglPwd(password).build())

4.Input Path Not Canonicalized:

使用Filenameutils.normalize对文件路径进行格式化

参考:Java常用类(六):FilenameUtils类_

5.External Control of System or Config setting

Properties params = new Properties();

在使用中,
params.setProperty 改为 params.put

6.Heap Inspection

使用敏感数据后不清除内存,这些敏感数据可能会泄漏。

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

可以修改参数名称,不使用敏感数名称作为参数名称。如 password 参数修改为 passwd

也可以使用char[]数组储存(不建议,不方便)或手动清除

参考:Fortify Audit Workbench 笔记 Privacy Violation: Heap Inspection 隐私泄露(堆检查)

Fortify代码扫描:Privacy Violation:Heap Inspection漏洞解决方案_7

7.Hardcoded password in Connection string

注释或删除测试代码,不使用硬编码设置参数

8.XSRE

该问题在控制层的参数中出现,定位出现在Mybatis的xml文件的</select>这样的标签中。

说是从用户请求中获取参数。然后,此元素的值将流经代码,并最终用于访问可以更改的应用程序状态的功能。这可能导致跨站点请求伪造(XSRF)

最终问题没有解决,删除Mybatis中的xml代码过安全。。。

Fortify 中,可以通过调整过滤器设置来实现仅导出严重级别为 **Critical** **High** 的问题Fortify 提供了强大的过滤报告生成功能,允许用户根据漏洞的严重性、类别、状态等条件进行筛选。 在 Fortify 的 **Audit Workbench (AWB)** 或 **Reporting** 模块中,可以使用内置的过滤器或自定义过滤器来筛选出特定严重级别的漏洞。以下是具体操作步骤: 1. 打开 Audit Workbench 并加载需要分析的项目。 2. 在左侧的“Issue List”中,点击“Filter Issues”按钮,打开过滤器对话框。 3. 在过滤器设置中,找到“Filter by”选项,选择“Severity”字段。 4. 在“Severity”条件中,勾选“Critical”“High”两个选项。 5. 点击“Apply”应用过滤器,此时仅显示严重级别为 Critical High 的漏洞。 6. 若需要导出这些漏洞,可右键点击问题列表,选择“Export Issues”,并选择合适的导出格式(如 PDF、Excel、FPR 等)。 此外,在命令行中使用 `ReportGenerator` 工具时,也可以通过指定过滤器文件(.flt)来控制输出内容。例如,可以创建一个名为 `critical_high.flt` 的过滤器文件,内容如下: ```xml <?xml version="1.0" encoding="UTF-8"?> <Filter version="2.0"> <Rule type="Include"> <Term> <Field>Severity</Field> <Operator>Equals</Operator> <Value>Critical</Value> </Term> </Rule> <Rule type="Include"> <Term> <Field>Severity</Field> <Operator>Equals</Operator> <Value>High</Value> </Term> </Rule> </Filter> ``` 然后使用如下命令生成报告: ```bash ReportGenerator -format pdf -source project.fpr -output report_critical_high.pdf -filter critical_high.flt ``` 通过上述方式,可以在 Fortify 中灵活地仅导出严重级别为 Critical High 的漏洞问题,便于进一步分析修复[^1]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值