原文:https://salls.github.io/Linux-Kernel-CVE-2017-5123/ 译者:hello1900@知道创宇404实验室 本文介绍如何利用Linux内核漏洞CVE...为此,内核设有copy_from_user与put_user等特殊函数,用于将数据复制进出用户区。...在较高级别,put_user的功能大致如下: put_user(x, void __user *ptr) if (access_ok(VERIFY_WRITE, ptr, sizeof(*ptr...为避免重复检查和SMAP启用/禁用的额外开销,内核开发人员将缺少必要检查的不安全版本_put_user与unsafe_put_user涵盖进来。这样一来,忘记额外检查就在意料之中了。...通常情况下,Chrome沙箱行之有效,因为Linux内核漏洞多位于syscall,由seccomp沙箱拦截。
Linux中把ioctl cmd划分成几个位段来帮助创建唯一的cmd。这几个位段一般是:type(模数),序号,传输方向和参数大小。...可使用下面的接口来做数据的传输: put_user(datum, ptr) __put_user(datum, ptr) 这些宏定义写 datum 到用户空间;它们相对快,且应当被调用来代替 copy_to_user...put_user 检查来确保这个进程能够写入给定的内存地址,它在成功时返回 0,并且在错误时返回 -EFAULT。...因此, __put_user 应当只用在内存区已经用 access_ok 检查过的时候。...它们象 put_user 和 __put_user,但是在相反方向传递数据。获取的值存储于本地变量 local; 返回值指出这个操作是否成功。
if (runtime->status->state == SNDRV_PCM_STATE_OPEN) 18 return -EBADFD; 19 if (put_user...return -EFAULT; 23 result = snd_pcm_lib_write(substream, xferi.buf, xferi.frames); 24 __put_user...return -EBADFD; 36 if (runtime->channels > 128) 37 return -EINVAL; 38 if (put_user...result = snd_pcm_lib_writev(substream, bufs, xfern.frames); 48 kfree(bufs); 49 __put_user...return -EFAULT; 61 result = snd_pcm_playback_rewind(substream, frames); 62 __put_user
//读地址++ spin_unlock_irq(&logbuf_lock); error = __put_user.../module.h> #include #include #include #include <linux/delay.h...error && (read_buff(&c)) && i < count) { error = __put_user(c,buf); //上传用户数据...10.2所以,修改的代码如下所示: #include #include #include #include...error && (read_buff(&c)) && i < count) { error = __put_user(c,buf); //上传用户数据
return -ENXIO; 14 switch (cmd) { 15 case SNDRV_CTL_IOCTL_PVERSION: 16 return put_user...return -ENOPROTOOPT; 47 case SNDRV_CTL_IOCTL_POWER_STATE: 48 #ifdef CONFIG_PM 49 return put_user...-EFAULT : 0; 50 #else 51 return put_user(SNDRV_CTL_POWER_D0, ip) ?
bionic git:(ffdd392b8196) git remote -v origin git://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux.../+git/bionic (fetch) origin git://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/bionic (...调用anon_inode_getfile方法创建一个file实例,其类型为 // include/linux/fs.h struct file { ... // 这个struct里存放了各种函数指针...我们先看下wait变量的类型 // include/linux/wait.h typedef struct wait_queue_entry wait_queue_entry_t; ......if (revents) { if (__put_user(revents, &uevent->events) || __put_user(epi->event.data
目前 Linux 支持64种信号。信号分为非实时信号(不可靠信号)和实时信号(可靠信号)两种类型,对应于 Linux 的信号值为 1-31 和 34-64。...信号实现原理 接下来我们分析一下Linux对信号处理机制的实现原理。...为了达到这个目的,Linux经历了一个十分崎岖的过程。...err |= __put_user(frame->retcode, &frame->pretcode); /* This is popl %eax ; movl $,%eax ; int $0x80...*/ err |= __put_user(0xb858, (short *)(frame->retcode+0)); err |= __put_user(__NR_sigreturn, (int
本节的WM8976的MODE脚接的高电平,所以是3线控制 3.接下来便来分析linux内核的声卡系统 在linux声卡中存在两种声卡系统,一种是OSS(开放声音系统),一种是ALSA(先 进Linux声音架构...本节系统以OSS(Open Sound System)为例 , 内核以linux-2.6.22.6版本为例,位于:linux-2.6.22.6\sound\Sound_core.c 3.1首先进入入口函数...uda1341_volume) * 100) / 63; //将寄存器音量值转换为原始数据 val |= val << 8; return put_user...break; case SOUND_MIXER_READ_VOLUME: val = (uda1341_volume * 100) / 63; //最大值为99 return put_user...SOUND_MIXER_WRITE_IGAIN:” case SOUND_MIXER_READ_IGAIN: //混音输入:0~100 val = (mixer_igain* 100) / 7; return put_user
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...lastdirent) { 302 typeof(lastdirent->d_off) d_off = file->f_pos; 303 if (__put_user
Linux系统提供了两套RTC接口,/dev/rtc是为pc机器提供,另一种/dev/rtc0, /dev/rtc1支持所有的系统,具体可参考rtc.txt文档。...linux为新的接口设计一套驱动模型,如果驱动工程师想增加某一个驱动,只需要将芯片相关的代码编写,然后注册到rtc核心层中即可。...RTC驱动框架 RTC涉及的代码如下: driver/rtc/class.c: 此文件向linux内核驱动模型注册了一个类RTC, 同时为底层的RTC驱动提供了注册/注销RTC接口。...= sizeof(long) && count == sizeof(unsigned int)) ret = put_user(data, (unsigned int __user *...: //返回出去给用户 sizeof(unsigned int); else ret = put_user(data, (unsigned long __user *)buf)
在Linux中,主要是通过fork的方式产生新的进程,我们都知道每个进程都在 内核对应一个PCB块,内核通过对PCB块的操作做到对进程的管理。...在Linux内核中,PCB对应着的结构体就是task_struct,也就是所谓的进程描述符(process descriptor)。...这个结构体的声明位于include/linux/sched.h中。...这个结构体的声明位于include/linux/sched.h中。...nr = pid_vnr(pid); if (clone_flags & CLONE_PARENT_SETTID) put_user
这本书属于学习Linux内核原理必读推荐书目之一!...对Linux内核的设计原理进行了细致的说明,也有具体实现部分的介绍,结合源码能很好的理解Linux内核; 在简单翻了一遍之后,带着如下几个疑问,整理了下相关知识点: 1、内核是什么时候加载运行的; 2、...Linux设备驱动作为一个linux内核模块存在,模块都有2个接口函数,模块初始化函数和模块退出函数。 上面提到的驱动程序的注册。一般是由模块初始化函数来实现的。...问题的解决办法是:系统提供一系列函数帮助完成数据空间转换:例如,get_user 、put_user 、copy_from_user 、copy_to_user 等函数。...MMU/Cache line CPU L1/L2高速缓存 页高速缓存:Linux内核实现的磁盘缓存,主要用来减少对磁盘的I/O操作。
通常,主设备号标示设备对应的驱动程序,linux允许多个驱动共用一个主设备号; 而次设备号用于确定设备文件所指的设备。 在内核中,用dev_t类型保存设备编号。...在驱动中访问设备号应该用中定义的宏。...见 mode_t f_mode; 通过FMODE_READ和FMODE_WRITE标示文件是否可读或可写。...long copy_from_user( void *to, const void __user *from, unsigned long count); //从用户空间获得数据 3. int put_user...extern inline long copy_from_user(void *to, const void __user *from, long n) 如果与用户进程交互的数据是1,2,4,8字节的话, 可用put_user
Linux 文件系统 目录 说明 bin 存放二进制可执行文件 sbin 存放二进制可执行文件,只有 root 才能访问 boot 存放用于系统引导时使用的各种文件 dev 用于存放设备文件 etc...是超级管理员 localhost 表示主机名 ~ 表示当前目录(家目录),其中超级管理员家目录为 /root,普通用户家目录为 /home/chan $ 表示普通用户提示符,# 表示超级管理员提示符 Linux...test.tar.gz 文件搜索命令 locate:在后台数据库搜索文件 updatedb:更新后台数据库 whereis:搜索系统命令所在位置 which:搜索命令所在路径及别名 find:搜索文件或文件夹 用户和组 Linux
Linux文件操作 Linux中,一切皆文件(网络设备除外)。 硬件设备也“是”文件,通过文件来使用设备。 目录(文件夹)也是一种文件。...boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件和镜像文件。...deb:deb是Device(设备)的缩写,该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。...系统会自动识别一些设备,例如U盘、光驱等,当识别后,Linux会把识别的设备挂载到这个目录下。...---- Linux文件的操作方式 文件描述符fd fd是一个大于等于0的整数。 每打开一个文件,就创建一个文件描述符,通过文件描述符来操作文件。
Linux的IO复用工具概览 在 Linux 中先后出现了select、poll、epoll等,FreeBSD的 kqueue也是非常优秀的 IO 复用工具,kqueue 的原理和 epoll 很类似,...5.1 底层数据结构 红黑树节点定义: #ifndef _LINUX_RBTREE_H #define _LINUX_RBTREE_H #include #include... #include struct rb_node { unsigned long __rb_parent_color;...并没有得到2.6内核版本代码的证实,并且关于这次拷贝的实现是这样的: revents = ep_item_poll(epi, &pt);//获取就绪事件 if (revents) { if (__put_user...(revents, &uevent->events) || __put_user(epi->event.data, &uevent->data)) { list_add(&epi->rdllink
revents) continue; // 复制到用户空间 if (__put_user(revents, &uevent->events) |...| __put_user(epi->event.data, &uevent->data)) { list_add(&epi->rdllink, head)
linux安装.net 下载.net https://dotnet.microsoft.com/download/thank-you/dotnet-sdk-2.1.4-linux-x64-binaries...下载安装包后执行命令: dotnet-sdk-2.1.302-linux-x64.tar.gz yum install libicu -y cd /root ln -s /data1/soft /data.../soft tar zxvf dotnet-sdk-2.1.302-linux-x64.tar.gz -C /data1/soft/dotnet/ echo 'export DONET_ROOT=$PATH
Linux ESC :wq 和:wq!的区别 Linux ESC:wq 和:wq!...的区别 发布者:IT人在线 | 发表时间:2018-12-4 17:20:43 Linux ESC :wq esc(键退出)->:(符号输入)->wq(保存退出) wq(存盘并退出 write%quite
领取专属 10元无门槛券
手把手带您无忧上云