一种基于编译器自定义段与链接脚本隔离的安全关键数据完整性自动保护方法及系统与流程

摘要: 本发明涉及计算机软件,更具体的说是涉及一种基于编译器自定义段与链接脚本隔离的安全关键数据完整性自动保护方法及系统。背景技术:1、在计算机安全系统中,软件必须满足...
一种基于编译器自定义段与链接脚本隔离的安全关键数据完整性自动保护方法及系统与流程

本发明涉及计算机软件,更具体的说是涉及一种基于编译器自定义段与链接脚本隔离的安全关键数据完整性自动保护方法及系统。

背景技术:

1、在计算机安全系统中,软件必须满足数据完整性要求。各行业对软件数据完整性要求是:(1)运行时数据完整性验证——所有安全关键/安全相关的全局数据和静态数据必须实施运行时完整性监控,确保单粒子翻转(seu)、内存比特翻转等随机硬件故障能够被及时检测,同时需具备检测软件逻辑错误(如野指针写入、数组越界访问、栈溢出等)导致的非法内存篡改的能力;(2)数据耦合与控制耦合分析——安全标准普遍要求对安全关键软件进行数据耦合和控制耦合分析,以证明模块间/组件间的数据交互不会产生未预期的故障传播;(3)地址空间内数据隔离——在模块化软件架构中,操作系统级的内存保护(mmu/mpu)通常仅提供进程间或分区间隔离,但同一进程/分区/地址空间内部的所有线程、模块共享完整地址空间,任一代码区域的野指针、数组越界、栈溢出均可直接破坏同地址空间内其他模块的全局/静态安全数据。

2、现有技术方案在以下方面存在显著不足:

3、第一,安全变量清单的人工维护方式存在根本性遗漏风险。现有工程实践中,安全关键变量的识别和清单维护几乎完全依赖人工,开发人员需要在独立的配置文件、excel表格或专用工具中手动列出每个安全关键变量。代码与清单分离,新增或修改变量时,开发者可能忘记同步更新清单。在大型工业软件项目中(代码规模可达数十万至数百万行),这种遗漏几乎不可避免。

4、第二,缺乏从物理内存布局层面的底层隔离。现有上层软件防护手段——互斥锁、信号量、访问权限检查、aslr、stack canary等——均工作在逻辑层/软件层,无法从内存物理布局层面阻断越界写入。栈溢出可跨过canary直接覆写相邻数据段,堆越界可超出分配边界污染后续内存区域。虽然链接脚本控制段布局是gcc等工具链的基本功能,但现有技术中缺乏一种将编译时自动标注的安全关键变量索引信息通过链接脚本集中隔离、并与运行时校验形成完整闭环的系统化方法。

5、第三,校验时机单一,无法覆盖软件运行全生命周期。多数现有方案仅在上电初始化时执行一次数据完整性校验(如flash ecc校验、固件签名验证),其隐含假设是初始化之后数据不再变化。然而seu可在运行期间的任意时刻发生,软件逻辑缺陷同样可能在运行期间的任意时刻产生非法写入,单一上电校验完全无法覆盖运行时新发生的故障。

6、第四,缺少从编译到运行的一体化自动化验证闭环。现有方案中,变量的完整性标记、模块级校验往往是多个独立工具或独立流程的拼凑,各环节之间数据流断裂,无法形成可信的完整性证据链。

7、第五,依赖专用硬件的方案工程落地难。部分学术研究提出了基于merkle tree和专用硬件电路的完整性校验方案,但这类方案需要处理器内置专用验证电路,无法在工业界大量使用的商用嵌入式处理器上部署,且其设计目标多为防御外部安全攻击(security),而非检测随机硬件故障(safety)。

8、因此,如何提供一种从编译时到运行时全流程自动化地保护全局变量与静态变量数据完整性的方法及系统是本领域技术人员亟需解决的问题。

技术实现思路

1、有鉴于此,本发明提供了一种基于编译器自定义段与链接脚本隔离的安全关键数据完整性自动保护方法及系统,利用编译器自定义段机制,在编译时将分散在各源文件中的安全关键变量的地址与长度信息声明式地归入编译器命名段;通过链接脚本将这些编译器自定义段放入与普通数据段、栈段、堆段在物理地址空间上分离的独立存储区域;运行时以链接器导出的段边界符号为遍历范围,对隔离后的安全数据区域执行周期性完整性校验,构建“编译标注—链接隔离—初始校验—运行校验”四阶段联合数据完整性保护管线。

2、为了实现上述目的,本发明采用如下技术方案:

3、一方面,本发明提供了一种基于编译器自定义段与链接脚本隔离的安全关键数据完整性自动保护方法,包括:

4、s1:在源文件中通过编译器段属性指令将每个安全关键变量的地址和长度信息存入编译器自定义链接段中,同时附加防优化属性,使各源文件中的变量索引在编译阶段自动汇聚至命名段;

