剖析一个由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
相关文档:
Service Discovery Protocol(SDP)提供一种能力,让应用程序有方法发现哪种服务可用以及这种服务的特性。
服务发现协议(SDP或Bluetooth SDP)在蓝牙协议栈中对蓝牙环境中的应用程序有特殊的含意,发现哪个服务是可用的和确定这些可用服务的特征。SDP定义了bluetooth client发现可用bluetooth server服务和它们的特征的方法。 ......
linux目录架构
/ 根目录
/bin 常用的命令 binary file 的目錄
/boot 存放系统启动时必须读取的档案,包括核心 (kernel) 在内
/boot/grub/menu.lst GRUB设置
/boot/vmlinuz 内核
& ......
vi /opt/back.sh(oracle用户)
#!/bin/ksh
tim=`date +%Y%m%d`
unset USERNAME
#export DISPLAY=0.0.0.0:0.0
#export ORACLE_BASE=/home/oraprod3
#export ORACLE_HOME=/prod/oracle/prod3db/9.2.0
#export ORACLE_SID=PROD3_db
#export LD_LIBRARY_PATH=/prod/oracle/prod3db/9.2.0/lib
#export ORACLE_TERM=vt100 ......
Linux下的压缩命令
压缩目录file
tar -czf file0117.tar.z file
解压.tar文件
tar -xzf 文件名.tar
打包目录
tar -cvf file0117.tar file
解包
tar -xvf 文件名.tar
AIX下的压缩命令
1. backup: 加-i参数可对文件或目录进行备份,加-p参数可对要备份的文件进行压缩,但是仅能压缩小于2G的文件。
2. compress: � ......
目录:
(1)硬件配置问题:
(2)最简单的ATI或Nvidia显卡最新官方驱动安装方法:
(3)如果显卡安装后,重启电脑黑屏怎么办?
(4)装了新显卡驱动,都黑屏了,怎么回图形界面?难道只能用回XP不成?
(5)如果一切顺利,显卡官方驱动就已经正确安装了。
(6)显卡驱动装好了,安装compiz fusion试用3D桌面。
(7� ......