《Information》:Evidence-Carrying Portability Contracts for Compiler Security Instrumentation: Differential Reconstruction of Shadow Call Stack Protocols
编辑推荐:
编译器安全插桩只有在编译器、应用二进制接口(ABI)、运行时、加载器、操作系统和硬件保持相同安全契约时才具有可移植性。研究人员提出证据携带可移植性契约(ECPC),一种机器可读方法,将每个版本化配置绑定到七项返回完整性义务、类型化跨层事实、权威决策规则、可执行
编译器安全插桩只有在编译器、应用二进制接口(ABI)、运行时、加载器、操作系统和硬件保持相同安全契约时才具有可移植性。研究人员提出证据携带可移植性契约(ECPC),一种机器可读方法,将每个版本化配置绑定到七项返回完整性义务、类型化跨层事实、权威决策规则、可执行转换见证和字段级溯源。研究人员在x86_64、AArch64和RISC-V上回顾性评估了八个影子调用栈配置。由此产生三点启示:指针发布顺序决定异步处理程序能否破坏槽位所有权;捕获、边覆盖和槽位所有权是相互独立的属性;硬件强制将义务转移到加载器、生命周期和非本地控制流支持中,而非消除这些义务。该重构区分了LLVM RISC-V D84414草案中的两个所有权缺陷、2020年落地形式中的一个缺陷,以及D149099之后的零个缺陷;一个glibc提交区间案例识别出恢复令牌搜索和RSTORSSP对跨上下文longjmp具有决定性作用。Compact TLS x86_64配置仅作为指定设计进行评估,因为其提交的工件相互冲突且实现源码不可用;研究人员不对其性能或生产就绪性作任何宣称。工件2.1.0版和30项语义测试使所有报告的分类均可再生成。该研究展示的是对已知状态的可追溯回顾性区分,而非前瞻性缺陷发现准确性。
研究背景与问题:编译器加固常以命令行选项形式呈现,但影子调用栈(SCS)等机制的保护能力并不只取决于编译器插桩。处理器、ABI、后端、运行时、加载器和操作系统共同决定返回地址的放置、保存、可见性与恢复;任一跨层契约破裂都可能导致已编译特性在新目标上丢失部分预期保证。传统可移植性判断常以表格单元格标注“安全”或“支持”,难以审计确切版本、决定性事实、规则、搜索边界、矛盾来源和运行环境,也容易混淆不同形式的支持。为解决这一表示与可审计性问题,研究人员提出证据携带可移植性契约(ECPC)。
研究内容与结论:ECPC将每个版本化配置绑定到七项返回完整性义务、类型化跨层事实、权威决策规则、可执行转换见证和字段级溯源。研究人员在x86_64、AArch64和RISC-V上回顾性评估八个SCS配置,得出三点核心结论:指针发布顺序决定异步处理程序能否破坏槽位所有权;捕获、边覆盖与槽位所有权相互独立;硬件强制将义务转移到加载器、生命周期和非本地控制流支持中而非消除义务。重构区分了LLVM RISC-V D84414草案的两个所有权缺陷、2020年落地形式的一个缺陷、D149099后的零个缺陷,并识别glibc提交区间中恢复令牌搜索和RSTORSSP对跨上下文longjmp的决定性作用。重要意义在于建立可追溯、可再生成的回顾性区分能力,而非前瞻性缺陷发现准确性。
关键技术方法:研究人员采用四项关键技术方法:其一,形式化ECPC判断记录J=?G,A,C,F,R,E?,以类型化事实、来源注册表和来源层级约束证据;其二,以机器可读规则目录(rules.json)为权威,用冻结期望夹具(validation_cases/rule_expectations.json)测试所有描述符—义务映射,包含30项语义测试;其三,可执行转换模型,状态为σ=?ssp, shadow[0..N?1]?,按版本固定指令序列精化,深度二枚举684个候选调度并保留80个边界等价类;其四,差分重构协议,对八个配置的历史区间(LLVM RISC-V评审历史与glibc提交区间)施加固定规则并生成见证。研究语料为八个完整配置,非生物样本队列;工件归档于Zenodo。
6.1. Outcome and Reasoning Matrix
结果与推理矩阵显示,56个完整性单元格中17个满足、27个条件、9个违反、3个未知;响应策略条目不计入总数。与工件v2.0.0相比,仅FlashStack捕获由满足变为条件;三个所有权行保持满足但改为引用构造特定规则。矩阵揭示:链接寄存器与硬件捕获由构造满足,x86被调用方复制捕获由规则推导为违反,许多部署级属性因ABI、混合代码、展开器或运行时前提不普遍而保持条件性。
6.2. RISC-V Differential Reconstruction (RQ2)
RISC-V差分重构表明,单个中断即可恢复历史进程:D84414草案存在两个独立所有权失败,2020年落地形式修正弹出并保留推送失败,D149099在后继指针存储前发布指针从而消除剩余失败。生成见证显示,外层帧将权值写入槽位2后,处理程序选择同一槽位并用“handler-0”覆盖,外层帧随后从槽位2载入被替换的返回权值。
6.3. glibc CET Commit-Interval Reconstruction (RQ2)
glibc提交区间重构将父提交(35694d3416b2)到提交(35694d3416b2)的变化隔离为:在跨用户上下文longjmp且存在有效恢复令牌的范围内,结果由违反变为满足;该提交在深度调整前增加恢复令牌搜索和RSTORSSP。完整CET非本地平衡仍为条件,因为任意异常或未指定展开器并未被建立。
6.4. Compact TLS x86_64 Specified Design (RQ3)
Compact TLS x86_64作为指定设计得出四个否定结论:捕获为推导违反,因为CALL在调用方复制前暴露普通栈权值;覆盖为推导违反,因为指定省略使x86返回权值留在可写普通内存;唯一槽位所有权被有界推送见证违反,因为先存储后发布会使异步处理程序选择并覆盖同一槽位;非本地平衡被构造轨迹违反,因为longjmp丢弃普通帧而未恢复紧凑SSP。在声明的先载入后递减顺序下,弹出满足P2,所有权缺陷仅限推送发布。
6.5. Comparative Implications
比较性含义表明所有权与捕获、覆盖相互独立。LLVM 7 x86在发布协议上所有权安全,但捕获在CALL后暴露且非常短叶函数未被插桩,因此覆盖违反。AArch64、FlashStack与CET分别通过原子寻址、直接映射和硬件构造满足所有权,但FlashStack捕获在其发布威胁模型下为条件,CET部署仍依赖兼容硬件、内核、加载器/运行时、对象与事件特定恢复。
讨论总结:指针发布是所有权边界,晚获取与早释放是对偶的异步破坏模式,D84414和D149099构成可复用协议原则。捕获、覆盖与所有权独立,修复发布顺序不能关闭调用到序言窗口,保留寄存器也不能初始化新线程。硬件强制将义务转移至系统栈:CET提供强局部构造,但依赖加载器启用、对象兼容、信号状态、用户上下文转移和展开;glibc重构证明INCSSP只能调整深度而不能选择另一影子栈,必须依靠恢复令牌搜索和RSTORSSP。前瞻性评估应冻结模式与规则后选择未见目标,并用时间戳预测送交维护者判定;独立验证至少需要两名不持有历史标签的分析者盲编码并报告一致率。
结论翻译:这项研究得出三个实质性发现。第一,影子调用栈指针发布是所有权边界:晚获取与早释放是对偶的异步破坏模式,RISC-V历史将其从两个缺陷减少到一个再到零。第二,捕获、边覆盖和槽位所有权相互独立;正确的压栈/弹出序列不能修复已暴露的权值或从未被插桩的边。第三,硬件强制将可移植性义务转移而非消除,因为CET仍依赖加载器策略、生命周期和控制转移恢复。ECPC通过将每个结果绑定到配置区间、源级序列、类型化跨层前提、权威选择器到结果规则和可执行见证,使这些发现持久可审计。规则目录修复本身展示了该纪律的价值:FlashStack的命名威胁模型条件强制条件性捕获结果,而AArch64、FlashStack和CET的所有权结果在匹配其实际构造的规则下满足。该工件是差分回归记录,精确显示哪一层、哪项义务、哪条规则和哪个结论发生了变化。