5、s2:在链接脚本中将所述自定义段放入独立存储区域;

6、s3:计算所述自定义链接段的离线校验值并保存;

7、s4:系统初始化时,在安全关键变量完成初始赋值后,同步执行上电自检和初始密封;

8、s5:每个应用周期执行业务逻辑前,以与初始密封相同的遍历方式和校验算法重新计算当前校验值,与已存在的校验值比对;若一致则允许执行业务逻辑,若不一致则执行故障安全响应;

9、s6:若本周期内业务逻辑对安全关键变量进行了合法修改,则在修改完成后立即重新计算当前全部变量数据的校验值并密封。

10、优选的,s1中所述编译器段属性指令通过一个编译器宏实现,所述宏以模块名为参数,在编译时静态定义一个包含模块所有安全关键变量运行时地址指针和变量字节长度的记录常量数组。

11、优选的,s2中所述链接脚本使用keep指令保护所述自定义链接段不被链接器的未引用段垃圾回收机制移除,并为自定义链接段导出边界符号;所述独立存储区域通过链接脚本中的地址区域定义实现,与代码段、普通数据段、栈段和堆段在物理地址空间上不重叠。

12、优选的,s4中所述上电自检具体包括:遍历所述安全关键数据所在的内存区域,计算上电期校验值,与离线校验值进行比对,若不一致则判定数据异常,系统拒绝进入正常运行状态;若一致,进入运行状态。

13、优选的,s3中计算所述自定义链接段的离线校验值具体包括:遍历所述自定义链接段内记录的所有变量地址和长度信息,采用校验算法计算全部安全变量当前数据的完整性校验值,并将校验值作为运行时密封基准保存。

14、另一方面,本发明还提供了一种基于编译器自定义段与链接脚本隔离的安全关键数据完整性自动保护系统,包括:

15、构建模块,用于在源文件中通过编译器段属性指令将每个安全关键变量的地址和长度信息存入编译器自定义链接段中,同时附加防优化属性,使各源文件中的变量索引在编译阶段自动汇聚至命名段;在链接脚本中将所述自定义段放入独立存储区域,计算所述自定义链接段的离线校验值并保存;

16、初始化密封模块,用于系统初始化时,在安全关键变量完成初始赋值后,同步执行上电自检与初始密封;

17、周期校验模块,用于每个应用周期执行业务逻辑前,以与初始密封相同的遍历方式和校验算法重新计算当前校验值,与前一周期的密封基准已存在的校验值比对;若一致则允许执行业务逻辑,若不一致则执行故障安全响应,若本周期内业务逻辑对安全关键变量进行了合法修改,则在修改完成后立即重新计算当前全部变量数据的校验值并密封。

18、经由上述的技术方案可知,与现有技术相比,本发明公开提供了一种基于编译器自定义段与链接脚本隔离的安全关键数据完整性自动保护方法及系统,具有以下有益效果:

19、(1)本发明仅需在每个安全关键全局变量或静态变量的声明后紧跟一行编译器宏,变量的增删改在编译阶段自动反映到自定义段的内容中,无需在任何外部清单文件、数据库或配置表中手动维护变量信息。从根源上消除了“代码与清单不同步”导致的校验盲区。

20、(2)本发明通过链接脚本将安全数据段放入与普通数据ram物理地址分离的独立存储区域中,栈溢出、堆越界、普通数据段越界等底层内存破坏行为因无法跨越链接脚本定义的内存区域边界,从根本上被阻断。

21、(3)上电自检在系统启动时验证固件烧录正确性和初始内存状态;运行时周期巡检在软件运行的每个周期覆盖新发生的seu位翻转和软件逻辑篡改。两个阶段在时域上无缝衔接,完整覆盖从系统上电到持续运行的全生命周期。上电自检使用的基准校验值为离线计算并固化在rom中的“黄金参考值”,与运行时实时计算值比对,可同时检测烧录错误和初始内存异常。

22、(4)通过建立基准-校验-合法修改-重密封,形成运行时的闭环保护机制。合法修改通过重密封更新基准后无缝衔接下次校验,既保护数据免遭意外篡改,又不阻碍正常的业务数据更新。每个模块独立密封、独立校验,校验失败时可直接定位到具体功能模块,支持模块级故障隔离和功能降级。

23、(5)完全基于标准编译器与链接器特性,纯软件实现,零专用硬件依赖。无需处理器内嵌任何专用硬件验证电路,可在几乎所有主流嵌入式及通用处理器平台上直接部署。

24、(6)自动支撑功能安全标准的数据耦合分析。所有安全关键变量的地址、长度、所属模块等元数据被编译器自动标注至自定义段中,可从生成的可执行镜像的符号表和链接映射文件中直接提取,用于支撑各行业功能安全标准要求的数据耦合与控制耦合分析。