分享到: 分享到QQ  分享到Twitter

作者: BigLoser    访问次数: 302 创建时间: 2022-12-15 12:31:16 更新时间: 2024-04-18 10:03:07

无论你是为一家大型组织运营 IT 部门,还是仅仅拥有一部智能手机,你都会对由于缺陷和安全漏洞而造成的源源不断的软件更新感到非常熟悉。人们总会犯错,所以代码不可避免地会包含你所犯的错误。但是,越来越多的人开始使用一种叫做 Rust 的语言来编写软件,因为这种代码在一个重要方面是绝对安全的(goof-proof)。根据设计,开发人员在使用 Rust 编写代码时,不会意外地创建一些最常见的可利用安全漏洞类型,这一区别可能会对日常补丁队列产生巨大影响,并最终会影响全球的基线网络安全。

 

编程语言中有流行趋势,新的语言来来去去,往往没有持久的影响。现年已经 12 岁的 Rust 花了很长一段时间从 Mozilla 研究院的辅助项目成长为一个强大的生态系统。与此同时,至今仍被广泛使用的其前身语言 C,今年已经 50 岁了。但因为 Rust 能生成更安全的代码,而且至关重要的是,它不会因此而降低性能,所以该语言一直在稳步地获得拥护者,现在其正处于一个转折点。自 2019 年以来,微软、谷歌和亚马逊网络服务公司都在使用 Rust,这三家公司于 2020 年与 Mozilla 和华为共同成立了非营利组织Rust基金会,以维持和发展该语言。经过几年的紧张工作,Linux 内核在上个月迈出了实现Rust支持的第一步

 

“作为一种语言,它正在迅速地传播,”安卓安全与隐私工程副总裁 Dave Kleidermacher 表示。“我们一直在安卓和整个谷歌上投资 Rust,很多工程师都在想,‘我该怎么开始做这个呢?这太棒了。’Rust 刚刚作为一种被官方认可和接受的语言首次登陆 Linux。所以这不仅仅是安卓;任何基于 Linux 的系统现在都可以开始整合 Rust 组件了。”

 

Rust 被称为是一种“内存安全”的语言,因为它的设计目的是使程序不能意外地从计算机内存中提取非预期数据。当程序员使用不具备这一特性的可靠语言(包括 C 和 C++)时,他们必须仔细检查程序将要请求的数据的参数以及如何执行请求任务,即使是最熟练、最有经验的开发人员也会偶尔出错。通过使用 Rust 编写的新软件,即使是业余的程序员也可以确信他们没有在代码中引入任何的内存安全漏洞。

 

程序的内存是其所有特性和库所使用的共享资源。想象一个用非内存安全语言编写的日历程序。你打开日历,然后输入一个请求 2022 年 11 月 2 日的日期,程序就会从你计算机分配用于存储该日期数据的内存区域中获取所有信息。一切都顺利。但是,如果该程序设计的约束条件不对,并且你请求 2022 年 11 月 42 日的日期,该软件可能不会产生错误或其他故障,而是会尽职尽责地从存储不同数据的内存中返回信息,可能是你用来保护日历的密码,或者是你为高级日历功能而保存的信用卡号。如果你在 11 月 42 日把生日派对添加到了日历中,它可能会覆盖内存中不相关的数据,而不是告诉你它无法完成任务。这些被称为“越界”读写缺陷,你可以看到它们是如何潜在被利用,从而使攻击者能够不适当地访问数据,甚至扩展了系统控制。

 

另一种常见的内存安全漏洞,被称为“释放后使用”(Use-After-Free,UAF 漏洞),它涉及到的情况是,程序放弃了对部分内存的使用权(可能你删除了 2022 年 10 月的所有日历条目),但错误地保留了访问权限。如果你稍后请求从 10 月 17 日开始的数据,该程序可能能获取到那里的任何数据。此外,代码中内存安全漏洞的存在也带来了这样一种可能性:黑客可能精心设计一个恶意的日历邀请,其中包含精心选择的日期或一组事件的详细信息,目的是操纵内存以允许攻击者远程访问。

 

这些类型的漏洞不仅仅是深奥的软件缺陷。研究和审计一再发现,它们构成了所有软件漏洞的大部分。因此,尽管在使用 Rust 编程时仍然会出错并产生安全漏洞,但它能消除内存安全漏洞这一点是至关重要的。

 

