博客

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

马蒂亚斯-马杜博士
发表于2020年6月18日

在过去的几年里,全世界的软件工程师似乎都对Rust编程爱不释手。这种相对较新的系统编程语言,由Mozilla出品,已经俘获了Stack Overflow社区的心--而且,作为一个非常不可能遭受愚弄的群体,当他们连续5年投票选出"最受喜爱的编程语言"时,是时候我们都坐起来并注意到了。

Rust编程语言融合了常用语言中的已知元素和功能元素,按照一种不同的理念工作,在引入性能和安全的同时,处置了复杂性。这是一个学习曲线,许多开发人员并没有得到很好的机会来玩它--在Stack Overflow的调查中,只有5.1%的人经常使用它。不过,撇开这一点不谈,不可否认的是,它是一种令人兴奋的语言,而且比它的前辈,如C和C++,有更大的安全火力。大规模采用需要一些改变,包括行为和技术方面......但现在,它仍然在理论层面上吸引着开发者的注意力。  

......但是等等,我们还需要照亮一件事:必须注意的是,Rust是一种优先考虑内存安全的编程语言,以及根除与常见内存管理问题有关的安全漏洞。这些都是大问题(而且无疑会导致超过几个AppSec团队的偏头痛),但它们不是我们面临的唯一安全编码挑战。

Rust到底能防止什么?在安全领域,我们还暴露在哪里?让我们来解读一下这个最新的编程独角兽。

现代内存安全系统编程的新境界

Mozilla的研究和开发团队在一些令人难以置信的项目上工作,而作为开源开拓者的Rust编程的投资也不例外。他们的介绍性视频提供了对他们精神的一些见解,其中的关键主题非常明确:目前的软件安全方法是有缺陷的,而Rust是为了解决这个问题的大部分。

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

尽管这个概念可能很简单,但有时简单的答案却能征服复杂的问题。从各种意义上讲,Rust是内存安全系统编程的一场革命,它在很多方面都实现了自己的承诺......当然,它也拯救了那些容易引入错误的开发者,这些错误如果没有被发现,会造成很大的问题。Java、C、C++,甚至像Kotlin和Golang这样较新的语言,对没有安全意识的开发者来说仍然是相当不宽容的。在这些语言中,没有内置的警告,也没有特别的迹象表明刚刚编译的强大功能有一个隐藏在引擎盖下的安全隐患。

因此,让我们更深入地挖掘。

是什么让Rust如此安全?

通常情况下,开发人员的主要目标是建立功能,确保它们的功能和用户友好--也许甚至是他们乐意在简历上炫耀的骄傲的来源。开发人员创建一些伟大的软件,将其运送出去,然后转到下一个大项目,这是完全正常的。在这一点上,安全团队会检查漏洞,如果发现漏洞,他们的 "成品 "应用程序可能会被弹回他们的团队进行热修复。这个问题可能很简单,也可能完全超出了开发人员的合理范围,无法补救。

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

现在,Rust试图从一开始就阻止许多漏洞进入代码:如果有语法错误或其他内存安全漏洞,它根本不会编译,这些漏洞会在SDLC中一直导致生产问题。这是设计上的内存安全编程,确保没有对无效内存的访问(无论软件如何执行)。由于70%的安全漏洞是由内存管理相关的问题造成的,这是一个伟大的成就。

锈迹斑斑将标志和防止。

  • 缓冲区溢出
  • 免费后使用
  • 双重免费
  • 解除对空指针的指责
  • 使用未初始化的内存

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

#include <iostream></iostream>
#include <string.h></string.h>
int main( void ) {
char a[3] = "12";
char b[4]= "123";
strcpy(a, b); // buffer overflow as len of b is greater than a
std::cout << a << "; " << b << std::endl;
}

Vs.

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

Rust提出了一个安全警告,并在运行时达到copy_from_slice函数时惊慌失措,以防止缓冲区溢出,但在编译时没有。

从这个意义上说,它是非常 "从左开始 "的语言之一。它将突出显示错误,并强制教导开发人员以正确的方式编写代码,以避免引入与内存有关的安全漏洞,因此,能否在最后期限前完成取决于编码人员的关注、补救和对交付路径的坚持。

