新聞 | iThome ( ) • 2024-03-22 17:24

研究人员发现Apple M系列处理器,允许攻击者执行GoFetch的微架构旁路攻击,透过资料记忆体依赖预取器(Data Memory-dependent Prefetcher,DMP),从执行常数时间的加密演算法中撷取机密金钥。

研究人员现在已经实现从OpenSSL的Diffie-Hellman、Go RSA,以及CRYSTALS专案的Kyber与Dilithium加密演算法撷取机密金钥。目前已知受影响的Apple晶片包括M1、M2和M3型号,研究人员特别强调,虽然Intel的第13代Raptor Lake微架构同样也有DMP,但是因为其启动标准更严格,因此较具抵御GoFetch攻击的能力。

GoFetch攻击要从常数时间程式开发解释起,常数时间程式开发是一种范式,可以确保所有操作花费相同的时间,来强化程式码抵御旁路攻击的能力。在非常数时间的演算法中,加密程式可能会因为不同的输入或是金钥,导致执行速度更快或更慢,使得攻击者可以测量这些时间差,获得加密过程或是金钥的资讯。

要符合常数时间程式开发范式,程式码中不能包含依赖机密的分支、回圈和控制结构,而且因为攻击者也可以观察CPU快取不同记忆体位置的延迟,来推断储存在记忆体中的资讯,因此常数时间演算法也不能以任何方式混合资料和位置,并禁止使用相依于机密的记忆体存取或是阵列索引。

而GoFetch攻击成功的关键,就是即便加密演算法按照常数时间程式开发原则,将资料与记忆体位址分开,由于DMP的存在,仍然可能产生与机密资料相依的记忆体存取行为,这种机制导致常数时间的演算法实际程式执行时间变得不一致,而这种时间变化就可被攻击者观察并利用,进一步撷取金钥破解加密。

导致常数时间加密失效的DMP是一种CPU功能,在Apple的M系列CPU上都有,研究人员对M系列CPU进行逆向工程,发现DMP会启动并尝试解引用(Dereference),从类似记忆体位置载入资料,研究人员提到,这样的DMP机制明显违反常数时间程式开发范式中,禁止混合资料和记忆体存取模式的要求。

攻击者便可以利用这项缺陷,精心设计加密操作来猜出金钥。研究人员安排加密操作的输入,只有当猜中金钥部分位元时才出现类似指标的值,而透过分析快取时序,监控DMP是否执行解引用来验证猜测,如此研究人员便可以逐批猜测金钥位元。根据研究人员发表的论文,他们已成功破解了包括OpenSSL Diffie-Hellman金钥交换、Go RSA解密和后量子加密演算法CRYSTALS-Kyber和CRYSTALS-Dilithium等4种热门的常数时间加密实作。

不过,其实在GoFetch之前,就有安全研究发展出Augury攻击方法,发现可滥用Apple M系列晶片DMP混合资料和记忆体位置的问题,只是Augury没发现M系列晶片DMP启用的标准,其实不如想像的严谨,GoFetch研究人员提到,任何从记忆体载入的值,无论实际内容和预期用途,都被M系列晶片DMP视为一个记忆体位址并尝试解引用。这个发现让GoFetch更具危险性,DMP可被用于攻击现实世界中的常数时间的加密演算法。

研究人员在M1处理器尝试发动端对端GoFetch攻击,同时也在M2和M3上发现类似可滥用DMP的行为,虽然研究人员并没有在M系列其他变体,诸如M2 Pro上测试,但他们猜测这些变体具有相同的微架构,可能也会有相同的问题。

目前M3晶片可以透过设定DIT(Data Independent Timing)位元停用DMP,但M1和M2的无法适用此方法,而Intel的Raptor Lake处理器则可设定DOIT(Data Operand Independent Timing)位元来停用DMP。加密函式库开发人员,可以透过设定DIT位元和DOIT位元,在特定CPU上停用DMP避免GoFetch攻击。

采用输入盲法(Blinding)也可以协助部分加密架构,免遭攻击者控制中介值,进而避免依赖金钥的DMP启动,此外,研究人员还提到,防止攻击者测量DMP启动,可以进一步强化加密协定的安全性。Apple目前对此还无回应,而研究人员在2023年12月5日向Apple揭露该漏洞,并于现在负责任的公开攻击手法,之后还会释出概念性验证程式码。