SCW 아이콘
영웅 배경, 구분선 없음
블로그

Rust 第五次成为最受欢迎的编程语言。这是我们的新安全救星吗?

마티아스 마두, Ph.
게시일 : 2020년 6월 18일
마지막 업데이트: 2026년 3월 9일

在过去的几年中,似乎全世界的软件工程师对 Rust 的利用不足以进行编程。这种相对较新的系统编程语言,由 Mozilla,吸引了 Stack Overflow 社区的心——而且,作为一个极不可能遭受傻瓜之苦的群体,当他们投票时”最受欢迎的编程语言“连续五年,是我们所有人坐下来注意的时候了。

Rust 编程语言融合了常用语言中的已知和功能元素,采用了一种不同的理念,既考虑了复杂性,又引入了性能和安全性。这是一个学习曲线,许多开发者没有机会过多地玩它- 在Stack Overflow上接受调查的受访者中, 常用它。但是,除此之外,不可否认的是,它是一种令人兴奋的语言,并且比其前身(例如C和C++)具有更大的安全火力。大规模采用将需要一些行为和技术上的改变... 但是目前,它仍在理论层面上吸引着开发者的注意力。

... 但是等等,我们还需要阐明一件事:值得注意的是,Rust 是一种编程语言,它优先考虑内存安全,并消除与常见内存管理问题相关的安全漏洞。这些都很重要(无疑会导致不止一些 AppSec 团队的偏头痛),但它们并不是我们面临的唯一安全编码挑战。

Rust 到底能阻止什么?在安全格局中,我们还面临哪些风险?让我们来解开最新的编程独角兽:

现代内存安全系统编程的新前沿

Mozilla 的研发团队参与了一些不可思议的项目,作为开源开拓者投资 Rust 编程也不例外。他们的 入门视频 为他们的精神提供了一些见解,关键主题非常明确:当前的软件安全方法存在缺陷,而 Rust 旨在解决大部分问题。

这似乎太简单了,尤其是因为我们每隔一天就会面临巨大的数据泄露——就像最近报道的可怕失误一样 易捷航空。数百万条数据记录经常遭到泄露,几乎都是网络应用程序漏洞造成的, 安全配置错误,或者网络钓鱼攻击,像 C++ 这样的语言已经存在了数十年。但是,这还不足以让开发人员掌握它们,以至于实现安全编码最佳实践。为什么 Rust 应该有所不同?新语言之前已经问世,这并不是说他们找到了消除常见漏洞的方法,也没有确保编写的任何代码在编译时神奇地完美无缺。

尽管概念可能很简单,但有时是简单的答案可以克服复杂的问题。从任何意义上讲,Rust 是内存安全系统编程的一场革命,它在许多方面兑现了承诺... 而且它无疑为那些容易引入错误的开发人员省钱,如果不被发现,这些错误可能会导致重大问题。对于没有安全意识的开发人员来说,Java、C、C++,甚至像科特林和Golang这样的新语言仍然相当无情。有了这些,就没有内在的警告,也没有特别的迹象表明刚刚编译的这个很棒的功能隐藏着安全隐患。

那么,让我们更深入地挖掘一下:

是什么让 Rust 如此安全?

通常,开发人员的主要目标是构建功能,确保功能强大且易于使用——甚至可能是他们乐于在简历中炫耀的自豪之源。开发人员创建一些很棒的软件,将其交付并继续进行下一个大项目,这是完全正常的。此时,安全团队会检查漏洞,如果发现漏洞,他们 “完成的” 应用程序可能会返回给他们的团队进行修复。问题可能很简单,也可能完全超出了开发人员修复的合理范围。

问题在于,从表面上看,安全漏洞根本不明显,如果扫描、测试和手动代码审查未能发现这些漏洞,那么攻击者就有可能利用这小的机会来利用这个漏洞。

现在,Rust 试图从一开始就阻止许多漏洞进入代码:如果存在语法错误或其他导致生产问题的内存安全错误,它根本无法编译。从设计上讲,这是内存安全的编程,可确保无法访问无效内存(无论软件如何执行)。并且 70% 的安全漏洞是由内存管理相关问题造成的,这是一项了不起的壮举。

Rust 会标记并防止:

  • 缓冲区溢出
  • 免费后使用
  • 双重免费
  • 空指针取消引用
  • 使用未初始化的内存

如果我们将 Rust 代码片段与 C++ 进行比较,就会发现一个代码片段在默认情况下是安全的。看看这个缓冲区溢出错误的示例:

#include<iostream></iostream>
#include<string.h></string.h>
int main(无效){
char a [3] = “12”;
char b [4] = “123”;
strcpy (a, b);//由于 b 的 len 大于 a 时出现缓冲区溢出
std:: cout << a << “;” << b << std:: endl;
}

대.

pub fn main () {
让 mut a: [char; 2] = [1, 2];
让 b: [char; 3] = [1, 2, 3];
a.copy_from_slice (&b);
}
러스트 코드 스니펫 비교

Rust 会发出安全警告,并在运行时到达 copy_from_slice 函数时出现恐慌以防止缓冲区溢出,但在编译时却没有。

从这个意义上讲,它在很大程度上是 “从左开始” 的语言之一。它将突出显示错误,并强制教会开发人员编写代码的正确方法,以避免引入与内存相关的安全漏洞,因此能否按时完成取决于编码人员的关注、补救和忠于交付路径。

这种语言的方法看似简单,但如果能让它运用这种强大的逻辑,那将是一项了不起的壮举,而且它确实能走上正轨。从安全的角度来看,Rust 是一次巨大的飞跃... 只要有更多的人使用它。像 Dropbox 这样的公司正在率先在企业范围内大规模使用它,这真是令人高兴。但是,在我们得出结论,收养问题是阻碍我们走向更安全的未来的唯一结论之前,还有更多的考虑因素。