这种语言的方法似乎很简单,但要让它与这种强大的逻辑一起工作,那将是一个不可思议的壮举,而且它确实走得很好。从安全角度来看,Rust是一个巨大的飞跃......如果有更多的人在使用它的话。像Dropbox这样的公司正率先在大型企业范围内使用它,这是很好的现象。但是,在我们得出结论认为采用问题是阻止我们实现更安全的未来的全部原因之前,还有更多的考虑。

拉斯特的算盘。

有几个小问题(好吧,大问题),即用Rust编程有更多的灵活性,可以引入比它可能出现的错误。它不会修复所有重要的OWASP十大漏洞,这些漏洞继续导致漏洞、延迟和不安全编码技术的普遍文化。也有一些天使和魔鬼的动态,或者,正如它被更广泛地称为:安全的Rust与不安全的Rust

正如官方文档所解释的那样,Safe Rust是Rust的 "真正 "形式,而Unsafe Rust包括那些被认为是 "绝对不安全 "的功能,尽管它们有时是必要的--例如需要与其他语言的东西集成。然而,即使是不安全的Rust,额外功能的列表仍然是有限的。在不安全的Rust中,可以在不安全的块中做以下事情。

  • 解除对原始指针的引用
  • 调用不安全的函数(包括C函数、编译器内含物和原始分配器)。
  • 实施不安全的特征
  • 变异的静力学
  • 访问联合体的字段。

即使在所谓的 "不安全 "模式下,Rust编程的一个超能力仍然发挥作用:"借贷检查器"。它一般通过静态代码分析来防止内存问题、并行计算中的碰撞和许多其他错误,这种分析仍然会在不安全块中进行检查--只是在某些情况下,如果没有编译器介入指导,编写不安全结构需要更多的工作。

对于大多数有经验的开发者来说,这似乎不是一个巨大的问题--毕竟,我们都知道通过修补来获得我们应用程序的最佳效果,并开辟一些更酷的功能--但它可能会打开一个黑洞,导致严重的错误配置和安全漏洞:未定义行为。与C或C++相比,用Rust编程(即使在不安全的情况下使用)可以很好地锁定漏洞的可能性,但调用未定义行为可能是一种风险。

这是对开发者主导的安全编码的依赖的终结吗?

还记得之前我说过Rust有知名语言的组件吗?Rust的主要安全漏洞之一就是,嗯,它有知名语言的组件--即C。

Rust仍然是一种 "安全的编程语言",但同样,引入用户是事情可能变得不稳定的地方。开发者仍然可以对其进行调整,使其在运行时不标记错误(这是一个有吸引力的提议,因为这释放了更多的能力),而且从本质上讲,即使在安全状态下,开发者仍然可以随心所欲地 "不安全",因为他们在事情真正发生之前有一层指导和保护。

而上述两种情况随着我们的深入都会变得更加危险,因为Rust的结果类似于扫描工具--就像没有瑞士军团的SAST/DAST/RAST/IAST工具可以扫描到每个漏洞、每个攻击媒介和每个问题一样,Rust也没有。即使使用Rust,一些漏洞仍然可以很容易地被引入

在运行不安全的Rust时,未定义的行为风险有可能打开整数溢出的问题,而在一般情况下,即使是安全配置也不能防止安全错误配置、商业逻辑或使用有已知漏洞的组件的人为错误。如果不打补丁,这些问题仍然构成非常真实的威胁,在像真正的Rust这样的 "假定安全 "环境中,如果编码者认为所有的主要问题都会被发现,甚至可能导致一些自满行为。

我发现Rust和编程导师没什么两样--一个资深的工程师花时间和一个经验不足的程序员坐在一起,审查他们的工作,向他们展示潜在的错误,指出效率,在某些情况下,确保在正确之前不会被编译。然而,对于Rust程序员来说,自己学习理论并致力于最佳实践要好得多,因为导师可能就会切断围裙的绳子,而你不希望被吊死。

准备好现在就找到并修复常见的Rust漏洞了吗? 参加挑战赛吧。
查看资源
查看资源

Rust融合了常用语言中的已知元素和功能元素,以一种不同的理念工作,在引入性能和安全的同时,处理掉了复杂性。

想了解更多信息?

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

Secure Code Warrior 我们在这里为您的组织提供服务,帮助您在整个软件开发生命周期中确保代码安全,并创造一种将网络安全放在首位的文化。无论您是应用安全经理、开发人员、CISO或任何涉及安全的人,我们都可以帮助您的组织减少与不安全代码有关的风险。

