《Electronics》:GC-Assisted Runtime Integrity Verification for Heap-Resident Bytecode in an FPGA-Based Virtual Machine
编辑推荐:
动态语言虚拟机将已编译函数存储为垃圾回收堆对象,然而嵌入式与现场可编程门阵列(FPGA)完整性机制仅在加载时检查代码,或忽略内存中是否存有活跃代码。picoStella是一种面向FPGA的概念验证虚拟机,在每次垃圾回收(GC)过程中对活跃代码进行重新认证:在标
动态语言虚拟机将已编译函数存储为垃圾回收堆对象,然而嵌入式与现场可编程门阵列(FPGA)完整性机制仅在加载时检查代码,或忽略内存中是否存有活跃代码。picoStella是一种面向FPGA的概念验证虚拟机,在每次垃圾回收(GC)过程中对活跃代码进行重新认证:在标记之后,验证过程利用标记位,以SHA3-256(安全散列算法3)对每个可达函数重新计算散列,并与一次性写入的可信摘要进行比对。该设计在两种仿真器上通过了36个测试平台且结果一致,针对Cyclone IV E FPGA完成了综合,其验证器在DE2-115开发板上进行了测试。闭式模型可精确预测每函数开销;对于最多八个256字节函数,验证使标记-清除开销增加167–8914%。复用回收器的可达性相较于自带遍历的验证器节省0.40%,而相较于不感知活跃性的清扫器最多节省83%。检测耗时42–314个周期,全部5770个注入的字节码故障均被检测到,板级调试寄存器注入复现了这些延迟。片上时钟毛刺在4.5%的损坏试验中击败了检测。寄存器级软错误注入表明SHA3状态翻转会安全失效,而控制或元数据翻转可能导致过程挂起或跳过某函数。检查时间到使用时间窗口被收窄而非闭合;复位清除的锁并非信任根;更大规模的开销为外推值。
研究背景方面,嵌入式与可重构系统日益运行托管型动态语言工作负载,托管运行时将已编译函数与闭包表示为垃圾回收堆上的普通对象,使语言可将代码作为数据处理并自动回收内存,但这也构成现有完整性机制大多未应对的硬件安全风险。函数字节码一旦加载即为普通读写内存,可被内存安全缺陷、故障注入、Rowhammer或恶意直接内存访问(DMA)触及。仅在加载时检查代码的安全启动模型在执行开始后无法提供任何保护。相邻的三类硬件研究各自只解决部分问题:硬件垃圾回收虽成熟但不确认所管理代码是否仍为加载时的代码;硬件内存完整性机制(如Bonsai Merkle树及其FPGA变体)在物理攻击模型下为通用内存提供强篡改检测,但保护的是固定块的数据而非活跃性随执行变化的动态对象图;硬件控制流完整性(CFI)检测被劫持的控制流,但不检测非执行期间代码本身被篡改。据文献检索所能确定,尚无现有机制对以可移动、垃圾回收对象形式存在于动态语言堆中的可执行代码进行重新认证。为此研究人员提出并实现了picoStella,一种将SHA3-256字节码重新验证与垃圾回收耦合的概念验证硬件机制:每次标记阶段后,对回收器判定为活跃的函数依据一次性写入的可信摘要重新计算散列。研究结论表明,验证开销严格遵循闭式每函数模型且以散列计算为主(在测量范围内为标记-清除开销的167%至8914%);复用回收器可达性相对于自行计算可达性的验证器仅节省一次冗余遍历(最大配置下为0.40%),但相对于不感知活跃性的清扫器可避免对每个不可达函数的散列(最多83%)。活跃代码损坏至多在两个过程内被检测(四个函数时为42–314个周期);注入字节码的全部5770个故障均被检测,多引用对象模型、定向恢复与有界抢占均经功能验证。寄存器级软错误测试表明SHA3状态翻转会安全失效,而控制寄存器与堆元数据翻转可能导致过程挂起或使函数未经验证。该机制的意义在于将未被检测的损坏可持久窗口从无界(仅加载时验证)收窄为有界值,并明确界定其保证与非保证:不闭合检查时间到使用时间窗口、复位清除的散列表锁并非信任根、不提供完整运行时代码完整性。所有周期计数来自小配置的寄存器传输级(RTL)仿真并在两种仿真器下复现,更大规模开销为基于模型的推断;板级结果仅针对验证器模块,片上时钟毛刺测试表明单周期时序故障可使检测失效而非仅延迟检测。
研究人员开展研究采用的主要关键技术方法包括:以SystemVerilog实现的SHA3-256硬件核心(1600位Keccak状态存于25个64位寄存器,每周期执行一轮Keccak-f[1600]置换);三色标记-清除回收器(标记位驱动验证过程选取活跃函数对象);GC耦合验证器与字节码解释器的顶层集成(解释器扫描自身活跃操作数栈提供根集);面向Cyclone IV E FPGA(DE2-115板,EP4CE115F29C7)的Quartus Prime综合与TimeQuest时序收敛;基于Icarus Verilog与ModelSim的双仿真器回归(36个测试平台,固定种子0xC0FFEE42的xorshift32随机化);以及板级UART加载、调试软故障寄存器注入与片上时钟毛刺发生器等物理验证手段。
研究结果方面,第一,开销随对象数量与字节码规模的变化:通过跨四种活跃对象数与四种每对象字节码长度的采集开销测量得出,仅标记-清除遍历随对象数八倍增长仅从21周期增至28周期,而启用验证后开销由散列主导,八个256字节对象时验证占2524总周期中的2496周期。第二,相对开销与吞吐:将数据折算为基线百分比得出,开销从单一3字节函数的167%至八个256字节函数的8914%,且归一到每字节后固定每次验证开销随消息长度增长而摊薄。第三,按阶段的周期归属:对四个活跃对象,标记与清除阶段在散列3字节函数时合计仅占162总周期中的6周期,在散列256字节函数时占1270周期中的6周期,表明该开销近似恒定且与对象大小无关。第四,闭式每函数验证开销模型:通过覆盖1至511字节、跨越四个136字节速率边界的十二种长度扫描得出模型Cverify(L)=53+24?L/136?+L?δ(L),与全部十二种实测长度精确吻合,且验证了开销取决于字节码长度而非字节内容。第五,仅加载时与持续验证策略的比较:通过对同一损坏事件下十次无故障过程的累计开销测量得出,持续验证在该窗口内为仅加载时验证的十倍且比值随执行无界增长,但持续验证能检测仅加载时验证在任何代价下都无法检测的加载后损坏。第六,检测延迟:通过四个活跃函数、每次试验损坏一个且各函数独立存储的三种场景测量得出,检测时间取决于扫描位置与损坏相对上次检查的时机,跨过程上界为314周期(最坏角52.68 MHz下5.96 μs)。第七,损坏检测覆盖率:通过对活跃函数字节码施加单比特穷举翻转、固定种子随机单比特翻转、固定0x00/0xFF故障、2–32位随机多比特故障及2–64位连续突发故障等故障模型得出全部5770个注入故障均被检测,且89,552次无注入验证过程未产生误报。第八,混合组成与垃圾不变性扩展:通过固定总活跃对象数变化可执行对象数、以及固定总分配数变化可达数的实验得出开销随可执行函数数线性增长(每两个函数增加624周期),每可达对象恰好增加一周期且与不可达垃圾数量无关。第九,鲁棒性测试:通过在五个时点断言复位及对可信散列表写入一次强制的测试得出复位后干净过程须匹配模型精确预测周期数,锁定时对已加载与未触碰索引的写入均被拒绝。第十,设计复杂度:通过静态代码度量得出经验证回收器12个状态对未验证回收器5个状态(2.4倍),复杂度集中于多周期散列核心握手。第十一,FPGA综合结果:通过Quartus Prime对两个模块分别综合得出picostella_verified_gc在慢速1200 mV、85 °C角下Fmax为52.68 MHz,picostella_system为53.82 MHz,均超过DE2-115原生50 MHz振荡器5–8%余量。第十二,独立验证器比较:通过插入完整第二遍根扫描与追踪的独立验证器测量得出集成的节省在每种长度下恰为N+2周期,头条配置下为2534周期中的10周期即0.40%,而相对不感知活跃性的清扫器每不可达256字节函数节省313周期,从R=2时的占其开销83%至无垃圾时为零。第十三,对象模型泛化:通过NUM_REFS参数将引用域扩展为数组并施加随机分配模式压力测试得出多引用实现正确处理表、多捕获闭包、共享子节点、内嵌环及50个伪随机对象图。第十四,定向恢复与有界抢占:通过RECOVER_ON_TAMPER与PREEMPTIBLE参数测试得出定向恢复将影响范围从整个堆缩小至单个对象并使系统在二十次连续损坏中存活,抢占请求在验证开始前两周期内生效。第十五,门级功耗验证与物理热测量:通过布局布线后网表与SDF时序仿真及VCCINT轨测量得出实测总功耗251.86 mW仅比最坏角后拟合估计257.60 mW低2.23%,稳态温度56.8 °C低于85 °C角。第十六,物理硬件功能验证:通过在DE2-115上以UART加载并经调试软故障寄存器注入得出实测均值0.86与6.31 μs对应43与315.5周期,与仿真延迟在1.5周期内一致,并确认二十次连续损坏下的定向恢复。第十七,寄存器级软错误注入:通过对六个目标组各500次单比特翻转得出认证内容翻转全部1000次被检测,SHA3置换状态翻转90.8%导致虚假停机即安全失效,控制寄存器翻转在8.4%与27.6%试验中挂起过程,堆元数据翻转从未无害且24.6%导致函数被跳过而无报告。第十八,片上时钟毛刺物理故障注入:通过在DE2-115上每周期依次注入缩短周期得出完好字节码下易感性呈梯度(6.67 ns时34%不受影响至16.67 ns时94%),且在1968次损坏试验中89次(4.5%)损坏在毛刺过程与随后无毛刺过程中均未被报告。
讨论部分总结:关于将验证集成于回收的收益,耦合消除了独立验证器本需重复的可达性分析,最大配置下节省10周期即0.40%,该节省虽小但可测量,且不消除验证本身开销;相对不感知活跃性的清扫器,耦合节省对每个不可达函数的散列。验证开销的可接受性取决于工作负载与回收频率而非仅标记-清除基线,研究未执行完整应用故无端到端吞吐测量,可测量量为每次验证过程开销,对N个活跃函数与平均长度L,过程需N×Cverify(L)周期。摊销分析适用于吞吐但不刻画硬实时行为,默认配置下完整验证过程为相关最坏停顿,研究评估了PREEMPTIBLE=1作为替代。未实现的两种缓解为增量验证与更轻量散列,前者引入持续损坏窗口,后者改变安全属性而非纯性能优化;结构替代方案为解耦后台清扫完整性监视器,留待未来工作。与最近替代方案的比较得出,针对活跃代码加载后损坏,现实竞争者为独立清扫器或独立验证器而非加载时检查,耦合的理由在于调度与选择性而非成本;预防与检测互补。有效性威胁与基于模型的推断方面,全部周期计数来自有限配置范围的RTL仿真,一致线性扩展为外推提供依据但未在数百至数千对象规模实验验证,更大规模数字均为推断而非实测性能或可扩展性证据。局限性方面:picostella_system功耗估计缺乏后拟合或物理佐证;板级评估仅针对picostella_verified_gc;值表示采用简化标记整数方案而非IEEE-754或NaN装箱;可信散列表锁为寄存器基且由复位清除,不构成信任根;默认配置下检测停机后恢复为全有全无;验证器自身状态无奇偶校验、纠错码或冗余,研究以通用文献软错误率作数量级估计约11 FIT、约11,000年任意寄存器位翻转平均间隔,但非经验证的可靠性声明;未应用三模冗余、无看门狗约束过程时长,均留待未来工作。向完整Stella虚拟机的可扩展性涉及对象模型、须认证内容(字节码与常量池)、可信摘要来源、规模、回收器设计与原生函数等未评估问题。未来工作包括将后拟合与板级验证扩展至picostella_system、添加通用字节码加载器与板级I/O、在硬件上验证PREEMPTIBLE与更大HEAP_CAP及NUM_REFS配置、以一次性可编程机制替换复位清除锁、限制持续拒绝服务风险、以及开展电压毛刺、电磁脉冲或激光注入等更多物理故障机制测试。研究结论部分翻译如下:本文提出了picoStella,一种将堆驻留字节码的SHA3-256重新验证与垃圾回收耦合的概念验证硬件机制:每次标记阶段后,回收器判定为活跃的函数依据一次性写入的可信摘要重新计算散列。测量结果显示了该耦合实现了什么与未实现什么。验证开销严格遵循闭式每函数模型且以散列为主(在测量范围内为标记-清除开销的167%至8914%);复用回收器可达性相对于自行计算可达性的验证器仅节省一次冗余遍历(最大配置下0.40%),但相对于不感知活跃性的清扫器避免了对每个不可达函数的散列(最多83%)。活跃代码损坏至多在两个过程内被检测(四个函数时42–314周期);注入字节码的全部5770个故障,从穷举单比特翻转到多比特与突发故障,均被检测,多引用对象模型、定向恢复与有界抢占均经功能验证。寄存器级软错误测试表明SHA3状态翻转会安全失效,而控制寄存器与堆元数据翻转可能导致过程挂起或使函数未经验证。这些保证是有界的。持续验证将检查时间到使用时间窗口收窄至过程间隔但不闭合它;复位清除的散列表锁并非信任根;该机制不提供完整运行时代码完整性。所有周期计数来自小配置(至多八个活跃函数、每函数至多511字节)的RTL仿真并在两种仿真器下复现,更大规模开销为基于模型的推断。板级结果仅针对验证器模块:VCCINT测量在最坏角后拟合功耗估计的2.23%以内,调试寄存器故障注入将仿真检测延迟复现至1.5周期以内并确认二十次连续损坏下的定向恢复。片上时钟毛刺测试表明单周期时序故障可使检测失效而非仅延迟检测;完整虚拟机、其他物理故障机制与更大配置仍待硬件评估。