Rust 的清算。

有几个小(好吧,大)问题,即在 Rust 中编程比看起来更容易引入错误。它会 修复最重要的 OWASP 十大漏洞,这些漏洞继续导致漏洞、延迟和普遍的不安全编码技术文化。还有一种天使与魔鬼的动态,或者更广为人知的是: 安全生锈与不安全生锈

正如中所解释的那样 官方文档,Safe Rust 是 Rust 的 “真正” 形式,Unsafe Rust 包含被认为是 “绝对不安全” 的函数,尽管它们有时是必要的,例如需要与其他语言的某些东西集成。但是,即使使用了 Unsafe Rust,附加功能的清单仍然有限。在 Unsafe Rust 中,可以在不安全的区块中执行以下操作:

  • 取消引用原始指针
  • 调用不安全的函数(包括 C 函数、编译器内在函数和原始分配器)
  • 实现不安全特征
  • 突变静态数据
  • 访问工会的字段。

即使在所谓的 “不安全” 模式下,Rust 编程的超能力之一仍然起作用:“借款检查器”。它通常通过静态代码分析来防止内存问题、并行计算中的冲突和许多其他错误,并且这种分析仍会在不安全的块中进行检查——在某些情况下,编译器无需介入指导即可编写不安全的构造只需要做更多的工作即可。

对于大多数有经验的开发人员来说,这似乎不是什么大问题——毕竟,众所周知,我们会修改应用程序并开放一些更酷的功能——但它可能会打开一个黑洞,可能导致严重的配置错误和安全漏洞:未定义的行为。与 C 或 C++ 相比,使用 Rust 编程(即使使用不安全)可以很好地锁定漏洞的可能性,但是调用未定义的行为可能会带来风险。

对开发人员主导的安全编码的依赖到此结束了吗?

还记得我之前说过 Rust 有众所周知语言的组件吗?Rust 的主要安全漏洞之一是,它包含众所周知语言的组件,即 C。

Rust 仍然是一种 “安全的编程语言”,但同样,引入用户是事情可以解开的地方。开发人员仍然可以对其进行调整以使其在不标记错误的情况下运行(这是一个有吸引力的主张,因为这样可以解锁更多功能),从本质上讲,即使处于安全状态,开发人员仍然可以随心所欲地处于 “不安全” 状态,因为在事情真正出错之前,他们有一层指导和保护。

随着我们深入研究,上述两种情况都变得更加危险,因为 Rust 的结果与扫描工具相似——就像没有瑞士陆军 SAST/DAST/RAST/IAST 工具可以扫描每个漏洞、每个攻击向量和每个问题一样,Rust 也没有。即使使用 Rust 仍然可以很容易地引入一些漏洞

运行 Unsafe Rust 时存在的未定义行为风险有可能引发整数溢出问题,而总的来说,即使是安全配置也无法防止安全配置错误中的人为错误, 商业逻辑,或者使用具有已知漏洞的组件。如果不进行修补,这些问题仍然构成非常现实的威胁,并且在像真正的 Rust 这样的 “假定安全” 的环境中,如果程序员认为无论如何都会解决所有重大问题,则甚至可能导致一些自鸣得意的行为。

我发现 Rust 与编程导师没什么不同,编程导师是一位高级工程师,他花时间与经验不足的编码人员坐在一起,审查他们的工作,向他们展示潜在的错误,指出效率,在某些情况下,还要确保直到正确才编译。但是,对于 Rust 程序员来说,自己学习理论并致力于最佳实践要好得多,因为那位导师可能只是削减了围裙的束缚,你不想袖手旁观。

准备好立即查找和修复常见的 Rust 漏洞了吗? 玩挑战赛。
리소스 보기
리소스 보기

Rust 融合了常用语言中的已知和功能元素,采用了一种不同的理念,既考虑了复杂性,又引入了性能和安全性。

더 많은 것에 관심이 있으신가요?

마티아스 마두는 보안 전문가, 연구원, CTO이자 Secure Code Warrior 의 공동 설립자입니다. 마티아스는 겐트 대학교에서 정적 분석 솔루션에 중점을 둔 애플리케이션 보안 박사 학위를 취득했습니다. 이후 미국의 Fortify에 입사하여 개발자의 보안 코드 작성을 지원하지 않고 코드 문제만 탐지하는 것만으로는 충분하지 않다는 것을 깨달았습니다. 이를 계기로 개발자를 지원하고 보안에 대한 부담을 덜어주며 고객의 기대를 뛰어넘는 제품을 개발하게 되었습니다. 팀 어썸의 일원으로 책상에 앉아 있지 않을 때는 RSA 컨퍼런스, 블랙햇, 데프콘 등의 컨퍼런스에서 무대에 올라 발표하는 것을 즐깁니다.

더 알아보세요

Secure Code Warrior는 조직이 소프트웨어 개발 생명주기 전반에 걸쳐 코드를 보호하고 사이버 보안을 최우선으로 하는 문화를 조성하도록 지원합니다. 앱 보안 관리자, 개발자, 최고정보보안책임자(CISO) 또는 보안 관련 업무를 수행하는 모든 분들에게, 저희는 조직이 안전하지 않은 코드와 관련된 위험을 줄일 수 있도록 돕습니다.

데모 예약
공유하기:
링크드인 브랜드사회적x 로고
저자
마티아스 마두, Ph.
게시일: 2020년 6월 18일

마티아스 마두는 보안 전문가, 연구원, CTO이자 Secure Code Warrior 의 공동 설립자입니다. 마티아스는 겐트 대학교에서 정적 분석 솔루션에 중점을 둔 애플리케이션 보안 박사 학위를 취득했습니다. 이후 미국의 Fortify에 입사하여 개발자의 보안 코드 작성을 지원하지 않고 코드 문제만 탐지하는 것만으로는 충분하지 않다는 것을 깨달았습니다. 이를 계기로 개발자를 지원하고 보안에 대한 부담을 덜어주며 고객의 기대를 뛰어넘는 제품을 개발하게 되었습니다. 팀 어썸의 일원으로 책상에 앉아 있지 않을 때는 RSA 컨퍼런스, 블랙햇, 데프콘 등의 컨퍼런스에서 무대에 올라 발표하는 것을 즐깁니다.

Matias는 15년 이상의 소프트웨어 보안 경험을 가진 연구원이자 개발자입니다. 그는 Fortify 소프트웨어와 같은 회사와 자신의 회사를 위한 솔루션을 개발했습니다. Sensei 안전. 그의 경력을 통해, Matias는 상용 제품으로 주도하고 자신의 벨트 아래 10 개 이상의 특허를 자랑하는 여러 응용 프로그램 보안 연구 프로젝트를 주도하고있다. 마티아스는 책상에서 떨어져 있을 때 고급 응용 프로그램 보안 교육을 위한 강사로 일했습니다. courses RSA 컨퍼런스, 블랙 햇, 데프콘, BSIMM, OWASP AppSec 및 브루콘을 포함한 글로벌 컨퍼런스에서 정기적으로 강연합니다.

마티아스는 겐트 대학교에서 컴퓨터 공학 박사 학위를 취득했으며, 프로그램 난독화를 통해 응용 프로그램 보안을 연구하여 응용 프로그램의 내부 작동을 숨깁니다.

공유하기:
링크드인 브랜드사회적x 로고

在过去的几年中,似乎全世界的软件工程师对 Rust 的利用不足以进行编程。这种相对较新的系统编程语言,由 Mozilla,吸引了 Stack Overflow 社区的心——而且,作为一个极不可能遭受傻瓜之苦的群体,当他们投票时”最受欢迎的编程语言“连续五年,是我们所有人坐下来注意的时候了。

Rust 编程语言融合了常用语言中的已知和功能元素,采用了一种不同的理念,既考虑了复杂性,又引入了性能和安全性。这是一个学习曲线,许多开发者没有机会过多地玩它- 在Stack Overflow上接受调查的受访者中, 常用它。但是,除此之外,不可否认的是,它是一种令人兴奋的语言,并且比其前身(例如C和C++)具有更大的安全火力。大规模采用将需要一些行为和技术上的改变... 但是目前,它仍在理论层面上吸引着开发者的注意力。

... 但是等等,我们还需要阐明一件事:值得注意的是,Rust 是一种编程语言,它优先考虑内存安全,并消除与常见内存管理问题相关的安全漏洞。这些都很重要(无疑会导致不止一些 AppSec 团队的偏头痛),但它们并不是我们面临的唯一安全编码挑战。

Rust 到底能阻止什么?在安全格局中,我们还面临哪些风险?让我们来解开最新的编程独角兽:

现代内存安全系统编程的新前沿

Mozilla 的研发团队参与了一些不可思议的项目,作为开源开拓者投资 Rust 编程也不例外。他们的 入门视频 为他们的精神提供了一些见解,关键主题非常明确:当前的软件安全方法存在缺陷,而 Rust 旨在解决大部分问题。

这似乎太简单了,尤其是因为我们每隔一天就会面临巨大的数据泄露——就像最近报道的可怕失误一样 易捷航空。数百万条数据记录经常遭到泄露,几乎都是网络应用程序漏洞造成的, 安全配置错误,或者网络钓鱼攻击,像 C++ 这样的语言已经存在了数十年。但是,这还不足以让开发人员掌握它们,以至于实现安全编码最佳实践。为什么 Rust 应该有所不同?新语言之前已经问世,这并不是说他们找到了消除常见漏洞的方法,也没有确保编写的任何代码在编译时神奇地完美无缺。

尽管概念可能很简单,但有时是简单的答案可以克服复杂的问题。从任何意义上讲,Rust 是内存安全系统编程的一场革命,它在许多方面兑现了承诺... 而且它无疑为那些容易引入错误的开发人员省钱,如果不被发现,这些错误可能会导致重大问题。对于没有安全意识的开发人员来说,Java、C、C++,甚至像科特林和Golang这样的新语言仍然相当无情。有了这些,就没有内在的警告,也没有特别的迹象表明刚刚编译的这个很棒的功能隐藏着安全隐患。

那么,让我们更深入地挖掘一下:

是什么让 Rust 如此安全?

通常,开发人员的主要目标是构建功能,确保功能强大且易于使用——甚至可能是他们乐于在简历中炫耀的自豪之源。开发人员创建一些很棒的软件,将其交付并继续进行下一个大项目,这是完全正常的。此时,安全团队会检查漏洞,如果发现漏洞,他们 “完成的” 应用程序可能会返回给他们的团队进行修复。问题可能很简单,也可能完全超出了开发人员修复的合理范围。

问题在于,从表面上看,安全漏洞根本不明显,如果扫描、测试和手动代码审查未能发现这些漏洞,那么攻击者就有可能利用这小的机会来利用这个漏洞。

现在,Rust 试图从一开始就阻止许多漏洞进入代码:如果存在语法错误或其他导致生产问题的内存安全错误,它根本无法编译。从设计上讲,这是内存安全的编程,可确保无法访问无效内存(无论软件如何执行)。并且 70% 的安全漏洞是由内存管理相关问题造成的,这是一项了不起的壮举。

Rust 会标记并防止:

  • 缓冲区溢出
  • 免费后使用
  • 双重免费
  • 空指针取消引用
  • 使用未初始化的内存

