Fastjson 1.2.83「无 Gadget」RCE 攻击检测实战——日志 / WAF / RASP 联动方案

前一篇《Fastjson 1.2.83「无 Gadget」RCE 深度解析》讲的是如何修;这一篇讲如何看见——当攻击真的发生时,你要在哪几层观测到痕迹,需要哪些关键字段、规则与钩子。全文尽量给出可以直接抄进 SIEM / WAF / RASP 的检测点。

一、先建立正确的心智模型

「无 Gadget」类研究的最大特点是不依赖历史链条——传统靠「载荷特征」的 IDS/WAF 规则会失效,你必须在行为层而不是字节层找到攻击。所以本文按 4 个观测点组织:

  1. 网关/WAF 层:请求语义分析——不看关键词,看 JSON 结构
  2. 应用日志层:Fastjson 自己抛的异常与告警
  3. RASP / 字节码层:进程内的类加载与反射行为
  4. 网络与主机层:JNDI 外联、可疑子进程、异常端口

四层任意一层触发都值得告警,四层同时触发几乎可以判定为攻击落地。gadget-free 的对抗,本质是从「点检测」升级为「链检测」。

二、网关 / WAF 层:JSON 语义级规则

过去我们习惯用正则匹配 RuntimeProcessBuilderldap:// 这类关键字,gadget-free 载荷几乎完全绕过这些特征。新的思路是解析 JSON、看结构

核心规则

  • 规则 A:顶层出现 @type——请求体是 application/json,且 J SON 根对象的键包含 @type——直接告警; 业务真需要多态时应改在服务端做类型映射,不再让客户端指定类型;
  • 规则 B:嵌套里的 @type——任意深度出现 @type 键值,做审计而非直接阻断(避免误伤白名单接口),持续观察 7 天再决定阻断阈值;
  • 规则 C:可疑值域——@type 的值出现 com.sun.rowset.JdbcRowSetImplorg.apache.tomcat.dbcp.dbcp2.BasicDataSourcejavax.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 support
  • autoTypeSupport 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 关键钩点

  1. java.lang.ClassLoader#defineClass:任何从「反序列化上下文」触发的 defineClass 都值得高危告警;
  2. javax.naming.InitialContext#lookupContext#lookup:捕获 JNDI 查询主体,尤其是 ldap:// / rmi:// 前缀;
  3. java.lang.Runtime#execjava.lang.ProcessBuilder#start:从 servlet 线程栈上溯,如果调用来源包含 com.alibaba.fastjson 帧,直接终止请求;
  4. javax.script.ScriptEngine#evalgroovy.lang.GroovyClassLoader#parseClass:任何脚本类通道;
  5. 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 的可复用规则思路

  • 启用 deserializationwebshell_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 步检测清单

  1. WAF:加入 5 条 JSON 语义级规则(顶层 @type、嵌套 @type、可疑值、混淆、超深);
  2. WAF:先开 audit 观察 7 天,再切阻断;
  3. SIEM:收集应用日志中 autoType is not support / autoTypeSupport is disabled 等 4 个关键字;
  4. SIEM:同源 IP 5 分钟 3 次触发 = 高危;
  5. RASP:为 defineClassInitialContext#lookupRuntime#exec 增加栈匹配 fastjson 的告警;
  6. DNS:默认拒绝 Java 进程访问 dnslog 类平台域名;
  7. 网络:禁止 Java 进程主动出站 LDAP / RMI / 非白名单端口;
  8. EDR:JVM 起子进程或写 Web 目录一律告警。

八步全部落地,中国大陆企业的 Fastjson 类 RCE 攻击可视性从「肉眼看不见」提升到「命中前必然告警」。Halocent 可以基于以上清单,为您的 SOC / WAF / RASP 出一份具体到产品的落地方案。

← 返回行业资讯

需要一份「Fastjson 攻击检测能力评估」吗?

1 个工作日内响应,5 个工作日交付:现有 WAF / SIEM / RASP 覆盖度评估 + 差距清单 + 30 天整改计划。