CS161
The primary way of securing a system is understanding how it works?
- False. Oftentimes the best defense is to remove incentives for attackers
Links
-
ucb的一门系统安全课程
Lecture 1: Introduction
-
Threat Model: 谁会攻击你、他们有什么样的资源
Lecture 2: Security Principles
-
Don’t Blame the Users
-
Security is Economics
-
Prevention
-
Detection, Defense in Depth
-
Password Authentication
-
Measuring Attacker Capabilities
- rubber-hose cryptanalysis
- rubber-hose cryptanalysis
-
Least Privilege
-
Trusted Computing Base (TCB)
- 可信任计算空间的特点是,小巧简单,这样构造的计算空间容易达到没有bug的要求。因此,以现代浏览器为例,开发者在开发过程中为浏览器的不同部分赋予了不同的权限和信任度,比如浏览器的核心是TCB,而浏览器的渲染引擎却不是TCB
-
Ensuring Complete Mediation
-
Time of Check to Time of Use (TOCCTOU)
Lecture 3: Buffer Overflows
-
易受攻击的代码
1 | char name[20]; |
-
缓冲区溢出CWE-119是最多被利用的漏洞
-
对于32bit的x86机器,如果攻击者可以在X地址处溢出,而函数的返回地址保存在Y地址处,攻击者通过写Y-X个无意义字节到达Y地址,将Y+4作为函数的返回地址写入,并在返回地址后加入他们的攻击代码,攻击就得以实现。
-
有符号无符号溢出
1 | void vulnerable(int len, char *data) { |
-
如果len == -1会发生什么?0x11111111,在mencpy中被认为是一个很大的正数!
-
整形溢出
1 | void f(size_t len, char *data) |
-
如果len == 0xFFFFFFFF,整型溢出
-
格式化字符串
-
栈
-
内存安全
- 禁止对未声明地址的访问
- 禁止越界访问
- 禁止超过生命周期的访问
Lecture 4: Buffer Overflow Defenses
-
使用内存安全的语言Python,Java,Go,Rust,而不是C,C++,Objective C
-
保护不安全的代码
-
堆栈金丝雀是每次程序开始执行时随机生成的值,在函数调用时检查,如果发现被篡改,就终止程序
- 一般来说,canary的的位数取决于机器架构,但至少有一字节的值为0x00,因为许多缓冲区溢出攻击(如字符串)不能包含NULL字节
-
对内存空间赋予不同的权限,如堆栈是可写的却不可执行,code是可执行的却是不可写的
-
返回到已经存在的库函数
-
面向返回编程
-
地址空间随机化ASLR
-
模糊测试
Lecture 5: IND-CPA, OTP and Block Ciphers
-
Keygen() -> K
-
Enc(K, M) -> C
-
Dec(K, C) -> M
-
Correctness: $$\forall K \exist M, c \gets Enc(K, M), Dec(K, C) = M$$
-
IND-CPA 选择明文攻击下的不可区分性
-
OTP 一次性密码
Lecture 6: Symmetric Key Encryption, PRG
-
分组密码 伪随机
-
AES