GOSSIP_summerschool_2019_day1

Let’s GOSSIP软件安全暑期学校笔记

今日演讲主题:

  1. Spectre & Meltdown, 你了解与不了解的侧信道攻击 张殷乾
  2. Rust的奇幻之旅 孙茗珅

DAY 1: 7.20

8:55 开幕式,李卷孺博士开幕式致辞,介绍本次暑期学校大致情况。

Spectre & Meltdown, 你了解与不了解的侧信道攻击 张殷乾

9:03 美国俄亥俄州立大学的张殷乾副教授开始《Spectre & Meltdown, 你了解与不了解的侧信道攻击》的演讲。

张老师首先介绍了著名的OSU的seclab的大致情况,欢迎同学们来到OSU深造。

Part 1

进入正题,张老师首先介绍了CPU的大致结构,以及Spectre和Meltdown的背景知识。

image-20190720112450254

  • 为了提高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处理异常的模型,分两个阶段:

​ - image-20190720112845450

​ - 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的原因:

image-20190720135829962

介绍了基础知识——栈溢出:

image-20190720135936299

以及常见的memory errors

image-20190720140242026

image-20190720140341900

检查:

image-20190720140602784

但是都存在部分问题。

因此出现了从设计之初就考虑了内存安全的语言:Rust、Go

image-20190720140845689

需要注意的问题:

image-20190720141054857

不能被多个线程同时读写缓冲区

image-20190720141339299

image-20190720141550959

只有一个变量指向一块内存

image-20190720141718945

Rust示例:

声明vector

将alice交给bob

大括号结束,bob释放

image-20190720141753433

最后一行时,alice已经不指向任何内存区域,报错

image-20190720141943660

读的话要加mut

image-20190720142047201

可读不可写:

image-20190720142118798

image-20190720142228718

Alice不能比bob提前结束

image-20190720142332402

image-20190720142410807

总结:

image-20190720142436514

栈上分配内存的例子

image-20190720142632645

image-20190720142718777image-20190720142724976

image-20190720143015561

变量的生命周期:

image-20190720143404643

image-20190720143453126

编译器眼中,b的生命周期小于a

image-20190720143509455

image-20190720143659768

编译器不知道返回x和y的生命周期

image-20190720143822175

Use-After Free在Rust中报错:

image-20190720144022029

image-20190720144048389

image-20190720144218691

Part 2

使用Rust开发的ARM TrustZone SDK

简单介绍TrustZone:

image-20190720150029586

image-20190720150227402

image-20190720150348720

image-20190720150529021

image-20190720150830287

image-20190720151030696

image-20190720151310425

image-20190720151533686

image-20190720151540682

image-20190720151923666

项目的结构,上游结构:

image-20190720152129980

修改的部分:

image-20190720152159798

rust/libstd的结构

image-20190720152255640

image-20190720152521154

image-20190720152733972

不希望产生panic,所以需要静态控制流分析。

image-20190720152819874

image-20190720152942903

image-20190720153011029

image-20190720153120313

image-20190720153157432

项目结构:

image-20190720153338803

image-20190720153717691

image-20190720153811376

image-20190720153928951

image-20190720154016067

image-20190720154158579

image-20190720154224189

总结:

image-20190720154258995

Unsafe Rust

在unsafe 大括号下,可使用不安全语法

  • Dereference a raw pointer

  • Access or modify a mutable static variable

  • Call an unsafe function or method

可以将unsafe function封装到safe function中

image-20190720160713644

lon shell : Rust 写的shell

image-20190720160854650

调用的C libraries:

image-20190720160929177

image-20190720161000349

最后,孙博士总结了发现Rust问题的一些方法:

image-20190720163114826