静态分析如何提高多核平台的安全性
扫描二维码
随时随地手机看文章
多核处理器在嵌入式设备中无处不在,但是对于开发安全关键型设备来说,仍然是一个重大挑战。多核处理器提供真正的并发性,意味着需要真正多线程的编程,这仍旧很难处理。在任务关键型软件中,静态分析是关键,因为它可以捕捉到传统测试(例如单元、功能和系统测试)遗漏的缺陷,及开发者花费数个小时甚至许多天才能解决的缺陷。在安全与保安关键型系统中,多核平台的优势必须大于风险。
安全关键型系统中的多核
多核处理器及其相应的硬件平台为安全关键型系统提供许多重要的功能:
1.分区:一个单一硬件单元可以通过虚拟分区安装多个操作系统和应用软件。多核CPU为强大的分区提供性能和处理器支持。
2.分割:类似于分区,但是可以将系统关键部分与非关键部分分割开来。例如,嵌入式平台可以安装一个实时操作系统,来控制一个带用户界面的强大且多功能的操作系统。
3.整合:多核平台在单一平台上提供分割功能,大幅减少产品所需的材料成本。提高单位电压的处理器性能会降低运行成本。
图1. 在多核平台上采用虚拟分区的系统案例。按照关键性和功能来分割是具有可操作性的。
但是,多核处理器为多线程软件引进了真实且基于硬件层级的并发功能,而在开发编程中非常难侦测并解决潜在缺陷。尽管在极端情况下,可以向单一线程操作系统中强制施加安全关键性代码,但是效率却非常低。选择适当的并发程序设计和正确的工具可以使得多核处理器上编程的风险较低。
传统单元测试与多核并发编程比较
一般来说,单元测试假设为单线程操作系统——为预计输出提供输入和输出检查。在多线程编程中,“单元”之间的关系复杂,正确的测试方法是需要优先考虑的因素。多核平台加入了真实的硬件并行行,这就意味着线程是真实并行运行的。此外,事件在系统中的计划和调度变得不确定,因为指令交错在可用的处理器内核(或者超线程CPU线程)中。下图显示了从两个指令和两个线程到三个指令与两个线程之间交错的复杂性。根据安全关键程度,这可能会被禁止。如果不禁止,那么就意味着需要特别小心,以确保正确操作。
这种复杂性显著增加了测试的工作量、缺陷的风险度和脆弱性。幸运地是,静态分析工具可以帮助检测数据访问冲突情况和同步缺陷,这些在单元测试和次级单元测试中都很难被探测出来。
静态分析,侦测并发问题
静态分析工具创建分析软件的内部表征(IR),以推理出预计的行为。作为这种推理的一部分,它可以侦测可能会超越传统测试技术的冲突情况和并行性问题。GrammaTech CodeSonar可以侦测出多线程并行应用程序中的以下复杂缺陷:
----数据冲突:当两个线程都访问一个共享数据,且没有清晰且正确的同步时,会出现数据冲突。这种错误会导致系统处于不稳定状态,可能会偶尔随机出现。
----死锁:当单线程通过同步机制访问共享资源,但没有为其它线程访问释放时,就会出现死锁。这通常是由于同时采用了多种同步机制(锁定一个资源后再锁定第二个,但仍然处于等待状态)。
----进程饥饿现象:当线程被阻塞在一个同步对象上很长一段时间时,就会发生饥饿现象(starvation)。在实时软件中,这会影响系统运行,或触发监视警告。
----不当同步:滥用线程同步源语,例如缺失锁定或解锁对导致不可预测的系统行为。CodeSonar能探测到软件中的多种锁定和解锁乱用。
安全与保安的影响
并发错误和不当线程行为对于开发者进行侦测、诊断和修复来说是一个令人头疼的问题。由于这些错误会对系统行为产生重大影响,因此,它们会产生巨大的安全与保安风险。在极端情况下,真正的并发编程会由于安全问题(会采用上述分区来处理)受到禁止。然而,利用真正并发会带来性能优势,这两者是并行的。采用时,需要加倍小心。
静态分析工具为测试安全关键性系统提供独一无二的好处,因为他们不依靠测试用例(反过来,这可能有缺陷),并且解决传统系统测试无法解决的问题。在部署的任务关键型软件中,在部署前可能没有发现的严重并行缺陷,使用CodeSonar会发现并解决。
由于潜在的影响,利用并发漏洞是一个慎重的考虑。触发并发错误会导致系统不稳定和拒绝服务,甚至更糟。如同所有其它的潜在缺陷一样,如果存在威胁向量,需要按照正确的优先级进行处理和响应,那么并发错误可能也是安全缺陷。
总结:
传统测试往往忽视并发问题,只到系统测试阶段才会发现,或者完全遗漏——此时已经太迟、太危险,也太过于昂贵了。在安全性系统中,这就意味着大量的返工和重新测试,因为验证环境意味着高额成本。GrammaTech CodeSonar在早期,即开发代码时,通过系统行为分析,无须大量的测试,即可检测这些问题,降低风险,节约成本。