Common Weak Enumeration (CWE) 是软件弱点和漏洞的类别系统,现在用于为开发关键任务嵌入式系统的人员提供源代码分析工具的通用词汇表。CWE项目的一些不同分组(例如与一般编码实践相关的分组)侧重于软件系统中特定于安全的部分,包括身份验证和加密,以及可以通过适当选择编程语言或工具来缓解的部分。最近决定在CWE的框架内包括“通用质量枚举”,该枚举将推广其适用于各种软件弱点,而不是严格意义上与网络安全相关的弱点。
制定 CWE
Common Weak Enumeration(CWE,http://cwe.mitre.org)已经成为每个具有安全意识的任务关键型嵌入式系统开发人员的事实上的参考资源。CWE将所有已知的网络安全漏洞分类为一个系统编号的列表,最新版本(3.2版,从2019年1月开始)包含800多个弱点和近1,200个项目。CWE源于MITRE公司(马萨诸塞州贝德福德和弗吉尼亚州麦克莱恩)的一个项目,该项目旨在描述和总结不断增长的常见漏洞和暴露(CVE)列表;MITRE还与美国国家标准与技术研究院(NIST)维护的国家漏洞数据库(NVD)一起维护CVE列表。
CVE和NVD一起记录了每个公开的网络安全漏洞和暴露事件,可以追溯到1999年。CWE试图将网络安全漏洞和暴露事件分为不同的类别,以便为工具,网络安全专家和整个关键任务软件开发社区提供通用词汇。在 3.2 版中,已努力包含更普遍的质量弱点,这些弱点源自 CQE(通用质量枚举)项目。这些类型的弱点与安全问题没有直接关系,但仍然可能导致生命周期中的重大问题,并且通常可以通过检测以安全为中心的弱点的相同类型的工具检测到。
CWE被用于各种上下文,但也许最重要的是与源代码分析工具有关。从历史上看,每个这样的工具都有自己特定的词汇表,所有这些词汇表都有可能令人困惑或模棱两可的描述,确切地说它旨在检测什么样的软件问题。然而,随着CWE的出现,许多源代码分析工具已经开始使用相关的唯一CWE标识符来识别它们检测到的问题。使用CWE,这种共享词汇能够以有意义的方式组合和比较来自多个工具的结果。即使使用通用术语,使用多个工具也有优势,因为在检测潜在的源代码缺陷时,不同的工具往往具有不同的优势。
CWE 示例
CWE最好通过示例来说明。在第一次查看 CWE 时,区分不同类型的弱点通常是有帮助的。有些我们可以称之为通用,因为它们在任何和每个应用程序中都是值得关注的,例如缓冲区溢出(CWE-120)。基本上,所有程序都使用表、数组或字符串,对于所有此类程序,尝试向表、数组或字符串中放入比它可以容纳的更多内容肯定会产生问题,如果语言通过运行时检查捕获此类尝试,或者最终如果由此类缓冲区溢出损坏的数据用作计算后期阶段的输入。CWE-120的 http://cwe.mitre.org 条目如下(表1)。
表 1:CWE-120。
除了 CWE-120 之外,还有一组相关的弱点,这些弱点涉及将索引到数组边界之外的类似数组的结构中。在CWE网站上搜索“数组越界”会生成相关CWE条目的列表,其中不仅包括对弱点的描述:它们还包括一些示例来说明那些编程语言中的弱点,其中编译时或运行时检查不会自动检测到弱点。此外,在一些更基本的 CWE(如 CWE-120)的条目中,还提供了其他部分,例如介绍模式、适用平台(通常是弱点更普遍的编程语言)、常见后果、利用的可能性和潜在的缓解措施。缓解措施部分将确定不太可能出现漏洞的语言或平台,以及软件开发或部署实践,这些实践将减少在所使用的语言或平台无法自动阻止漏洞的环境中被利用的可能性。
除了缓冲区溢出及其相关危险等普遍弱点之外,还有一些弱点更特定于应用程序,具体取决于应用程序的性质。例如,正确使用身份验证和授权可能与在物理安全位置之外无法访问的应用程序无关。CWE-284,访问控制不当,解决了这一特定于应用程序的弱点(下一页的表2)。
表 2:CWE-284。
与缓冲区溢出一样,还有一组其他 CWE 条目专注于此一般弱点领域的特定元素。在CWE网站上搜索“身份验证和授权”会生成示例列表。
尽管此类特定于应用程序的 CWE 可能并不适用于所有系统,但具有外部连接的系统的比例每天都在增长。例如,过去只有飞行员才能使用的军事系统现在正在联网,以改善协调和态势感知。尽管网络中的其他系统本身可能是安全的,但干扰通信的可能性始终存在。即使是这些纯粹的计算机到计算机连接也可能需要身份验证和授权,以避免不友好方的欺骗或损坏。最重要的是,越来越多的以前特定于应用程序的CWE在其相关性方面变得更加普遍。
如上所述,刚刚在CWE版本3.2中添加的一组新的CWE条目与安全性没有直接关系,但仍然与强大的关键任务嵌入式系统的构建和发展相关。该组源自几年前构建的实验性通用质量枚举 (CQE),包括 CWE 条目,例如 CWE-1041,冗余代码的使用(表 3)。
表 3:CWE-1041。
如表的扩展描述所示,相同代码的重复副本会严重影响系统的维护和演进。这也是一个普遍的质量和可维护性问题,事实上,几乎每个系统都会发生,与编程语言或开发过程无关。甚至还有一个三个字母的首字母缩略词专门用于这个问题:DRY – 不要重复自己!代码的重复在某种程度上是“不要重新发明轮子”的另一面。无论是重复自己还是重新发明轮子,都不是程序员构建长期关键任务系统的正确答案。关键是抽象、模块化和编程平台底层的良好库系统,因此可重用的组件可以抽象为可以多次调用或实例化的组件,而无需依赖复制和粘贴。
CWE 兼容工具
正如上述少量CWE条目所证明的那样,CWE与软件密集型系统开发过程中每天面临的挑战直接相关。有了这个通用词汇,软件项目现在可以根据工具是否可以检测甚至建议更正正在开发或部署的系统源代码中的此类弱点来识别和评估工具。事实上,MITRE 已经建立了一个遵循 CWE 命名法的工具注册表,无论是在控制其操作方面,还是在生成报告方面。此工具列表作为MITRE的CWE兼容性和有效性计划的一部分进行维护。
目前,大约有35家公司在CWE兼容工具注册表中列出了50多种工具。要在注册表中列出,该工具必须至少满足以下六个条件中的前四个:可使用 CWE 标识符进行 CWE 搜索;必须包含或允许用户获取相关的 CWE 标识符;必须准确链接到适当的 CWE 标识符;必须描述 CWE、CWE 兼容性和 CWE 相关功能;必须明确列出功能声称覆盖范围和有效性的 CWE-ID,以防止在软件中定位;并且必须在网站上显示 CWE 评估软件的测试结果。
作为某些类型的工具如何将 CWE 标识符集成到其用户界面中的示例,下面是静态分析工具的屏幕截图,展示了它在示例程序 [dining_philosophers.adb – 基于经典的餐饮哲学家算法] 中检测各种 CWE 问题的能力(图 1)。
图1:屏幕截图演示了该工具在示例程序中检测 CWE 问题的能力。
如上所示,显示的每条消息都包含与每个已识别问题关联的 CWE 标识符(在本例中,我们看到缓冲区溢出和数字范围溢出)。图形界面还使用户能够通过CWE标识符识别当前感兴趣的特定弱点,从而过滤掉与这些问题无关的消息。虽然此处未显示,但将鼠标悬停在 CWE 标识符上会显示弱点的简短描述,因此用户无需尝试记住每个 CWE ID 的含义。
作为另一个示例,下面是一个工具的屏幕截图,该工具支持在 Ada 的 SPARK 子集中编写的程序的程序属性的形式证明。
图2:屏幕截图显示了相应的 CWE 标识符。
在这里,我们再次看到指示工具无法完全自动化证明运行时错误缺失 (AoRTE) 属性的位置的消息包括适当的 CWE 标识符。上面还显示了一个搜索功能,可以过滤掉非 CWE 邮件(在本例中,通过在搜索框中写入“CWE”),或者可以识别引用特定 CWE ID 的邮件。
MITRE对常见弱点枚举的定义为开发更安全,更健壮的软件密集型系统的整个过程做出了重要贡献。它提供了一个通用词汇表,有助于软件开发组织内部的沟通,并允许用户理解和比较用于扫描和分析任务关键型软件源代码的工具的功能。设计人员会发现,将CWE兼容功能纳入静态分析和形式化方法工具集,使用户能够轻松了解可以消除的安全性和鲁棒性问题。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !