易截截图软件、单文件、免安装、纯绿色、仅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 Bluetooth编程(三) HCI层编程

1. HCI层协议概述:
HCI提供一套统一的方法来访问Bluetooth底层。如图所示:
从图上可以看出,Host Controller Interface(HCI)  就是用来沟通Host和Module。Host通常就是PC, Module则是以各种物理连接形式(USB,serial,pc-card等)连接到PC上的bluetooth Dongle。
在Host这一端:application,SDP,L2cap等协议 ......

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

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

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下配置TOMCAT服务

一、安装jdk
# chmod u+x ./jdk-1_5_0_14-linux-i586-rpm.bin
# ./jdk-1_5_0_14-linux-i586-rpm.bin
二、安装tomcat
   tar zxvf apache-tomcat-5.5.25.tar.gz
三、建用户和权限
#  useradd  tomcat 
#  passwd   tomcat
#  chown  -R  tomcat:tomcat&n ......

[转]linux中的结构体用法


原文地址:http://blog.chinaunix.net/u2/74524/showart_1138735.html
好多次看书、编程时又看到了对结构体这种定义的方法,如:
struct file_operations scull_fops = {
.owner = THIS_MODULE,
.llseek = scull_llseek,
.read = scull_read,
.write = scull_write,
.ioctl = scull_ioctl,
.open ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号