预定一个演示
分享到
作者
马蒂亚斯-马杜博士
发表于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。

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

分享到

在过去的几年里,全世界的软件工程师似乎都对Rust编程爱不释手。这种相对较新的系统编程语言,由Mozilla出品,已经俘获了Stack Overflow社区的心--而且,作为一个非常不可能遭受愚弄的群体,当他们连续5年投票选出"最受喜爱的编程语言"时,是时候我们都坐起来并注意到了。

Rust编程语言融合了常用语言中的已知元素和功能元素,按照一种不同的理念工作,在引入性能和安全的同时,处置了复杂性。这是一个学习曲线,许多开发人员并没有得到很好的机会来玩它--在Stack Overflow的调查中,只有5.1%的人经常使用它。不过,撇开这一点不谈,不可否认的是,它是一种令人兴奋的语言,而且比它的前辈,如C和C++,有更大的安全火力。大规模采用需要一些改变,包括行为和技术方面......但现在,它仍然在理论层面上吸引着开发者的注意力。  

......但是等等,我们还需要照亮一件事:必须注意的是,Rust是一种优先考虑内存安全的编程语言,以及根除与常见内存管理问题有关的安全漏洞。这些都是大问题(而且无疑会导致超过几个AppSec团队的偏头痛),但它们不是我们面临的唯一安全编码挑战。

Rust到底能防止什么?在安全领域,我们还暴露在哪里?让我们来解读一下这个最新的编程独角兽。

现代内存安全系统编程的新境界

Mozilla的研究和开发团队在一些令人难以置信的项目上工作,而作为开源开拓者的Rust编程的投资也不例外。他们的介绍性视频提供了对他们精神的一些见解,其中的关键主题非常明确:目前的软件安全方法是有缺陷的,而Rust是为了解决这个问题的大部分。

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

尽管这个概念可能很简单,但有时简单的答案却能征服复杂的问题。从各种意义上讲,Rust是内存安全系统编程的一场革命,它在很多方面都实现了自己的承诺......当然,它也拯救了那些容易引入错误的开发者,这些错误如果没有被发现,会造成很大的问题。Java、C、C++,甚至像Kotlin和Golang这样较新的语言,对没有安全意识的开发者来说仍然是相当不宽容的。在这些语言中,没有内置的警告,也没有特别的迹象表明刚刚编译的强大功能有一个隐藏在引擎盖下的安全隐患。

因此,让我们更深入地挖掘。

是什么让Rust如此安全?

通常情况下,开发人员的主要目标是建立功能,确保它们的功能和用户友好--也许甚至是他们乐意在简历上炫耀的骄傲的来源。开发人员创建一些伟大的软件,将其运送出去,然后转到下一个大项目,这是完全正常的。在这一点上,安全团队会检查漏洞,如果发现漏洞,他们的 "成品 "应用程序可能会被弹回他们的团队进行热修复。这个问题可能很简单,也可能完全超出了开发人员的合理范围,无法补救。

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

现在,Rust试图从一开始就阻止许多漏洞进入代码:如果有语法错误或其他内存安全漏洞,它根本不会编译,这些漏洞会在SDLC中一直导致生产问题。这是设计上的内存安全编程,确保没有对无效内存的访问(无论软件如何执行)。由于70%的安全漏洞是由内存管理相关的问题造成的,这是一个伟大的成就。

锈迹斑斑将标志和防止。

  • 缓冲区溢出
  • 免费后使用
  • 双重免费
  • 解除对空指针的指责
  • 使用未初始化的内存

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

#include <iostream></iostream>
#include <string.h></string.h>
int main( void ) {
char a[3] = "12";
char b[4]= "123";
strcpy(a, b); // buffer overflow as len of b is greater than a
std::cout << a << "; " << b << std::endl;
}

Vs.

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

Rust提出了一个安全警告,并在运行时达到copy_from_slice函数时惊慌失措,以防止缓冲区溢出,但在编译时没有。

从这个意义上说,它是非常 "从左开始 "的语言之一。它将突出显示错误,并强制教导开发人员以正确的方式编写代码,以避免引入与内存有关的安全漏洞,因此,能否在最后期限前完成取决于编码人员的关注、补救和对交付路径的坚持。

