2026 年 4 月,Black Hat Asia。安全研究员 Zhihui Chen 与 Xinyu Bai 在台上演示了一个让全场寂静的攻击场景:一个看似无害的 Unicode 字符串「爻」(U+2F58) 穿过层层 WAF 规则,却在 Java 后端悄然截断为恶意字符 'X'。
爻→ U+2F58 →二进制:00101111 01011000
(byte) 转换后:截取低 8 位 0x58 → 'X'
一旦攻击者利用该漏洞进行SQL注入、RCE、路径穿越——而整个过程中,安全设备日志干净得像什么都没发生过。这就是 Ghost Bits(幽灵比特位)攻击。
它暴露了 Java 生态一个存在二十年的底层编码陷阱:Java char 为 16 位,强制转为 byte 时仅保留低 8 位。
攻击者只需将Payload中的关键字符替换成特定Unicode字符(低8位与目标字符一致),就能让WAF看到的是乱码,而Java应用执行的是完整的攻击代码。
这不是规则绕过,是检测范式的失效。
为什么WAF"看不见"?
从原理上说,WAF 的困境在于检测与执行上下文不一致。它站在流量入口处,基于 HTTP 原始报文做规则匹配。WAF 按 Unicode 码点检测,而 Java 应用按 char→byte 截断后执行,两者语义不一致。
两者之间的语义鸿沟,让基于正则表达式的规则库瞬间失效。正如研究数据显示,GitHub上超过8100个Java项目存在 (byte)ch、ch & 0xFF等危险写法,这意味着Ghost Bits不是某个组件的漏洞,而是整个Java生态的系统性风险。
RASP:在危险发生的地方"看见"危险
WAF的盲区,恰恰是RASP的主场。
作为进程内防护(In-Process Protection),青藤天睿RASP的核心逻辑是: "与其猜测输入长什么样,不如监控它最终做了什么"。
当Ghost Bits编码的Payload骗过WAF进入应用,试图调用FileInputStream.read()读取/etc/passwd,或在JDBC层执行拼接SQL时,天睿RASP在字节码层面植入的探针会直接Hook这些危险操作。此时,它看到的不再是经过编码的Unicode字符,而是Java运行时真实处理的字节数据。
简单说:WAF看到的是"伪装",RASP看到的是"行为"。
以本次披露的目录遍历为例:
(1)WAF视角:输入参数包含Unicode字符,不符合../特征,放行。
(2)RASP视角:java.io.File构造函数被调用,目标路径经标准化处理后包含../穿越行为,立即告警,并上报完整上下文堆栈。
这种"所见即所得"的检测模式,让Ghost Bits这类编码混淆攻击彻底失效。因为无论攻击者如何变换输入形态,最终的操作行为无法改变。
效果验证:WAF失守,RASP兜底
在本次 Ghost Bits 漏洞验证测试中,青藤天睿 RASP 基于运行时行为检测,成功拦截了漏洞利用的核心攻击链:
针对文件读取路径穿越攻击:攻击者构造了包含多层../的路径请求,试图通过/../../../../etc/passwd越权读取敏感文件。RASP 在sun.nio.fs.UnixNativeDispatcher open文件操作系统调用层,精准识别到路径中的目录穿越特征,直接触发了恶意文件操作高危告警,即便 URL 层的路径解析存在差异,也无法绕过 RASP 对文件行为的直接监控。

图1 针对Ghost Bits漏洞攻击目录遍历防护
针对 JXPath 表达式注入的远程代码执行攻击:攻击者通过构造恶意的valueReference参数,调用java.lang.Runtime.getRuntime()执行系统命令。RASP 在运行时函数调用层,成功捕获到该恶意表达式执行行为,触发了表达式执行高危告警,阻断了远程代码执行的关键步骤。
相较于传统 WAF 依赖 URL 流量特征检测、易被应用层路径解析差异绕过的局限性,青藤天睿 RASP 深入 JVM 运行时内部,直接监控文件读写、代码执行等高危行为,从攻击执行的根源进行拦截,真正实现了对 Ghost Bits 这类复杂漏洞的有效防护。

图2 针对Ghost Bits漏洞攻击表达式注入防护
给技术负责人的行动清单
1. 立即自查:扫描代码中 (byte)ch、ch & 0xFF等Ghost Bits高危写法,优先修复文件上传、URL解析模块;
2. 升级组件:按官方公告升级Jackson、Fastjson、Tomcat等存在解码缺陷的组件;
3.部署RASP:对暂无法立即升级修复的业务系统,部署青藤天睿 RASP 进行运行时安全检测,先实时观测漏洞利用行为,评估无误报风险后,再针对性开启拦截策略,实现安全与业务稳定性兼顾。
4.验证测试:使用研究公开的POC测试现有WAF规则有效性,评估Gap。