技术分享 | 2024-03-22
白宫国家网络主任办公室发布内存安全语言应用的分析


白宫国家网络主任办公室 (ONCD)发布了一份报告《BACK TO THE BUILDING BLOCKS:A PATH TOWARD SECURE AND MEASURABLE SOFTWARE》,呼吁科技界主动减少网络空间的攻击面;通过改用Rust等内存安全编程语言,减少内存安全漏洞的数量来提高软件安全性。报告一发布在互联网上炸开了锅,一方面为拜登选举制造了话题,另外一方面软件技术专家也开展了关于内存安全应用开发,C++与rust语言之争的讨论。

白宫国家网络主任办公室例举了历史上一些著名的网络攻击事件,包括:1988年的Morris蠕虫病毒、2003年的Slammer蠕虫病毒、2014年的 Heartbleed漏洞、2016年的Trident漏洞、2023年的Blastpass漏洞。并指出,所有这些问题的背后都有一个共同的根本原因,即内存安全漏洞。内存安全漏洞是软件中最常见的编程错误之一,当软件以非预期或不安全的方式访问内存时,会导致各种安全问题,如缓冲区溢出、释放后使用、使用未初始化的内存和双重释放。成功利用此类漏洞会带来严重安全风险,可能允许攻击者能未经授权访问数据,或者允许以系统权限执行恶意代码。内存安全漏洞是一类影响内存访问方式的漏洞,以非故意的方式写入、分配或解除分配。专家们已经确定了一些程序既缺乏与记忆安全相关的特征,又具有高度扩散性的语言跨关键系统,如C和C++。

白宫的观点总结为,内存安全漏洞是最常见的产生网络安全问题的原因之一,这一问题可以用编程语言的内存安全机制避免。



观点一:内存安全只是整体安全保护中的一小部分。C++的安全实践主要得益于正式规范、充分指定的内存模型以及活跃的用户与实现者社区。相比之下,某些理论上更安全的语言反而缺少正式规范。当前由ISO C++ 标准定义,可以解决常见的安全问题,例如指针和数组范围。ISO C++总体策略是,使用静态分析来消除潜在错误,但全局静态分析无法承受,所以需要一些规则来简化正在编写的内容,以便有效且廉价地进行本地静态分析,然后提供一系列库来更好地依赖这些规则。

观点二:从技术角度看,用内存安全语言如 Rust 重写大型C/C++ 系统组件后就绝对安全了吗?答案是否定的。本质上讲,Rust和C/C++是不能直接交互的——它们在类型、内存管理和控制流方面都采取了截然不同的方法。内存管理方法方面,Rust的类型系统会静态跟踪对象的生命周期和所有权,C语言要求程序员手动管理内存,而C++虽然提供内存安全抽象,但也允许自由将其与原始指针加以混合。多语言环境的融合会导致系统更加复杂,从而增加安全风险。全部重写工作量巨大,新软件不可避免产生安全问题。

观点三:C/C++语言的地位在可见未来之内不会动摇。首先,操作系统最基本的底层接口,无论Windows还是Linux,只提供C语言接口,在可见的未来和目前的技术框架视野之内不会提供C语言之外的接口(包括Rust);其次,计算机编程领域大量的基础库,包括音视频编解码、图像格式、窗口系统协议、压缩算法,都已提供稳定的C语言接口并经过长期市场验证。市面上可见的其他编程语言在这些基本能力上,本质上都是对这些C语言基础库的封装。



在上文的语境中,在JG应用系统中与C++相对应的是Rust语言。Rust是一种相对年轻的系统编程语言,由Mozilla基金会赞助开发,首个稳定版本于2015年发布。Rust的设计初衷是创造一种可以提供C++级别的性能,同时保障内存安全和线程安全的编程语言。Rust已经逐渐成为系统编程领域的一颗新星,被广泛应用于Web浏览器引擎、操作系统、物联网等场景。

1)性能方面

在性能方面,C++和Rust都具有极高的优势。由于它们都能够直接操作底层硬件,因此在性能上可以媲美C语言。然而,在某些场景下,Rust的编译器可以在编译时进行更多的优化,使得Rust的性能略胜一筹。

2)内存安全

内存安全是编程语言安全性的一个重要指标。C++以指针操作著称,这让程序员可以直接操作内存地址,但同时也带来了潜在的风险。错误的指针操作可能导致内存泄漏、空指针解引用等问题。相较之下,Rust通过所有权系统和借用检查器确保了内存安全。这一机制可以在编译时发现潜在的内存安全问题,从而避免了运行时的内存错误。因此,在内存安全方面,Rust具有明显优势。

3)并发编程

并发编程对于现代软件开发而言至关重要,它可以充分利用多核处理器的性能。C++在并发编程方面提供了一些基本的工具,如线程和互斥锁。然而,在C++中编写并发代码时需要格外小心,以避免死锁、竞态条件等问题。

Rust在设计之初就着重考虑了并发安全性。其所有权系统和借用检查器可以确保在编译时捕捉到潜在的数据竞争问题。同时,Rust还提供了一系列高级抽象,如通道、异步编程等,简化了并发编程的复杂度。因此,Rust在并发编程方面相对于C++更具优势。

4)生态系统

C++拥有着庞大的生态系统,比如boost,Qt,STL等,广泛应用于各个领域。C++库和框架的数量庞大,为开发者提供了丰富的选择。此外,C++还有着良好的跨平台兼容性,可以在多种操作系统和硬件平台上运行。

Rust的生态系统相对较年轻,但发展迅速。它拥有一个快速增长的库和框架生态,如Tokio、Rocket等。虽然Rust的生态系统与C++相比仍有所不足,但随着越来越多的开发者和企业开始采用Rust,其生态系统将持续发展和完善。


C++和Rust各自在不同领域和场景下有着各自的优势。C++在性能、生态系统和跨平台兼容性方面占据优势,而Rust在内存安全、并发编程和易用性方面更具竞争力。因此,选择C++或Rust应根据项目的具体需求和场景来决定。

为适应JG内存安全的应用场景,可以在Rust语言应用进行技术储备,就当前JG应用较多的Qt框架和插件式应用开展同级别的rust插件式框架的预研,特别是界面应用,主要构建JG的插件式框架,同时验证rust软件生态、rust的可用性、rust的内存安全性是否能够满足JG的常见需求,比如态势的业务需求、高可靠性需求、高可用性需求等。





免责声明

本文部分内容摘自网络,因转载众多,或无法确认真正原始作者,如涉及作品版权问题,请与我们联系,我们将在第一时间协商版权问题或删除内容!

推荐新闻
返回列表
试用申请
立即申请
试用申请