易截截图软件、单文件、免安装、纯绿色、仅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编程 (七) SDP协议

Service Discovery Protocol(SDP)提供一种能力,让应用程序有方法发现哪种服务可用以及这种服务的特性。
服务发现协议(SDP或Bluetooth SDP)在蓝牙协议栈中对蓝牙环境中的应用程序有特殊的含意,发现哪个服务是可用的和确定这些可用服务的特征。SDP定义了bluetooth client发现可用bluetooth server服务和它们的特征的方法。 ......

学习嵌入式linux开发的一点建议

对于是应该学嵌入式linux应用开发呢,还是系统开发,又或者是驱动开发呢?希望下面的内容能给我们这些初学者有帮助。(仅供参考)
一、编程比较熟悉,只关心系统移植,应该学什么?
1)系统移植的方法
2)制作Bootloader
3)编译调试内核
4)定制文件系统
即:嵌入式linux系统开发
二、编程不太会,学会简单的系统移 ......

linux下使用ssh翻墙的一种方法


linux下使用ssh翻墙的一种方法: 
        proxychains 
        
可以根据需要强制任何想要的程序通过指定代理访问网络。
    一、proxychains的功能特性:
    
    1.支持解析代理服务器dns解析,即 ......

[轉]小學三年級的 Linux 玩家

连结:小学三年级的 Linux 玩家

洪朝贵2010/01/12 05:00:00
小学三年级的小 P,自己制作出双开机的 linux 随身碟。
小 P 到妈妈公司,用 gparted 把公司的电脑调整一下分割,并装上 Linux。 妈妈的同事看到陌生的 grub 选单,很害怕也很不高兴,以为电脑被玩坏了。
在家里,小 P 藉着 Windows XP 升级成 Wi ......

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 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号