这种语言的方法似乎很简单,但要让它与这种强大的逻辑一起工作,那将是一个不可思议的壮举,而且它确实走得很好。从安全角度来看,Rust是一个巨大的飞跃......如果有更多的人在使用它的话。像Dropbox这样的公司正率先在大型企业范围内使用它,这是很好的现象。但是,在我们得出结论认为采用问题是阻止我们实现更安全的未来的全部原因之前,还有更多的考虑。

拉斯特的算盘。

有几个小问题(好吧,大问题),即用Rust编程有更多的灵活性,可以引入比它可能出现的错误。它不会修复所有重要的OWASP十大漏洞,这些漏洞继续导致漏洞、延迟和不安全编码技术的普遍文化。也有一些天使和魔鬼的动态,或者,正如它被更广泛地称为:安全的Rust与不安全的Rust

正如官方文档所解释的那样,Safe Rust是Rust的 "真正 "形式,而Unsafe Rust包括那些被认为是 "绝对不安全 "的功能,尽管它们有时是必要的--例如需要与其他语言的东西集成。然而,即使是不安全的Rust,额外功能的列表仍然是有限的。在不安全的Rust中,可以在不安全的块中做以下事情。

  • 解除对原始指针的引用
  • 调用不安全的函数(包括C函数、编译器内含物和原始分配器)。
  • 实施不安全的特征
  • 变异的静力学
  • 访问联合体的字段。

即使在所谓的 "不安全 "模式下,Rust编程的一个超能力仍然发挥作用:"借贷检查器"。它一般通过静态代码分析来防止内存问题、并行计算中的碰撞和许多其他错误,这种分析仍然会在不安全块中进行检查--只是在某些情况下,如果没有编译器介入指导,编写不安全结构需要更多的工作。

对于大多数有经验的开发者来说,这似乎不是一个巨大的问题--毕竟,我们都知道通过修补来获得我们应用程序的最佳效果,并开辟一些更酷的功能--但它可能会打开一个黑洞,导致严重的错误配置和安全漏洞:未定义行为。与C或C++相比,用Rust编程(即使在不安全的情况下使用)可以很好地锁定漏洞的可能性,但调用未定义行为可能是一种风险。

这是对开发者主导的安全编码的依赖的终结吗?

还记得之前我说过Rust有知名语言的组件吗?Rust的主要安全漏洞之一就是,嗯,它有知名语言的组件--即C。

Rust仍然是一种 "安全的编程语言",但同样,引入用户是事情可能变得不稳定的地方。开发者仍然可以对其进行调整,使其在运行时不标记错误(这是一个有吸引力的提议,因为这释放了更多的能力),而且从本质上讲,即使在安全状态下,开发者仍然可以随心所欲地 "不安全",因为他们在事情真正发生之前有一层指导和保护。

而上述两种情况随着我们的深入都会变得更加危险,因为Rust的结果类似于扫描工具--就像没有瑞士军团的SAST/DAST/RAST/IAST工具可以扫描到每个漏洞、每个攻击媒介和每个问题一样,Rust也没有。即使使用Rust,一些漏洞仍然可以很容易地被引入

在运行不安全的Rust时,未定义的行为风险有可能打开整数溢出的问题,而在一般情况下,即使是安全配置也不能防止安全错误配置、商业逻辑或使用有已知漏洞的组件的人为错误。如果不打补丁,这些问题仍然构成非常真实的威胁,在像真正的Rust这样的 "假定安全 "环境中,如果编码者认为所有的主要问题都会被发现,甚至可能导致一些自满行为。

我发现Rust和编程导师没什么两样--一个资深的工程师花时间和一个经验不足的程序员坐在一起,审查他们的工作,向他们展示潜在的错误,指出效率,在某些情况下,确保在正确之前不会被编译。然而,对于Rust程序员来说,自己学习理论并致力于最佳实践要好得多,因为导师可能就会切断围裙的绳子,而你不希望被吊死。

准备好现在就找到并修复常见的Rust漏洞了吗? 参加挑战赛吧。
查看资源
查看资源

请填写下表下载报告

我们希望得到您的许可,向您发送有关我们产品和/或相关安全编码主题的信息。我们将始终以最谨慎的态度对待您的个人资料,绝不会将其出售给其他公司用于营销目的。

提交
要提交表格,请启用 "分析 "cookies。完成后,请随时再次禁用它们。

