背景介绍

智能化是当代汽车发展的必然趋势,为了增加乘用舒适性,现代汽车将车联网与智能车有机联合,搭载先进的车载传感器,控制器,执行器等,并融合现代通信网络技术,实现车与人、车、路等智能信息的交换共享,V2X从此走进大众视野,开拓智能汽车的网联时代。

但,发展亦为挑战,面对日益增多的ECU,日趋庞大的车载代码,如何保证汽车应用信息安全?怎样才能不给黑客们可乘之机?这是一个严肃的议题,开发人员必须借助相关工具确保嵌入式代码的安全性,否则如下案例便是前车之鉴:

2013年,黑客通过Uconnect软件入侵数十万辆Fiat Chrysler,Fiat Chrysler最终在美国召回了140万辆汽车;

2015年,两名信息安全研究人员成功地在10英里外远程夺取了一辆Jeep Cherokee的控制权;

在刚刚过去的2018年,黑客盗取特斯拉与地图、遥测和车辆服务有关的专有数据,并利用特斯拉公共云入侵计算机系统植入挖矿运算程序。

据Upstream公司统计显示,从2010年到2018年,黑客针对智能汽车的攻击数量激增了6倍,“每一项连接到车上的新服务都为黑客提供了新的入侵途径”。

另据Juniper Research预测,2019年拥有V2V功能的车辆总数逾110万辆,在未来四年内,其年复合增长率高达173%。到2023年,联网汽车数量将达到7.75亿辆,而无钥匙进入、娱乐系统、远程控制单元和连接智能手机等功能将会在更多的车型上配备。

所以,软件信息安全是现在及未来开发过程中的一大焦点。尽管软件工程师会设计诸如数据加密、身份验证协议等来减轻漏洞,但即便如此,软件也有可能存在隐患。为了保证软件安全,您需要从源码级别做起。

据软件工程研究所(Software Engineering Institute ,SEI卡内基梅隆大学研发中心,主要由美国国防部和国土安全部提供资金)估计,高达90%的安全事故都是由于黑客攻击了软件代码或者设计漏洞,黑客利用这些漏洞窃取私人数据,未经授权夺取系统控制权。

为了描述这是如何发生的,让我们举一个例子:C语言缓冲区溢出

C语言缓冲区溢出

什么是缓冲区溢出

当数据超出了既定内存的边界,就会发生溢出错误,比如:

char buff[10];

buff[10] = ‘a’;

这个例子中,声明了一个10字节的数组,但是程序想要索引第11个字节,超出已定义数组一个字节,如果邻近这一数组的内存区要在之后的程序里被占用,那么这种定义会导致不可预知的行为。

分布式网络缓冲区溢出如何吸引黑客

当一个程序运行时,它使用一个叫做“堆栈”的内存区域。当前执行函数作用域内的变量将存储在堆栈中。函数调用的地址也将被存储,以允许return语句返回到正确的位置。当函数返回给调用函数时,程序从它停止的地方继续执行。

因此,如果堆栈上的返回地址被修改为指向其他恶意指令,那么这些指令将在函数返回时执行。如果程序在接收数据(没有进行检查以确保输入缓冲区不会溢出),黑客就有可能设计一个包含恶意代码的输入或“有效负载”。这会使缓冲区溢出,并用恶意代码的地址覆盖堆栈上的返回地址。

所以,黑客可以利用缓冲区错误摧毁一个程序,篡改数据或者盗取信息。

预防安全漏洞至关重要

预防安全漏洞(如缓冲区溢出)至关重要并且是可以实现的,那就是确保代码本身的编写没有可利用的漏洞。英文有句俗’Putting stronger locks on your front door is no use if the windows are left open.’密码访问可以在一定程度上阻止黑客的攻击,但源码的安全才是最根本的保障。

如何保证C代码的网络信息安全

当聊到C的网络信息安全,我们首先会考虑以下3种编码规范:

CERT C

CERT 编码规范由软件工程研究所SEI 的CERT部门发布,它包含了编码和执行错误,还有低级的设计错误,旨在清除代码中可能导致网络安全的编码惯例以及未定义的行为。

CERT C每条规范包含:

· 标题

· 描述

· 不合规代码举例

· 合规代码解决方案举例

· 例外情形

CERT C这样定义漏洞:允许攻击者违反显式或隐式安全政策的一系列情况。缺陷可能很小,甚至可能都不影响软件的性能或者运行结果。然而它会在遭遇攻击的时候暴露问题,导致严重的安全后果。

Common Weakness Enumeration

CWE(Common Weakness Enumeration)是从架构、设计、乃至编码层面描述代码中常见的网络安全问题。由美国MITRE公司发起。CWE可以作为识别、减少、预防漏洞的基线。