如果我们将 Rust 代码片段与 C++ 进行比较,就会发现一个代码片段在默认情况下是安全的。看看这个缓冲区溢出错误的示例:

#include<iostream></iostream>
#include<string.h></string.h>
int main(无效){
char a [3] = “12”;
char b [4] = “123”;
strcpy (a, b);//由于 b 的 len 大于 a 时出现缓冲区溢出
std:: cout << a << “;” << b << std:: endl;
}

대.

pub fn main () {
让 mut a: [char; 2] = [1, 2];
让 b: [char; 3] = [1, 2, 3];
a.copy_from_slice (&b);
}
러스트 코드 스니펫 비교

Rust 会发出安全警告,并在运行时到达 copy_from_slice 函数时出现恐慌以防止缓冲区溢出,但在编译时却没有。

从这个意义上讲,它在很大程度上是 “从左开始” 的语言之一。它将突出显示错误,并强制教会开发人员编写代码的正确方法,以避免引入与内存相关的安全漏洞,因此能否按时完成取决于编码人员的关注、补救和忠于交付路径。

这种语言的方法看似简单,但如果能让它运用这种强大的逻辑,那将是一项了不起的壮举,而且它确实能走上正轨。从安全的角度来看,Rust 是一次巨大的飞跃... 只要有更多的人使用它。像 Dropbox 这样的公司正在率先在企业范围内大规模使用它,这真是令人高兴。但是,在我们得出结论,收养问题是阻碍我们走向更安全的未来的唯一结论之前,还有更多的考虑因素。

Rust 的清算。

有几个小(好吧,大)问题,即在 Rust 中编程比看起来更容易引入错误。它会 修复最重要的 OWASP 十大漏洞,这些漏洞继续导致漏洞、延迟和普遍的不安全编码技术文化。还有一种天使与魔鬼的动态,或者更广为人知的是: 安全生锈与不安全生锈

正如中所解释的那样 官方文档,Safe Rust 是 Rust 的 “真正” 形式,Unsafe Rust 包含被认为是 “绝对不安全” 的函数,尽管它们有时是必要的,例如需要与其他语言的某些东西集成。但是,即使使用了 Unsafe Rust,附加功能的清单仍然有限。在 Unsafe Rust 中,可以在不安全的区块中执行以下操作:

  • 取消引用原始指针
  • 调用不安全的函数(包括 C 函数、编译器内在函数和原始分配器)
  • 实现不安全特征
  • 突变静态数据
  • 访问工会的字段。

即使在所谓的 “不安全” 模式下,Rust 编程的超能力之一仍然起作用:“借款检查器”。它通常通过静态代码分析来防止内存问题、并行计算中的冲突和许多其他错误,并且这种分析仍会在不安全的块中进行检查——在某些情况下,编译器无需介入指导即可编写不安全的构造只需要做更多的工作即可。

对于大多数有经验的开发人员来说,这似乎不是什么大问题——毕竟,众所周知,我们会修改应用程序并开放一些更酷的功能——但它可能会打开一个黑洞,可能导致严重的配置错误和安全漏洞:未定义的行为。与 C 或 C++ 相比,使用 Rust 编程(即使使用不安全)可以很好地锁定漏洞的可能性,但是调用未定义的行为可能会带来风险。

对开发人员主导的安全编码的依赖到此结束了吗?

还记得我之前说过 Rust 有众所周知语言的组件吗?Rust 的主要安全漏洞之一是,它包含众所周知语言的组件,即 C。

Rust 仍然是一种 “安全的编程语言”,但同样,引入用户是事情可以解开的地方。开发人员仍然可以对其进行调整以使其在不标记错误的情况下运行(这是一个有吸引力的主张,因为这样可以解锁更多功能),从本质上讲,即使处于安全状态,开发人员仍然可以随心所欲地处于 “不安全” 状态,因为在事情真正出错之前,他们有一层指导和保护。

随着我们深入研究,上述两种情况都变得更加危险,因为 Rust 的结果与扫描工具相似——就像没有瑞士陆军 SAST/DAST/RAST/IAST 工具可以扫描每个漏洞、每个攻击向量和每个问题一样,Rust 也没有。即使使用 Rust 仍然可以很容易地引入一些漏洞

运行 Unsafe Rust 时存在的未定义行为风险有可能引发整数溢出问题,而总的来说,即使是安全配置也无法防止安全配置错误中的人为错误, 商业逻辑,或者使用具有已知漏洞的组件。如果不进行修补,这些问题仍然构成非常现实的威胁,并且在像真正的 Rust 这样的 “假定安全” 的环境中,如果程序员认为无论如何都会解决所有重大问题,则甚至可能导致一些自鸣得意的行为。

我发现 Rust 与编程导师没什么不同,编程导师是一位高级工程师,他花时间与经验不足的编码人员坐在一起,审查他们的工作,向他们展示潜在的错误,指出效率,在某些情况下,还要确保直到正确才编译。但是,对于 Rust 程序员来说,自己学习理论并致力于最佳实践要好得多,因为那位导师可能只是削减了围裙的束缚,你不想袖手旁观。

准备好立即查找和修复常见的 Rust 漏洞了吗? 玩挑战赛。
리소스 보기
리소스 보기

아래 양식을 작성하여 보고서를 다운로드하세요

귀하의 허락을 받아 저희 제품 및/또는 관련 보안 코딩 주제에 관한 정보를 보내드리고자 합니다. 귀하의 개인정보는 항상 매우 신중하게 취급되며, 마케팅 목적으로 타사에 판매하지 않을 것을 약속드립니다.

제출
scw 성공 아이콘
scw 오류 아이콘
양식을 제출하려면 "분석" 쿠키를 활성화하십시오. 완료 후에는 원할 때 다시 비활성화할 수 있습니다.

