常见fortify漏洞与整改规则

fortify源代码扫描问题分析汇总 编号 漏洞名称 漏洞危害 修复建议 1 Dynamic Code Evaluation: Unsafe Deserialization 动态代码评估:不安全的反序列化 Actuator正是Spring Boot提供的对应用系统的监控和管理的集成功能,可以查看应用配置的详细信息,例如自动化配置信息、创建的Spring beans信息、系统环境变量的配置信以及Web请求的详细信息等。在使用... 阅读详情

背景

针对于代码质量管控来说,代码安全扫描作为其中极其重要的一环,是一项必不可少的且能够有效把控代码质量的操作。其中fortify,作为比较常用的扫描工具之一,尝尝被用来进行此环节的把关。
为了能够在代码编写过程中,自然的遵循代码安全规范,所以此处列举一些在代码安全扫描中较为常见的问题。

规则清单

Path Maniputation

规则描述
当满足以下两个条件时,就会产生 path manipulation 错误:

  1. 攻击者可以指定某一文件系统操作中所使用的路径。

  2. 攻击者可以通过指定特定资源来获取某种权限,而这种权限在一般情况下是不可能获得的。

例如,在某一程序中,攻击者可以获得特定的权限,以重写指定的文件或是在其控制的配置环境下运行程序。

在这种情况下,攻击者可以指定通过 AttachmentController.java 中第 155 行的 getParameter() 进入程序的值,这一数值可以通过 AttachmentController.java 中第 205 行的 File() 访问文件系统资源。

例 1: 下面的代码使用来自于 HTTP 请求的输入来创建一个文件名。程序员没有考虑到攻击者可能使用像“…/…/tomcat/conf/server.xml”一样的文件名,从而导致应用程序删除它自己的配置文件。

String rName = request.getParameter("reportName");
File rFile = new File("/usr/local/apfr/reports/" + rName);
rFile.delete();

解决方案
进行文件名校验

    public static final Character[] INVALID_WINDOWS_SPECIFIC_CHARS = {'"', '`', '<', '>', '?', '|','\000'};
    public static boolean validateStringFilenameUsingContains(String filename) {
        if (filename == null || filename.isEmpty() || filename.length() > 255) {
            return false;
        }
        return Arrays.stream(INVALID_WINDOWS_SPECIFIC_CHARS)
                .noneMatch(ch -> filename.contains(ch.toString()));
    }
public static boolean validateFileName(String fileName) {
        // Check if the file name is null or empty
        if (fileName == null || fileName.isEmpty()) {
            return false;
        }

        // Check if the file name contains any invalid characters
        String invalidChars = "[/\\\\?%*:|\"<>]";
        if (fileName.matches(".*" + invalidChars + ".*")) {
            return false;
        }

        // Check if the file name ends with a period or space
        if (fileName.endsWith(".") || fileName.endsWith(" ")) {
            return false;
        }

        // Check if the file name is too long
        int maxFileNameLength = 255;
        if (fileName.length() > maxFileNameLength) {
            return false;
        }

        // If all checks pass, the file name is valid

        return true;
    }

Header Manipulation

规则描述
以下情况中会出现 Header Manipulation 漏洞:

  1. 数据通过一个不可信赖的数据源进入 Web 应用程序,最常见的是 HTTP 请求。

  2. 数据包含在一个 HTTP 响应头文件里,未经验证就发送给了 Web 用户。

如同许多软件安全漏洞一样,Header Manipulation 只是通向终端的一个途径,它本身并不是终端。从本质上看,这些漏洞是显而易见的:一个攻击者将恶意数据传送到易受攻击的应用程序,且该应用程序将数据包含在 HTTP 响应头文件中。

其中最常见的一种 Header Manipulation 攻击是 HTTP Response Splitting。为了成功地实施 HTTP Response Splitting 盗取,应用程序必须允许将那些包含 CR(回车,由 %0d 或 \r 指定)和 LF(换行,由 %0a 或 \n 指定)的字符输入到头文件中。攻击者利用这些字符不仅可以控制应用程序要发送的响应剩余头文件和正文,还可以创建完全受其控制的其他响应。

如今的许多现代应用程序服务器可以防止 HTTP 头文件感染恶意字符。例如,如果尝试使用被禁用的字符设置头文件,最新版本的 Apache Tomcat 会抛IllegalArgumentException。如果您的应用程序服务器能够防止设置带有换行符的头文件,则其具备对 HTTP Response Splitting 的防御能力。然而,单纯地过滤换行符可能无法保证应用程序不受 Cookie Manipulation 或 Open Redirects 的攻击,因此必须在设置带有用户输入的 HTTP 头文件时采取措施。