在过去的几年里,全世界的软件工程师似乎都对Rust编程爱不释手。这种相对较新的系统编程语言,由Mozilla出品,已经俘获了Stack Overflow社区的心--而且,作为一个非常不可能遭受愚弄的群体,当他们连续5年投票选出"最受喜爱的编程语言"时,是时候我们都坐起来并注意到了。

Rust编程语言融合了常用语言中的已知元素和功能元素,按照一种不同的理念工作,在引入性能和安全的同时,处置了复杂性。这是一个学习曲线,许多开发人员并没有得到很好的机会来玩它--在Stack Overflow的调查中,只有5.1%的人经常使用它。不过,撇开这一点不谈,不可否认的是,它是一种令人兴奋的语言,而且比它的前辈,如C和C++,有更大的安全火力。大规模采用需要一些改变,包括行为和技术方面......但现在,它仍然在理论层面上吸引着开发者的注意力。  

......但是等等,我们还需要照亮一件事:必须注意的是,Rust是一种优先考虑内存安全的编程语言,以及根除与常见内存管理问题有关的安全漏洞。这些都是大问题(而且无疑会导致超过几个AppSec团队的偏头痛),但它们不是我们面临的唯一安全编码挑战。

Rust到底能防止什么?在安全领域,我们还暴露在哪里?让我们来解读一下这个最新的编程独角兽。

现代内存安全系统编程的新境界

Mozilla的研究和开发团队在一些令人难以置信的项目上工作,而作为开源开拓者的Rust编程的投资也不例外。他们的介绍性视频提供了对他们精神的一些见解,其中的关键主题非常明确:目前的软件安全方法是有缺陷的,而Rust是为了解决这个问题的大部分。

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

尽管这个概念可能很简单,但有时简单的答案却能征服复杂的问题。从各种意义上讲,Rust是内存安全系统编程的一场革命,它在很多方面都实现了自己的承诺......当然,它也拯救了那些容易引入错误的开发者,这些错误如果没有被发现,会造成很大的问题。Java、C、C++,甚至像Kotlin和Golang这样较新的语言,对没有安全意识的开发者来说仍然是相当不宽容的。在这些语言中,没有内置的警告,也没有特别的迹象表明刚刚编译的强大功能有一个隐藏在引擎盖下的安全隐患。

因此,让我们更深入地挖掘。

是什么让Rust如此安全?

通常情况下,开发人员的主要目标是建立功能,确保它们的功能和用户友好--也许甚至是他们乐意在简历上炫耀的骄傲的来源。开发人员创建一些伟大的软件,将其运送出去,然后转到下一个大项目,这是完全正常的。在这一点上,安全团队会检查漏洞,如果发现漏洞,他们的 "成品 "应用程序可能会被弹回他们的团队进行热修复。这个问题可能很简单,也可能完全超出了开发人员的合理范围,无法补救。

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

现在,Rust试图从一开始就阻止许多漏洞进入代码:如果有语法错误或其他内存安全漏洞,它根本不会编译,这些漏洞会在SDLC中一直导致生产问题。这是设计上的内存安全编程,确保没有对无效内存的访问(无论软件如何执行)。由于70%的安全漏洞是由内存管理相关的问题造成的,这是一个伟大的成就。

锈迹斑斑将标志和防止。

  • 缓冲区溢出
  • 免费后使用
  • 双重免费
  • 解除对空指针的指责
  • 使用未初始化的内存

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

#include <iostream></iostream>
#include <string.h></string.h>
int main( void ) {
char a[3] = "12";
char b[4]= "123";
strcpy(a, b); // buffer overflow as len of b is greater than a
std::cout << a << "; " << b << std::endl;
}

Vs.

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

Rust提出了一个安全警告,并在运行时达到copy_from_slice函数时惊慌失措,以防止缓冲区溢出,但在编译时没有。

从这个意义上说,它是非常 "从左开始 "的语言之一。它将突出显示错误,并强制教导开发人员以正确的方式编写代码,以避免引入与内存有关的安全漏洞,因此,能否在最后期限前完成取决于编码人员的关注、补救和对交付路径的坚持。

这种语言的方法似乎很简单,但要让它与这种强大的逻辑一起工作,那将是一个不可思议的壮举,而且它确实走得很好。从安全角度来看,Rust是一个巨大的飞跃......如果有更多的人在使用它的话。像Dropbox这样的公司正率先在大型企业范围内使用它,这是很好的现象。但是,在我们得出结论认为采用问题是阻止我们实现更安全的未来的全部原因之前,还有更多的考虑。

拉斯特的算盘。

有几个小问题(好吧,大问题),即用Rust编程有更多的灵活性,可以引入比它可能出现的错误。它不会修复所有重要的OWASP十大漏洞,这些漏洞继续导致漏洞、延迟和不安全编码技术的普遍文化。也有一些天使和魔鬼的动态,或者,正如它被更广泛地称为:安全的Rust与不安全的Rust

正如官方文档所解释的那样,Safe Rust是Rust的 "真正 "形式,而Unsafe Rust包括那些被认为是 "绝对不安全 "的功能,尽管它们有时是必要的--例如需要与其他语言的东西集成。然而,即使是不安全的Rust,额外功能的列表仍然是有限的。在不安全的Rust中,可以在不安全的块中做以下事情。

  • 解除对原始指针的引用
  • 调用不安全的函数(包括C函数、编译器内含物和原始分配器)。
  • 实施不安全的特征
  • 变异的静力学
  • 访问联合体的字段。

即使在所谓的 "不安全 "模式下,Rust编程的一个超能力仍然发挥作用:"借贷检查器"。它一般通过静态代码分析来防止内存问题、并行计算中的碰撞和许多其他错误,这种分析仍然会在不安全块中进行检查--只是在某些情况下,如果没有编译器介入指导,编写不安全结构需要更多的工作。

对于大多数有经验的开发者来说,这似乎不是一个巨大的问题--毕竟,我们都知道通过修补来获得我们应用程序的最佳效果,并开辟一些更酷的功能--但它可能会打开一个黑洞,导致严重的错误配置和安全漏洞:未定义行为。与C或C++相比,用Rust编程(即使在不安全的情况下使用)可以很好地锁定漏洞的可能性,但调用未定义行为可能是一种风险。

这是对开发者主导的安全编码的依赖的终结吗?

还记得之前我说过Rust有知名语言的组件吗?Rust的主要安全漏洞之一就是,嗯,它有知名语言的组件--即C。

Rust仍然是一种 "安全的编程语言",但同样,引入用户是事情可能变得不稳定的地方。开发者仍然可以对其进行调整,使其在运行时不标记错误(这是一个有吸引力的提议,因为这释放了更多的能力),而且从本质上讲,即使在安全状态下,开发者仍然可以随心所欲地 "不安全",因为他们在事情真正发生之前有一层指导和保护。

而上述两种情况随着我们的深入都会变得更加危险,因为Rust的结果类似于扫描工具--就像没有瑞士军团的SAST/DAST/RAST/IAST工具可以扫描到每个漏洞、每个攻击媒介和每个问题一样,Rust也没有。即使使用Rust,一些漏洞仍然可以很容易地被引入

在运行不安全的Rust时,未定义的行为风险有可能打开整数溢出的问题,而在一般情况下,即使是安全配置也不能防止安全错误配置、商业逻辑或使用有已知漏洞的组件的人为错误。如果不打补丁,这些问题仍然构成非常真实的威胁,在像真正的Rust这样的 "假定安全 "环境中,如果编码者认为所有的主要问题都会被发现,甚至可能导致一些自满行为。

我发现Rust和编程导师没什么两样--一个资深的工程师花时间和一个经验不足的程序员坐在一起,审查他们的工作,向他们展示潜在的错误,指出效率,在某些情况下,确保在正确之前不会被编译。然而,对于Rust程序员来说,自己学习理论并致力于最佳实践要好得多,因为导师可能就会切断围裙的绳子,而你不希望被吊死。

准备好现在就找到并修复常见的Rust漏洞了吗? 参加挑战赛吧。
开始吧

点击下面的链接,下载本资料的 PDF 文件。

Secure Code Warrior 我们在这里为您的组织提供服务,帮助您在整个软件开发生命周期中确保代码安全,并创造一种将网络安全放在首位的文化。无论您是应用安全经理、开发人员、CISO或任何涉及安全的人,我们都可以帮助您的组织减少与不安全代码有关的风险。

查看报告预定一个演示
查看资源
分享到
想了解更多信息?