软件供应链安全公司 Chainguard 的首席执行官 Dan Lorenc 表示:“在所有报告的发生在操作系统、手机和基础设施等关键应用程序中的漏洞中,内存安全问题占了很大很大的比例”。“在过去的几十年里,人们一直在用非内存安全的语言编写代码,我们一直试图改进和构建更好的工具,并教人们如何避免犯这些错误,但告诉人们更努力的做法实际上是有限度的。因此,你需要一种新技术来消除所有这类漏洞,这就是 Rust 最终的优势所在。”

 

Rust 并非没有怀疑者和批评者。过去两年,在 Linux 中实现 Rust 的努力一直备受争议,部分原因在于添加对任何其他语言的支持天生就增加了复杂性,另外部分原因在于如何具体地使其工作的争论。但支持者强调,Rust 具备必要的因素,它不会造成性能损失,而且它可以与其他语言编写的软件进行良好的互操作,这很关键,因为它满足了最迫切的需求。

 

“与其说这是正确的选择,不如说它已经准备好了,”长期开源贡献者和研究员 Lorenc 说道。“现在除了什么都不做之外,没有其他真正的选择了,而且这已经不再是一种选择。继续使用非内存安全的代码,再过十年,对科技行业、国家安全乃至一切都将是一个巨大的问题。”

  

然而,向 Rust 过渡的最大挑战之一,恰恰是开发人员已经花了几十年的时间用非内存安全的语言编写了重要的代码。用 Rust 编写新软件并不能解决大量的积压问题。例如,Linux 内核实现是从外围开始的,它支持基于 Rust 的驱动程序,即在操作系统和诸如打印机等硬件之间进行协调的程序。

 

“当你在做操作系统时,速度和性能始终是首要考虑因素,而你在 C++或 C 中运行的部分通常是由于性能原因而无法在 Java 或其他内存安全语言中运行的部分。”谷歌的 Kleidermacher 说。“因此,能够运行 Rust,并具有相同的性能,但又能获得内存安全真的很酷。但这是一段旅程。你不可能在一夜之间重写 5000 万行代码,所以我们会仔细挑选安全关键组件,随着时间的推移,我们将会再改进其他组件。”

 

Kleidermacher 表示,在安卓中,许多加密密钥管理功能现在都是用 Rust 编写的,私有互联网通信功能 DNS over HTTPS、新版本的超宽带芯片堆栈、以及谷歌定制的 Tensor G2 芯片中所使用的新版安卓虚拟化框架也是用 Rust 编写的。他补充说,安卓团队正在越来越多地将蓝牙和 Wi-Fi 等连接堆栈转换为 Rust,因为它们是基于复杂的行业标准的,往往会包含很多漏洞。简而言之,策略是首先将最暴露的或最重要的软件组件转换为 Rust,然后再从那里向内推进工作,从而开始获得增量的安全效益。

 

“是的,这是一项艰巨的工作,工作量很大,但科技行业有多少万亿美元,还有有多少才华横溢的程序员?我们有资源,”负责内存安全倡议 Prossimo 以及免费证书授权Let‘s Encrypt的互联网安全研究小组执行主任 Josh Aas 说。“仅仅需要大量工作的问题都是很伟大的。”

 

随着 Rust 向主流应用的过渡,针对内存安全问题的某种解决方案的案例似乎每天都在不断反复出现。就在本周,如果其机制是用内存安全的语言编写的话,那么无处不在的安全通信库 OpenSSL 中的一个高危漏洞就可以被阻止。与 2014 年那个臭名昭著的OpenSSL漏洞Heartbleed不同,该漏洞潜伏了两年,并使互联网上的网站遭受了数据拦截攻击,尽管已经在努力减少内存安全漏洞了,但这一新漏洞还是在过去几个月被引入到了 OpenSSL 中。

 

“现在有多少人因为内存安全漏洞而生活在身份被盗的噩梦中?或者在国家安全层面上,如果我们担心美国遭受网络攻击,那么有多少威胁是内存安全漏洞造成的?”Aas 说。“从我的角度来看,现在整个游戏只是在说服人们投入努力。我们是否足够了解这种威胁,我们是否有意愿。”

 

原文链接:https://www.wired.com/story/rust-secure-programming-language-memory-safe/

季度最有价值文章

月度最有价值文章

投票统计

是否原创: 0 %

0 % Complete (success)

是否有价值: 0 %

0% Complete

是否有素质: 0 %

0% Complete (warning)

是否合法: 0 %

0% Complete

   群组工具

   外部链接