在过去的几年中,似乎全世界的软件工程师对 Rust 的利用不足以进行编程。这种相对较新的系统编程语言,由 Mozilla,吸引了 Stack Overflow 社区的心——而且,作为一个极不可能遭受傻瓜之苦的群体,当他们投票时”最受欢迎的编程语言“连续五年,是我们所有人坐下来注意的时候了。

Rust 编程语言融合了常用语言中的已知和功能元素,采用了一种不同的理念,既考虑了复杂性,又引入了性能和安全性。这是一个学习曲线,许多开发者没有机会过多地玩它- 在Stack Overflow上接受调查的受访者中, 常用它。但是,除此之外,不可否认的是,它是一种令人兴奋的语言,并且比其前身(例如C和C++)具有更大的安全火力。大规模采用将需要一些行为和技术上的改变... 但是目前,它仍在理论层面上吸引着开发者的注意力。

... 但是等等,我们还需要阐明一件事:值得注意的是,Rust 是一种编程语言,它优先考虑内存安全,并消除与常见内存管理问题相关的安全漏洞。这些都很重要(无疑会导致不止一些 AppSec 团队的偏头痛),但它们并不是我们面临的唯一安全编码挑战。

Rust 到底能阻止什么?在安全格局中,我们还面临哪些风险?让我们来解开最新的编程独角兽:

现代内存安全系统编程的新前沿

Mozilla 的研发团队参与了一些不可思议的项目,作为开源开拓者投资 Rust 编程也不例外。他们的 入门视频 为他们的精神提供了一些见解,关键主题非常明确:当前的软件安全方法存在缺陷,而 Rust 旨在解决大部分问题。

这似乎太简单了,尤其是因为我们每隔一天就会面临巨大的数据泄露——就像最近报道的可怕失误一样 易捷航空。数百万条数据记录经常遭到泄露,几乎都是网络应用程序漏洞造成的, 安全配置错误,或者网络钓鱼攻击,像 C++ 这样的语言已经存在了数十年。但是,这还不足以让开发人员掌握它们,以至于实现安全编码最佳实践。为什么 Rust 应该有所不同?新语言之前已经问世,这并不是说他们找到了消除常见漏洞的方法,也没有确保编写的任何代码在编译时神奇地完美无缺。

尽管概念可能很简单,但有时是简单的答案可以克服复杂的问题。从任何意义上讲,Rust 是内存安全系统编程的一场革命,它在许多方面兑现了承诺... 而且它无疑为那些容易引入错误的开发人员省钱,如果不被发现,这些错误可能会导致重大问题。对于没有安全意识的开发人员来说,Java、C、C++,甚至像科特林和Golang这样的新语言仍然相当无情。有了这些,就没有内在的警告,也没有特别的迹象表明刚刚编译的这个很棒的功能隐藏着安全隐患。

那么,让我们更深入地挖掘一下:

是什么让 Rust 如此安全?

通常,开发人员的主要目标是构建功能,确保功能强大且易于使用——甚至可能是他们乐于在简历中炫耀的自豪之源。开发人员创建一些很棒的软件,将其交付并继续进行下一个大项目,这是完全正常的。此时,安全团队会检查漏洞,如果发现漏洞,他们 “完成的” 应用程序可能会返回给他们的团队进行修复。问题可能很简单,也可能完全超出了开发人员修复的合理范围。

问题在于,从表面上看,安全漏洞根本不明显,如果扫描、测试和手动代码审查未能发现这些漏洞,那么攻击者就有可能利用这小的机会来利用这个漏洞。

现在,Rust 试图从一开始就阻止许多漏洞进入代码:如果存在语法错误或其他导致生产问题的内存安全错误,它根本无法编译。从设计上讲,这是内存安全的编程,可确保无法访问无效内存(无论软件如何执行)。并且 70% 的安全漏洞是由内存管理相关问题造成的,这是一项了不起的壮举。

Rust 会标记并防止:

  • 缓冲区溢出
  • 免费后使用
  • 双重免费
  • 空指针取消引用
  • 使用未初始化的内存

如果我们将 Rust 代码片段与 C++ 进行比较,就会发现一个代码片段在默认情况下是安全的。看看这个缓冲区溢出错误的示例:

#include<iostream></iostream>
#include<string.h></string.h>
int main(无效){
char a [3] = “12”;
char b [4] = “123”;
strcpy (a, b);//由于 b 的 len 大于 a 时出现缓冲区溢出
std:: cout << a << “;” << b << std:: endl;
}

대.

pub fn main () {
让 mut a: [char; 2] = [1, 2];
让 b: [char; 3] = [1, 2, 3];
a.copy_from_slice (&b);
}
러스트 코드 스니펫 비교

Rust 会发出安全警告,并在运行时到达 copy_from_slice 函数时出现恐慌以防止缓冲区溢出,但在编译时却没有。

从这个意义上讲,它在很大程度上是 “从左开始” 的语言之一。它将突出显示错误,并强制教会开发人员编写代码的正确方法,以避免引入与内存相关的安全漏洞,因此能否按时完成取决于编码人员的关注、补救和忠于交付路径。

这种语言的方法看似简单,但如果能让它运用这种强大的逻辑,那将是一项了不起的壮举,而且它确实能走上正轨。从安全的角度来看,Rust 是一次巨大的飞跃... 只要有更多的人使用它。像 Dropbox 这样的公司正在率先在企业范围内大规模使用它,这真是令人高兴。但是,在我们得出结论,收养问题是阻碍我们走向更安全的未来的唯一结论之前,还有更多的考虑因素。

Rust 的清算。