分享到
作者
马蒂亚斯-马杜博士
发表于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。

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

分享到

在过去的几年里,全世界的软件工程师似乎都对Rust编程爱不释手。这种相对较新的系统编程语言,由Mozilla出品,已经俘获了Stack Overflow社区的心--而且,作为一个非常不可能遭受愚弄的群体,当他们连续5年投票选出"最受喜爱的编程语言"时,是时候我们都坐起来并注意到了。

Rust编程语言融合了常用语言中的已知元素和功能元素,按照一种不同的理念工作,在引入性能和安全的同时,处置了复杂性。这是一个学习曲线,许多开发人员并没有得到很好的机会来玩它--在Stack Overflow的调查中,只有5.1%的人经常使用它。不过,撇开这一点不谈,不可否认的是,它是一种令人兴奋的语言,而且比它的前辈,如C和C++,有更大的安全火力。大规模采用需要一些改变,包括行为和技术方面......但现在,它仍然在理论层面上吸引着开发者的注意力。  

......但是等等,我们还需要照亮一件事:必须注意的是,Rust是一种优先考虑内存安全的编程语言,以及根除与常见内存管理问题有关的安全漏洞。这些都是大问题(而且无疑会导致超过几个AppSec团队的偏头痛),但它们不是我们面临的唯一安全编码挑战。

Rust到底能防止什么?在安全领域,我们还暴露在哪里?让我们来解读一下这个最新的编程独角兽。

现代内存安全系统编程的新境界

Mozilla的研究和开发团队在一些令人难以置信的项目上工作,而作为开源开拓者的Rust编程的投资也不例外。他们的介绍性视频提供了对他们精神的一些见解,其中的关键主题非常明确:目前的软件安全方法是有缺陷的,而Rust是为了解决这个问题的大部分。

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

尽管这个概念可能很简单,但有时简单的答案却能征服复杂的问题。从各种意义上讲,Rust是内存安全系统编程的一场革命,它在很多方面都实现了自己的承诺......当然,它也拯救了那些容易引入错误的开发者,这些错误如果没有被发现,会造成很大的问题。Java、C、C++,甚至像Kotlin和Golang这样较新的语言,对没有安全意识的开发者来说仍然是相当不宽容的。在这些语言中,没有内置的警告,也没有特别的迹象表明刚刚编译的强大功能有一个隐藏在引擎盖下的安全隐患。

因此,让我们更深入地挖掘。

是什么让Rust如此安全?

通常情况下,开发人员的主要目标是建立功能,确保它们的功能和用户友好--也许甚至是他们乐意在简历上炫耀的骄傲的来源。开发人员创建一些伟大的软件,将其运送出去,然后转到下一个大项目,这是完全正常的。在这一点上,安全团队会检查漏洞,如果发现漏洞,他们的 "成品 "应用程序可能会被弹回他们的团队进行热修复。这个问题可能很简单,也可能完全超出了开发人员的合理范围,无法补救。

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

现在,Rust试图从一开始就阻止许多漏洞进入代码:如果有语法错误或其他内存安全漏洞,它根本不会编译,这些漏洞会在SDLC中一直导致生产问题。这是设计上的内存安全编程,确保没有对无效内存的访问(无论软件如何执行)。由于70%的安全漏洞是由内存管理相关的问题造成的,这是一个伟大的成就。

锈迹斑斑将标志和防止。

  • 缓冲区溢出
  • 免费后使用
  • 双重免费
  • 解除对空指针的指责
  • 使用未初始化的内存

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

#include <iostream></iostream>
#include <string.h></string.h>
int main( void ) {
char a[3] = "12";
char b[4]= "123";
strcpy(a, b); // buffer overflow as len of b is greater than a
std::cout << a << "; " << b << std::endl;
}

Vs.

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

Rust提出了一个安全警告,并在运行时达到copy_from_slice函数时惊慌失措,以防止缓冲区溢出,但在编译时没有。

从这个意义上说,它是非常 "从左开始 "的语言之一。它将突出显示错误,并强制教导开发人员以正确的方式编写代码,以避免引入与内存有关的安全漏洞,因此,能否在最后期限前完成取决于编码人员的关注、补救和对交付路径的坚持。

