ARTICLE · 软件编程
告别 LEB128 的规范性陷阱,Bijou64 用结构设计解决安全问题
一语总结Bijou64 通过结构化设计消除可变长整数的规范性歧义,提升解码速度并引发社区关于安全与性能的讨论。
文章介绍了 Ink & Switch 研究实验室推出的 Bijou64 可变长度整数编码方案。该方案通过将 0‑247 的值直接编码为单字节,并使用标签字节(248‑255)表示后续负载字节数,确保每个整数只有一种合法编码,从根本上消除了传统 LEB128 等方案中的规范性漏洞。基准测试显示,Bijou64 在小数字上的解码速度约为 LEB128 的两倍,大数字提升可达 8‑10 倍。文章还引用了 Hacker News 社区的讨论,指出 SIMD 方案在并行场景下仍更快,并指出若遗漏最高字节范围检查,仍可能产生溢出风险。文末提供了 Rust、JavaScript、Elixir、Go、Perl、Java 等语言的实现链接,并提及了 bijou32、bijou128 等位宽变体。
- Bijou64 通过结构设计消除规范性歧义。
通过将小值直接编码为单字节,使用标签字节表示后续负载长度,确保每个整数只有一种合法字节序列,避免非规范编码导致的安全漏洞。
- 解码性能优于 LEB128,小数字提升约 2 倍,大数字提升 8‑10 倍。
利用连续的大端负载字节,可通过一次加载和字节交换完成解码,免去位掩码和分支开销,从而在 x86 和 ARM 上实现显著加速。
- 社区指出 SIMD 方案在并行场景更快,且安全论点仍需运行时检查。
一些评论者认为 SIMD 指令能提供更高并行性,并警告若遗漏最高字节范围检查,仍可能导致溢出,因而并未完全消除验证需求。
告别 LEB128 的规范性陷阱,Bijou64 用结构设计解决安全问题
文章介绍了 Ink & Switch 研究实验室推出的 Bijou64 可变长度整数编码方案。该方案通过将 0‑247 的值直接编码为单字节,并使用标签字节(248‑255)表示后续负载字节数,确保每个整数只有一种合法编码,从根本上消除了传统 LEB128 等方案中的规范性漏洞。基准测试显示,Bijou64 在小数字上的解码速度约为 LEB128 的两倍,大数字提升可达 8‑10 倍。文章还引用了 Hacker News 社区的讨论,指出 SIMD 方案在并行场景下仍更快,并指出若遗漏最高字节范围检查,仍可能产生溢出风险。文末提供了 Rust、JavaScript、Elixir、Go、Perl、Java 等语言的实现链接,并提及了 bijou32、bijou128 等位宽变体。
文章金句
"这是 bijou64 设计目标中希望彻底消除的一类漏洞。它不是通过增加更多检查来实现,而是移除了那个真正重要的检查,并让格式本身保证:即使完全没有规范性检查,对于任何给定值,存在的唯一编码就是规范编码。
"测试证明,当你转向 SIMD 指令时,ULEB128 或 sentinel values 每次都会获胜,因为它们拥有并行化机会。真正讽刺的是,即使是 SIMD 文本解析也会超过这个方案!SIMD 的能力就是这么强大。