有几个小(好吧,大)问题,即在 Rust 中编程比看起来更容易引入错误。它会 修复最重要的 OWASP 十大漏洞,这些漏洞继续导致漏洞、延迟和普遍的不安全编码技术文化。还有一种天使与魔鬼的动态,或者更广为人知的是: 安全生锈与不安全生锈

正如中所解释的那样 官方文档,Safe Rust 是 Rust 的 “真正” 形式,Unsafe Rust 包含被认为是 “绝对不安全” 的函数,尽管它们有时是必要的,例如需要与其他语言的某些东西集成。但是,即使使用了 Unsafe Rust,附加功能的清单仍然有限。在 Unsafe Rust 中,可以在不安全的区块中执行以下操作:

  • 取消引用原始指针
  • 调用不安全的函数(包括 C 函数、编译器内在函数和原始分配器)
  • 实现不安全特征
  • 突变静态数据
  • 访问工会的字段。

即使在所谓的 “不安全” 模式下,Rust 编程的超能力之一仍然起作用:“借款检查器”。它通常通过静态代码分析来防止内存问题、并行计算中的冲突和许多其他错误,并且这种分析仍会在不安全的块中进行检查——在某些情况下,编译器无需介入指导即可编写不安全的构造只需要做更多的工作即可。

对于大多数有经验的开发人员来说,这似乎不是什么大问题——毕竟,众所周知,我们会修改应用程序并开放一些更酷的功能——但它可能会打开一个黑洞,可能导致严重的配置错误和安全漏洞:未定义的行为。与 C 或 C++ 相比,使用 Rust 编程(即使使用不安全)可以很好地锁定漏洞的可能性,但是调用未定义的行为可能会带来风险。

对开发人员主导的安全编码的依赖到此结束了吗?

还记得我之前说过 Rust 有众所周知语言的组件吗?Rust 的主要安全漏洞之一是,它包含众所周知语言的组件,即 C。

Rust 仍然是一种 “安全的编程语言”,但同样,引入用户是事情可以解开的地方。开发人员仍然可以对其进行调整以使其在不标记错误的情况下运行(这是一个有吸引力的主张,因为这样可以解锁更多功能),从本质上讲,即使处于安全状态,开发人员仍然可以随心所欲地处于 “不安全” 状态,因为在事情真正出错之前,他们有一层指导和保护。

随着我们深入研究,上述两种情况都变得更加危险,因为 Rust 的结果与扫描工具相似——就像没有瑞士陆军 SAST/DAST/RAST/IAST 工具可以扫描每个漏洞、每个攻击向量和每个问题一样,Rust 也没有。即使使用 Rust 仍然可以很容易地引入一些漏洞

运行 Unsafe Rust 时存在的未定义行为风险有可能引发整数溢出问题,而总的来说,即使是安全配置也无法防止安全配置错误中的人为错误, 商业逻辑,或者使用具有已知漏洞的组件。如果不进行修补,这些问题仍然构成非常现实的威胁,并且在像真正的 Rust 这样的 “假定安全” 的环境中,如果程序员认为无论如何都会解决所有重大问题,则甚至可能导致一些自鸣得意的行为。

我发现 Rust 与编程导师没什么不同,编程导师是一位高级工程师,他花时间与经验不足的编码人员坐在一起,审查他们的工作,向他们展示潜在的错误,指出效率,在某些情况下,还要确保直到正确才编译。但是,对于 Rust 程序员来说,自己学习理论并致力于最佳实践要好得多,因为那位导师可能只是削减了围裙的束缚,你不想袖手旁观。

准备好立即查找和修复常见的 Rust 漏洞了吗? 玩挑战赛。
웹 세미나 시청
시작하자
더 알아보세요

아래 링크를 클릭하고 이 자료의 PDF를 다운로드하세요.

Secure Code Warrior는 조직이 소프트웨어 개발 생명주기 전반에 걸쳐 코드를 보호하고 사이버 보안을 최우선으로 하는 문화를 조성하도록 지원합니다. 앱 보안 관리자, 개발자, 최고정보보안책임자(CISO) 또는 보안 관련 업무를 수행하는 모든 분들에게, 저희는 조직이 안전하지 않은 코드와 관련된 위험을 줄일 수 있도록 돕습니다.

보고서 보기데모 예약
리소스 보기
공유하기:
링크드인 브랜드사회적x 로고
더 많은 것에 관심이 있으신가요?

공유하기:
링크드인 브랜드사회적x 로고
저자
마티아스 마두, Ph.
게시일: 2020년 6월 18일

마티아스 마두는 보안 전문가, 연구원, CTO이자 Secure Code Warrior 의 공동 설립자입니다. 마티아스는 겐트 대학교에서 정적 분석 솔루션에 중점을 둔 애플리케이션 보안 박사 학위를 취득했습니다. 이후 미국의 Fortify에 입사하여 개발자의 보안 코드 작성을 지원하지 않고 코드 문제만 탐지하는 것만으로는 충분하지 않다는 것을 깨달았습니다. 이를 계기로 개발자를 지원하고 보안에 대한 부담을 덜어주며 고객의 기대를 뛰어넘는 제품을 개발하게 되었습니다. 팀 어썸의 일원으로 책상에 앉아 있지 않을 때는 RSA 컨퍼런스, 블랙햇, 데프콘 등의 컨퍼런스에서 무대에 올라 발표하는 것을 즐깁니다.

Matias는 15년 이상의 소프트웨어 보안 경험을 가진 연구원이자 개발자입니다. 그는 Fortify 소프트웨어와 같은 회사와 자신의 회사를 위한 솔루션을 개발했습니다. Sensei 안전. 그의 경력을 통해, Matias는 상용 제품으로 주도하고 자신의 벨트 아래 10 개 이상의 특허를 자랑하는 여러 응용 프로그램 보안 연구 프로젝트를 주도하고있다. 마티아스는 책상에서 떨어져 있을 때 고급 응용 프로그램 보안 교육을 위한 강사로 일했습니다. courses RSA 컨퍼런스, 블랙 햇, 데프콘, BSIMM, OWASP AppSec 및 브루콘을 포함한 글로벌 컨퍼런스에서 정기적으로 강연합니다.

