国家网络总监办公室 (ONCD) 近期发布了一份新报告,题为“回归基础构件:通往安全可衡量软件之路”。该报告是 ONCD 新任主管 Harry Coker 发布的首批重要公告之一,为采用内存安全编程语言提供了有力的理由。
这一新重点源于重新平衡网络安全责任、调整激励机制,以利于长期网络安全投资的目标。内存安全的编程语言也被列为开源软件安全倡议 (OS3I) 目标之一,该倡议最近发布了一份新报告。
当程序员编写的代码导致与内存访问相关的问题时,就会出现内存漏洞。常见漏洞由缓冲区溢出和悬空指针导致。若使用 Rust、Go、Java、Swift 和 Python 等内存安全的编程语言,开发人员无法创建导致内存漏洞的代码,因为语言本身包含内存或类型安全等特定属性。若开发者用非内存安全语言(如 C 和 C++)编写代码,则可能无意中写出导致内存访问错误的代码。与内存安全语言在编译和运行时捕获错误不同,这些漏洞会进入最终版本并导致安全问题。
网络安全通常侧重于应对威胁,而降低风险则始于建立能够减少可能导致安全问题的代码错误的实践。Google 报告称,70% 的严重安全漏洞实际上是内存安全问题。广泛使用的编程语言,如 C 和 C++,往往是许多问题的罪魁祸首,尤其是指针错误。
使用内存安全语言可以显著减少甚至完全消除内存安全漏洞。这反过来又降低了最终代码的网络安全风险。除了提高安全性之外,内存安全语言还可以减少崩溃,使开发者无需专注于内存管理问题,从而提高工作效率。
减少内存漏洞是一个复杂的问题,需要多管齐下。报告的重点是让各组织关注与内存安全语言相关的两个具体领域。此外,政府希望重点与技术界,特别是工程师和开发人员建立合作关系,共同努力实现这一关键转变。
以下是随报告一起发布的资料文档中概述的两个主要目标:
攻击区域越小意味着风险越低。造成漏洞的每行代码都会大幅扩大攻击面。导致内存安全错误的单个错误可能会造成大量漏洞。报告建议将内存安全的编程语言作为减少攻击面的最有效方法之一。使用这些语言,程序员不会犯下导致内存漏洞增加攻击面的错误。
许多组织无法准确评估其软件中的风险,因为在不断变化的软件上使用指标极具挑战性。虽然软件可衡量性是一项复杂的挑战,但要实现这一转变,首先要从被动应对转为主动预防。通过开发更好的网络安全质量诊断功能,组织可以更准确地识别并主动修复风险。
虽然倡导组织使用内存安全语言容易,但实际转型过程十分复杂。许多软件程序和库都基于非内存安全语言构建,完全重写整个代码库通常并不可行。
若有可能,使用内存安全的编程语言启动新项目是开始过渡的最简单方法。组织还可以通过仅重写最容易出现内存安全漏洞的关键函数和库(通常包括缓冲区溢出和悬空指针的区域)来减少攻击面,而无需完全重写。部分内存安全语言,例如 Rust 和 Swift,可以与 C 和 C++ 互操作,使这种方法变得可行。在采取这种方法时,组织必须在新语言中整合构建系统和构建抽象层,以便处理共享对象和数据。
然而,实现这一转变需要合适的开发者资源。组织应从评估现有开发团队开始,以确定团队在内存安全语言方面的专业能力。下一步是培训现有开发人员并确保新开发人员熟练掌握内存安全语言。
随着对网络安全的日益重视,许多组织意识到,最重要的一步是从被动应对转向主动预防。从源头开始专注于创建安全代码,组织可以显著降低风险。虽然这不是一个简单或快速的过程,但这种转变带来的益处是意义深远且持久的。