CWE按优先级排列漏洞列表。优先级最高的25个条目来自二十多个不同组织的统计数据,他们基于使用频率和重要性评估了每个C代码缺陷,很多CWE列表中的缺陷都和缓冲溢出相关。我们的设计人员、编程者、测试者可以通过遵循CWE来消除典型错误,在编码阶段清除漏洞。

(ps: CERT及最新发布的CWE都包含针对C++的信息安全规范,在此不做详述)

MISRA C

MISRA编码规范由汽车工业软件可靠性协会发布,可以用来防止会导致安全问题和安全漏洞的错误编码,为安全相关系统的开发提供了最好的实践指导,可以说MISRA 是嵌入式系统最为理想的编码规范。目前应用最为广泛的MISRA C:2012 Amendment 1发布于2016年,它新增了C编码的安全指导,包括新的规则和指令,也包含了合规代码和不合规代码的举例说明。

既然以上三种编码规范都可以应用于C代码信息安全测试,那它们之间又有什么关联?还是举个栗子:

MISRA C 2012 Rule 18.1

“A pointer resulting from arithmetic on a pointer operand shall address an element of the same array as that pointer operand”

这条规则与CERT ARR30-C做的是同样的事情

CERT ARR30-C

“Do not form or use out-of-bounds pointers or array subscripts.”

而这两条规则都与CWE C的多个典型安全漏洞相关,比如:

CWE-119

“Improper Restriction of Operations within the Bounds of a Memory Buffer.”

也就是软件对内存缓冲区执行操作,但是它可以从缓冲区的预期边界之外的内存位置进行读写操作。

需要注意的是CERT C 是基于C11设计的,MISRA C 2012是基于C99设计的,MISRA C 2012-Addendum 3专门阐述了两者之间规则的异同点,具体数据如下图:

图1 CERT C & MISRA C 2012规则覆盖汇总

以上数据汇总了CERT C和MISRA C 2012的规则覆盖情况,并根据规则覆盖强度分为:

· Strong:由CERT C规则处理的代码行为被一个或多个MISRA C2012规则覆盖

· Weak:由CERT C规则处理的代码行为仅被一个或多个MISRA C2012指令/Rule1.3覆盖

· None:独立于MISRA C 2012的CERT C规则

图2 部分CERT C & MISRA C 2012规则交叉示例

虽然MISRA C 2012对CERT C的覆盖达到了60%以上,但两者依据的C标准不同,且存在19%的差异,所以,各位大咖还要按需遵循。为此,Perforce(PRQA)公司建议了以下测试方案。

代码信息安全静态测试解决方案

结合工程实际,我们需要选择性遵循相关编码规范:

· 如果开发代码为C,并且要求综合全面的信息安全规则覆盖度,那么您需要同时执行MISRA C 2012(incl. Amendment 1)和CERT C

· 如果开发代码为C++且基于AUTOSAR架构,建议您全面执行AUTOSAR Coding Guidelines

· 如果您使用C++开发且要求遵循MISRA C++ 2008,那么建议您同时执行CERT C++,以保证所开发车辆的信息安全

以上静态测试方案的高效执行,还需借助强有力的静态代码分析器,才能避免CWE中的典型安全漏洞。作为代码静态测试领域的领跑者,Perforce(PRQA)公司的Helix QAC无疑是各大厂商的第一选择。它可以自动执行MISRA、CERT、CWE、AUTOSAR Coding Guidelines等编码规范,拥有超过1600条诊断消息,每一条诊断消息都对应着一种违反规定的语言使用,并且提供详细的指标度量,以及可视化报表,量化代码质量,帮助测试人员深入了解数据流和控制流,大大提高静态测试效率,确保代码的信息安全。

如有需求,可联系北汇信息进行试用申请。北汇信息作为Perforce(PRQA)公司的合作伙伴,将为客户提供专业的静态代码测试工具和服务。

Perforce公司简介

Perforce(PRQA)公司是AUTOSAR组织在代码静态分析领域的唯一会员,负责功能安全软件架构的相关标准制定工作,参与编写了C++14编码指南,制定了AUTOSAR测试方案,并应用其开发的静态测试工具Helix QAC在AUTOSAR Adaptive Platform演示代码上执行代码静态测试。

Helix QAC作为代码静态分析领域的先驱,不仅仅提供针对AUTOSAR C++的诊断,还支持MISRA C/C++、HICPP、JSF AV C++、CERT、CWE编码规范包,其精准的诊断消息和强大的软件生命周期管理平台为全球3000多个整车厂和零部件供应商所信赖。

参考文献

[1] MISRA C:2012 – Addendum 3 Coverage of MISRA C:2012 (including Amendment 1) against CERT C 2016 Edition.

[2]《当黑客盯上智能汽车》-汽车商业评论

[3] How to write Secure C code. -Perforce