这种语言的方法似乎很简单,但要让它与这种强大的逻辑一起工作,那将是一个不可思议的壮举,而且它确实走得很好。从安全角度来看,Rust是一个巨大的飞跃......如果有更多的人在使用它的话。像Dropbox这样的公司正率先在大型企业范围内使用它,这是很好的现象。但是,在我们得出结论认为采用问题是阻止我们实现更安全的未来的全部原因之前,还有更多的考虑。

拉斯特的算盘。

有几个小问题(好吧,大问题),即用Rust编程有更多的灵活性,可以引入比它可能出现的错误。它不会修复所有重要的OWASP十大漏洞,这些漏洞继续导致漏洞、延迟和不安全编码技术的普遍文化。也有一些天使和魔鬼的动态,或者,正如它被更广泛地称为:安全的Rust与不安全的Rust

正如官方文档所解释的那样,Safe Rust是Rust的 "真正 "形式,而Unsafe Rust包括那些被认为是 "绝对不安全 "的功能,尽管它们有时是必要的--例如需要与其他语言的东西集成。然而,即使是不安全的Rust,额外功能的列表仍然是有限的。在不安全的Rust中,可以在不安全的块中做以下事情。

  • 解除对原始指针的引用
  • 调用不安全的函数(包括C函数、编译器内含物和原始分配器)。
  • 实施不安全的特征
  • 变异的静力学
  • 访问联合体的字段。

即使在所谓的 "不安全 "模式下,Rust编程的一个超能力仍然发挥作用:"借贷检查器"。它一般通过静态代码分析来防止内存问题、并行计算中的碰撞和许多其他错误,这种分析仍然会在不安全块中进行检查--只是在某些情况下,如果没有编译器介入指导,编写不安全结构需要更多的工作。

对于大多数有经验的开发者来说,这似乎不是一个巨大的问题--毕竟,我们都知道通过修补来获得我们应用程序的最佳效果,并开辟一些更酷的功能--但它可能会打开一个黑洞,导致严重的错误配置和安全漏洞:未定义行为。与C或C++相比,用Rust编程(即使在不安全的情况下使用)可以很好地锁定漏洞的可能性,但调用未定义行为可能是一种风险。

这是对开发者主导的安全编码的依赖的终结吗?

还记得之前我说过Rust有知名语言的组件吗?Rust的主要安全漏洞之一就是,嗯,它有知名语言的组件--即C。

Rust仍然是一种 "安全的编程语言",但同样,引入用户是事情可能变得不稳定的地方。开发者仍然可以对其进行调整,使其在运行时不标记错误(这是一个有吸引力的提议,因为这释放了更多的能力),而且从本质上讲,即使在安全状态下,开发者仍然可以随心所欲地 "不安全",因为他们在事情真正发生之前有一层指导和保护。

而上述两种情况随着我们的深入都会变得更加危险,因为Rust的结果类似于扫描工具--就像没有瑞士军团的SAST/DAST/RAST/IAST工具可以扫描到每个漏洞、每个攻击媒介和每个问题一样,Rust也没有。即使使用Rust,一些漏洞仍然可以很容易地被引入

在运行不安全的Rust时,未定义的行为风险有可能打开整数溢出的问题,而在一般情况下,即使是安全配置也不能防止安全错误配置、商业逻辑或使用有已知漏洞的组件的人为错误。如果不打补丁,这些问题仍然构成非常真实的威胁,在像真正的Rust这样的 "假定安全 "环境中,如果编码者认为所有的主要问题都会被发现,甚至可能导致一些自满行为。

我发现Rust和编程导师没什么两样--一个资深的工程师花时间和一个经验不足的程序员坐在一起,审查他们的工作,向他们展示潜在的错误,指出效率,在某些情况下,确保在正确之前不会被编译。然而,对于Rust程序员来说,自己学习理论并致力于最佳实践要好得多,因为导师可能就会切断围裙的绳子,而你不希望被吊死。

准备好现在就找到并修复常见的Rust漏洞了吗? 参加挑战赛吧。

目录

下载PDF
查看资源
想了解更多信息?

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

Secure Code Warrior 我们在这里为您的组织提供服务,帮助您在整个软件开发生命周期中确保代码安全,并创造一种将网络安全放在首位的文化。无论您是应用安全经理、开发人员、CISO或任何涉及安全的人,我们都可以帮助您的组织减少与不安全代码有关的风险。

预定一个演示下载
分享到
资源中心
资源中心