流量无特征,不代表攻击不存在:RASP视角下的Ghost-Bits

admin 2026-05-06 06:25:02 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文介绍Ghost-Bits新型绕过技术,其利用Unicode字符高8位丢失的特性将攻击语义隐藏于组件解析差异中,传统WAF难以检测。RASP通过在运行时监控文件读写、命令执行等敏感API调用,直接识别最终攻击行为而非流量特征,有效防护此类0day漏洞。以CVE-2025-41242为例展示RASP如何截获路径穿越攻击并读取/etc/passwd的实际案例。 综合评分: 85 文章分类: 漏洞分析,应用安全,解决方案,WEB安全,安全工具


cover_image

流量无特征,不代表攻击不存在:RASP 视角下的 Ghost-Bits

原创

烛龙实验室 烛龙实验室

实战攻防

2026年4月30日 15:06 北京

在小说阅读器读本章

去阅读

在 Black Hat Asia 2026 上 B1u3r(浅蓝) 和 1ue 师傅给大家带来了 Ghost Bits 新型绕过方式,其核心本质是类似于 DataOutputStream#writeBytes(String s) 这类 API,会将 char 强转成 byte,导致高 8 位丢失,只保留低 8 位,而丢失的那高 8 位称为 “Ghost Bits”。

以 CVE-2025-41242 中最典型的字符串 阮严灵丰丰甲来 为例,这些字符的 Unicode 编码低 8 位刚好可以拼出攻击者想要的路径片段:

| | | | | | — | — | — | — | | 字符 | Unicode | 低 8 位 | 变成的 ASCII | | 阮 | U+962E | 0x2E | . | | 严 | U+4E25 | 0x25 | % | | 灵 | U+7075 | 0x75 | u | | 丰 | U+4E30 | 0x30 | 0 | | 甲 | U+7532 | 0x32 | 2 | | 来 | U+6765 | 0x65 | e |

当存在“只写低 8 位”的错误处理逻辑时,阮严灵丰丰甲来 就会被转换成:

| | | — | | Plain Text                   .%u002e |

Ghost-Bits 这类绕过手法最危险的地方,不在于 payload 写得多“花”,而在于它把攻击藏进了应用与中间件的解释差异里:流量入口看到的是一串不显眼的字符,经过框架、中间件、解码器和资源处理器的多次转换后,真正落到危险函数上的却已经是文件读取、命令执行、SSRF、SQL 注入等清晰的攻击行为。

这正是 RASP 相较于传统流量防护的核心价值:它不需要在入口处猜测这串字符未来会被谁、以什么规则、解释成什么结果,而是在应用运行时守住最终的敏感函数调用。当攻击真正要读文件、写文件、起进程、发网络请求或执行 SQL 时,RASP 能看到已经被应用处理后的真实参数、调用栈和业务上下文。

· Ghost-Bits 绕过的本质:不是“没有攻击”,而是“攻击被推迟显形”

传统 WAF 的主要观察面是 HTTP 请求与响应。它擅长识别流量中的典型特征,例如 ../、/etc/passwd、命令拼接、SQL 关键字、反序列化 gadget 片段等。但 Ghost-Bits 的问题在于:攻击语义并不一定以这些形态出现在流量入口。

在 Ghost-Bits 场景中,中间件或应用自身会对请求路径、参数、编码内容进行二次甚至多次处理。某些字符在一个组件中是“普通字符”,在另一个组件中却可能因为截断、编码兼容、非标准解码或解析差异变成危险字节。于是,安全检查发生时它看起来无害;真正访问资源时,它已经变成了危险路径。

这类绕过并不孤立。类似思路还包括 XML 中的 CDATA 注入、MySQL JDBC 连接串中的 Unicode 编码、反序列化场景中的 UTF-8 overlong 等。表面上看它们是不同协议、不同语法、不同编码下的技巧,本质上都是把攻击语义藏在解释链路的缝隙里。

所以,Ghost-Bits 并没有创造一种全新的漏洞类型。它绕过的是“入口处的可见性”,最终落地的仍然是我们熟悉的风险:RCE、SSRF、任意文件读取、任意文件写入、文件上传、SQL 注入等。

·以 CVE-2025-41242 为例:Spring 看到“无害字符”,Jetty 走到了路径穿越

就在前两天,P 牛上传了 Vulhub Spring CVE-2025-41242 环境 很适合说明 Ghost-Bits 的攻击链路。该漏洞出现在 Spring Framework 与内嵌 Jetty 对 URI 的解析不一致场景中,最终影响表现为路径穿越和任意文件读取。

