最初发表于tamiz.pro. "沉默危机:未定义的行为跨越语言边界"(The Silent Crisis: Understanding Behavior Cross Language Bundaries) 近期高调的安全事件暴露出软件工程界日益严重的关注:未定义的行为(UB)不再仅仅是C/C++问题.
从 Rust 编译错误到 JavaScript 引擎漏洞,开发者正在目睹当代码跨越语言边界或与低等系统交互时,微妙的语言设计选择会如何导致灾难性的失败.
这些事件并非孤立的——它们代表着一个系统性问题,影响着建立在多种语言生态系统上的现代软件堆.
案例研究:"鲁斯特记忆安全神话"(Rust Memory Security Myth Rust)是用不收集垃圾的记忆安全承诺来建造的.
然而,最近的CVES揭示了不安全的Rust块中未定义的行为会损害整个系统: 2024年OpenSSL Rust Port事件 A的关键弱点被发现于OpenSSL的Rust Port,其中代码块进行不受控制的指针算术.
虽然安全的Rust地层强制了边界检查,但不安全的边界在没有验证的情况下将生指向C地层.
这并没有被Rust的编译器所捕获,因为它明确允许操作.
UB只在对基础 C 库进行跨语言调用时表现出来.
另一起事件涉及一个 Rust-to-Wasm 编译错误, 当这些假设在瓦斯姆边界被打破时,攻击者可能会引发堆积而出.
JavaScript的"隐藏的未定义行为"虽然JavaScript经常被批评为打字松散,但其近期的安全事件揭示出更深层的问题: 节点.js缓冲腐败事件 在Node.js的零天脆弱性允许在JavaScript代码与由Rust编译的本地加通交互时进行缓冲超读.
这个问题出自JavaScript的垃圾收集器和Rust的所有权模型之间不匹配的寿命假设.
V8引擎优化UB 近期研究表明,V8的JIT优化可以在处理侧道敏感码时以违反JavaScript语义的方式重新排列操作.
这使得在浏览器背景下运行的密码库能够进行定时攻击。
跨语言编译错误:日益增长的威胁矢量 Rust和JavaScript生态系统的交汇产生了新的攻击表面: 语言对等常见的bug模式 Severity Rust → Web Assembly Life time missions Critical JavaScript → Rust FFI (通过WASM) 在数据从JavaScript到Rust(通常通过WebAssembly的JSON序列化)时, 类型强制错误可以引入未定义的行为。
最近的事件表明,JavaScript中输入的畸形会导致Rust的去串行化来绕过安全检查.
从最近的安全事件中得到的教训
1.
不安全代码仍然是危险的.
Rust社区强调"无所畏惧的货币",有时导致对街区的过度自信.
安全审计必须采用与C/C++相同的严格码处理.
2.
语言Interop要求正式核查 跨语调要求正式核查边界条件.
这些事件表明,单靠运行时间检查无法满足UB的所有情况。
3.
编译器优化可打破语义学,既能打破Rust,又能打破JavaScript引擎的急剧优化。
最近的事件表明,优化通行证可以引入潜在的UB,这种UB只能在特定运行时间条件下显示。 4.垃圾收集错配JavaScript的GC和Rust的所有权模式对记忆寿命做出了根本不同的假设.
这些语言之间的FFI层需要明确的同步协议.
开发者现在应该做什么 审计您的不安全代码 狦