不不可能完成的任务从 用户空间窃取内核数据 Yueqiang Cheng, Zhaofeng Chen, Yulong Zhang, Yu Ding, Tao Wei Baidu Security
关于演讲者 Dr. Yueqiang Cheng 我们的安全项 目: Mr. Zhaofeng Chen Mr. Yulong Zhang Dr. Yu Ding Dr. Tao Wei
怎样从 用户空间读取未授权的内核数据?
这为什什么很难? 强有 力力的内核 - 用户隔离 (KUI) MMU- 页表 (Page Table) 的加持 假设内核 无缺陷 : 无内核缺陷来任意的读取内核数据
KUI 里里的内存访问 虚拟地址 查询 TLB 查询失败 截取 页表 查询成功 保护检查 更更新 TLB 拒绝 保护失败 准许 物理理地址 SIGSEGV
权限检查 1: 页表许可 2: 控制暂存器器, 例例如, SMAP in CR4 Image from Intel sdm
无计可施? 1. 非特权应 用程序 + 2.KUI 权限检查 + 3. 无缺陷内核
但, 为了了获得 高性能的 CPU 1. 非特权应 用程序 + 2.权限检查 + 3. 无缺陷内核
高性能 推测执 行行 + 无序执 行行
投机执 行行 S 无推测执 行行 F T 正确预测 E 错误预测
无序执 行行 例例 子 : 数据流图 有序执 行行 : 无序执 行行 : Images are from Dr. Lihu Rappoport
推测执 行行 + 无序执 行行 够了了么? 不不够!!!
延迟的权限检查 + 缓存副作 用 执 行行引擎以 无序 方式执 行行 前端分 支预测器器服务于推测执 行行 缓存中的副作 用仍然存在!!! 权限检查延迟到注销单元 Image from https://www.cse.msu.edu/~enbody/postrisc/postrisc2.htm
Meltdown (v3) 的 工作原理理 1. 攻击者选择的, 无法访问的内存位置的内容将加载到寄存器器中 指向 目标内核地址
Meltdown (v3) 的 工作原理理 2. 临时指令根据寄存器器的秘密内容访问缓存线 将数据放 入缓存 这个数字应该 >= 0x6
Meltdown (v3) 的 工作原理理 3. 攻击者使 用 flush+reload 来确定访问的缓存线, 从 而确定存储在所选内存位置的秘密 0 1 2 254 255 阵列列基 256 槽 所选索引是 目标字节的值 例例如, 如果所选索引为 0x65, 则值为 A
ForeShadow 把秘密放在 一级取消映射 页表条 目 Meltdown
Spectre(v1/v2) 怎么样?
Sepctre(v1) 的 工作原理理 1. 在设置阶段, 处理理器器被错误的训练去做出 一个可被利利 用的错误的推测 例例如, x < array1_size 指向 目标地址 阵列列 2 的槽索引泄漏漏数据 真正的执 行行流程和推测执 行行在这 里里
Sepctre(v1) 的 工作原理理 2. 处理理器器推测地将来 自 目标上下 文的指令执 行行到微体系结构的隐蔽通道中 例例如, x > array1_size 执 行行流程应该在这 里里 推测执 行行在这 里里! 将 array2 的 一个槽加载到缓存中
Sepctre( v1) 的 工作原理理 3: 可以通过定时访问 CPU 缓存中的内存地址来恢复敏敏感数据 0 1 2 254 255 Array2 基类 256 槽 所选索引是 目标字节的值 例例如, 如果所选索引是 0x66, 那对应值就是 B
Sepctre 如何读取内核数据 ü array1 和 array2 在 用户空间中 ü x 由对 方控制 array1+x 指向秘密 array2 槽索引泄漏漏内核数据
耶! 我们现在得到内核数据了了 1. 非特权应 用程序 + 2.权限检查 + 3. 无缺陷内核
但是... KPTI Meltdown Spectre (Gadget in User SMA Spectre P (Gadget in Kernel Space)
KPTI 内核空间 内核空间 内核空间 用户空间 用户空间 用户空间 用户 / 内核模式内核模式 用户模式 KPTI 之前 KPTI 之后 PCID 有助于提 高性能
SMAP 用户模式 ( 用户空间 ) 监督者模式 ( 内核空间 ) ü 当 CR4 中的 SMAP 位被设置时,SMAP 将被启 用 ü 通过对 EFLAGS.AC 标志的设置, 可临时禁 用 SMAP ü SMAP 检查早在退役, 甚 至执 行行之前就已经完成了了 即使我们把 Spectre 组件放进内核空间, SMAP 也会阻 止它
攻击和规避总结 技术 窃取内核 数据? 规避规避之后, 内核数据泄 漏漏? Spectre 成功 KPTI + SMAP 失败 Meltdown 成功 KPTI 失败 ForeShadow 成功 KPTI 失败 仅 用于内核数据泄漏漏 其它总结不不包含在这 里里
Image from http://nohopefor.us/credits 绝望... KPTI + SMAP + KUI
绝望中的希望 内核空间 内核空间 内核空间 这部分不不能被消除 用户空间 用户 / 内核模式 KPTI 之前 用户空间 内核模式 KPTI 之后 用户空间 用户模式 共享范围作为泄漏漏内核数据的桥
新型 Meltdown v3z 中断 SMAP + KPTI + 用户内核隔离 1: 使 用新的组件在 目标内核数据和桥之间建 立数据依赖关系 ( 绕过 SMAP) 2: 使 用可靠的 Meltdown 来探查桥, 从 而泄漏漏内核数据 ( 绕过 KPTI 和 KUI)
第 一步 : 触发 New Gadget 与 Spectre 组件类似, 但不不完全相同 指向 目标地址 桥 的槽序数 Arr2+offset 是 桥 的库 x and offset 应由对 方控制!!
如何触发新的组件 有很多 方法可以触发新的组件 : 1: Syscalls 2: /proc and /sys 等接 口 3: 中断和异常处理理程序 4: ebpf 5:
如何找到新的组件 源代码扫描 我们在 Linux Kernel 4.17.3 中使 用 smatch, Ø 默认设置 : 36 备选组件 Ø 全选设置 : 166 备选组件 However, there are many restrictions to the gadget in real exploits ü 偏移量量范围 ü 可控调 用 ü 缓存噪 音 ü 二进制代码扫描??
第 二步 : 探查桥 0 1 2 254 255 用户空间 用户数组库 0 1 2 254 255 桥 桥库 显然, 每 一轮都有 (256*256) 个探测为了了使结果可靠, 通常我们需要运 行行多轮次 低效
使其实 用 / 高效 0 1 2 254 255 用户空间 用户数组库 桥库 0 1 2 254 255 为什什么我们需要在 Meltdown 里里探测 256 次? 如果我们知道桥库槽 0 的值, 我们只需探测 一次 桥 我们可以提前知道这个值吗?
不不适 用于 Meltdown (v3) Meltdown 能够读取内核数据 但是, 它要求 目标数据在 CPU L1d 缓存中 如果 目标数据不不在 L1d 缓存中, 0x00 返回. 我们需要可靠地读取内核数据!
可靠的 Meltdown (V3r) V3r 共有两步 : 第 一步 : 将数据放 入 L1d 缓存 指向 目标地址 内核中的任何地 方 第 二步 : 使 用 v3 获取数据 我们使 用 Intel CPU E3-1280 v6 在 Linux 4.4.0, 和 Intel CPU I7-4870HQ 在 MacOS 10.12.6(16G1036) 上进 行行测试
信息汇总 离线阶段 : Ø 使 用 v3r 转储 网桥数据, 并将其保存到表中 在线阶段 : Ø 第 一步 : 在 目标数据和桥槽之间建 立数据依赖关系 Ø 第 二步 : 探测桥的每个槽 效率 : Ø 从 几分钟 ( 在某些情况下甚 至是 1 小时左右 ) 到只要 几秒钟只泄漏漏 一个字节
演示设置 内核 : Linux 4.4.0 with SMAP + KPTI CPU: Intel CPU E3-1280 v6 在内核空间, 我们有 一个机密消息, 例例如, xlabsecretxlabsecret, 位置在, 例例如, 0xffffffffc0e7e0a0
探讨对策 软件规避 ü 修补内核以消除所有预期的组件 ü 最 小化共享的 桥 区域 ü 随机化共享的 桥 区域 ü 监视基于缓存的侧通道活动
探讨对策 硬件规避 ü 在执 行行阶段中执 行行权限检查 ü 修改推测执 行行和 无序执 行行 ü 使 用侧通道抗缓存, 例例如独占 / 随机缓存 ü 增加硬件级侧通道检测机制
重点信息 在启 用 KPTI + SMAP + KUI 的情况下,Trinational Spectre 和 Meltdown 无法窃取内核数据 我们新型的 Meltdown variants 能够打破最强的保护 (KPTI + SMAP + KUI) 所有现有的内核都需要修补以规避我们的新攻击
Q&A image is from https://i.redd.it/ 不不可能完成的任务从 用户空间窃取内核数据 Yueqiang Cheng 百度安全