在这个漏洞中,Spring 的 StringUtils.uriDecode 在处理非 %xy 字符时会写入 ByteArrayOutputStream.write(int)。这个写入过程只保留 Java char 的低 8 位,于是某些高位 Unicode 字符会在解码过程中被静默转换成 ASCII 字节。例如 Vulhub 文档中提到的字符组合,经过这一过程后可以形成类似 .%u002e 的结果。

问题的关键在于,不同组件对这个中间结果的理解并不一致:

  1. Spring 的路径安全检查阶段,看不到字面量 ../。
  2. 标准 URL 解码逻辑也不会把非标准%uXXXX当作普通路径穿越处理。
  3. 请求继续向下进入 Jetty 的资源解析流程。
  4. Jetty 在后续路径处理里把%u002e 解释为.。
  5. 最终,原本没有显式出现的 ../ 在文件系统访问阶段完成显形。

换句话说,入口流量中出现的是一串特殊 Unicode 字符;框架检查时看到的是一个没有命中规则的中间形态;真正走到资源读取时,底层文件 API 面对的已经是跨目录后的目标路径。

这也是 Ghost-Bits 对 WAF 极不友好的原因:WAF 要想准确判断,就必须完整复刻目标应用、目标框架、目标中间件在特定版本下的解释链路。一旦某个环节的解码规则、规范化顺序或容器实现不同,入口规则就很容易失真。

· RASP 的防护点:不追逐“幽灵字符”,而是守住真实行为

RASP 的观察位置在应用进程内部。它不只看 HTTP 请求长什么样,还会在运行时关注敏感 API 的调用,例如:

  • 文件读取:FileInputStream、Files.newInputStream 等。
  • 文件写入:FileOutputStream、Files.write 等。
  • 命令执行:Runtime.exec、ProcessBuilder.start 等。
  • 网络请求:HTTP Client、Socket、JNDI、DNS 等。
  • 数据库操作:JDBC 执行入口、ORM 最终 SQL 执行点等。

因此,面对 CVE-2025-41242,RASP 不需要在请求入口判断 阮严灵丰丰甲来 到底是不是攻击载荷。它只需要在文件读取行为发生时回答几个更确定的问题:

  • 当前应用是否正在读取敏感文件?

  • 真实 absolutePath 是否指向 /etc/passwd 这类系统文件?

  • 传入路径是否包含跨目录后的结果?

  • 这次调用是否来自 Web 请求处理链路?

  • 调用栈是否经过 Spring 静态资源处理与 Jetty 资源解析流程?

在本次 Vulhub 环境的防护效果中,RASP 命中了任意文件读取检测,危险等级为高危,异常原因是执行关键 API:

| | | — | | Plain Text                   java.base/java.nio.file.Files.newInputStream |

同时,RASP 看到的参数已经不再是入口处那串“幽灵字符”,而是攻击最终想要触达的真实资源:

| | | — | | Plain Text                   absolutePath: /etc/passwd                   name: passwd                   path: /tmp/jetty-docbase…/../../../../../../../../etc/passwd |

这就是运行时防护的决定性差异:流量层仍然在面对编码、解码、规范化差异带来的不确定性,而 RASP 已经站在危险动作发生前,直接看见了文件 API、真实路径和完整调用栈。

·为什么 RASP 更适合对抗这类 0day 绕过

很多 0day 的难点不在“最终危害未知”,而在“触发路径未知”。攻击者可以不断更换入口形态:编码一次、嵌套编码、多组件解析、协议边界差异、容器兼容逻辑、框架历史包袱。WAF 需要在请求刚进入时就给出判断,天然处在信息不足的位置。

RASP 的优势是把判断时机后移到关键行为发生前。无论入口 payload 如何变化,只要漏洞最终要完成文件读取、命令执行、网络外连、SQL 执行等动作,就会经过相应的底层函数或关键框架入口。对 RASP 来说,防护目标不是某个 CVE 的 PoC 字符串,而是漏洞利用的最终动作。

这也是 RASP 能在很多 Java 0day 场景中提供有效防护的根本原因:它不依赖“是否认识这个 payload”,而依赖“是否看见危险行为正在发生”。当 Ghost-Bits 把特征藏在流量之外,RASP 仍然能在函数调用处看到已经解码、规范化、传递完成后的真实意图。

参考资料

  • https://i.blackhat.com/Asia-26/Presentations/Asia-26-Bai-Cast-Attack-Ghost-Bits-4.23.pdf

  • https://github.com/vulhub/vulhub/blob/master/spring/CVE-2025-41242/README.zh-cn.md

(ReaJason@边界无限烛龙实验室供稿)


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:实战攻防 烛龙实验室 烛龙实验室《流量无特征,不代表攻击不存在:RASP 视角下的 Ghost-Bits》

评论:0   参与:  0