English | 中文
基于 Java 对象序列化规范 的 Java 对象序列化流解析器,使用 Rust 编写。
- 完整支持 Java 序列化协议(magic
0xACED,版本 5) - 支持所有类型码:
TC_OBJECT、TC_ARRAY、TC_CLASSDESC、TC_ENUM、TC_PROXYCLASSDESC、TC_STRING、TC_LONGSTRING等 - 块数据(Block Data)和注解(Annotation)解析
- 句柄引用解析(通过
TC_REFERENCE的反向引用) - 自动适配 JDK 8u20 漏洞利用载荷(缺失
TC_ENDBLOCKDATA时自动重试) - 可选
serde支持,支持 JSON 等格式输出 - 通过 35 个 ysoserial gadget chain 载荷测试验证
在 Cargo.toml 中添加依赖:
[dependencies]
java-serialization = "0.1"解析序列化流:
use java_serialization::parse_serialization_stream;
let data = std::fs::read("payload.ser")?;
let (_, stream) = parse_serialization_stream(&data)?;
for obj in stream.objects() {
println!("{:?}", obj);
}启用 serde feature 可将解析结果序列化为 JSON 或其他格式:
[dependencies]
java-serialization = { version = "0.1", features = ["serde"] }use java_serialization::parse_serialization_stream;
let data = std::fs::read("payload.ser")?;
let (_, stream) = parse_serialization_stream(&data)?;
let json = serde_json::to_string_pretty(&stream)?;
println!("{}", json);JDK 8u20 漏洞利用载荷在 TC_REFERENCE 引用句柄 0x7e0009 后省略了 TC_ENDBLOCKDATA 字节,导致标准解析器失败。parse_serialization_stream 在首次解析失败时会自动重试预处理。你也可以手动应用预处理:
use java_serialization::{parse_serialization_stream, preprocess_jdk8u20};
let data = std::fs::read("JDK8u20.ser")?;
let preprocessed = preprocess_jdk8u20(&data);
let (_, stream) = parse_serialization_stream(&preprocessed)?;| 类型 | 说明 |
|---|---|
SerializationStream |
顶层解析结果,包含版本号和内容列表 |
StreamObject |
所有对象类型的枚举(NewObject、NewArray、NewString、NewEnum 等) |
ClassDesc |
类描述符(普通类或代理类) |
FieldValue |
基本类型或对象字段值 |
BlockData |
块数据(短格式或长格式) |
cargo test # 运行所有测试
cargo test --all-features # 包含 serde feature
cargo clippy --all-features -- -D warnings # 代码检查测试套件通过 35 个 ysoserial 生成的 .ser 文件进行验证,涵盖 CommonsCollections、Spring、Groovy、Clojure、Hibernate 等多种 gadget chain。
本项目仅作为解析器——不会执行或实例化任何 Java 对象。testcases/ 目录中的 .ser 文件仅用于测试解析器对已知 Java 反序列化载荷格式的正确性。
这些文件由 ysoserial 生成,仅适用于经授权的安全研究、漏洞评估和教育目的。请勿对未经授权的系统使用这些载荷。