示例:下列代码片段会从 HTTP 请求中读取网络日志项的作者名字 author,并将其置于一个 HTTP 响应的 cookie 头文件中。

String author = request.getParameter(AUTHOR_PARAM);
Cookie cookie = new Cookie(""author"", author);
cookie.setMaxAge(cookieExpiration);
response.addCookie(cookie);

假设在请求中提交了一个字符串,该字符串由标准的字母数字字符组成,如“Jane Smith”,那么包含该 cookie 的 HTTP 响应可能表现为以下形式:

HTTP/1.1 200 OK

…

Set-Cookie: author=Jane Smith

…

然而,因为 cookie 值来源于未经校验的用户输入,所以仅当提交给 AUTHOR_PARAM 的值不包含任何 CR 和 LF 字符时,响应才会保留这种形式。如果攻击者提交的是一个恶意字符串,比如“Wiley Hacker\r\nHTTP/1.1 200 OK\r\n…”,那么 HTTP 响应就会被分割成以下形式的两个响应:

HTTP/1.1 200 OK

…

Set-Cookie: author=Wiley Hacker

HTTP/1.1 200 OK

…

显然,第二个响应已完全由攻击者控制,攻击者可以用所需的头文件和正文内容构建该响应。攻击者可以构建任意 HTTP 响应,从而发起多种形式的攻击,包括:cross-user defacement、网络和浏览器缓存中毒、cross-site scripting 和 page hijacking。

用户信息涂改:攻击者可以向一个易受攻击的服务器发出一个请求,导致服务器创建两个响应,其中第二个响应可能会被曲解为对其他请求的响应,而这一请求很可能是与服务器共享相同 TCP 连接的另一用户发出的。这种攻击可以通过以下方式实现:攻击者诱骗用户,让他们自己提交恶意请求;或在远程情况下,攻击者与用户共享同一个连接到服务器(如共享代理服务器)的 TCP 连接。最理想的情况是,攻击者只能通过这种做法让用户相信自己的应用程序已经遭受了黑客攻击,进而对应用程序的安全性失去信心。最糟糕的情况是,攻击者可能提供经特殊技术处理的内容,这些内容旨在模仿应用程序的执行方式,但会重定向用户的私人信息(如帐号和密码),将这些信息发送给攻击者。

缓存中毒: 如果多用户 Web 缓存或者单用户浏览器缓存将恶意构建的响应缓存起来,该响应的破坏力会更大。如果响应缓存在共享的 Web 缓存(如在代理服务器中常见的缓存)中,那么使用该缓存的所有用户都会不断收到恶意内容,直到清除该缓存项为止。同样,如果响应缓存在单个用户的浏览器中,那么在清除该缓存项以前,该用户会不断收到恶意内容。然而,影响仅局限于本地浏览器的用户。

跨站脚本攻击:一旦攻击者控制了应用程序传送的响应,就可以选择多种恶意内容来传播给用户。Cross-Site Scripting 是最常见的攻击形式,这种攻击在响应中包含了恶意的 JavaScript 或其他代码,并在用户的浏览器中执行。基于 XSS 的攻击手段花样百出,几乎是无穷无尽的,但通常它们都会包含传输给攻击者的私人数据(如 Cookie 或者其他会话信息)。在攻击者的控制下,指引受害者进入恶意的网络内容;或者利用易受攻击的站点,对用户的机器进行其他恶意操作。对于易受攻击的应用程序用户,最常见且最危险的攻击就是使用 JavaScript 将会话和 authentication 信息返回给攻击者,而后攻击者就可以完全控制受害者的帐号了。

网页劫持:除了利用一个易受攻击的应用程序向用户传输恶意内容,还可以利用相同的根漏洞,将服务器生成的供用户使用的敏感内容重定向,转而供攻击者使用。攻击者通过提交一个会导致两个响应的请求,即服务器做出的预期响应和攻击者创建的响应,致使某个中间节点(如共享的代理服务器)误导服务器所生成的响应,将本来应传送给用户的响应错误地传给攻击者。因为攻击者创建的请求产生了两个响应,第一个被解析为针对攻击者请求做出的响应,第二个则被忽略。当用户通过同一 TCP 连接发出合法请求时,攻击者的请求已经在此处等候,并被解析为针对受害者这一请求的响应。这时,攻击者将第二个请求发送给服务器,代理服务器利用针对受害者(用户)的、由该服务器产生的这一请求对服务器做出响应,因此,针对受害者的这一响应中会包含所有头文件或正文中的敏感信息。