마티아스는 겐트 대학교에서 컴퓨터 공학 박사 학위를 취득했으며, 프로그램 난독화를 통해 응용 프로그램 보안을 연구하여 응용 프로그램의 내부 작동을 숨깁니다.

공유하기:
링크드인 브랜드사회적x 로고

在过去的几年中,似乎全世界的软件工程师对 Rust 的利用不足以进行编程。这种相对较新的系统编程语言,由 Mozilla,吸引了 Stack Overflow 社区的心——而且,作为一个极不可能遭受傻瓜之苦的群体,当他们投票时”最受欢迎的编程语言“连续五年,是我们所有人坐下来注意的时候了。

Rust 编程语言融合了常用语言中的已知和功能元素,采用了一种不同的理念,既考虑了复杂性,又引入了性能和安全性。这是一个学习曲线,许多开发者没有机会过多地玩它- 在Stack Overflow上接受调查的受访者中, 常用它。但是,除此之外,不可否认的是,它是一种令人兴奋的语言,并且比其前身(例如C和C++)具有更大的安全火力。大规模采用将需要一些行为和技术上的改变... 但是目前,它仍在理论层面上吸引着开发者的注意力。

... 但是等等,我们还需要阐明一件事:值得注意的是,Rust 是一种编程语言,它优先考虑内存安全,并消除与常见内存管理问题相关的安全漏洞。这些都很重要(无疑会导致不止一些 AppSec 团队的偏头痛),但它们并不是我们面临的唯一安全编码挑战。

Rust 到底能阻止什么?在安全格局中,我们还面临哪些风险?让我们来解开最新的编程独角兽:

现代内存安全系统编程的新前沿

Mozilla 的研发团队参与了一些不可思议的项目,作为开源开拓者投资 Rust 编程也不例外。他们的 入门视频 为他们的精神提供了一些见解,关键主题非常明确:当前的软件安全方法存在缺陷,而 Rust 旨在解决大部分问题。

这似乎太简单了,尤其是因为我们每隔一天就会面临巨大的数据泄露——就像最近报道的可怕失误一样 易捷航空。数百万条数据记录经常遭到泄露,几乎都是网络应用程序漏洞造成的, 安全配置错误,或者网络钓鱼攻击,像 C++ 这样的语言已经存在了数十年。但是,这还不足以让开发人员掌握它们,以至于实现安全编码最佳实践。为什么 Rust 应该有所不同?新语言之前已经问世,这并不是说他们找到了消除常见漏洞的方法,也没有确保编写的任何代码在编译时神奇地完美无缺。

尽管概念可能很简单,但有时是简单的答案可以克服复杂的问题。从任何意义上讲,Rust 是内存安全系统编程的一场革命,它在许多方面兑现了承诺... 而且它无疑为那些容易引入错误的开发人员省钱,如果不被发现,这些错误可能会导致重大问题。对于没有安全意识的开发人员来说,Java、C、C++,甚至像科特林和Golang这样的新语言仍然相当无情。有了这些,就没有内在的警告,也没有特别的迹象表明刚刚编译的这个很棒的功能隐藏着安全隐患。

那么,让我们更深入地挖掘一下:

是什么让 Rust 如此安全?

通常,开发人员的主要目标是构建功能,确保功能强大且易于使用——甚至可能是他们乐于在简历中炫耀的自豪之源。开发人员创建一些很棒的软件,将其交付并继续进行下一个大项目,这是完全正常的。此时,安全团队会检查漏洞,如果发现漏洞,他们 “完成的” 应用程序可能会返回给他们的团队进行修复。问题可能很简单,也可能完全超出了开发人员修复的合理范围。

问题在于,从表面上看,安全漏洞根本不明显,如果扫描、测试和手动代码审查未能发现这些漏洞,那么攻击者就有可能利用这小的机会来利用这个漏洞。

现在,Rust 试图从一开始就阻止许多漏洞进入代码:如果存在语法错误或其他导致生产问题的内存安全错误,它根本无法编译。从设计上讲,这是内存安全的编程,可确保无法访问无效内存(无论软件如何执行)。并且 70% 的安全漏洞是由内存管理相关问题造成的,这是一项了不起的壮举。

Rust 会标记并防止:

  • 缓冲区溢出
  • 免费后使用
  • 双重免费
  • 空指针取消引用
  • 使用未初始化的内存

如果我们将 Rust 代码片段与 C++ 进行比较,就会发现一个代码片段在默认情况下是安全的。看看这个缓冲区溢出错误的示例:

#include<iostream></iostream>
#include<string.h></string.h>
int main(无效){
char a [3] = “12”;
char b [4] = “123”;
strcpy (a, b);//由于 b 的 len 大于 a 时出现缓冲区溢出
std:: cout << a << “;” << b << std:: endl;
}

대.

pub fn main () {
让 mut a: [char; 2] = [1, 2];
让 b: [char; 3] = [1, 2, 3];
a.copy_from_slice (&b);
}
러스트 코드 스니펫 비교

Rust 会发出安全警告,并在运行时到达 copy_from_slice 函数时出现恐慌以防止缓冲区溢出,但在编译时却没有。

从这个意义上讲,它在很大程度上是 “从左开始” 的语言之一。它将突出显示错误,并强制教会开发人员编写代码的正确方法,以避免引入与内存相关的安全漏洞,因此能否按时完成取决于编码人员的关注、补救和忠于交付路径。

