汽车软件的模糊测试
01.ISO/SAE 21434与模糊测试
随着AI(Artificial Intelligence,人工智能)、移动通讯、大数据及物联网等新技术、新基础设施建设的高速发展,汽车,尤其是新能源汽车已不再是简单的交通工具,而是逐渐向智能终端转变,安全问题也随之凸显。
2021年8月31日,汽车信息安全领域首个国际标准ISO/SAE 21434(道路车辆-网络安全工程)正式发布,众多OEM厂商(Original Equipment Manufacturer,原始设备制造商)自此逐步加强了对汽车软件的测试:该标准不仅涵盖了车载软件的相关规定,还包括了车载软件与外部系统连接的诸多规定,并重新定义了软件安全工程的需求——OEM厂商需将基于反馈的模糊测试集成到DevOps流程中。
*ECU:Electronic Control Unit,电子控制单元
*OBD:On-Board Diagnostics,车载自诊断系统
*USB:Universal Serial Bus,通用串行总线
*DSRC:Dedicated Short Range Communication,专用短程通信技术
*V2X:Vehicle to Everything,车用无线通信技术
*TPMS:Tire Pressure Monitoring System,轮胎压力监测系统
*ADAS:Advanced Driving Assistance System,高级驾驶辅助系统
模糊测试是一种自动化的安全测试技术,通过给计算机程序提供无效、意外或随机的数据作为输入,并对程序进行监视,检测Bug是否存在,以防止后续诸如崩溃、代码断言失效、内存泄漏等安全隐患的出现。模糊测试可以在开发过程中进行,类似于动态应用安全测试(DAST,Dynamic Application Security Testing)和交互式应用安全测试(IAST,Interactive Application Security Testing)。
02.模糊测试的难点
开发团队和安全保障团队在进行汽车软件模糊测试时,主要会面临以下三个挑战:
1、模糊测试应如何启动?
当团队第一次尝试进行模糊测试时,往往面临着以下困境:预算不足,开发人员不具备相关经验,通常也没有专业的技术支持。整个团队会因为担心项目无法产出有效成果而倍感压力。因此,选择一个合适的项目作为开始非常重要。
2、如何对具有依赖关系的复杂系统进行模糊测试?
现代车辆中的车载娱乐信息系统通常与一系列外部传感器进行通信,其系统代码往往非常复杂。软件之间的依赖关系使开发人员很难对应用程序进行适当的模糊测试,手动操作的工作量非常大。因此,应在应用程序开发阶段就建立不间断的模糊测试机制,用以模拟传感器的输入。该机制比传统的动态应用安全测试或交互式应用安全测试具备更高的自动化程度,也能实现更高的代码覆盖率。
3、如何将模糊测试集成到CI/CD流程中?
将模糊测试集成到CI(Continuous Integration,持续集成)/CD(Continuous Delivery,持续交付/Continuous Deployment,持续部署)中可以更加凸显其自动化的特点。成功集成的关键在于团队之间是否拥有良好的沟通环境,且开发团队、安全保障团队和维护团队应对模糊测试和CI/CD的含义及影响有相同的认知。
03.模糊测试的步骤
可以尝试从简单的项目开始,循序渐进地使用模糊测试,以便在每一个步骤中进行总结与复盘,从而深入使用更加先进的模糊测试方法,保障软件安全。
*API:Application Program Interface,应用程序编程接口
*Web Service:基于网络的模块化组件
*TCP:Transmission Control Protocol,传输控制协议
*IP:Internet Protocol,网际互连协议
*IPSec:Internet Protocol Security,互联网安全协议
*CAN Bus:Controller Area Net-work Bus,CAN总线
*UDS:Unified Diagnostic Services,统一诊断服务
*Protobuf:ProtocolBuffer,谷歌提供的一种数据序列化协议
步骤一:单元模糊测试
初次在汽车软件开发环境中设置模糊测试时,最简单的方法是把之前的单元测试用例作为模板。通常来说,项目中都是已具备单元测试用例的。只需通过在独立的单元测试(例如库函数、API函数或不同类型的解析函数)中设置漏洞检查工具,测试人员便可在几小时内发现绝大部分的安全问题。
当在此阶段出现合并请求时,只需反复执行这些已被定义的过程,就可以轻松实现持续集成。
步骤二:接口模糊测试
由于需要考虑网络层面不同的网络接口协议(TCP/IP、以太网、CAN总线),相关模糊测试人员需要另外理解例如IPSec、UDS和Protobuf等协议——这便是接口模糊测试的时长需要几天甚至几周的原因。测试对象复杂性逐步增加,更多的Bug(程序错误)也会随之显现。
虽然可以在单元模糊测试开始前进行接口模糊测试并得到结果,但调试和分析所出现的Bug可能会耗费更多时间。因此,一般情况下最好先从单元模糊开始。
步骤三:系统模糊测试
在汽车等复杂嵌入式系统中,系统模糊测试是一个长期目标。制造过程的最后阶段,所有测试都必须在硬件上执行,测试人员可用单元测试期间生成的用例作为硬件测试的基础,并通过编译器了解操作系统的实际情况。
参考文献
https://www.code-intelligence.com/blog/roadmap-to-successful-fuzz-testing
原文链接
https://mp.weixin.qq.com/s/SPjPH4qAc7KxDm9BKbd5Ng