#traits #deserialize #serialization

detrojt

支持任意trait对象反序列化的技巧

2个版本

使用旧版Rust 2015

0.1.1 2017年7月8日
0.1.0 2017年7月8日

#2034 in 编码

MIT/Apache

19KB
193

可反序列化的trait对象

Documentation Crates.io

master分支的文档

支持任意trait对象反序列化的一个脏技巧。

这是为了回应rust-lang/rfcs#668以及Dmitry Gordon的问题Rust中如何添加多态trait对象的反序列化?相关Rust论坛帖子)而创建的一个原型。

告示

反序列化可能会导致任意代码执行。该库有一些合理性检查,使其难以意外出错,但无法保证该库能够安全抵御恶意攻击者。

即使是可信的数据,在违反以下任何假设的平台和配置上进行反序列化可能会导致未定义的行为

  • 正在反序列化的数据最初是由在相同条件下(架构、优化级别、其他编译器标志等)构建的完全相同的可执行文件序列化的
  • 所有vtable都映射到一个单一的连续内存块,彼此之间的位置固定(每次执行都相同)
  • trait对象具有以下布局:{ data: *mut _, vtable: *mut _ }
  • vtable具有以下布局:{ destructor: fn, size: usize, alignment: usize, ... }
  • 具有/dev/random/dev/null的POSIX系统(将其移植到其他平台可能不太困难)
  • 64位指针(虽然不是完全必要,但32位指针会使利用更加容易)

如果Rust添加了对#[repr(align = "N")]的支持,则可能可以使用自定义对齐作为次要合理性检查。

依赖项

~355–750KB
~17K SLoC