给各位分享一篇关于GitHub上的rust风格的开发人员如何可以使开发更加安全的博客,我已经帮大家翻译了
设您正在使用 C++ 构建电子邮件客户端。您的新应用程序将在每天由多个不同人员使用的工作站上运行。但是在某个地方,你犯了一个错误。通过向自己发送特制的电子邮件,他们可以溢出应用程序的内存缓冲区,并发送应用程序命令以从其他用户的收件箱中检索电子邮件。
此缓冲区溢出错误是内存安全问题的典型示例,也是软件中最常见的安全问题类型之一。根据微软安全响应中心的Matt Miller的演讲,在2004年至2018年期间,Microsoft产品中修复的所有安全问题中约有70%是内存安全问题,该中心对公司报告的所有安全问题进行了分类。
内存安全是一个大问题。操作系统需要确保各个应用程序不会相互泄漏数据。Web 浏览器需要确保在一个选项卡中打开的 Web 应用无法从另一个选项卡抓取数据。云计算平台需要确保一个用户无法从另一个用户那里读取数据。
“内存安全不仅仅是一个技术问题,也是一个社会问题,”互联网安全研究小组执行董事Joshua Aas说。“内存安全问题不仅会产生有缺陷的软件。它们可能会破坏人们赖以谋生或找工作的服务。安全漏洞会剥夺我们的隐私。软件可以而且应该以更好的方式构建。
“内存安全不仅仅是一个技术问题,也是一个社会问题。
2020 年 10 月,互联网安全研究小组启动了一项名为 Prossimo 的计划,致力于促进互联网上的内存安全。到目前为止,他们的主要举措是使用 Rust 编程语言,该语言于 2010 年由 Mozilla 开源,可以更轻松地编写内存安全代码。
C、C++ 和其他需要开发人员编写代码来管理其软件内存的编程语言被认为是“内存不安全”,因为即使是很小的错误也会造成内存安全问题。“无论你的开发人员多么有才华,他们都会犯错误,”Aas说。“世界上最伟大、最有能力的系统编程团队经常会制造内存安全问题。只要看看几乎任何重大项目的安全补丁说明,你就会看到一个又一个的例子。
正如云边缘计算公司 Fastly 的工程副总裁 Laura Thomson 所说:“编写 C 就像在没有帮助的情况下进行脑部手术。
长期以来,用“内存安全”语言编写自动管理内存的软件已被证明可以减少整个安全漏洞。尽管如此,C和C++代码仍然无处不在。操作系统、网络软件、Web 浏览器和硬件驱动程序传统上都是用 C 或其面向对象的后继者 C++ 编写的。无论您使用的是 Android、iOS、Windows、Linux 还是 Mac,尽管在许多应用程序中使用了 C#、Java 和 Swift 等内存安全语言,但后台还是有很多 C/C++。
这是有充分理由的。C 和 C++ 速度很快。他们很可靠。程序员已经知道如何使用它们,其中编写了数千个开源库,并且他们几乎为每个可以想象的芯片组提供了编译器。
Prossimo 专注于整体内存安全,而不仅仅是 Rust。但 Rust 可能比任何其他语言都更有可能破坏系统编程的现状。
“Rust 是过去 20 年左右引入的一组新语言中的第一个,它们可以真正用于我们以前一直停留在 C 或汇编代码中构建的东西,”Fastly 首席技术官 Tyler McMullen 说。“它具有记忆性能,并且具有引人注目的类型系统,可让您用低级语言表达更高层次的概念。此外,它与其他语言的互操作性很好,可以在从嵌入式系统到服务器的许多平台上运行。
Rust 具有牵引力。在 Stack Overflow 的 2021 年开发者调查中,Rust 被评为“最受欢迎”的编程语言——这是该语言连续第六年位居榜首。与此同时,从科学计算到开源项目,例如由Node.js创建者Ryan Dahl构建的新服务器端JavaScript平台Deno,它变得越来越受欢迎。
今年,Mozilla 将 Rust 的管理权移交给了 Rust 基金会,该基金会是由亚马逊网络服务、Facebook、谷歌、华为、Microsoft 和 Mozilla 共同创立的联盟。这表明业界最大的参与者对 Rust 的未来是认真的。
例如,Facebook 现在有数百名开发人员使用 Rust,其中包括一些核心 Rust 编程语言的贡献者。Facebook 并没有放弃其他语言,但 Rust 被用于整个公司的项目,包括 Diem 区块链、Move 编程语言以及他们的 Buck 工具的下一个版本。“我们参与基金会的主要目标之一是与其他优秀的基金会成员和 Rust 社区密切合作,帮助 Rust 维护者更有效地完成他们的伟大工作,使 Rust 成为系统编程及其他领域的主流语言选择,”Facebook 开源开发者倡导者兼 Rust 基金会成员总监 Joel Marcey 说。
许多公司现在都在使用 Rust 来帮助保护他们的云计算平台,包括 Amazon Web Services、Cloudflare、Fastly 和 Microsoft Azure。
“几年前我还没有被卖掉,”麦克马伦说。但是 Fastly 的 WebAssembly 团队要求使用 Rust 构建一些项目,McMullen 对该语言的性能和安全性印象深刻。现在 Rust 是公司堆栈的核心部分。“基本上,我们在后端所做的所有新工作都是用 Rust 编写的,”Thomson 说。“我们的客户用来运行代码的计算服务都是基于 Rust 构建的。”
“基本上,我们在后端所做的所有新工作都是用 Rust 编写的。”
McMullen 说,他们的目标是确保整个数据平面管道内存的安全。“在这种环境中,我们不能信任任何人,”他说。“我们不能信任传入的流量,我们不能信任服务器上运行的代码。用 Rust 这样的语言编写可以更容易地不必信任。
AWS 在多种服务的网络堆栈中使用 Rust,包括 EC2、S3 和 CloudFront,Amazon Web Services 的 Rust 平台团队负责人 Shane Miller 说。该云平台在 Rust 中构建了大部分开源、面向容器的虚拟化系统 Firecracker,以及基于 Linux 的容器操作系统 Bottlerocket。“Rust 很快成为 AWS 大规模交付基础设施的关键,”Miller 说,他也是 Rust 基金会的主席。
使用内存安全语言进行绿地开发是一个好的开始。但是,要使 Web 更加内存安全,还需要重构旧软件。最雄心勃勃的 Rust 编程语言工作之一是推动在 Linux 中增加对 Rust 的支持,这项工作尚未得到 Linus Torvalds 的认可,他告诉 ZDnet,当谈到 Rust 时,他处于“观望阵营”。
与此同时,Linux 版 Rust 团队正在努力使 Rust 和内核很好地结合在一起。例如,Rust 标准库假设内存分配永远不会返回错误,这一概念称为“无误分配”。当内存分配失败时,进程将终止。问题在于,这可能会导致内核崩溃——换句话说,操作系统会完全停止,以响应它认为的致命错误。如果并行运行多个工作负载,这是个坏消息。由 Google 赞助的 Linux 版 Rust 团队最近使用自定义 Rust 库解决了这个问题,但项目负责人 Miguel Ojeda 写道,他希望看到这个问题在 Rust 本身的上游得到解决。“我们已经开始了这个过程,一些变化已经被上游接受了,”他在内核邮件列表上写道。
如果 Rust for Linux 被合并,这将是 Linux 内核第一次正式支持 C 或汇编语言以外的语言,内核开发人员 Greg Kroah-Hartman 说。
Linux 并不是唯一使用 Rust 的操作系统。2019 年,Microsoft Hyper-V 工程团队的 Adam Burch 在一篇博客文章中宣布,他正在用 Rust 重写 Windows 代码库的一个低级系统组件,尽管他不能说出是什么组件。“虽然这个项目还没有完成,但我可以说我对 Rust 的体验总体上是积极的。对于那些希望避免经常导致 C++ 代码库中安全漏洞的常见错误的人来说,这是一个不错的选择。
所以的东西都会生锈
如果您准备好自己使用 Rust,Rust 社区提供了各种各样的资源来学习该语言。但要注意。尽管 Rust 的粉丝们喜欢这门语言,但它确实有一个问题:许多程序员抱怨说,与其他现代语言相比,Rust 的学习曲线很陡峭。“工程师们将学习 Rust 比作学习吃蔬菜,”Miller 说。“一旦他们理解了它,他们就会喜欢它,但它可能会令人生畏。所以我关注的一件事是把西兰花变成布朗尼。让学习体验变得很棒。
为了解决这个问题,亚马逊云科技正在聘请计算机科学教育专家来咨询语言的设计。一些改进很简单,例如在文档中提供其他代码示例。该公司希望为 Rust 贡献的其他想法则更为复杂。例如,重新思考 Rust 的编译器。
但即使对于 Rust 的忠实粉丝来说,仍然很难想象世界上所有的内存不安全代码都在 Rust 中被重写。旧代码需要很长时间才能停用,尤其是在它已经运行良好的情况下。Thompson Reuters 估计,目前仍有大约 2200 亿行 COBOL 正在生产中,COBOL 是一种可以追溯到 1950 年代的更古老的语言,为大约 43% 的银行系统和 95% 的 ATM 刷卡提供支持。Fortran 同样在世界各地的商业应用程序中仍然很常见。
也就是说,并非所有旧的 C/C++ 代码都需要重写。“我们并不是要解决成千上万的项目,”Aas说。“我们专注于几乎每个人都使用的关键组件。像 Web 服务器、内核、TLS、DNS、NTP 这样的东西——互联网的核心结构。
我们专注于几乎每个人都使用的关键组件。
“在某些情况下,您可以逐个组件替换软件组件,”Aas 解释道。“你可以用内存安全的库替换内存不安全的库,随着时间的推移,使整个应用程序更加内存安全。
Prossimo 与 Curl 的合作就是一个很好的例子。Curl 主要用 C 语言编写,但 Prossimo 赞助了在 Curl 中添加对基于 Rust 的 TLS 和 HTTP 网络库的支持。这使得将 Rust 用于应用程序中触及网络边缘的部分成为可能,而无需完全重写 Curl。Curl 并不默认使用基于 Rust 的库,但任何喜欢它们的人都可以打开它们。“我们希望,随着内存安全模块的测试和改进,它们最终将成为所有主要Linux发行版的默认模块,”Aas说。
同时,有一些方法可以对不安全代码进行沙盒化,以最大限度地降低与之相关的风险。例如,Fastly通过基于Rust的WebAssembly运行时运行许多基于C / C++的软件。“这是将所有软件放入 Rust 的巧妙小方法,”McMullen 说。
当然,包括安全漏洞在内的错误是不可避免的。但是,通过选择一种可以防止内存安全问题的编程语言,完全有可能消除这些问题。Rust 提供了一种越来越流行的语言,它不仅性能高、功能强大且开源,而且还使互联网对每个人来说都更安全。