Zig有多安全?

2021-03-22 17:04:34

对于各种常见的安全问题,我们可以看出软件中存在的保护,因为它通常发货(即不包括不推荐用于生产使用的地址硬化器等工具):

只有在使用标记的联合时,' t防止在更改标签时保持指针到值

空间记忆安全。主要是运行时的缓解。在Zig和Rust中几乎相同。这些易于实施,并且可能充分地非争议,任何新系统语言都有类似的功能。

时间记忆安全和数据竞争安全。主要是编制时间缓解。独特的生锈。这些是新颖的,不琐碎的实施,并为语言增加大量复杂性。

因此,我们可以说,Zigs空间记忆安全性大致与锈硬相当,其时间记忆安全性和数据竞争安全性大致与C相当。

标准图书馆包括一组分配者,其中不用重复使用分配,防止无用,并捕获双重。我'虽然虽然是如何高的,但虽然是如何高的,但是在使用这些时,它将决定。

在C单调的变量中,通常可以使用单个表达式初始化时' t。在Zig IT&#39中可以使用标记的块返回初始值,或使用可选类型并将其初始化为NULL。

普遍的分配器API使得更容易使用竞技场分配或垃圾收集的池,这简化了寿命管理。

使用DEFER和ERRDEFER简化了复杂控制流程内的资源清理,从而减少了错误的可能性。

ZIG还拥有许多工具,以帮助检测在测试期间违反时间内存安全性的工具。这些是有用的,但C的经验表明他们赢得了' t足以消除漏洞。

我尝试从C和C ++编写的各种项目中查看一些公开的安全问题(主要来自Alex Gaynors Handy Summary),以获得相对频率的感觉:

Windows:一些类别Don' T整齐地映射到空间VS时间。如果我们假设和#39;堆栈腐败'始终是颞率的,但'堆腐败'无论哪种方式,我们都有23-36%的空间与2018年的时间。如果我们缩小到被剥削的问题,那么它' s 0%空间与75%的时间。

卷曲:45%空间与7%的时间(饼图击穿仅适用于与内存安全相关的安全问题的52%)

在野外:大多数情况下的细节不足,但如果我们看看那些明确标记为&#39的那些;免费使用'然后我们在2019年的2020年5月25日,2018年5月21日,2018年6月12日等所以可能> 50%的时间?

这是一个非常清晰的画面。项目之间的百分比变得越来越大。这些类别足够含糊,我可以将它们分类错误。看起来只关注固定问题就会告诉我们它们是多么容易利用,但看现有的利用将我们限制在一个非常小的数据集中。

它肯定似乎只是修复空间记忆安全(从C到Zig)是一种非琐碎的改进。但是,我喜欢更好地了解为什么实际的漏洞在这里依赖于违反时间记忆安全性的原因。

铁锈额外复杂和摩擦,以购买时间记忆安全和数据竞争安全。但有时我们可能能够更便宜地购买,例如:

可以通过以下方式接近时间记忆安全的系统:利用一些专业系统管理长寿状态(例如化石'使用SQLite,Edge'使用Memgc)

有时我们也可以选择承担成本。对于具有低风险简档的系统(例如从未暴露于敌对输入的内部软件),我们可能决定调试偶尔的使用是可以添加开发摩擦。

肯定有系统,虽然以上都不是选项。例如,Web Spec几乎授权浏览器必须具有复杂的所有权模型,在线之间使用普及共享并不断地暴露于敌对输入。在这种情况下,它很难对Zig作出争论。