’:/tmp/rtl8814au/os_dep/linux/rtw_android.c:615:62: error: macro "access_ok" passed 3 arguments, but...^/tmp/rtl8814au/os_dep/linux/rtw_android.c:615:7: error: ‘access_ok’ undeclared (first use in this function...access_ok(VERIFY_READ, priv_cmd.buf, priv_cmd.total_len)){ ^~~~~~~~~/tmp/rtl8814au/os_dep/linux...access_ok(VERIFY_READ, priv_cmd.buf, priv_cmd.total_len)){ 改成如下即可: #if (LINUX_VERSION_CODE >= KERNEL_VERSION...access_ok(priv_cmd.buf, priv_cmd.total_len)) {#elseif (!
原理 先看一段小视频,如果内核访问用户不做access_ok会怎样? ? 接下来继续深入地做功课! ?...危害 一个攻击案例可以参考: http://www.freebuf.com/vuls/152412.html 《Linux内核Waitid系统调用本地提权漏洞(CVE-2017-5123)的分析与利用...显然,它只是增加了对access_ok的调用。
第二个层次是为什么要用copy_from_user而不是直接memcpy 为什么要拷贝 拷贝这个事情是必须的,这个事情甚至都跟Linux都没有什么关系。...比如Linux有个kobject结构体,kobject结构体里面有个name指针: struct kobject { const char *name; struct list_head...name,比如: dev_set_name(&chan->dev->device, "dma%dchan%d", device->dev_id, chan->chan_id); 但是Linux...就是因为,作者把有access_ok的put_user改为了没有access_ok的unsafe_put_user。...所以,你看到内核修复这个CVE的时候,是对这些地址进行了一个access_ok的: ? 下面我们看第二个问题,page fault的修复机制。
第二个层次是为什么要用copy_from_user而不是直接memcpy 为什么要拷贝 拷贝这个事情是必须的,这个事情甚至都跟Linux都没有什么关系。...比如Linux有个kobject结构体,kobject结构体里面有个name指针: struct kobject { const char *name; struct list_head...name,比如: dev_set_name(&chan->dev->device, "dma%dchan%d", device->dev_id, chan->chan_id); 但是Linux...比如内核的这个commit,引起了著名的安全漏洞: 就是因为,作者把有access_ok的put_user改为了没有access_ok的unsafe_put_user。...所以,你看到内核修复这个CVE的时候,是对这些地址进行了一个access_ok的: 下面我们看第二个问题,page fault的修复机制。
原文:https://salls.github.io/Linux-Kernel-CVE-2017-5123/ 译者:hello1900@知道创宇404实验室 本文介绍如何利用Linux内核漏洞CVE...在较高级别,put_user的功能大致如下: put_user(x, void __user *ptr) if (access_ok(VERIFY_WRITE, ptr, sizeof(*ptr...在内核版本4.13中,为了能够正常使用unsafe_put_user,专门对waitid syscall进行了更新,但access_ok检查仍处于缺失状态。漏洞代码如下所示。...通常情况下,Chrome沙箱行之有效,因为Linux内核漏洞多位于syscall,由seccomp沙箱拦截。...考虑到Linux内核堆栈并非自身擅长领域,先喷射10000个线程,然后使用调试器检查任务结构在堆栈中的位置。我注意到,喷射对象达到一定数量后,大部分任务结构将在堆栈较低地址处结束。
Linux中把ioctl cmd划分成几个位段来帮助创建唯一的cmd。这几个位段一般是:type(模数),序号,传输方向和参数大小。...使用access_ok之后就可以安全地传输数据。...__put_user 进行更少的检查(它不调用 access_ok),但是仍然能够失败如果被指向的内存对用户是不可写的。...因此, __put_user 应当只用在内存区已经用 access_ok 检查过的时候。...再次, __get_user 应当只用在已经使用 access_ok 校验过的地址。
我这里说一个大概思路,因为我觉得《Linux设备驱动程序》这本书已经说的非常清楚了,但是得化一些时间来看。...Linux 的第一个版本使用 16-位数: 高 8 位是关联这个设备的”魔”数, 低 8 位是一个顺序号, 在设备内唯一....`Type' is user-oriented, while * access_ok is kernel-oriented, so the concept of "read" and * "write"...access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd)); else if (_IOC_DIR(cmd) & _IOC_WRITE) err...access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd)); if (err) return -EFAULT; 在调用 access_ok 之后
Linux阅码场 操作系统堪称是IT皇冠上的明珠,Linux阅码场专注Linux操作系统内核研究, 它的文章云集了国内众多知名企业一线工程师的心得,畅销著作有《linux设备驱动开发详解 》等。...Linux阅码场精选文章汇总: 关于Linux学习方法: 迭代螺旋法——关于Linux学习方法的血泪建议 纪念金庸先生——程序员的武侠世界 ---- Linux任督二脉之进程管理 郭健:Linux进程调度技术的前世今生之...论打通Linux进程和内存管理任督二脉 宋宝华: Linux僵尸进程可以被“杀死”吗?...4分钟理解Linux为什么不是一个硬实时的操作系统 宋宝华:关于Linux进程优先级数字混乱的彻底澄清 有关微内核OS史上最透彻一篇 - 写于华为鸿蒙发布一周之际 被神话的Linux, 一文带你看清Linux...深入理解Linux RCU之一——从硬件说起 谢宝友:深入理解Linux RCU:从硬件说起之内存屏障 廖威雄: 学习Linux必备的硬件基础一网打尽 为什么内核访问用户数据之前,要做access_ok
Linux内核中do{...}while(0)意义: 辅助定义复杂的宏,避免引用的时候出错,如果不用{},if后面的语句只有第一条进行了判断。同时避免宏展开后“;”造成编译不通过....ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x)) https://blog.csdn.net/ganggexiongqi/article/details/24603363 ACCESS_OK...宏 CVE-2017-5123(waitid系统调用),检查指针是不是属于用户空间的,x86架构下ACCESS_OK宏的实现: /** * access_ok: - Checks if a user...range - after calling * this function, memory access functions may still return -EFAULT. */ #define access_ok...= PER_LINUX32) PER_LINUX32 = 0x0008, PER_MASK = 0x00ff, /*, Return the base personality without flags
ioctl 方法第二个参数 cmd 为用户与驱动的 “协议”,理论上可以为任意 int 型数据,可以为 0、1、2、3……,但是为了确保该 “协议” 的唯一性,ioctl 命令应该使用更科学严谨的方法赋值,在linux...命令及相关宏定义,可以理解为一份 “协议” 文件,代码如下: // ioctl-test.h #ifndef __IOCTL_TEST_H__ #define __IOCTL_TEST_H__ #include linux...access_ok(VERIFY_WRITE, (void __user *)arg, \ _IOC_SIZE(cmd)); else if (_IOC_DIR(cmd) & _IOC_WRITE) ret...access_ok(VERIFY_READ, (void __user *)arg, \ _IOC_SIZE(cmd)); if (ret) return -EFAULT; switch(cmd) {
Linux内核中do{...}while(0)意义: 辅助定义复杂的宏,避免引用的时候出错,如果不用{},if后面的语句只有第一条进行了判断。同时避免宏展开后“;”造成编译不通过....ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x)) https://blog.csdn.net/ganggexiongqi/article/details/24603363 ACCESS_OK...宏 CVE-2017-5123(waitid系统调用),检查指针是不是属于用户空间的,x86架构下ACCESS_OK宏的实现: /** * access_ok: - Checks if a user space...*/#define access_ok(addr, size) \({ \ WARN_ON_IN_IRQ...= PER_LINUX32) PER_LINUX32 = 0x0008,PER_MASK = 0x00ff, /*, * Return the base personality
在《Linux Kernel Development》中对两种 ioctl 方法有详细的解说。...ioctl 方法第二个参数 cmd 为用户与驱动的 “协议”,理论上可以为任意 int 型数据,可以为 0、1、2、3……,但是为了确保该 “协议” 的唯一性,ioctl 命令应该使用更科学严谨的方法赋值,在linux...可以理解为一份 “协议” 文件,代码如下: // ioctl-test.h #ifndef __IOCTL_TEST_H__ #define __IOCTL_TEST_H__ #include linux...access_ok(VERIFY_WRITE, (void __user *)arg, \ _IOC_SIZE(cmd)); else if (_IOC_DIR(cmd) & _IOC_WRITE) ret...access_ok(VERIFY_READ, (void __user *)arg, \ _IOC_SIZE(cmd)); if (ret) return -EFAULT; switch(cmd) {
getdents64在fs/readdir.c中定义如下: 275SYSCALL_DEFINE3(getdents64, unsigned int, fd, 276 struct linux_dirent64...__user *, dirent, unsigned int, count) 277{ 278 struct file * file; 279 struct linux_dirent64...access_ok(VERIFY_WRITE, dirent, count)) 285 goto out; 286 287 error = -EBADF
在上章34.Linux-printk分析、使用printk调试驱动里讲述了: printk()会将打印信息存在内核的环形缓冲区log_buf[]里, 可以通过dmesg命令来查看log_buf[]...access_ok(VERIFY_WRITE, buf, len)) { // access_ok:检查用户层地址是否访问OK error = -EFAULT.../module.h> #include linux/kernel.h> #include linux/fs.h> #include linux/init.h> #include linux/delay.h...10.2所以,修改的代码如下所示: #include linux/module.h> #include linux/kernel.h> #include linux/fs.h> #include...linux/init.h> #include linux/delay.h> #include #include #include <asm/io.h
文件系统的作用 linux 内核中进程管理、内存管理、网络协议栈、文件系统是内核的四大核心模块。其中文件系统提供最基础的操作文件的能力。...文件和目录 linux在设计之处就流行一句话linux中一切都是文件,在文件系统设计中也非常实用。内核看待目录也是当作文件来看待。...access_ok(VERIFY_READ, buf, count))) return -EFAULT; // 检查文件系统可写区域以及锁检查 ret = rw_verify_area(WRITE
这就意味着在机器运行时,会存在利用已知的漏洞(当然,还会有一些未知的漏洞)来进行攻击的情况,所以需要某种方法来检测和阻止对这些漏洞的利用,这正是Linux Kernel Runtime Guard(Linux...Juho Junnila的论文题为“Linux Rootkit检测工具的有效性”,显示了LKRG可以作为有效的内核Rootkit检测器。...LKRG挫败了许多预先存在的Linux内核漏洞的利用,并且很可能会检测并防御许多未来没有特意试图绕过LKRG的利用(包括未知的漏洞)。...LKRG防御 为了说明LKRG的漏洞检测能力,在对发行版内核的测试中,LKRG成功检测到CVE-2014-9322 (badret)、CVE-2017-5123 (waitid(2) missing access_ok...内核.text部分 Linux内核.rodata部分 Linux内核的异常向量表 关键的系统全局变量,如SMEP和SMAP 所有动态加载的模块及其在内部结构中的顺序; 如有IOMMU,也可对其防护 pCFI
Linux 文件系统 目录 说明 bin 存放二进制可执行文件 sbin 存放二进制可执行文件,只有 root 才能访问 boot 存放用于系统引导时使用的各种文件 dev 用于存放设备文件 etc...是超级管理员 localhost 表示主机名 ~ 表示当前目录(家目录),其中超级管理员家目录为 /root,普通用户家目录为 /home/chan $ 表示普通用户提示符,# 表示超级管理员提示符 Linux...test.tar.gz 文件搜索命令 locate:在后台数据库搜索文件 updatedb:更新后台数据库 whereis:搜索系统命令所在位置 which:搜索命令所在路径及别名 find:搜索文件或文件夹 用户和组 Linux
就好比研究Linux内核,如果一上来就从Linux 4.x/5.x内核版本开始研究,可以看到很多“历史遗留”代码。...文件内容如下: #include linux/module.h> #include linux/kernel.h> #include linux/ctype.h> #include linux.../device.h> #include linux/cdev.h> #include #include linux/pid.h> #include linux/uaccess.h...> #include linux/sched/signal.h> #include linux/pid_namespace.h> #include linux/interrupt.h> // 中断号...access_ok(VERIFY_READ, pArg, sizeof(int))) { printk("access failed!
Linux文件操作 Linux中,一切皆文件(网络设备除外)。 硬件设备也“是”文件,通过文件来使用设备。 目录(文件夹)也是一种文件。...boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件和镜像文件。...deb:deb是Device(设备)的缩写,该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。...系统会自动识别一些设备,例如U盘、光驱等,当识别后,Linux会把识别的设备挂载到这个目录下。...---- Linux文件的操作方式 文件描述符fd fd是一个大于等于0的整数。 每打开一个文件,就创建一个文件描述符,通过文件描述符来操作文件。
领取专属 10元无门槛券
手把手带您无忧上云