采用嵌入式安全编码标准的第一步
有太多以安全性为重点的编码实践和标准(即CERT,OWASP,CWE,MISRA,AUTOSAR以及基于IEC 61508的整个标准系列)。您如何确定适用于您的特定项目的一组编码标准?本指南将带您开始前进。
软件在我们的日常生活中越来越重要。日常设备中装有软件,例如汽车、电话、冰箱、手表、医疗设备或飞机。从银行或保险公司到能源工厂或交通控制系统,我们所依赖的组织都依赖可靠的软件。该软件的存在为我们提供了很多机会——居住在智能家居中,驾驶智能汽车以及我们的智能手机和智能手表为我们提供所需的一切,随着越来越多的这些元素相互联系,我们可以增加更多的收益和效率,让我们的生活变得更加轻松。
但是,所有这些都有风险。可以利用软件安全漏洞来获得对任何系统的特权访问。这可能意味着简单的黑客行为,例如在我们不期望的时候关掉灯,或者发出更多令人震惊的攻击,例如用摄像机监视我们,或者在我们不知情或未经许可的情况下清空我们的银行帐户。即使没有网络犯罪分子的参与,导致应用程序出现不良行为的软件错误也会引起类似的问题。由于这些原因,软件安全对于世界各地的公民而言已成为头等大事。
安全编码:从CVE到CWE前25名
1999年,MITRE Corporation(一家由联邦政府赞助的运营研究与开发中心的美国非营利组织)开始在“常见漏洞和披露(CVE)”列表中记录已知的软件安全漏洞。最初的列表包含321个CVE条目,但增长迅速,目前(截至2018年9月),CVE列表包含100,000多个条目,并由92个CVE编号颁发机构(CNA)维护——来自世界各地的不同组织(漏洞研究人员、产品供应商和错误赏金计划),这些漏洞研究人员已被授权将CVE ID分配给检测到的问题。美国国家标准与技术研究院(NIST)、美国国防信息系统局(DISA)等推荐该清单,使用范围非常广泛。
MITRE公司希望使人们更容易理解最常见问题的根源,并采取适当的措施避免以后再出现类似的问题,因此他们根据问题的类型将CVE条目归类,最后以CVE的发布为准。研究人员漏洞示例初步列表(PLOVER)文件。将此工作与其他研究结合起来,可以定义通用弱点枚举(CWE)列表,它是软件弱点类型的正式列表。当前,CWE列表版本3.1包含大约800种弱点类型,分为300个类别和视图。由于这个数字可能不胜枚举,因此CWE与SANS Institute共同维护“Top 25最危险的软件错误”列表,以维护可能导致软件严重漏洞的最广泛和最严重的错误。例如,当前“Top 25”列表的顶部包括SQL注入、OS命令注入、缓冲区溢出和跨站点脚本。
功能安全标准
对于安全性比其他行业更为重要的行业(例如,机载、汽车或医疗保健系统与电视或其他娱乐系统),国际电工委员会(IEC)开发了IEC 61508:电气/电子/可编程功能安全性电子安全相关系统。IEC 61508是用于各种行业的通用标准,但以下也是专用于特定行业的标准,例如:
- 机载:DO-178C / ED-12C
- 汽车:ISO 26262
- 铁路:IEC 62279 / EN 50128
- 核电站:IEC 61513
这些标准考虑了给定领域的细节,但是它们的总体思想(至少从软件角度而言)非常相似。所有这些都需要(除其他验证技术之外)对已开发的代码执行静态分析,并且它们为需要执行的操作提供了一些高级指导,同时还留有很大的解释空间。它们通常不命名要使用的任何特定编码约定或编码标准,而是例如。ISO 26262提到MISRA C作为C编程语言的编码指南示例。
(安全)编码标准
编写安全代码意味着编写不会受到攻击的代码,即不包含可能被利用的弱点的代码。这意味着编写符合某些“安全”模式的代码以及避免“不安全”模式的代码。对于不同的编程语言,这些模式也会有所不同。当然,没有任何一套可以遵循的规则来保证软件的安全性。一些广泛考虑安全性的编码标准包括:
- 对于C语言:MISRA C,SEI CERT C编码标准
- 对于C++语言:MISRA C++,JSF AV C++编码标准,SEI CERT C++编码标准,AUTOSAR C++编码准则
MISRA C和MISRA C++标准是由汽车工业软件可靠性协会(MISRA)开发的。 AUTOSAR C++编码准则由AUTOSAR(汽车开放系统架构)开发合作伙伴关系开发。 JSF A V C++编码标准是由洛克希德·马丁公司开发的。SEI CERT C和C++编码标准包含旨在确保以C和C++编程语言开发的软件系统的安全性、可靠性和安全性的通用规则。
这些标准中的规则通常分为多个类别,以使导航更加容易,因为给定标准中的规则数量可能非常大,例如:
- MISRA C 2012拥有173条指南,156条规则和17条指令
- CERT C有307条指南,121条规则和186条建议
- AUTOSAR有344条指导原则,其中有319条要求和25条“建议”
- CERT C++具有163条准则,其中包含83条C++规则和80条相关C规则
考虑到许多不同的功能安全标准,编码标准以及每种标准推荐或要求的指导原则的数量,在启动使代码安全的计划时,做出正确的选择很重要。
如何选择正确的编码标准
如果需要根据特定的功能安全标准(例如,汽车的ISO 26262或机载的DO-178C)对软件进行认证,则已经做出了初步决定。但是无论如何,都需要做出选择以确定要在开发的软件上实施的一个或多个编码标准或标准或该标准的子集。它可以但不一定是上述标准之一。
接下来,由于无法手动验证是否符合所有这些规则,因此需要选择适当的静态代码分析工具。有开源和商业静态分析工具。挑选一个好人很重要。应该考虑的一些因素是:
- 该工具是否完全或部分支持所选的编码标准?
- 如果功能安全标准要求工具合格,那么该工具是否通过认证?是否提供资格鉴定工具?
- 该工具能否以进行合规性分析所需的形式生成分析报告?
- 该工具能否以开发人员易于阅读的形式生成分析报告?
- 该工具是否与使用过的IDE,构建和CI系统完美集成?
- 该工具是否允许对新代码,更改的代码或旧代码进行选择性分析?
- 该工具是否支持灵活的分析配置?
- 该工具是否利用风险评分算法来帮助对发现的缺陷进行优先级排序?
此外,CWE社区推动了CWE兼容性和有效性计划,该计划是对产品或服务的正式审查和评估过程。“与CWE官方兼容”的产品和服务列表当前包含55个条目。使用此列表中的工具可确保它已达到MITRE正式CWE兼容性计划的最后阶段。
选择编码标准和适当的工具后,对于从头开始的软件项目,应该容易做更多的工作——只需将工具与CI系统集成在一起,并确保没有任何缺陷。但是通常,编码标准需要在已经开发的软件上执行。
在这种情况下,在整个代码库上盲目执行分析可能会报告数百个缺陷,这些缺陷很难一起处理。幸运的是,可以使用多种技术来简化此过程。例如,您可以首先关注新编写或修改的代码,以确保从建立编码标准的那一刻起至少不引入新的缺陷。
另一个好的做法是对报告的缺陷进行优先级排序,以确保首先处理最严重的缺陷。例如,CERT C和C++规则具有与之关联的风险评估,从而可以轻松区分发现的缺陷的优先级。
完善的静态分析工具还可以帮助您首先关注具有最高严重性的规则,随着更严重的缺陷得到修复,可以增加正在关注的规则的数量。
结论
最重要的部分是确保开发团队采取适当的措施来进行分析。如果开发人员不使用它们来修复代码,则静态分析的报告有多好无关紧要,从而可以提供更安全的软件产品。花时间选择正确的静态分析解决方案和编码标准将使您踏上成功之路。