Cookie Manipulation:当与类似 Cross-Site Request Forgery 的攻击相结合时,攻击者就可以篡改、添加、甚至覆盖合法用户的 cookie。

打开重定向:如果允许未验证的输入来控制重定向机制所使用的 URL,可能会有利于攻击者发动钓鱼攻击。

解决方案

     public static String fixFilenameByRegex(String filename) throws UnsupportedEncodingException {
        String regex = "[`~!@#$%^&*()\\+\\=\\{}|\"?><【】\\r\\n]";
        Pattern pa = Pattern.compile(regex);
        Matcher ma = pa.matcher(filename);
        if (ma.find()) {
            filename = ma.replaceAll("");
        }
        return URLEncoder.encode(filename, "UTF-8");
    }

Dynamic Code Evaluation:Unsafe JSON Derialization (动态代码之json反序列化)

规则描述
在运行时对用户控制的对象流进行反序列化,会让攻击者有机会在服务器上执行任意代码、滥用应用程序逻辑和/或导致 Denial of Service。

解决方案

对于json反序列化操作

     /**
     * Dynamic Code Evaluation: Unsafe Deserialization
     */
    public static void checkSerializeStream(String[] args) throws IOException, ClassNotFoundException {
        Bar bar = new Bar("bar-test");
        Foo foo = new Foo("test-foo", bar);

        // write into an array buffer
        ByteArrayBuffer buffer = new ByteArrayBuffer();
        try (ObjectOutputStream serializeStream = new ObjectOutputStream(buffer)) {
            serializeStream.writeObject(foo);
        }

        try (ValidatingObjectInputStream stream = new ValidatingObjectInputStream(buffer.newInputStream())) {
            // add validated classes
            stream.accept(Foo.class);
            stream.accept(Bar.class);


            Foo foo2 = (Foo) stream.readObject();
            System.out.println(foo2);
        }
    }

    public static class Foo implements Serializable {
        private String name;
        private Bar bar;

        public Foo(String name, Bar bar) {
            this.name = name;
            this.bar = bar;
        }

        @Override
        public String toString() {
            return "Foo{" +
                    "name='" + name + '\'' +
                    ", bar=" + bar +
                    '}';
        }
    }

    public static class Bar implements Serializable {
        private String name;

        public Bar(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return "Bar{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }

对于redisTemplate初始化设置

    @Bean
    public RedisTemplate<String, Serializable> limitRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Serializable> template = new RedisTemplate<>();
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        template.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
Fortify代码安全扫描实战:从SAST原理到流水线落地 代码安全扫描是保障软件供应链安全的重要环节。静态应用安全测试(SAST)在不运行代码的前提下,通过解析源码并构建中间表示,实现对项目全量代码路径的分析。其底层核心是污点分析:从用户可控入口追踪数据流,判断是否流向 SQL 执行、命令执行等危险函数,从而在代码阶段发现注入、XSS 等隐患。SAST 覆盖面广、可嵌入流水线,常作为 DevSecOps 质量门禁,与 DAST、IAST 等互补。Fortify 是应用广泛的 SAST 商业工具,拥有完整的规则库与跨方法数据流分析能力,支持 Java、C/C++、P 阅读详情

相关推荐

Fortify扫描出的Access Control: Database漏洞,我是这样修复的(附实战代码)

本文针对Fortify扫描出的Access Control: Database高危漏洞,提供了从理解漏洞本质到实施修复的完整解决方案。文章深入剖析了未绑定用户上下文的数据库查询为何构成横向越权风险,并系统介绍了查询层加固、架构层抽象、模式重构及数据库行级安全(RLS)四级修复策略,辅以MyBatis及多表关联查询的实战代码,帮助开发者将安全合规要求转化为可持续的纵深防御能力。

gpt4scribbler的博客 429

Spring boot项目Fortify漏洞扫描问题解决

一、背景 前段时间公司使用Fortify工具对项目源码进行安全漏洞扫描,结果报出Dynamic Code Evaluation: Unsafe Deserialization漏洞。整个项目是基于Spring boot框架开发的。 二、问题源 Fortify工具明确指出该安全漏洞是由于引入了Spring Boot Actuator依赖导致的 <dependency> <groupId>org.springframework.boot</grou...

夏日清风 6217

基于Gitee的SCA工具选型与集成:从依赖漏洞到安全门禁

软件成分分析(SCA)是保障开源组件安全的核心手段,通过解析项目依赖清单并与公开漏洞库比对,识别组件版本风险、许可证合规问题。在代码托管与CI/CD流程中,SCA的价值不仅在于发现漏洞,更在于将扫描结果嵌入研发链路,形成自动化的依赖安全门禁。针对国内团队广泛使用的Gitee平台,SCA集成需结合Webhook、Gitee Go流水线及OpenAPI等能力,实现从代码推送、依赖解析、漏洞匹配到结果回写的完整闭环。本文围绕SCA工具选型,对比Dependency-Check、Trivy、Grype/Syft等主

weixin_34214500的博客 449

Dynamic Code Evaluation:Unsafe Deserialization 动态代码评估:不安全反序列化

Abstract: 在运行时对用户控制的对象流进行反序列化,会让攻击者有机会在服务器上执行任意代码、滥用应用程序逻辑和/或导致 Denial of Service。 Explanation: Java 序列化会将对象图转换为字节流(包含对象本身和必要的元数据),以便通过字节流进行重构。开发人员可以创建自定义代码,以协助 Java 对象反序列化过程,在此期间,他们甚至可以使用其他对象或代理替代反...

Dearzh的博客 860

Deserialization反序列化漏洞

详细介绍反序列化安全漏洞的知识笔记。绝佳的入门教程+配套靶场

一个安全白帽子的成长记录:Web 安全、漏洞复现、内网渗透。完整目录在 gysec.top 3467

企业安全建设之自动化代码扫描(代码审计)

目前市面上有基于正则表达式和基于语义分析的两种检测方式。

墨痕诉清风的博客 2025

Fortify SCA在CI/CD中的漏洞阈值控制与门禁策略实践

静态应用安全测试(SAST)是DevSecOps实践中的重要一环,而Fortify SCA作为成熟的SAST工具,接入CI/CD流水线时,真正的难点在于如何设定合理的漏洞阈值与门禁规则。仅依赖扫描报告中的漏洞数量往往导致误杀或门禁失效,因此需要引入基线对比机制,以增量变化而非绝对总量作为阻断依据。通过阈值、基线和阻断策略的协同,团队能把安全评价从人工评审转化为可量化、可解释、可追溯的自动化关卡。在实际工程中,结合Jenkins、GitLab CI等流水线,将“新增Critical直接失败、新增High允许豁

weixin_29324401的博客 165

Fortify-SCA安装使用手册范本:从环境配置到扫描报告的完整落地指南

静态代码分析(SAST)是软件安全开发生命周期(SDL)中的关键环节,通过在不运行程序的情况下扫描源码,识别SQL注入、内存泄漏等安全缺陷。Fortify SCA作为业界成熟的静态分析工具,其安装配置与使用流程的规范化管理,直接影响安全测试团队的工作效率。针对企业内部分享知识时常见的手册缺失、资料零散等痛点,一份结构化的Fortify SCA安装使用手册范本显得尤为重要。该范本以docx格式呈现,完整覆盖系统环境审查、安装拓扑选型、目录骨架搭建、扫描命令配置、报告解读与回滚方案,并给出可直接替换的占位符和实

weixin_26642481的博客 250

Fortify SCA漏洞阈值控制:在CI/CD流水线中实现安全门禁阻断

静态代码分析是DevSecOps中的重要一环,但扫描结果若不与流程绑定,很难真正转化为安全能力。CI/CD流水线通过引入漏洞阈值控制,将安全扫描从“事后报告”升级为“同步门禁”:超线则红、在线则绿,让每次代码提交和合并都过一遍安全检查。本文从漏洞阈值设定的原理出发,阐述如何基于Fortify SCA扫描产物FPR,设计可量化的阻断策略,并结合Jenkins、GitLab CI等常见流水线实现自动拦截。文章重点关注增量阻断模式,避免存量漏洞阻塞迭代,同时给出误报审计、规则包版本锁定、扫码超时排查等工程实践。通

weixin_31960565的博客 321

Fortify SCA 插件实战:从环境搭建到 CI 集成的静态代码扫描避坑指南

静态应用安全测试(SAST)通过数据流分析在编码阶段发现漏洞,其核心原理是追踪污点从输入点传播到危险操作点的路径。在 DevSecOps 实践中,将 SAST 工具集成到 IDE 和 CI 流水线能实现安全左移,显著降低修复成本。Fortify SCA 作为主流白盒测试工具,其 IDE 插件让开发者在编码时即可扫描,但环境配置、规则调优和误报处理常成为落地难点。本文基于真实项目经验,详解 Fortify SCA 插件的安装配置、扫描流程、常见报错排查以及自定义规则与 CI 集成技巧,帮助研发和测试人员高效完

weixin_29323365的博客 270

Fortify SCA 20.1.1实战:代码审计中的翻译扫描分离与参数调优

静态代码分析是软件安全测试的核心手段,通过在不运行程序的情况下分析源码的语法、数据流与控制流,识别注入、XSS、硬编码密钥等风险。其原理主要依赖污点分析和调用链追踪:从外部输入等污点源出发,跟踪数据在函数间的传播,最终汇聚到敏感操作,从而定位漏洞的完整路径。这类技术在 SDLC 早期发现缺陷、降低修复成本方面价值显著,广泛应用于代码审计、渗透测试前期的源码梳理及 CI 流水线中的自动化安全扫描。当面对动辄数十万行的真实业务系统时,工具的高效配置与结果去噪往往比扫描本身更关键。本文围绕 Fortify SCA

weixin_28715953的博客 81

语法分析器识别负数代码_企业安全建设之自动化代码扫描

一、代码扫描的目标网上关于代码扫描的介绍无一不是在推荐基于语法语义分析的代码扫描工具,典型的代表就是fortify、Checkmarx。总结起来观点无非是, 目前市面上有基于正则表达式和基于语义分析的两种检测方式,基于正则表达式的传统代码安全扫描方案的缺陷在于其无法很好的“理解”代码的语义,而是仅仅把代码文件当作纯字符串处理。静态扫描商用产品都运用了语义分析、语法分析等程序分析技术静态分...

weixin_39800990的博客 225

Fortify SCA 20.1.1 静态代码审计实战:安装部署、CI集成与误报治理

静态应用安全测试(SAST)通过数据流分析追踪用户输入从入口点到危险操作的传播路径,在代码提交前识别SQL注入、反序列化等安全漏洞。Fortify SCA作为商用SAST工具,支持Java、Python、Go等二十多种语言,其核心价值在于以可控的误报率从海量代码中精准捞出真实风险。在DevSecOps实践中,将Fortify集成到Jenkins或GitLab CI流水线,配合质量门禁实现安全左移,已成为企业代码准入审计的标配。本文围绕Fortify SCA 20.1.1,详解静默安装、规则调优、CI集成及A

weixin_33859135的博客 256

安全审计技能地图:从Fortify SCA到Security Onion的实战指南

安全审计是企业安全建设中不可或缺的环节,它要求审计人员同时具备代码层、系统层与网络层的综合视野。以静态应用安全测试工具Fortify SCA为例,理解其许可证机制与误报研判方法,是开展代码审计的前提;而Spring Security框架迁移中隐藏的授权漏洞,则考验对应用层配置的敏感度。向下延伸到Windows主机层,安全基线核查、注册表策略检查,以及Security Onion这类流量审计平台的部署与应用,共同构成了完整的审计闭环。从这些基础技术概念出发,掌握工具原理与排查思路,才能在实际项目中高效发现风险

weixin_29325515的博客 142

Fortify SCA 20.1.1 从安装到流水线落地:代码审计避坑指南

源码级漏洞扫描是软件安全测试中的关键环节,SAST(静态应用安全测试)工具通过将代码解析为抽象语法树和数据流模型,精准追踪危险函数与污染数据的传播路径,从而定位SQL注入、XSS、硬编码口令等缺陷。相比正则匹配,SAST具备更高准确率和更广语言覆盖,被广泛用于上线前安全门禁、外包代码交付验收及漏洞整改闭环管理。在实际部署中,License激活、规则包更新、classpath配置和扫描参数设置常成为落地难点,尤其当工具接入Jenkins流水线时,增量扫描与基线对比策略直接影响审计效果。本文围绕Fortify

weixin_28834169的博客 221

fortify扫描问题总结

fortify扫描问题总结,系统安全类

安全审计实战指南:从漏洞扫描到风险定级的完整技能框架

漏洞扫描是信息安全的基础手段,但工具的自动化输出只是起点。静态分析工具如Fortify SCA能快速发现代码层面的注入、XSS等已知风险,而动态渗透测试(如基于Kali Linux的工具链)则用于验证漏洞的实际可利用性。然而,真实世界的安全审计远不止扫描与验证,它更依赖审计者对业务逻辑、权限模型和部署环境的深入理解。从资产梳理、静态走查、动态验证到风险定级与报告输出,一套完整的审计流程需要将工具结果转化为业务语言,并推动整改落地。在框架升级或配置迁移中,人工复核与威胁建模往往能发现工具遗漏的灰区问题;配合持

weixin_42706667的博客 247

fortify规则包概述

NULL 博文链接:https://hoochiang.iteye.com/blog/2070813

上一篇: idea 2021版本控制文件变化后让整个目录树也变色
下一篇: 记录一次kylin系统部署java服务中文乱码的完整踩坑过程
chastera
博客等级 码龄10年 29粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值