这种语言的方法看似简单,但如果能让它运用这种强大的逻辑,那将是一项了不起的壮举,而且它确实能走上正轨。从安全的角度来看,Rust 是一次巨大的飞跃... 只要有更多的人使用它。像 Dropbox 这样的公司正在率先在企业范围内大规模使用它,这真是令人高兴。但是,在我们得出结论,收养问题是阻碍我们走向更安全的未来的唯一结论之前,还有更多的考虑因素。

Rust 的清算。

有几个小(好吧,大)问题,即在 Rust 中编程比看起来更容易引入错误。它会 修复最重要的 OWASP 十大漏洞,这些漏洞继续导致漏洞、延迟和普遍的不安全编码技术文化。还有一种天使与魔鬼的动态,或者更广为人知的是: 安全生锈与不安全生锈

正如中所解释的那样 官方文档,Safe Rust 是 Rust 的 “真正” 形式,Unsafe Rust 包含被认为是 “绝对不安全” 的函数,尽管它们有时是必要的,例如需要与其他语言的某些东西集成。但是,即使使用了 Unsafe Rust,附加功能的清单仍然有限。在 Unsafe Rust 中,可以在不安全的区块中执行以下操作:

  • 取消引用原始指针
  • 调用不安全的函数(包括 C 函数、编译器内在函数和原始分配器)
  • 实现不安全特征
  • 突变静态数据
  • 访问工会的字段。

即使在所谓的 “不安全” 模式下,Rust 编程的超能力之一仍然起作用:“借款检查器”。它通常通过静态代码分析来防止内存问题、并行计算中的冲突和许多其他错误,并且这种分析仍会在不安全的块中进行检查——在某些情况下,编译器无需介入指导即可编写不安全的构造只需要做更多的工作即可。

对于大多数有经验的开发人员来说,这似乎不是什么大问题——毕竟,众所周知,我们会修改应用程序并开放一些更酷的功能——但它可能会打开一个黑洞,可能导致严重的配置错误和安全漏洞:未定义的行为。与 C 或 C++ 相比,使用 Rust 编程(即使使用不安全)可以很好地锁定漏洞的可能性,但是调用未定义的行为可能会带来风险。

对开发人员主导的安全编码的依赖到此结束了吗?

还记得我之前说过 Rust 有众所周知语言的组件吗?Rust 的主要安全漏洞之一是,它包含众所周知语言的组件,即 C。

Rust 仍然是一种 “安全的编程语言”,但同样,引入用户是事情可以解开的地方。开发人员仍然可以对其进行调整以使其在不标记错误的情况下运行(这是一个有吸引力的主张,因为这样可以解锁更多功能),从本质上讲,即使处于安全状态,开发人员仍然可以随心所欲地处于 “不安全” 状态,因为在事情真正出错之前,他们有一层指导和保护。

随着我们深入研究,上述两种情况都变得更加危险,因为 Rust 的结果与扫描工具相似——就像没有瑞士陆军 SAST/DAST/RAST/IAST 工具可以扫描每个漏洞、每个攻击向量和每个问题一样,Rust 也没有。即使使用 Rust 仍然可以很容易地引入一些漏洞

运行 Unsafe Rust 时存在的未定义行为风险有可能引发整数溢出问题,而总的来说,即使是安全配置也无法防止安全配置错误中的人为错误, 商业逻辑,或者使用具有已知漏洞的组件。如果不进行修补,这些问题仍然构成非常现实的威胁,并且在像真正的 Rust 这样的 “假定安全” 的环境中,如果程序员认为无论如何都会解决所有重大问题,则甚至可能导致一些自鸣得意的行为。

我发现 Rust 与编程导师没什么不同,编程导师是一位高级工程师,他花时间与经验不足的编码人员坐在一起,审查他们的工作,向他们展示潜在的错误,指出效率,在某些情况下,还要确保直到正确才编译。但是,对于 Rust 程序员来说,自己学习理论并致力于最佳实践要好得多,因为那位导师可能只是削减了围裙的束缚,你不想袖手旁观。

准备好立即查找和修复常见的 Rust 漏洞了吗? 玩挑战赛。

목록

PDF 다운로드
리소스 보기
더 많은 것에 관심이 있으신가요?

마티아스 마두는 보안 전문가, 연구원, CTO이자 Secure Code Warrior 의 공동 설립자입니다. 마티아스는 겐트 대학교에서 정적 분석 솔루션에 중점을 둔 애플리케이션 보안 박사 학위를 취득했습니다. 이후 미국의 Fortify에 입사하여 개발자의 보안 코드 작성을 지원하지 않고 코드 문제만 탐지하는 것만으로는 충분하지 않다는 것을 깨달았습니다. 이를 계기로 개발자를 지원하고 보안에 대한 부담을 덜어주며 고객의 기대를 뛰어넘는 제품을 개발하게 되었습니다. 팀 어썸의 일원으로 책상에 앉아 있지 않을 때는 RSA 컨퍼런스, 블랙햇, 데프콘 등의 컨퍼런스에서 무대에 올라 발표하는 것을 즐깁니다.

더 알아보세요

Secure Code Warrior는 조직이 소프트웨어 개발 생명주기 전반에 걸쳐 코드를 보호하고 사이버 보안을 최우선으로 하는 문화를 조성하도록 지원합니다. 앱 보안 관리자, 개발자, 최고정보보안책임자(CISO) 또는 보안 관련 업무를 수행하는 모든 분들에게, 저희는 조직이 안전하지 않은 코드와 관련된 위험을 줄일 수 있도록 돕습니다.

데모 예약다운로드
공유하기:
링크드인 브랜드사회적x 로고
자원 센터

시작하는 데 도움이 되는 자료

더 많은 게시물
자원 센터

시작하는 데 도움이 되는 자료

더 많은 게시물