19 hours ago
- OCaml是一种实用的函数式语言,可以将C语言的缓冲区管理技术隐藏在抽象接口之后。
- 当OCaml变为多核时,缓冲区管理技术的安全性受到了损害,这一点在ocaml-wire库中被发现。
- ocaml-wire实现了EverParse的二进制格式模型,其验证器会在应用程序代码看到输入之前拒绝格式错误的输入。
- 一个简单的验证器在每次调用时都会分配一个新的槽数组,导致高分配量(1000万次调用分配0.3 GB)。
- 通常的修复方法是将暂存数组提升到顶层以便重用,从而消除分配。
- 在具有域(domains)的OCaml 5中,共享的暂存缓冲区在多个域同时验证时会导致数据竞争。
- ThreadSanitizer揭示了数据竞争,修复方法使用Domain.DLS(域本地存储)为每个域提供自己的暂存缓冲区。
- 域本地存储对于纤程(fibers)是安全的,因为纤程只在效果点交错执行,而解码不执行任何效果。
- 该漏洞存在于ocaml-wire的两个地方:解码暂存和参数化编解码器的max_len边界,两者均在1.1.0版本中修复。