Linux内核info leak漏洞
1 Information Leak漏洞风险
从应用层软件,到hypervisor再到kernel代码,都存在Information Leak的风险。下面给出一些示例:
应用层软件:通常是应用敏感数据泄漏,比如从远程客户端获取服务端敏感数据。CVE-2012-0053,Openssl的心脏滴血等。
Hypervisor:主要是向guest泄漏hypervisor数据。CVE-2010-4525.
Kernel代码:泄漏内核地址,空间布局等,如CVE-2013-2147.
这里主要分析内核中的Information Leak漏洞所带来的风险。内核中的Information Leak通常都是用来绕过内核中的保护机制(利用缓解:StackGuard, ASLR),由于本身并不能直接用来形成提权等高风险操作,因此Information Leak漏洞经常被人忽视。
先来看一下这些保护机制。
StackGuard.
StackGuard是一种编译器实现的保护技术,它在栈函数返回地址前插入一个“canary”,当发生溢出“canary”值被破坏,将触发系统的异常处理流程。它的安全性依赖于“canary”的保密,也就是“canary”不能被攻击者预测或取到。
ASLR.
ASLR技术是将进程等的加载地址随机化,它的安全性依赖于加载基地址的不可预测,使exploit不能精确进行地址覆盖。
无论“canary”还是ASLR的基地址,对攻击者来说都是“秘密”。也就是在没有Information Leak漏洞前提下,这些都是用户不可直接获取的。但Information Leak漏洞可以辅助攻击者获取到这些“秘密”,进而绕过内核中的保护机制,成功实现漏洞利用。
2 Information Leak漏洞分类
根据漏洞成因,可以对Information Leak漏洞进行分类。这里同样只关注内核中的情况。
字节对齐带来的内存“空洞”.
为了程序性能,编译器在编译代码时会对变量进行字节对齐,从而引入了一些内存“空洞”。比如结构体使用sizeof计算的大小一般会大于各个成员占用空间大小的和。当这些内核中的内存“空洞”没有被初始化(ABI没有规定函数退栈时要清理这些栈空间),通过copy_to_user等函数拷贝到用户空间时,就会造成Information Leak漏洞,泄漏内核栈中的数据,比如泄漏了一个栈上指针,就可以通过它来计算进程基址(stackjack攻击)。
缺少变量初始化.
内核函数中的本地变量声明后,默认不会被初始化。根据C99描述这块空间的内容是不确定的。实际上栈空间是被各函数复用的,因此未初始化变量的内容很可能保存的是上个函数栈上的数据。
缺少对用户读操作的检查.
当向用户空间拷贝数据时,没有做大小检查或者检查逻辑出现错误,都会导致Information Leak。这类漏洞通常称作“越界读”,它允许用户态读取不应该被访问的内核空间数据。
其它bug导致的infoleaks.
其它的Information Leak原因这里不做研究,但提一下。比如/proc/,/sys/和/boot/文件系统中也提供了内核符号地址,它们已经靠kptr_restrict机制保护,但也可能因为bug而绕过。另外系统缓存,日志等都有可能导致Information Leak.
上面说到Information Leak可能危害保证StackGuard和ASLR可靠基础的“秘密”,下面分析一下内核中的Information Leak确切会影响哪些数据。
Data段.
内核中的data段保存了编译时就确定的全局变量,data段的泄漏可能导致静态内核symbols的泄漏,比如某些用于配置的变量。
栈
内核栈是根据ABI约定,运行时分配的。里面包含了函数返回地址,栈指针和一些其它数据。比如函数调用的参数,StackGuard机制的“canary”等。另外如果没有实现栈地址随机化,还会泄漏栈布局。
堆
内核中的堆是由内存分配器管理,在需要的地方动态分配。这些堆分配器通常使用双向链表来管理这些堆内存。Information Leak会漏洞这些堆存储的内容,还有可能泄漏用于堆管理的结构数据。
3 栈的Information Leak漏洞检测技术
分析目前的漏检测技术,发现通过数据流分析的方法,可以对Information Leak进行建模来进行漏洞检测。在模型里定义3个基本元素:数据源,数据接收方和传播路径。
我们可以对程序进行语义分析来匹配这套模型,从而识别漏洞。语义分析这个工作,选用开源的Coccinelle工具。
1 handler(...) {
2 <...
3 T ID;
4 ... when != memset(&ID, 0, ...)
5 when != ID = ...
6* copy_to_user(EV, &ID, EN)
7 ...>}
1) 数据源:ID变量
2) 数据接收方:用户态指针EV
3) 传播路径:我们想确定ID的内容没有被初始化。因此限定条件,ID在copy_to_user前没有memset()或初始化操作
像其它基于数据流的静态检测技术类似,这种方法也存在缺陷。比如这种Information Leak检测方法假定漏洞发生在一个函数内的,因此这种方法覆盖不了多函数场景。但实际测试中,依然会发现很多Linux内核和三方Driver的Information Leak漏洞。
Linux内核info leak漏洞的更多相关文章
- Linux内核提权漏洞(CVE-2019-13272)
漏洞描述 kernel / ptrace.c中的ptrace_link错误地处理了想要创建ptrace关系的进程的凭据记录,这允许本地用户通过利用父子的某些方案来获取root访问权限 进程关系,父进程 ...
- Linux内核通杀提权漏洞CVE-2016-5195验证
一.漏洞简介 CVE-2016-5195这个漏洞是linux内核级的本地提权漏洞,原理是linux内核内存子系统在 处理私有只读存储映射的写入时复制机制发现了一个冲突条件.这个漏洞官方给出的影响范围是 ...
- 漏洞预警:Linux内核9年高龄的“脏牛”0day漏洞
这个名叫Dirty COW,也就是脏牛的漏洞,存在Linux内核中已经有长达9年的时间,也就说2007年发布的Linux内核版本中就已经存在此漏洞.Linux kernel团队已经对此进行了修复. 漏 ...
- 【漏洞预警】Intel爆CPU设计问题,导致win和Linux内核重设计(附测试poc)
目前研究人员正抓紧检查 Linux 内核的安全问题,与此同时,微软也预计将在本月补丁日公开介绍 Windows 操作系统的相关变更. 而 Linux 和 Windows 系统的这些更新势必会对 Int ...
- NULL指针引起的一个linux内核漏洞
NULL指针一般都是应用于有效性检测的,其实这里面有一个约定俗成的规则,就是说无效指针并不一定是 NULL,只是为了简单起见,规则约定只要指针无效了就将之设置为NULL,结果就是NULL这个指针被用来 ...
- Linux本地内核提权漏洞复现(CVE-2019-13272)
Linux本地内核提权漏洞复现(CVE-2019-13272) 一.漏洞描述 当调用PTRACE_TRACEME时,ptrace_link函数将获得对父进程凭据的RCU引用,然后将该指针指向get_c ...
- CVE-2019-11477:Linux 内核中TCP协议栈整数溢出漏洞详细分析 代码卫士 今天
CVE-2019-11477:Linux 内核中TCP协议栈整数溢出漏洞详细分析 代码卫士 今天
- CVE-2019-13272:Linux本地内核提权漏洞复现
0x00 简介 2019年07月20日,Linux正式修复了一个本地内核提权漏洞.通过此漏洞,攻击者可将普通权限用户提升为Root权限. 0x01 漏洞概述 当调用PTRACE_TRACEME时,pt ...
- Linux内核漏洞精准检测如何做?SCA工具不能只在软件层面
摘要:二进制SCA工具要想更好的辅助安全人员实现安全审计.降低漏洞检测的误报率,必须向更细颗粒度的检测维度发展,而不仅仅停留在开源软件的层面,同时对漏洞库的要求也需要向细颗粒度的精准信息提出的挑战. ...
随机推荐
- python爬虫---requests库的用法
requests是python实现的简单易用的HTTP库,使用起来比urllib简洁很多 因为是第三方库,所以使用前需要cmd安装 pip install requests 安装完成后import一下 ...
- https 不会被中间人攻击——因为中间人即使拿到了数据,也是加密的
只要你登陆了一个使用 HTTPS 数据加密的网站,浏览的页面的内容如果被人中途看见,将会是一团乱码.它也能保证,你浏览的页面就是你想浏览的,不会被黑客在中途修改,网站收到的数据包也是你最初发的那个,不 ...
- xinetd黑/白名单配置教程(以telnet为例)
对于诸如telnet等托管于xinetd的服务,当请求到来时由于是通过xinetd进行通知,所以可以直接在xinetd上配置白名单允许和拒绝哪些ip连接服务. 本文主要参考xinetd.conf的ma ...
- Java 统计字母个数
原理: 将字符串转换成char字符数组 然后使用另一个数组存储 代码如下 public class CalChar { public static void main(String[] args) { ...
- OOP⑹
1.抽象类 所有由abstract关键字修饰的方法我们称之为 抽象方法! 抽象方法只能存在于 抽象类中! 所有由abstract关键字修饰的类我们称之为 抽象类! 抽象类的特点: 01.由abstra ...
- Java并发编程_volatile关键字的用法(二)
被volatile修饰的变量能够保证每个线程能够获取该变量的最新值,从而避免出现数据脏读的现象. 根据下面实例理解: package sync; public class VolatileTest e ...
- springMVC操作cookie和session
cookie相关说明: 1.cookie由服务器端创建,然后添加到HttpServletResponse中发送给客户端(浏览器). 2.可以添加多个cookie键值对. 3.cookie由键值名和键值 ...
- 《Python》线程之锁、信号量、事件、条件、定时器、队列
一.锁 线程为什么要有锁: += .-= 赋值操作数据不安全(要经过取值.计算.放回值,3部操作) pop .append 都是数据安全的(只有添加和删除,一次操作) 队列也是数据安全的 1.同步锁 ...
- substr、substring和slice的区别
substr(start,[length])表示从start位置开始取length个字符串:substring(start,end)表示从start,到end之间的字符串,包括start位置的字符但是 ...
- Interlocked单向链式栈
线程同步一大部分与原子访问(atomic access)有关, 所谓原子访问, 指的是一个线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问同一资源. Interlocked单向链式栈的操作 ...