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工具要想更好的辅助安全人员实现安全审计.降低漏洞检测的误报率,必须向更细颗粒度的检测维度发展,而不仅仅停留在开源软件的层面,同时对漏洞库的要求也需要向细颗粒度的精准信息提出的挑战. ...
随机推荐
- 网页定位点击事件js响应函数教程(Chrome)
一.背景说明 在前端页面调试或者渗透测试(尤其是XSS)时,我们经常想定位js函数位置:比如点击了某个位置弹出了一个对话框,这是哪个文件的哪个js函数在响应. 本文以Chrome浏览器定位点击事件响应 ...
- install the Mondo Rescue utility in Ubuntu 12.04 or 12.10.
1. Open a terminal window. 2. Type in the following commands, then hit Enter after each. wget ft ...
- Linux第六周作业
一 实验过程 1 先进入LinuxKernel环境下,更新menu代码到最新版,用到的命令为rm menu -rf //强制删除当前menu,git clone http://git.shiyanlo ...
- windows中mysql5.7保存emoji表情
1.找到my.ini文件,修改一下配置: [client] default-character-set=utf8mb4 [mysqld] character-set-client-handshake ...
- python2.x 与 python3.x的区别
从语言的源码角度: python2.x 的源码书写不够规范,且源码有重复,代码的复用率不高; python3.x 的源码清晰.优美.简单 从语言的特性角度: python2.x 默认为ASCII字符编 ...
- http协商缓存VS强缓存
之前一直对浏览器缓存只能描述一个大概,深层次的原理不能描述上来:终于在前端的两次面试过程中被问倒下,为了泄恨,查阅一些资料最终对其有了一个更深入的理解,废话不多说,赶紧来看看浏览器缓存的那些事吧,有不 ...
- OOP⑶
/** * 学生类 * ctrl+o 查询本类的所有属性 和方法 */ public class Student { int age; // 年龄 String name; // 姓名 // 自己创建 ...
- 【转】用深度学习做crowd density estimation
本博文主要是CVPR2016的<Single-Image Crowd Counting via Multi-Column Convolutional Neural Network>这篇文章 ...
- EF-记录程序自动生成并执行的sql语句日志
在EntityFramework的CodeFirst模式中,我们想将程序自动生成的sql语句和执行过程记录到日志中,方便以后查看和分析. 在EF的6.x版本中,在DbContext中有一个Databa ...
- Cracking The Coding Interview 3.6
// Write a program to sort a stack in ascending order. You should not make any assumptions about how ...