易截截图软件、单文件、免安装、纯绿色、仅160KB

剖析一个由sendfile引发的linux内核BUG

之前看了《新爆内核高危漏洞sock_sendpage的利用分析的讨论
》这篇帖子,在九贱兄和诸位CUer的指引下,大致弄清了整个漏洞的始末。现与大家分享(引用自我的空间
)。
有什么不足之处还望多多指教~
内核的BUG
这个BUG首先得从sendfile系统调用说起。
考虑将一个本地文件通过socket发送出去的问题。我们通常的做法是:打开文件fd和一个socket,然后循环地从文件fd中read数据,并将读取
的数据send到socket中。这样,每次读写我们都需要两次系统调用,并且数据会被从内核拷贝到用户空间(read),再从用户空间拷贝到内核
(send)。
而sendfile就将整个发送过程封装在一个系统调用中,避免了多次系统调用,避免了数据在内核空间和用户空间之间的大量拷贝。
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
虽然这个系统调用接收in和out两个fd,但是有所限制,in只能是普通文件,out只能是socket(这个限制不知道后来的内核版本有没有放宽)。
sendfile系统调用在内核里面是怎么实现的呢?这个还是比较复杂,它在内核里面做了原来要在用户态做的事情:创建一个pipe对象作buffer用、从in_fd中读数据到pipe中、将pipe中的数据写到out_fd、循环直到满足结束条件。
关于写数据到out_fd的过程,简要描述如下:
sys_sendfile
=> 入口
do_sendfile
=> 参数检查,其中会确定out_fd对应的file结构包含sendfile方法(out_file->f_op->sendpage)
do_splice_direct
=> 最终调用到out_file->f_op->splice_write,而out_file是个socket,它的f_op->splice_write等于generic_splice_sendpage
generic_splice_sendpage
=> 最终调用到out_file->f_op->sendpage,这个sendpage等于sock_sendpage
sock_sendpage的代码如下:
struct socket *sock;
int flags;
sock = file->private_data;
flags = !(file->f_flags & O_NONBLOCK) ? 0 : MSG_DONTWAIT;
if (more)
   
flags |= MSG_MORE;
return sock->ops->sendpage(sock, page, offset, size, flags);
注意,BUG出现了,调用sock->ops->sendpage之前没有判断这个函数指针是否为NULL。
(这里调用的sock->ops->sendpage就是
out_file->f_op->private_data->ops->sendpage,out_file->f_op->private_data
指针指向的是一个struct socket结构,因为这个fd代表的是一个sock


相关文档:

Linux设备模型之input子系统详解

一:前言
最近在研究android的sensor driver,主要是E-compass,其中用到了Linux input子系统.在网上也看了很多这方面的资料,感觉还是这篇分析的比较细致透彻,因此转载一下以便自己学习,同时和大家分享!
(这篇博客主要是以键盘驱动为例的,不过讲解的是Linux Input Subsystem,可以仔细的研究一下!)
键盘驱动将检 ......

Linux内核网络栈代码的准备知识详述


1. Linux内核ipv4网络部分分层结构:
BSD socket层: 这一部分处理BSD socket相关操作,每个socket在内核中以struct socket结构体现。这一部分的文件
主要有:/net/socket.c /net/protocols.c etc
INET socket层:BSD socket是个可以用于各种网络协议的接口,而当用于tcp/ip,即建立了AF_INET形式的socket时 ......

Linux下查看版本号的命令

Linux下查看版本号的命令
1,查看内核版本命令:
cat   /proc/version
uname   -a
uname   -rcat   /etc/issue
man   uname
2,查看linux版本:抄录如下:
1) 登录到服务器执行 lsb_release -a ,即可列出所有版本信息,例如:
[root@3.5.5Biz-46 ~]# lsb ......

写得蛮好的linux学习笔记(转)


linux目录架构
/   根目录
/bin    常用的命令
binary file 的目錄
/boot   存放系统启动时必须读取的档案,包括核心
(kernel) 在内
     /boot/grub/menu.lst   GRUB设置
     /boot/vmlinuz   内核
  ......

linux fcitx 输入法

第一部分:乱码问题
1.打开终端,输入 fc-list 查看所有的字体 找到任意一个中文的,如:
文鼎PL简报宋,AR PL SungtiL GB:style=Regular
文泉驿正黑,文泉驛正黑,WenQuanYi Zen Hei:style=中等,Medium (这个你安装了文泉驿正黑才有)

2.再找到~/.fcitx/config文件, 即在终端输入 gedit ~/.fcitx/conf ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号