软件安全原理
教学目的:以基础软件、BS架构支撑软件、移动APP为重点,讲解软件技术发展
过程中安全威胁与防御机制的博弈演讲,以及确保软件安全的正确方法。从安全
视角重新认识软件,掌握围绕软件攻防的白帽与黑帽方法,理解软件的安全内
构。
1. 软件安全防御:论述软件安全的基本原理,从白帽视角论述软件的各类安全
防御机制
2. 软件分析与攻击:从黑帽视角论述软件存在的各种安全脆弱性问题,以及如
何利用它们形成有效攻击
3. 安全的软件开发:确保软件安全的工程化方法,BSI内构安全是其核心
操作系统安全与虚拟化技术
计算机基础软件概述
CPU和现代操作系统
操作系统是管理计算机硬件的程序,为应用程序提供基础
分段、分页与特权级
分段
1978年intel 8086处理器首次加入分段机制。
基本思路:地址空间中,对程序中每一个逻辑单元设立
一个独立的、从0开始、线性连续地址空间。每个程序
若干段,代码段、数据段、堆栈段、其他段。
分段机制出现前,程序所使用的内存空间不是相互隔离
的。
分段机制将程序运行所需的内存空间从虚拟空间映射到
某个物理空间。
实模式
早期8086是16位,两个字节
物理地址=段值*16+偏移
只能访问1M地址空间
保护模式
CPU为32位,寻址空间达到4G
保护模式下16位寄存器表示的段值只是一个索
引,称为段选择符,其作用是选择包含段特征的
段描述符。
段选择符有三个域,13位索引域(描述符在描述
符表中的索引)、1位选择域(1-局部描述符
表/0-全局描述符表)、2位选择符特权级
RPL(用来与描述符的特权级比较大小实现一定
的保护)
段描述符64位,表述了段的存储位置和相关的段
属性,含基地址、DPL等
分页
1985年80386处理器第一次引入分页和特权级
线性地址被分为固定长度为单位的组,称为页。
页框:分页单元将RAM分为固定长度4K大小的页框
页表:把线性地址映射到物理地址
页目录表:为页表建立目录索引
寄存器:CR0中PG位控制是否启动分页机制、CR3位页
目录寄存器
特权级
出现背景
分段机制带来一些问题:
1. 地址空间缺乏保护机制
2. 用来改变段寄存器内容的指令不是特权指令
——使得进程可以访问内存中任何单元
80386保护模式,通过分级把代码隔离了起来
段保护
引入CPL、DPL、RPL进行权限控制
CPL-当前运行代码权限,CS寄存器的0、1位表示
Ring0-3共4个级别
只有当CPL<=DPL&&RPL<=DPL时,访问才被
允许。
页保护
在页目录项、页表项中引入User/Supervisor位
0-Supervisor,对应CPL=0,1,2
1-User,对应CPL=3
程序运行在CPL=0,1,2情形下可以访问所有内
存页,CPL=3只能访问user内存页
宏内核与微内核
宏内核,整个核心程序都是以核心空间以及监管者模式运行;
效率高、灵活性差
微内核,只有最基本的操作功能放在内核中;优:一致接口、
可扩展性、灵活性、可移植性、可靠性、
固件攻防技术演进
固件是一种特定的计算机软件类,为设备的特定硬件提供低级控制。
为设备复杂的软件提供标准化操作环境,或是充当简单设备的完整操
作系统。
嵌入式系统、消费设备、计算机、计算机外设等几乎所有电子设备都
包含固件。
BIOS是计算机主板上最重要最核心的计算机固件。计算机加电时,
CPU取得的第一条指令就存储在BIOS中。
BIOS功能:开机自检、系统初始化、提供常驻内存的运行时服务、
系统设置、引导操作系统
固件威胁
第三方创建自定义固件,固件黑客通常利用许多设备上的固件
更新工具来安装或运行自己的代码。
固件安全防护
硬件写保护、双BIOS(一部分写保护对其他部分验证)、软
件写保护、签名机制、安全升级、禁止非授权回滚
操作系统安全机制演进
操作系统脆弱性和保护机制概述
操作系统攻击的危害:
破坏系统数据、干扰系统运行、攻击文件、抢占系统资源、干扰IO
设备、导致系统性能下降、攻击存储器、敏感信息窃取、网络破坏
计算机安全防护:
一方面,硬件提供支持,另一方面从设计之初就要考虑安全问题
写保护、执行保护技术
早期典型攻击技术
HOOK技术
rootkit通过HOOK内核关键数据结构如SSDT表、IDT
表、GDT表等实现恶意目的。
缓冲区溢出
缓冲区溢出,向缓冲区提供多于其存储容量的数据,若
精心构造溢出数据,可能获得系统控制权。
eg:strcpy覆盖原有的返回地址,使其指向shellcode
写保护
CR0是系统的控制寄存器之一,控制寄存器决定了当前处理器
的操作模式和正在执行任务的特征。
80486的处理器在CR0中加入了“写保护WP”位,控制是否
允许处理器向标记为只读属性的内存页写入数据。以保护内核
关键数据,如SSDT表,IDT表,GDT表,防止被恶意篡改。
规则:CR0.WP = 0,可以任意写;WP=1,只可写页表项
R/W位为1的页
写保护位有利于UNIX类操作系统在创建进程时实现写时复
制,即起子进程时并不复制整个进程地址空间,而是需要写入
时数据才被复制,避免拷贝大量不被使用的数据。
但是写保护可以被关闭。
Canary
在栈上函数返回值附近放置一个难以预测的值,函数返回时检
查这个值是否被改变
执行保护
NX/XD
AMD提出NX,在内存中的某些关键段关闭执行权限。
XD-intel,执行禁止位,在内存界面的数据区域设置某
些标志,CPU检测到内存页面有这些标志时就拒绝执
行。
DEP
windows的安全机制,将只包含数据的内存位置标记为
非可执行,当尝试执行时CPU抛出异常。
ROP/JOP
2000年提出,面向返回编程ROP:用小程序地址填充堆
栈,每个小程序片段都一RET及其类似指令为结尾。
面向跳转编程JOP:基本单元是以转移指令结尾的指令
片段
地址随机化技术
Ret2libc
1999年出现,可绕过非可执行段,直接在共享库段找执行代
码。
libc提供类UNIX系统中的C运行时支持,总会被链接到程序
中,且提供了一些对攻击者有用的函数。
ret2libc攻击利用缓冲区溢出将战中的返回地址修改为libc函数
的入口地址,并通过栈传参
地址空间随机化ASLR
2001年提出,一开始只对栈地址实施随机化,后来推广到
堆、共享库。
目的:降低攻击成功概率;使得攻击方法不能简单移植
主要思想:对进程的堆栈代码段数据段共享库等装在地址进行
随机化排布,使得攻击者无法得知这些段的具体位置。
使用:VS的链接选项
粗粒度的ASLR只是随机处理数据区域的基地址,有人提出了
细粒度的,基于对象的随机化。
绕过:return-to-plt,调用动态连接器的符号解析过程,获得
符号地址。plt为链接过程表,与动态链接相关;GOT表保存
动态链接库函数的地址。ret2plt的思想是通过修改GOT表
(通过多次strcpy函数拼凑system函数地址),使用plt机制
劫持控制流。
堆喷射技术
2004年,将包含攻击者代码的对象大面积地分配在进程的堆
中,提高引用/执行这些代码的成功率。
实现原理:shellcode前面加大量滑板指令,申请大量内存,
反复注入填充。使用其他漏洞攻击技术控制程序流,使其执行
到堆上。
优点:增加了缓冲区溢出的成功率,容易被察觉,只能协同攻
击,有一定失败率。
JIT喷射:JIT生成代码存放在可读写执行的代码缓存中,JIT喷
射强制即时编译器产生大量代码进行堆喷射。
可信计算
基本思想:
1. 先在计算机系统中建立一个信任根(由物理安全、技术安全、
管理安全共同保证)
2. 再建立一条信任链,从信任根开始,到硬件平台、操作系统、
应用,一级度量一级,一级信任一级,将信任扩展到整个计算
机系统。
信任根是基于密码学和物理保护的信任源头(TPM、TCM、
TPCM)
TPM
国际可信计算组织TCG在现有体系结构上引入TPM。
信任根完成可信度量的存储等功能
TSS
是可信计算平台上TPM的支撑软件,为操作系统和应用软件提
供使用TPM的接口。
结构上可分为内核层、系统服务层、用户程序层
相关技术
intel TXT
通过使用高级的TXT模块芯片,配合主机板芯片组及虚
拟机软件,协助保护系统重要数据并避免其受到攻击。
依赖于一系列支持TXT技术的硬件、软件、固件
ARM TrustZone
将单个的物理处理器分成两个虚拟处理器核,普通和安
全。这种硬件架构为普通操作系统和安全操作系统提供
了基础。
AMD-SP
利用TrustZone技术将CPU分为两个虚拟区域,敏感任
务在安全区域运行,其他任务在普通模式下运行。
控制流安全
控制流劫持
控制流劫持攻击通过劫持函数返回地址或代码指针将控制流跳
转到攻击者指定的代码地址并执行。
分为注入和非注入两种。
注入攻击
利用漏洞将包含shellcode的代码注入到内存可执行区
域,并想办法执行
攻击条件:
1. 注入漏洞
2. 控制程序原有执行流程并跳转
3. 攻击代码可被执行
非注入类
代码重用攻击
重用目标程序中的工具代码片段(Gadget)构造
攻击代码
ROP
2000年提出,面向返回编程ROP:用小程
序地址填充堆栈,每个小程序片段都一RET
及其类似指令为结尾。
最早2000年,ret2libc绕过了DEP,局限执
行顺序为线性,不能分支、跳转,恶意程
序只能是程序的代码段或加载的库函数。
2007年,通过在libc等库中寻找以ret结尾
的指令序列gadget,将这些gadget串联完
成复杂操作。
JOP
使用以JMP或call间接跳转指令结尾的
gadget
COOP
针对前向CFI的攻击方式
动态生成代码
不依赖漏洞注入,不依赖程序中存在合法攻击代
码段,通过设计程序输入完成攻击代码注入或攻
击代码段构造
防御机制
DEP和ASLR
ASLR防御代码复用攻击:代码复用攻击绝大多数依赖于
程序的内存布局,若程序布局不可预知,会大大增加代
码复用的难度。
控制流完整性保护CFI
通过检查控制流非正常跳转而防止程序控制流被劫持的
防御方法。
细粒度CFI
通过一些方法严格控制每一个间接跳转指令的转
移目标,在目标地址前插入标记,在控制流转移
前检查标记。
虽简单但开销大
粗粒度CFI
主要基于攻击特征的检查,包括实施代码复用攻
击时指令序列的特征和程序正常执行时的安全规
则。
微软CFG
通过代码编译和程序运行时相结合的方式实现对
call的间接跳转目标的限制。
intel CET
Intel推出的用于防护ROP/JOP的芯片级解决方
案。
影子堆栈:对返回地址进行保护,预防ROP
原理:影子堆栈保存返回地址,函数返回时进行
对比。为保证影子堆栈不被篡改,在页表保护中
提供新的扩展属性,被标记为shadow stack的内
存页普通软件和指令无法对其进行写操作。新的
寄存器SSP指向shadow stack的栈顶。
间接分支跟踪:对跳转分支保护,预防JOP
原理:提供新指令,标记合法的间接call/jmp目
标
闪避防御技术
将软件多样化技术应用到动态代码生成上增加生成代码
的不确定性,生成多变形态功能相同的代码,减少攻击
者对于生成代码的知识,降低攻击成功率。
访问控制
在身份认证的基础上,依据授权对资源访问请求加以控制。(限制已
授权的用户、程序、进程或网络中其它系统对本系统资源的访问)
自主访问控制DAC
特点:允许授权用户改变客体访问控制属性