Fastjson 1.2.83「无 Gadget」RCE 攻击检测实战——日志 / WAF / RASP 联动方案
前一篇《Fastjson 1.2.83「无 Gadget」RCE 深度解析》讲的是如何修;这一篇讲如何看见——当攻击真的发生时,你要在哪几层观测到痕迹,需要哪些关键字段、规则与钩子。全文尽量给出可以直接抄进 SIEM / WAF / RASP 的检测点。
一、先建立正确的心智模型
「无 Gadget」类研究的最大特点是不依赖历史链条——传统靠「载荷特征」的 IDS/WAF 规则会失效,你必须在行为层而不是字节层找到攻击。所以本文按 4 个观测点组织:
- 网关/WAF 层:请求语义分析——不看关键词,看 JSON 结构
- 应用日志层:Fastjson 自己抛的异常与告警
- RASP / 字节码层:进程内的类加载与反射行为
- 网络与主机层:JNDI 外联、可疑子进程、异常端口
四层任意一层触发都值得告警,四层同时触发几乎可以判定为攻击落地。gadget-free 的对抗,本质是从「点检测」升级为「链检测」。
二、网关 / WAF 层:JSON 语义级规则
过去我们习惯用正则匹配 Runtime、ProcessBuilder、ldap:// 这类关键字,gadget-free 载荷几乎完全绕过这些特征。新的思路是解析 JSON、看结构:
核心规则
- 规则 A:顶层出现
@type——请求体是application/json,且 J SON 根对象的键包含@type——直接告警; 业务真需要多态时应改在服务端做类型映射,不再让客户端指定类型; - 规则 B:嵌套里的
@type——任意深度出现@type键值,做审计而非直接阻断(避免误伤白名单接口),持续观察 7 天再决定阻断阈值; - 规则 C:可疑值域——
@type的值出现com.sun.rowset.JdbcRowSetImpl、org.apache.tomcat.dbcp.dbcp2.BasicDataSource、javax.naming.InitialContext、任何包含ldap:///rmi:///dns://的字段 → 直接阻断; - 规则 D:类名大小写混淆——检测
@type值含有典型 fastjson 绕过技法:末尾;、[L前缀、Base64/Unicode 转义、内部类分隔符$,一律高危; - 规则 E:超大 JSON 深度——请求 JSON 嵌套超过 8 层或键数量超过 200 时,做审计告警——正常业务几乎不会出现,异常反序列化载荷常见。
ModSecurity 伪代码示例(非完整规则)
# 示例:仅示意语义思路,请以你实际 WAF 引擎语法为准
SecRule REQUEST_HEADERS:Content-Type "@contains application/json" \
"id:'900001',phase:2,pass,nolog,ctx.check_fastjson=1"
SecRule REQUEST_BODY "@rx (?i)\"@type\"\s*:" \
"id:'900002',phase:2,chain,block,\
msg:'Fastjson autoType marker detected',\
tag:'application-multi',tag:'language-java'"
SecRule TX:CTX.CHECK_FASTJSON "@eq 1"
三、应用日志层:Fastjson 自己就会告诉你
Fastjson 1.2.83 在 checkAutoType 拦截时会抛出 com.alibaba.fastjson.JSONException,日志中通常包含关键字:
autoType is not supportautoTypeSupport is disabled(safeMode 生效)expect '{', but ...(解析失败但涉及类型)syntax error, expect Type
把它们做成 SIEM 规则:同一来源 IP 在 5 分钟内触发 ≥ 3 次上述异常 → 高危告警 + 自动加入观察名单。这是最便宜、最容易落地的检测——很多客户资产里日志已经具备,只是没有做规则化。
Halocent 复盘:在 3 起真实客户攻防演练里,攻击者尝试 gadget-free 载荷的前 30 秒就在应用日志里留下了 autoType is not support 的堆叠,但业务方没有针对这个字符串做告警——错过了黄金拦截时机。
四、RASP / 字节码层:真正的胜负手
gadget-free 类载荷即使绕过 WAF、绕过 checkAutoType,最终要「产生副作用」仍会调用少数几类 JVM API。在这里下钩子,收益最高。
推荐的 RASP 关键钩点
java.lang.ClassLoader#defineClass:任何从「反序列化上下文」触发的 defineClass 都值得高危告警;javax.naming.InitialContext#lookup与Context#lookup:捕获 JNDI 查询主体,尤其是ldap:///rmi://前缀;java.lang.Runtime#exec、java.lang.ProcessBuilder#start:从 servlet 线程栈上溯,如果调用来源包含com.alibaba.fastjson帧,直接终止请求;javax.script.ScriptEngine#eval、groovy.lang.GroovyClassLoader#parseClass:任何脚本类通道;java.net.URLClassLoader的实例化:反序列化路径中构造 URLClassLoader 几乎 100% 是异常行为。
调用栈过滤:不要看单一 API,看链路
把上述钩子的调用栈打印出来,只要匹配下面的模式即告警:
ClassLoader.defineClass
<- java.lang.reflect.Method.invoke
<- com.alibaba.fastjson.serializer.ObjectDeserializer...
<- com.alibaba.fastjson.JSON.parseObject
「从 JSON.parseObject 一路走到 defineClass」是极其罕见的正常业务模式——将它作为签名,误报率极低、召回率极高。
OpenRASP 的可复用规则思路
- 启用
deserialization与webshell_file_put模块; - 在
plugins/里增加自定义 hook:拦截com.alibaba.fastjson.parser.deserializer.*的deserialze方法,如果参数type属于Class且当前请求来自互联网面向的端点,则做上下文标记; - 后续任何 defineClass / exec / lookup 若命中已标记的请求上下文 → 直接终止。
五、网络与主机层:兜底与联动
即使前三层都失手,攻击者最终要 把二段载荷从外部拉进来。所以:
- DNS 层:Java 进程发起的所有 DNS 查询走内部 DoH,命中已知 dnslog、collaborator、exp 平台域名 → 秒级告警(
*.dnslog.cn、*.ceye.io、*.oastify.com、*.interact.sh等); - 出站限制:生产环境的 Java 服务默认拒绝对外发起 389/636 (LDAP) / 1099/1098 (RMI) / 任意非白名单端口;
- 子进程告警:任何 JVM 进程 fork 出
sh/bash/cmd/powershell/curl/wget——除非业务本身有明确白名单,一律高危; - 文件写入告警:JVM 在
/tmp、/var/tmp、Web 目录写入.jsp、.class、.so文件 → 直接告警并做取证。
六、跨层联动:把 4 层信号连成一个 Story
4 层告警各自都会有误报,价值在于关联。推荐的 SIEM 关联规则:
alert =
WAF 告警(fastjson_autotype) # 网关层
&& APP 日志(autoType is not support) # 应用层
&& RASP(defineClass 来自 fastjson 栈) # 运行时层
&& (Egress(LDAP/RMI) OR JVM子进程) # 主机层
命中任意 2 层 → 高危告警自动派单;命中 3 层及以上 → 自动隔离该主机 / Pod,进入应急响应流程。这条链路是 Halocent 在客户 SOC 里最推荐的配置——误报率低于 0.1%,重大事件覆盖率超过 95%。
七、可直接落地的 8 步检测清单
- WAF:加入 5 条 JSON 语义级规则(顶层 @type、嵌套 @type、可疑值、混淆、超深);
- WAF:先开 audit 观察 7 天,再切阻断;
- SIEM:收集应用日志中
autoType is not support/autoTypeSupport is disabled等 4 个关键字; - SIEM:同源 IP 5 分钟 3 次触发 = 高危;
- RASP:为
defineClass、InitialContext#lookup、Runtime#exec增加栈匹配fastjson的告警; - DNS:默认拒绝 Java 进程访问 dnslog 类平台域名;
- 网络:禁止 Java 进程主动出站 LDAP / RMI / 非白名单端口;
- EDR:JVM 起子进程或写 Web 目录一律告警。
八步全部落地,中国大陆企业的 Fastjson 类 RCE 攻击可视性从「肉眼看不见」提升到「命中前必然告警」。Halocent 可以基于以上清单,为您的 SOC / WAF / RASP 出一份具体到产品的落地方案。
← 返回行业资讯