一、攻击核心背景与原理基础
1. 关键技术
- Linear Address Masking(LAM)/Upper Address Ignore(UAI):LAM是英特尔推出的硬件特性,可在解引用64位指针前掩码部分高位(LAM48掩码62:48位,LAM57掩码62:57位);UAI是AMD类似特性,直接忽略虚拟地址最高7位。二者初衷是让软件利用未翻译的地址高位存储元数据,却被SLAM攻击滥用为绕过地址规范性检查的工具。
- 未掩码Spectre Gadget:代码形式以指针双重解引用(如
**secret)为主,源于内核中广泛的指针遍历逻辑,将高熵机密直接编码为指针地址。与传统掩码Gadget(将机密转为数组索引,低熵)不同,未掩码Gadget此前因地址非规范、无法填充缓存被认为不可利用,却在SLAM攻击中成为核心载体。
ssize_t kernfs_fop_read_iter(struct kiocb *iocb, struct iov_iter *iter) {
struct file *f = iocb->ki_filp; // 攻击者控制iocb,注入恶意指针
struct seq_file *sf = f->private_data; // 解引用伪指针,触发TLB转换
// ...
}
TLB Evict+Reload隐通道:放弃传统缓存隐通道,利用地址转换阶段TLB(翻译后备缓冲器)状态变化传递信号。地址转换先于SMAP(监管模式访问保护)检查,即便内核态解引用用户指针触发异常,TLB仍会记录转换痕迹,攻击者通过驱逐并重新加载TLB条目,测量访问延迟获取机密。
非规范地址:x86-64架构中,规范地址要求指针高位(4级分页为63:48位,5级为63:57位)与最高有效翻译位(4级为47位,5级为56位)一致,否则为非规范地址。SLAM攻击目标(如
/etc/shadow中ASCII密码哈希)编码为指针时,因ASCII字节最高位为0,必然是非规范地址。
2. 攻击核心原理
SLAM(Spectre based on LAM)攻击本质是利用Intel LAM/AMD UAI硬件特性或AMD TENA漏洞,突破传统防护限制,通过非规范地址转换的TLB隐通道,实现对未掩码Spectre Gadget的利用,最终泄露内核内存中的高熵机密(如root密码哈希)。其核心逻辑是:将ASCII机密字符串编码为非规范伪指针,诱导内核投机执行未掩码Gadget完成地址转换,再通过TLB隐通道捕捉转换痕迹,结合滑动与即时重映射技术逐字节泄露机密。
二、SLAM攻击三阶段核心流程
SLAM攻击围绕解决三大核心挑战(C1:扩展至用户指针、C2:扩展至非规范指针、C3:实现机密泄露)展开,分为三个关键阶段:
阶段一:构建TLB Evict+Reload隐通道(解决C1)
1. 挑战本质
传统缓存隐通道无法处理用户指针:内核态下解引用用户指针会触发SMAP保护,无法填充缓存行传递信号。而地址转换发生在SMAP检查之前,MMU需先完成地址转换找到PTE(页表项),才能检查特权位判断是否为用户内存,此过程会留下TLB状态痕迹。
2. 技术实现步骤
- 方案对比与选择:
- PTE探测:通过Prime+Probe等缓存攻击,探测根页表中被访问的缓存行,推断用户指针高位比特。但需较大投机窗口、信号噪声高、多层页表信号匹配难,最终被放弃。
- TLB探测:依赖TLB Prime+Probe或Evict+Time攻击,获取Gadget访问的TLB集及对应指针比特。需较短窗口,但仅支持存在的用户地址且噪声更高(TLB集页粒度碰撞更频繁)。
- TLB Evict+Reload(最终方案):
- 驱逐TLB条目:攻击者在用户态通过TLB驱逐集,清空目标用户指针对应的L1 TLB条目,保留L2 TLB有效条目。
- 触发投机执行:通过BHI(分支历史注入)劫持内核间接分支,诱使其投机执行未掩码Gadget(
**secret),解引用用户指针触发地址转换,TLB记录转换状态(L2 TLB条目重新加载到L1 TLB)。 - 测量延迟:攻击者重新访问目标指针,测量TLB访问延迟。延迟低表示L1 TLB命中(Gadget执行转换,ASCII字节猜测正确),延迟高则猜测错误。
- 关键调优:
- 缓存层级选择:L2缓存为最优选择。L1缓存与TLB并行查找会掩盖信号,更高层级缓存(如LLC、DRAM)会因微架构复杂性增加延迟抖动,L2缓存可平衡信号清晰度与抖动。
- TLB层级选择:优先利用L1 TLB miss与L2 TLB hit的信号。仅驱逐L1 TLB条目,保留L2 TLB条目,避免L2 TLB miss带来的页表遍历抖动,且短延迟可缩短投机窗口,帮助绕过部分防护。
- 页面大小选择:采用4KB页面。内核常用2MB页面存储自身文本和数据、1GB页面用于物理内存直接映射,4KB页面在TLB中占用独立分区,受内核干扰最小,可最大化信号纯度。
阶段二:绕过地址规范性检查(解决C2)
1. 挑战本质
SLAM攻击目标(ASCII字符串)编码为指针时必然是非规范地址,传统模式下直接访问会触发异常,无法完成地址转换,TLB隐通道无痕迹可捕捉。需通过硬件特性或漏洞,让非规范地址通过规范性检查,完成地址转换。
2. 分平台技术实现
Intel平台(LAM特性):
- LAM掩码机制:LAM48(4级分页)掩码62:48位,强制这些位复制自47位;LAM57(5级分页)掩码62:57位,复制自56位。仅保留bit 63作为特殊检查位,要求其与最高有效翻译位相等。
- 绕过原理:LAM自动“修正”指针高位,使非规范指针变为规范形式。SLAM攻击目标为ASCII字符串,伪指针bit 47(最高有效翻译位)与bit 63均为0,天然满足LAM检查要求,非规范指针可通过转换。
- 关键特性:LAM对用户指针的掩码生效且忽略特权级别,内核解引用用户传入的非规范指针时,LAM仍执行掩码操作,为跨用户态-内核态利用提供可能。

