前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CVE-2018-8781:linux内核mmap整数溢出漏洞分析

CVE-2018-8781:linux内核mmap整数溢出漏洞分析

作者头像
De4dCr0w
发布于 2019-05-22 07:11:06
发布于 2019-05-22 07:11:06
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

漏洞分析

drivers/scsi/sg.c

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static const struct file_operations sg_fops = {
	.owner = THIS_MODULE,
	.read = sg_read,
	.write = sg_write,
	.poll = sg_poll,
	.unlocked_ioctl = sg_ioctl,
#ifdef CONFIG_COMPAT
	.compat_ioctl = sg_compat_ioctl,
#endif
	.open = sg_open,
	.mmap = sg_mmap,
	.release = sg_release,
	.fasync = sg_fasync,
	.llseek = no_llseek,
};
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static int udl_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
{
	unsigned long start = vma->vm_start;
	unsigned long size = vma->vm_end - vma->vm_start;
	unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
	unsigned long page, pos;

    //offset+size可以通过整数溢出绕过size的检查
    //(1)offset = 2**64-info->fix.smem_start + 目标地址
    //(2)size = 目标size
    // 这样我们就可以从用户层访问到低的物理地址
	if (offset + size > info->fix.smem_len)
		return -EINVAL;

	pos = (unsigned long)info->fix.smem_start + offset;

	pr_notice("mmap() framebuffer addr:%lu size:%lu\n",
		  pos, size);

	while (size > 0) {
		page = vmalloc_to_pfn((void *)pos);
		if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED))
			return -EAGAIN;

		start += PAGE_SIZE;
		pos += PAGE_SIZE;
		if (size > PAGE_SIZE)
			size -= PAGE_SIZE;
		else
			size = 0;
	}

	/* VM_IO | VM_DONTEXPAND | VM_DONTDUMP are set by remap_pfn_range() */
	return 0;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct cred {
	atomic_t	usage;
#ifdef CONFIG_DEBUG_CREDENTIALS
	atomic_t	subscribers;	/* number of processes subscribed */
	void		*put_addr;
	unsigned	magic;
#define CRED_MAGIC	0x43736564
#define CRED_MAGIC_DEAD	0x44656144
#endif
	kuid_t		uid;		/* real UID of the task */
	kgid_t		gid;		/* real GID of the task */
	kuid_t		suid;		/* saved UID of the task */
	kgid_t		sgid;		/* saved GID of the task */
	kuid_t		euid;		/* effective UID of the task */
	kgid_t		egid;		/* effective GID of the task */
	kuid_t		fsuid;		/* UID for VFS ops */
	kgid_t		fsgid;		/* GID for VFS ops */
	unsigned	securebits;	/* SUID-less security management */
	kernel_cap_t	cap_inheritable; /* caps our children can inherit */
	kernel_cap_t	cap_permitted;	/* caps we're permitted */
	kernel_cap_t	cap_effective;	/* caps we can actually use */
	kernel_cap_t	cap_bset;	/* capability bounding set */
	kernel_cap_t	cap_ambient;	/* Ambient capability set */
#ifdef CONFIG_KEYS
	unsigned char	jit_keyring;	/* default keyring to attach requested
					 * keys to */
	struct key __rcu *session_keyring; /* keyring inherited over fork */
	struct key	*process_keyring; /* keyring private to this process */
	struct key	*thread_keyring; /* keyring private to this thread */
	struct key	*request_key_auth; /* assumed request_key authority */
#endif
#ifdef CONFIG_SECURITY
	void		*security;	/* subjective LSM security */
#endif
	struct user_struct *user;	/* real user ID subscription */
	struct user_namespace *user_ns; /* user_ns the caps and keyrings are relative to. */
	struct group_info *group_info;	/* supplementary groups for euid/fsgid */
	struct rcu_head	rcu;		/* RCU deletion hook */
} __randomize_layout;

kuid_t和kgid_t 类型为unsigned int:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef __kernel_uid32_t
typedef unsigned int	__kernel_uid32_t;
typedef unsigned int	__kernel_gid32_t;
#endif

sudo mknod /dev/MWR_DEVICE c 200 0 sudo chmod 777 /dev/MWR_DEVICE

sudo mknod /dev/MWR_DEVICE_Fault c 233 0 sudo chmod 664 /dev/MWR_DEVICE_Fault

sudo mknod /dev/MWR_DEVICE_Fault2 c 244 0 sudo chmod 664 /dev/MWR_DEVICE_Fault2

sudo mknod /dev/H4N9U1 c 245 0 sudo chmod 777 /dev/H4N9U1

参考链接

https://research.checkpoint.com/mmap-vulnerabilities-linux-kernel/

补丁地址:https://patchwork.freedesktop.org/patch/211845/

