Mayhem - 内存位损坏攻击绕过 sudo 和 OpenSSH 身份验证

美国伍斯特理工学院的研究人员推出了一种新型的 Mayhem 攻击,该攻击利用 Rowhammer 动态随机存取存储器位失真技术来改变程序中用作标志的堆栈变量的值,以决定身份验证和安全检查是否已完成。通过了。该攻击的实际示例演示了如何绕过 SUDO、OpenSSH 和 MySQL 中的身份验证,以及更改 OpenSSL 库中安全相关检查的结果。

该攻击可应用于使用检查来比较不为零的值的应用程序。易受攻击的代码示例:int auth = 0; ... // 身份验证成功后更改 auth 值的验证码 if(auth != 0) return AUTH_SUCCESS;否则返回 AUTH_FAILURE;

在此示例的上下文中,对于成功的攻击,足以破坏与堆栈上的 32 位 auth 变量关联的内存中的任何位。如果变量中的任何位被损坏,该值将不再为零,并且条件运算符将确定身份验证是否成功完成。此类验证模式在应用程序中非常常见,例如在 SUDO、OpenSSH、MySQL 和 OpenSSL 中。

Mayhem - 内存位损坏攻击以绕过 sudo 和 OpenSSH 身份验证

该攻击还可以应用于“if(auth == 1)”形式的比较,但在这种情况下,其实现变得更加复杂,因为需要扭曲的不是 32 的任何位,而是最后一位。该方法还可用于影响处理器寄存器中变量的值,因为当上下文切换、函数调用或信号处理程序触发时,寄存器的内容可以暂时刷新到堆栈上。在寄存器值在内存中的一段时间内,可能会在该内存中引入失真,并且更改后的值将被恢复到寄存器中。

Mayhem - 内存位损坏攻击以绕过 sudo 和 OpenSSH 身份验证

为了扭曲这些位,使用了 RowHammer 类攻击的修改之一。由于 DRAM 存储器是二维单元阵列,每个单元由电容器和晶体管组成,因此对同一存储区域执行连续读取会导致电压波动和异常,从而导致相邻单元中的少量电荷损失。如果读取强度很高,则相邻单元可能会失去足够多的电荷,下一个再生周期将没有时间恢复其原始状态,这将导致单元中存储的数据值发生变化。为了防范 RowHammer,芯片制造商添加了 TRR(目标行刷新)机制,该机制可以阻止特殊情况下的单元损坏,但不能防范所有可能的攻击变化。

为了防止混乱攻击,建议在比较中不要使用对与零的差异或与一一致的评估,而是使用具有非零八位位组的随机种子值进行匹配检查。在这种情况下,为了设置变量的期望值,需要精确地扭曲大量比特,与一位的扭曲相比,这是不现实的。不可攻击代码示例:int auth = 0xbe406d1a; ... // 如果身份验证成功,则将 auth 值设置为 0x23ab8701 的验证码 if(auth == 0x23ab8701) return AUTH_SUCCESS;否则返回 AUTH_FAILURE;

指定的保护方法已被 sudo 开发人员使用,并包含在 1.9.15 版本中作为 CVE-2023-42465 漏洞的修复。他们计划在对主要易受攻击的项目进行修复后发布用于执行攻击的代码原型。

来源: opennet.ru

添加评论