Ghost Bits(幽灵比特位)自查工具发布:检测高位截断与WAF绕过风险

请帮忙点点下面链接

https://mp.weixin.qq.com/s/4EqINgdR9KEVHyB0Uw1uKQ

一、技术根源

在 Black Hat Asia 2026 上,安全研究员 Zhihui Chen(1ue)与安全研究员 Xinyu Bai(浅蓝)发表了题为《Cast Attack: A New Threat Posed by Ghost Bits in Java》的研究成果。该研究成果揭示了该缺陷并非某个具体组件的实现错误,而是源于 Java 语言中 charbyte 类型之间窄化转换的静默截断行为。

Java 中 char 为 16 位无符号整数(范围 0x0000 ~ 0xFFFF),而 byte 仅为 8 位有符号整数(-128 ~ 127)。当代码显式执行 (byte) chch & 0xFFByteArrayOutputStream.write(ch)DataOutputStream.writeBytes(String) 时,JVM 会无警告地丢弃 char 的高 8 位,仅保留低 8 位。

以汉字「阮」(U+962E)为例:

  • 二进制:1001 0110 0010 1110
  • 高 8 位 0x96 被丢弃
  • 低 8 位 0x2E 被保留,对应 ASCII 字符 .(点号)

攻击者利用这一机制,可以精心挑选一个高位任意、低 8 位等于目标危险 ASCII 的 Unicode 字符。常见映射如下:

真实 ASCII Ghost Bits 字符 Unicode 低 8 位
. U+962E 0x2E
/ U+4E2F 0x2F
j U+966A 0x6A
@ U+4E40 0x40
\r U+760D 0x0D
\n U+760A 0x0A
% U+4E25 0x25
0 U+4E30 0x30
u U+7075 0x75
2 U+7532 0x32

在攻击链路中,WAF/IDS 基于字符串模式匹配,看到的是"无害"的 Unicode 字符序列(如 ),判定为安全并放行;而后端 Java 应用在执行 char→byte 窄化转换时,会恢复出原始攻击载荷(如 .j@),从而触发路径穿越、文件上传、反序列化 RCE 等漏洞。

以具体的 Ghost Bits 变形为例:

  • 字符序列 (分别为 U+962E、U+4E25、U+7075、U+4E30、U+4E30、U+7532、U+6765)经过低 8 位折叠后,依次得到字节 0x2E0x250x750x300x300x320x65,即字符串 .%u002e。在支持 %u 解码的容器(如 Jetty)中,%u002e 会被进一步解析为 .,与前一个 . 组合成 ..,从而实现路径穿越。
  • 字符序列 (U+760D、U+760A)的低 8 位分别为 0x0D(CR)和 0x0A(LF),直接折叠为 \r\n,可注入 SMTP 协议或 HTTP 头部,触发 CRLF 注入攻击。

这就是 Ghost Bits 既能用于路径穿越,也能用于 CRLF 注入的根本原因:攻击者只需选择低 8 位对目标字节的高位字符序列,即可将任意 ASCII 控制字符"隐身"在 Unicode 字符串中,待后端截断后还原生效。

二、典型不安全代码模式:

以下 Java 代码写法均存在将 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">char</font> 静默截断为 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">byte</font> 的风险,攻击者可利用 Ghost Bits 绕过安全检测:

plain 复制代码
(byte) ch
ch & 0xff
ch & 255
0xff & ch
baos.write(ch)
DataOutputStream.writeBytes(String s)
OutputStream.write(int)
StringBufferInputStream.read
String.getBytes(int, int, byte[], int)
RandomAccessFile.writeBytes
URLDecoder.decode

上述 内容 均将字符(16 位)当作字节(8 位)处理 ,或仅保留低 8 位而丢弃高 8 位。开发者在使用时往往默认输入仅为 ASCII 字符,忽略了高位 Unicode 字符可能被攻击者利用。

三、 自查工具的使用

该工具已经集成了上述不安全代码模式检测,具体检测结果还需专业技术人员辅助分析进行验证。

功能特性

🔍 GitHub 代码搜索
  • 通过 GitHub Code Search API 远程搜索可能存在 Ghost Bits 漏洞的 Java 代码,辅助标记可能存在该漏洞的开源项目,提前做好防范措施。
  • 支持 11 种漏洞代码模式筛选
  • 支持关键词搜索(如 Jackson、Tomcat、Spring、fastjson 等)
  • 搜索结果展示文件名、仓库、路径等信息
🔬 SAST 路径扫描
  • 指定本地目录路径,递归扫描所有 Java 源码文件
  • 静态应用安全测试(SAST)+ 污点源追踪
  • 可选 AI 分析,利用大语言模型评估漏洞可利用性
🤖 AI 智能分析
  • 集成大语言模型(LLM)进行漏洞可利用性评估
  • 分析代码上下文,判断漏洞是否可被实际利用
  • 提供修复建议和风险评级

使用说明

  1. 首次使用:
    • 双击 "启动.bat" 或 "GhostBitsScanner.exe" 启动程序
复制代码
- 浏览器访问 [http://127.0.0.1:5000](http://127.0.0.1:5000),可以看到如下页面后,点击配置按钮
复制代码
- 在 "配置" 页面设置 LLM API 和 GitHub Token

获取 GitHub Classic Token 通过 Settings -> Developer settings -> Personal access tokens -> Tokens (classic) 这个路径进行创建。

四、临时缓解方案

  1. [优先] 应用层输入校验: 排查 API 网关或全局 Filter 中的"输入验证"逻辑(针对低 8 位的黑名单检查),作为虚拟补丁。
  2. [优先] 业务代码排查与修复: 使用静态代码分析工具(SAST)或通过 grep 扫描工程中的 writeBytes(byte) 等关键字,根据实际业务场景进行替换为 UTF-8 安全编码方法。
  3. [常规] 升级依赖组件: 跟踪各大中间件(如 Spring, Tomcat, Jetty)的安全公告,及时升级版本。
  4. [常规] WAF 特征沉淀: 将捕获到的已知恶意 Ghost 字符沉淀到 WAF 规则库中。

参考

参考资料:

  1. Black Hat Asia 2026 原议题
    Cast Attack: A New Threat Posed by Ghost Bits in Java作者:Xinyu Bai(@b1u3r / @iSafeBlue)、Zhihui Chen(@1ue1166323)、贡献者 Zongzheng Zheng(@chun_springX)

相关推荐
向往着的青绿色3 天前
java安全专栏
java安全
honest_gg14 天前
潜影【TraceHarvest】:自动化“一键”钓鱼工具
安全·hw·社会工程学·hvv·钓鱼·攻防演练·护网
cike_y5 个月前
JavaWeb-Request应用与Cookie&[特殊字符]️Session
java·开发语言·安全·java安全
cike_y5 个月前
JavaWeb之HttpServletResponse
java·开发语言·安全·java安全
摸鱼也很难10 个月前
Java安全-常规漏洞问题(SQL注入,XXE,SSRF,RCE)
java安全·java靶场练习
癞皮狗不赖皮1 年前
WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入
web安全·java安全
cop_g1 年前
Java安全-类的动态加载
java·代码审计·java安全