https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-mmap-exploitation-whitepaper-2017-09-18.pdf

内存映射函数remap_pfn_range学习:https://www.cnblogs.com/pengdonglin137/p/8149859.html

https://github.com/h4n9u1/Linux_Driver_mmap_Handler_Exploitation

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
从 0 开始学 Linux 内核之 android 内核栈溢出 ROP 利用
最近在研究一个最简单的android内核的栈溢出利用方法,网上的资料很少,就算有也是旧版内核的,新版的内核有了很大的不同,如果放在x86上本应该是很简单的东西,但是arm指令集有很大的不同,所以踩了很多坑
Seebug漏洞平台
2019/02/26
1.7K0
CVE-2017-7184-xfrm_user 分析
IPSEC是一个协议组合,用于提供IP层的安全性。它包含AH、ESP、IKE协议,IPSec提供了两种安全机制:认证(采用ipsec的AH)和加密(采用ipsec的ESP)。
De4dCr0w
2020/06/12
9030
CVE-2017-7184-xfrm_user 分析
深入理解mmap 0拷贝技术
我们知道,linux系统中用户空间和内核空间是隔离的,用户空间程序不能随意的访问内核空间数据,只能通过中断或者异常的方式进入内核态,一般情况下,我们使用copy_to_user和copy_from_user等内核api来实现用户空间和内核空间的数据拷贝,但是像显存这样的设备如果也采用这样的方式就显的效率非常底下,因为用户经常需要在屏幕上进行绘制,要消除这种复制的操作就需要应用程序直接能够访问显存,但是显存被映射到内核空间,应用程序是没有访问权限的,如果显存也能同时映射到用户空间那就不需要拷贝操作了,于是字符设备中提供了mmap接口,可以将内核空间映射的那块物理内存再次映射到用户空间,这样用户空间就可以直接访问不需要任何拷贝操作,这就是我们今天要说的0拷贝技术。
用户7244416
2021/08/06
1K0
Stringipc-从内存任意读写到权限提升
传入的new_size为-1时,krealloc分配一个0大小的空间返回一个不为0的错误代码ZERO_SIZE_PTR(0x10),绕过下面的判断你,又因为new_size是无符号整数,此时channel->buf_size=0xffffffffffffffff,后续读和写操作的范围就没有限制,可以对内存任意读写。
De4dCr0w
2020/06/12
1.1K0
Stringipc-从内存任意读写到权限提升
Android/Linux Root 的那些事儿
玩过安卓的朋友应该都对 root 这个名词不陌生,曾几何时,一台 root 过的手机是发烧友标配;对于开发者来说,root 后的手机是黑灰产外挂的温床,是想要极力避免和打击的目标;而对于安全研究人员来说,root 则意味着更多 —— Towelroot、PingPongRoot、DirtyC0w、ReVent,那些有趣的漏洞和精妙的利用,承载了不少的汗水和回忆。
evilpan
2023/02/12
9890
Linux内存映射——mmap
所谓的内存映射就是把物理内存映射到进程的地址空间之内,这些应用程序就可以直接使用输入输出的地址空间,从而提高读写的效率。Linux提供了mmap()函数,用来映射物理内存。在驱动程序中,应用程序以设备文件为对象,调用mmap()函数,内核进行内存映射的准备工作,生成vm_area_struct结构体,然后调用设备驱动程序中定义的mmap函数。
全栈程序员站长
2022/07/02
6.1K0
Linux内存映射——mmap
Linux内核虚拟内存管理之匿名映射缺页异常分析
韩传华,就职于南京大鱼半导体有限公司,主要从事linux相关系统软件开发工作,负责Soc芯片BringUp及系统软件开发,乐于分享喜欢学习,喜欢专研Linux内核源代码。
Linux阅码场
2020/09/10
3.1K0
Linux内核虚拟内存管理之匿名映射缺页异常分析
Android中mmap原理及应用简析
mmap是Linux中常用的系统调用API,用途广泛,Android中也有不少地方用到,比如匿名共享内存,Binder机制等。本文简单记录下Android中mmap调用流程及原理。mmap函数原型如下:
看书的小蜗牛
2019/02/22
1.9K0
Android中mmap原理及应用简析
【内存管理】页表映射基础知识
大家在看内核代码时会经常看的以上术语,但在ARM的芯片手册中并没有用到这些术语,而是使用L1,L2,L3页表这种术语。
嵌入式与Linux那些事
2024/06/11
5500
【内存管理】页表映射基础知识
Android跨进程通信IPC之8——Binder驱动
原本是没有这篇文章的,因为原来写Binder的时候没打算写Binder驱动,不过我发现后面大量的代码都涉及到了Binder驱动,如果不讲解Binder驱动,可能会对大家理解Binder造成一些折扣,我后面还是加上了这篇文章。主要内容如下:
隔壁老李头
2018/08/30
1.7K0
Android跨进程通信IPC之8——Binder驱动
Linux内存管理之mmap详解
作者:freeboy1015 来源:http://lib.csdn.net/article/linux/62126 一. mmap系统调用 1. mmap系统调用 mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。munmap执行相反的操作,删除特定地址区域的对象映射。 当使用mmap映射文件到进程后,就可以直接操作这段虚拟地址进行文件的读写等操作,不必再调用read,write等系统调用.但需注意,直
小小科
2018/05/02
4.6K0
Linux内存管理之mmap详解
linux内核缺页中断处理
现代处理器大部分都有MMU,除了一些小型嵌入式设备。MMU可以做虚拟地址到物理地址的转换,使用MMU我们就可以使用更多的内存空间,因为程序具有局部性原理,我们可以将暂时用不到的数据存放到磁盘,当访问到时会发生缺页中断,从磁盘中将所需要的数据加载到内存。所以我们可以通过mmu运行程序大小大于内存的程序和打开大于内存的文件。现代处理器通过分段分页机制实现虚拟地址到物理地址转换一般支持二级页表或四级页表。
用户4415180
2022/06/23
11.2K0
linux内核缺页中断处理
想掌握Android面试官必问的 Binder 机制?那别想绕开 Binder 驱动源码分析!
Binder 是 Android 系统的进程间通信机制,是了解 Android 运行机制必须要掌握的一个知识点,更是一线企业面试必问的知识点!比如:
Android技术干货分享
2020/08/30
2.2K0
想掌握Android面试官必问的 Binder 机制?那别想绕开 Binder 驱动源码分析!
系统调用之mmap源码分析(基于linux1.2.13)
mmap涉及到操作系统底层很多知识,目前粗略介绍一下大概的逻辑,等深入理解后再继续。操作系统用vma链表管理内存,mmap就是申请一个新的vma供进程使用。可以当作内存使用,也可以当做文件来使用vma对应的这片空间。但是申请的vma,还不会分配物理地址。等到真正访问这片地址的时候,由缺页处理程序作物理页的映射。
theanarkh
2019/07/30
1.9K0
深入理解Linux内核之mmu-gather操作
本文讲解Linux内核虚拟内存管理中的mmu_gather操作,看看它是如何保证刷tlb和释放物理页的顺序的,又是如何将更多的页面聚集起来统一释放的。
用户7244416
2022/04/28
2.5K0
深入理解Linux内核之mmu-gather操作
task_struct结构详解
在 Linux 内核中,无论是进程还是线程,到了内核里面,都叫做任务(Task),由统一的数据结构 task_struct 进行管理。task_struct 是 Linux 中的进程描述符,是感知进程存在的唯一实体。Linux 内核中通过一个双向循环链表将所有的 task_struct 串了起来,不同的操作系统中,PCB 所包含的内容也会不同。
小文要打代码
2025/04/01
1350
Binder概述,快速了解Binder体系
众所周知,Binder是Android系统中最主要的进程间通信套件,更具体一点,很多文章称之为Binder驱动,那为什么说它是一个驱动呢,驱动又是何物,让我们自底向上,从内核中的Binder来一步步揭开它的面纱。本文重点在帮助读者对于Binder系统有一个简略的了解,所以写得比较笼统,后续文章会详细分析。
做个快乐的码农
2021/12/31
1.6K0
Binder概述,快速了解Binder体系
Linux | 块设备了解之三层结构
块设备是文件系统的底层支撑,完成数据的存储和访问。块设备也能脱离文件系统以螺设备的形式工作。
heidsoft
2023/03/18
1.5K0
Linux | 块设备了解之三层结构
Linux mmap原理
mmap是linux操作系统提供给用户空间调用的内存映射函数,很多人仅仅只是知道可以通过mmap完成进程间的内存共享和减少用户态到内核态的数据拷贝次数,但是并没有深入理解mmap在操作系统内部是如何实现的,原理是什么。
大忽悠爱学习
2022/10/30
3.9K0
Linux mmap原理
mmap的系统调用
mmap:进程创建匿名的内存映射,把内存的物理页映射到进程的虚拟地址空间。进程把文件映射到进程的虚拟地址空间,可以像访问内存一样访问文件,不需要调用系统调用read()/write()访问文件,从而避免用户模式和内核模式之间的切换,提高读写文件速度。两个进程针对同一个文件创建共享的内存映射,实现共享内存。2.删除内存映射
刘盼
2023/01/05
1.6K0
mmap的系统调用
相关推荐
从 0 开始学 Linux 内核之 android 内核栈溢出 ROP 利用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档