- 娱乐
嵌入式软件漏扫工具 中控
时间:2010-12-5 17:23:32 作者:休闲 来源:休闲 查看: 评论:0
内容摘要:中控的嵌入式团队上周又栽了。一个藏在Bootloader里的数组越界,过了三版静态检查,直到实车测试时CAN总线报错才被揪出来。排查花了两天,而漏洞本身只值一行代码。这不是个例,他们的漏扫工具链里,传
中控的嵌入嵌入式团队上周又栽了。一个藏在Bootloader里的式软扫工数组越界,过了三版静态检查,漏具中直到实车测试时CAN总线报错才被揪出来。嵌入排查花了两天,式软扫工而漏洞本身只值一行代码。漏具中这不是嵌入个例,他们的式软扫工漏扫工具链里,传统SAST工具对交叉编译环境支持差,漏具中误报率高达六成,嵌入工程师干脆把扫描结果当垃圾邮件处理。式软扫工 换工具?漏具中没那么简单。嵌入式软件漏扫有个特殊门槛——你得先让工具理解“什么是嵌入这个项目的代码”。中控的式软扫工代码库横跨三款芯片,底层驱动用C,漏具中中间件混着C++,还嵌着供应商闭源的二进制库。通用漏扫工具扫描时,要么把启动代码当成普通函数分析,要么在碰到寄存器地址时直接懵掉。真正有效的方案必须做三件事:解析芯片手册里的内存映射,识别中断向量表,还得把汇编写的临界区保护逻辑纳入检查范围。 他们最后选的路子有点“土”。自研脚本把编译过程产生的.d文件(依赖关系文件)重新组织,生成一份“代码-芯片-外设”的映射表。漏扫工具拿着这张表,只分析实际烧录进Flash的那部分代码,屏蔽掉所有测试桩和条件编译的死分支。这招让误报率降到了百分之十五以下——代价是每次代码合并后要花二十分钟重建映射。 但真正的坑在运行时行为。中控的电机控制任务里有个看门狗喂狗函数,漏扫工具静态分析时认为它“永不返回”——因为函数末尾有个while(1)空循环等待中断。可实际上这个循环会被硬件中断打断,喂狗动作就发生在中断服务程序里。工具不懂这个机制,直接报了个“死循环导致任务挂起”的致命错误。工程师得在代码里加注释标记,告诉工具“这是中断驱动的等待模式”。这类领域知识,任何现成工具都学不会。 倒是有一个发现值得记一笔:把漏扫接入CI流水线后,新代码的漏洞密度反而升高了。原因很反直觉——开发人员知道有自动扫描兜底,写代码时更敢用危险的指针操作和位域技巧。这就像装了安全气囊的司机更容易超速。中控的解法是每周五下午开半小时“漏洞复盘会”,把扫描报告里的典型问题投到屏幕上,让写代码的人自己讲当时为什么这么写。有些对话挺有意思的,比如“我以为这个全局变量只有中断会改,忘了DMA也能访问它”。 现在他们的漏扫结果分三级:红牌(必须立即修)、黄牌(本迭代内修)、蓝牌(记录在案)。红牌标准很简单粗暴——能导致看门狗复位或内存踩踏的。蓝牌大多是代码风格问题,比如未初始化的局部变量,但这类问题在嵌入式里往往比表面更危险,因为编译器优化可能把未定义行为变成随机崩溃。 说到底,工具解决的是“已知的未知”。真正让嵌入式漏扫头疼的,永远是芯片手册第200页那个“建议使用官方驱动”的注释,和供应商闭源库里那些不敢动的函数。中控下一步打算把硬件在环测试的数据反馈给漏扫工具,让工具学会识别哪些代码路径在真实运行中从未被执行过——这可能会筛掉一批理论上有漏洞但永远触发不了的代码。但这事能不能成,还得看硬件组的配合程度。