AMD新一代平台(UAI特性):
- UAI机制:直接忽略虚拟地址最高7位,仅使用低57位进行地址转换。
- 绕过原理:4级分页下,UAI忽略63:57位,但56:48位仍需满足规范要求,无法支持通用ASCII字符串;5级分页下,56:48位纳入地址转换(索引5级页表),非规范ASCII指针可通过转换,适配TLB隐通道。
AMD老旧平台(TENA漏洞):
- TENA漏洞特性:部分老旧AMD CPU(如Ryzen 7 2700X)中,地址转换与规范性检查并行执行。CPU用指针低48位查询TLB和L1缓存,同时用高位检查规范性,非规范地址可触发短暂TLB状态更新。
- 利用原理:TLB Evict+Reload隐通道需TLB命中,实验证实L2 TLB命中即可触发短暂非规范访问。攻击者驱逐L1 TLB条目,保留L2 TLB条目,诱导内核投机执行Gadget,非规范地址通过低48位完成TLB转换,留下可探测痕迹。


阶段三:滑动+即时重映射实现机密泄露(解决C3)
1. 挑战本质
即使完成非规范地址转换,伪指针仍有31位熵(ASCII字节高位为0,从36位降至31位),对应8TB地址空间,无法直接探测。需通过技术手段降低熵值,实现逐字节泄露。
2. 技术实现步骤
滑动技术(熵减核心):
- 原理:从已知ASCII字符串片段(如
/etc/shadow中deamon后缀)开始,逐字节平移伪指针,每次仅聚焦1个未知字节。例如反向滑动时,伪指针“向左滑”1字节,新伪指针仅包含1个未知字节+所有已知字节,熵从31位降至7位(ASCII字节仅需探测0-127)。 - 优势:反向滑动的伪指针地址连续(正向滑动地址分散),后续重映射更高效,为SLAM默认选择。
- 原理:从已知ASCII字符串片段(如
即时重映射(高效探测):
- 问题:伪指针地址范围达8TB,无法一次性映射所有可能地址,一次性映射会产生大量页错误且内存占用过高。
- 解决方案:动态调整用户态重加载缓冲区地址。首次映射覆盖128个页面(对应7位熵的所有可能),每次滑动后通过
mremap系统调用,将缓冲区快速调整到当前需探测的128个页面范围。反向滑动时,缓冲区为连续地址块,仅需1次系统调用即可完成重映射,避免页错误与内存浪费。
逐字节泄露流程:
- 攻击者从已知字符串片段(如
deamon)出发,反向滑动伪指针,确定当前需探测的未知字节对应的128个可能地址。 - 通过
mremap即时映射这128个页面作为重加载缓冲区。 - 驱逐目标伪指针对应的L1 TLB条目,触发内核投机执行未掩码Gadget。
- 重新访问128个缓冲区地址,测量TLB延迟,延迟最低的地址对应正确ASCII字节。
- 重复上述步骤,逐字节拼接出完整机密(如root密码哈希)。
- 攻击者从已知字符串片段(如

三、端到端完整攻击流程(以泄露Linux内核root密码哈希为例)
在完成三阶段核心技术准备后,SLAM攻击通过四个步骤实现端到端机密泄露:
1. 步骤一:突破KASLR(内核地址空间布局随机化)
- 利用预取侧信道构造预言机,基于预取指令的翻译依赖时序(如文献[36]方法),探测内核物理内存直接映射区的随机基址。通过判断地址是否为有效内核地址,确定内核数据(如
/etc/shadow)的实际存储范围,为后续定位机密奠定基础。
2. 步骤二:BHI分支劫持与Gadget触发
- BHB碰撞寻找:基于BHI攻击策略[11],通过 brute-force 方式反复生成随机分支历史,污染分支历史缓冲区(BHB),诱导内核系统调用调度器(目标间接分支)错误预测,跳转到目标未掩码Gadget。
- 扩大投机窗口:构建L2缓存驱逐集,清空L2缓存中与攻击者发起系统调用对应的系统调用表条目。当内核执行该系统调用时,需从内存重新加载系统调用表条目,延长投机执行窗口,确保未掩码Gadget完整执行地址转换。
- 碰撞验证(2步预言机):
- Step 1(快速路径):将attacker构造的secret指针传入系统调用,若Gadget被触发,其读取机密的操作会访问重加载缓冲区,产生可测量的TLB信号。但可能存在误报(其他指针追逐路径触发信号)。
- Step 2(慢速路径):将上一步构建的指针替换为已知内核数据指针(如包含特定magic_num的用户页地址),若Gadget被触发,会解引用该指针产生TLB信号,验证碰撞有效性,排除误报。
3. 步骤三:定位 /etc/shadow文件
- 执行
passwd命令,确保/etc/shadow文件驻留物理内存(避免页面交换导致机密不在内存中)。 - 利用已构建的BHI信息泄露原语,通过TLB隐通道扫描内核物理内存直接映射区,查找以“root:$”(
/etc/shadow中root条目前缀)开头的4KB页面,确定密码哈希所在的内存地址。
4. 步骤四:逐字节泄露root密码哈希
- 起始点选择:“root:$”前缀不适合反向滑动起始(需从已知后缀反向泄露),选择
/etc/shadow中第二个用户条目“deamon”作为已知后缀。 - 泄露执行:从“deamon”开始反向滑动伪指针,每次通过即时重映射调整128页缓冲区,结合TLB Evict+Reload探测当前未知字节。例如探测到某地址TLB延迟最低,确定该字节为“$”,逐步拼接出root密码哈希的完整字节序列(如“$y$j9T$…”)。
- 错误处理:利用TLB信号的冗余性(仅7位用于数据,其余位为已知签名),若探测结果与已知签名不匹配,请求重新探测,确保泄露准确性。实验显示,该过程在Intel i9-13900K上(软件模拟LAM),最快可在0.5分钟内泄露完整root密码哈希。
四:攻击条件总结
- 绕过指针规范检测
- 内核态地址转换结果直接写入TLB(可考虑区分内核地址与用户地址)
- TLB共享,可进行时序观测(考虑隔离)