SCW图标
英雄背景无分隔线
博客

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

马蒂亚斯-马杜博士
出版日期: 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;
}

Vs.

pub fn main () {
让 mut a: [char; 2] = [1, 2];
让 b: [char; 3] = [1, 2, 3];
a.copy_from_slice (&b);
}
比较一个Rust代码片段

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

对更多感兴趣?

Matias Madou, Ph.D.是一位安全专家、研究员和CTO,也是Secure Code Warrior 的联合创始人。Matias在根特大学获得了应用安全的博士学位,主要研究静态分析解决方案。后来他加入了美国的Fortify公司,在那里他意识到,仅仅检测代码问题而不帮助开发人员编写安全代码是不够的。这激发了他开发产品的热情,帮助开发人员,减轻安全的负担,并超越客户的期望。当他不在办公桌前作为Awesome团队的一员时,他喜欢站在舞台上,在包括RSA会议、BlackHat和DefCon等会议上发表演讲。

了解更多

Secure Code Warrior可帮助您的组织在整个软件开发生命周期中保护代码,并营造一种将网络安全置于首位的文化。无论您是应用安全经理、开发人员、首席信息安全官还是任何与安全相关的人员,我们都能帮助您的组织降低与不安全代码相关的风险。

预约演示
分享到:
领英品牌社交x 标志
作者
马蒂亚斯-马杜博士
发表于2020年6月18日

Matias Madou, Ph.D.是一位安全专家、研究员和CTO,也是Secure Code Warrior 的联合创始人。Matias在根特大学获得了应用安全的博士学位,主要研究静态分析解决方案。后来他加入了美国的Fortify公司,在那里他意识到,仅仅检测代码问题而不帮助开发人员编写安全代码是不够的。这激发了他开发产品的热情,帮助开发人员,减轻安全的负担,并超越客户的期望。当他不在办公桌前作为Awesome团队的一员时,他喜欢站在舞台上,在包括RSA会议、BlackHat和DefCon等会议上发表演讲。

马蒂亚斯是一名研究员和开发人员,拥有超过15年的软件安全实践经验。他曾为Fortify Software和他自己的公司Sensei Security等公司开发解决方案。在他的职业生涯中,马蒂亚斯领导了多个应用安全研究项目,并将其转化为商业产品,他拥有超过10项专利。当他离开办公桌时,Matias曾担任高级应用安全培训courses ,并定期在全球会议上发言,包括RSA会议、黑帽、DefCon、BSIMM、OWASP AppSec和BruCon。

马蒂亚斯拥有根特大学的计算机工程博士学位,在那里他研究了通过程序混淆来隐藏应用程序的内部工作的应用安全。

分享到:
领英品牌社交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;
}

Vs.

pub fn main () {
让 mut a: [char; 2] = [1, 2];
让 b: [char; 3] = [1, 2, 3];
a.copy_from_slice (&b);
}
比较一个Rust代码片段

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 错误图标
要提交表单,请启用“分析”Cookie。完成后,可以随意再次禁用它们。

在过去的几年中,似乎全世界的软件工程师对 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;
}

Vs.

pub fn main () {
让 mut a: [char; 2] = [1, 2];
让 b: [char; 3] = [1, 2, 3];
a.copy_from_slice (&b);
}
比较一个Rust代码片段

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可帮助您的组织在整个软件开发生命周期中保护代码,并营造一种将网络安全置于首位的文化。无论您是应用安全经理、开发人员、首席信息安全官还是任何与安全相关的人员,我们都能帮助您的组织降低与不安全代码相关的风险。

查看报告预约演示
查看资源
分享到:
领英品牌社交x 标志
对更多感兴趣?

分享到:
领英品牌社交x 标志
作者
马蒂亚斯-马杜博士
发表于2020年6月18日

Matias Madou, Ph.D.是一位安全专家、研究员和CTO,也是Secure Code Warrior 的联合创始人。Matias在根特大学获得了应用安全的博士学位,主要研究静态分析解决方案。后来他加入了美国的Fortify公司,在那里他意识到,仅仅检测代码问题而不帮助开发人员编写安全代码是不够的。这激发了他开发产品的热情,帮助开发人员,减轻安全的负担,并超越客户的期望。当他不在办公桌前作为Awesome团队的一员时,他喜欢站在舞台上,在包括RSA会议、BlackHat和DefCon等会议上发表演讲。

马蒂亚斯是一名研究员和开发人员,拥有超过15年的软件安全实践经验。他曾为Fortify Software和他自己的公司Sensei Security等公司开发解决方案。在他的职业生涯中,马蒂亚斯领导了多个应用安全研究项目,并将其转化为商业产品,他拥有超过10项专利。当他离开办公桌时,Matias曾担任高级应用安全培训courses ,并定期在全球会议上发言,包括RSA会议、黑帽、DefCon、BSIMM、OWASP AppSec和BruCon。

马蒂亚斯拥有根特大学的计算机工程博士学位,在那里他研究了通过程序混淆来隐藏应用程序的内部工作的应用安全。

分享到:
领英品牌社交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;
}

Vs.

pub fn main () {
让 mut a: [char; 2] = [1, 2];
让 b: [char; 3] = [1, 2, 3];
a.copy_from_slice (&b);
}
比较一个Rust代码片段

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
查看资源
对更多感兴趣?

Matias Madou, Ph.D.是一位安全专家、研究员和CTO,也是Secure Code Warrior 的联合创始人。Matias在根特大学获得了应用安全的博士学位,主要研究静态分析解决方案。后来他加入了美国的Fortify公司,在那里他意识到,仅仅检测代码问题而不帮助开发人员编写安全代码是不够的。这激发了他开发产品的热情,帮助开发人员,减轻安全的负担,并超越客户的期望。当他不在办公桌前作为Awesome团队的一员时,他喜欢站在舞台上,在包括RSA会议、BlackHat和DefCon等会议上发表演讲。

了解更多

Secure Code Warrior可帮助您的组织在整个软件开发生命周期中保护代码,并营造一种将网络安全置于首位的文化。无论您是应用安全经理、开发人员、首席信息安全官还是任何与安全相关的人员,我们都能帮助您的组织降低与不安全代码相关的风险。

预约演示下载
分享到:
领英品牌社交x 标志
资源中心

帮助您入门的资源

更多帖子
资源中心

帮助您入门的资源

更多帖子