Let’s GOSSIP软件安全暑期学校笔记
今日演讲主题:
- Spectre & Meltdown, 你了解与不了解的侧信道攻击 张殷乾
- Rust的奇幻之旅 孙茗珅
DAY 1: 7.20
8:55 开幕式,李卷孺博士开幕式致辞,介绍本次暑期学校大致情况。
Spectre & Meltdown, 你了解与不了解的侧信道攻击 张殷乾
9:03 美国俄亥俄州立大学的张殷乾副教授开始《Spectre & Meltdown, 你了解与不了解的侧信道攻击》的演讲。
张老师首先介绍了著名的OSU的seclab的大致情况,欢迎同学们来到OSU深造。
Part 1
进入正题,张老师首先介绍了CPU的大致结构,以及Spectre和Meltdown的背景知识。
为了提高CPU效率,需要多个逻辑CPU对指令进行乱序执行
微架构的侧信道攻击
威胁模型:两个虚拟机/线程在同一个处理器上运行
场景:云计算、移动设备、浏览器中的JavaScript
侧信道攻击的C语言例子
当secret不同时,控制流不同
从执行的控制流推断secret
攻击方法
Prime+Probe 更普遍 精度cache set
Flush+Reload 更精确
…
通过循环访问、驱逐cache块,并检测cache的访问时间,泄露程序是否访问特定cache,从而推测同一块处理器上的victim程序访问的数据。
攻击向量
- 计算机的储存结构以及执行指令模型:取指()、译指、转换为多条micro指令、分发到多个执行单元。
TLB 侧信道攻击
- 驱逐TLB表项,victim访问后TLB存在,根据translate地址时间,判断。与之前类似
威胁模型
Hyper-Threading 攻击者与目标在同一个物理core,不同逻辑core 共享较多
Same core,分时复用,共享的资源较少
Cross core,共享的资源更少,page table、DRAM、LLC
Part 2
X86 Execution Engine 看PPT. Fetcher->decoder->issuer->scheduler
乱序执行、预测执行
预测执行攻击
- 当产生耗时操作(page fault)时,后续的micro instructions将继续预测执行,若预测错误,恢复寄存器、mem,但micro-architectural state发生变化,产生side channel effect
Spectre Attack
针对分支预测
Example 论文里的例子
Meltdown
内核地址映射到用户空间的高内存部分
通过软件、硬件实现内存隔离
乱序执行、条件竞争
- 数据到达比权限检查到达得更快,可以用micro-architectural state side channel 泄漏读取到的信息。
Example
CPU处理异常的模型,分两个阶段:
-
- Meltdown有时候失败返回0的原因:在P1后才返回数据
L1 Terminal Fault Attack(L1TF)
SGX
通过 绕过检查
只能leak L1 cache中的数据
利用Page fault
RIDL attack
利用Line Fill Buffer(LFB)
优点:可以跨域读取(没有清空LFB)
总结
对CPU side channel attack有了更深入的了解。
Spectre论文:https://spectreattack.com/spectre.pdf
Meltdown论文:https://meltdownattack.com/meltdown.pdf
LOCCS实验室成员阅读Spectre论文笔记:https://loccs.sjtu.edu.cn/gossip/blog/2019/04/11/spectre-attacks-exploiting-speculative-execution/
Rust的奇幻之旅 孙茗珅
孙博士首先介绍了最近热门的Rust项目Libra
说明了为什么选择Rust的原因:
介绍了基础知识——栈溢出:
以及常见的memory errors
检查:
但是都存在部分问题。
因此出现了从设计之初就考虑了内存安全的语言:Rust、Go
需要注意的问题:
不能被多个线程同时读写缓冲区
只有一个变量指向一块内存
Rust示例:
声明vector
将alice交给bob
大括号结束,bob释放
最后一行时,alice已经不指向任何内存区域,报错
读的话要加mut
可读不可写:
Alice不能比bob提前结束
总结:
栈上分配内存的例子
变量的生命周期:
编译器眼中,b的生命周期小于a
编译器不知道返回x和y的生命周期
Use-After Free在Rust中报错:
Part 2
使用Rust开发的ARM TrustZone SDK
简单介绍TrustZone:
项目的结构,上游结构:
修改的部分:
rust/libstd的结构
不希望产生panic,所以需要静态控制流分析。
项目结构:
总结:
Unsafe Rust
在unsafe 大括号下,可使用不安全语法
Dereference a raw pointer
Access or modify a mutable static variable
Call an unsafe function or method
可以将unsafe function封装到safe function中
lon shell : Rust 写的shell
调用的C libraries:
最后,孙博士总结了发现Rust问题的一些方法: