任何使用flock()或fcntl()函数的程序,或者可以由其他用户读取的文件使用了这两个函数的APIs(比如带O_EXLOCK和O_SHLOCK的"open()"),都容易受到本地的拒绝服务攻击。 由于这种攻击需要用户用自己的帐号来锁定文件,所以很容易可以找出攻击的用户,一般情况系统用户都不会使用此方法对系统进行本地的拒绝服务攻击。
问题简介
这两种锁定方法都可以打开一个文件并对文件进行读取锁定。这样其他的进程就不能对这个文件进行写入锁定。另外,flock()方法允许用户对那些他可以打开来读取的文件进行写入锁定。而fcntl()锁定的方法首先需要文件被打开,这样从某程度上说安全性会好一点。当一个进程对一个文件进行了写入锁定的时候,其他任何的进程都不可以对同一个文件进行读取或写入锁定。虽然flock()和fcntl()函数都存在一些安全问题,但他们的锁定特性注定他们一定会被很多软件所使用。
检查
利用工具读取进程文件的描述列表就可以找出正在利用锁定的进程。其他中一个这样的工具叫做lsof,可以在下面地址找到:
ftp://vic.cc.purdue.edu/pub/tools/unix/lsof/
用这个工具你可以找出一个或多个正在对文件进行读取或写入锁定的进程。
# lsof /etc/settings
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
lockit 25472 badguy 3rW VREG 116,131072 1841 292 /etc/settings
在上面的例子里,用户badguy的lockit进程(pid 25472)打开了/etc/settings进行读取,并对它进行了写入锁定(从FD项可看到)。如果这是一个攻击,管理员可以杀掉这个恶意的进程来解开锁定。
Sendmail文件锁定
在sendmail里面,多个文件被进行了锁定,其中包括aliases、maps、statistics和pid文件。任何能打开这些文件的用户就能使sendmail或者和他相关的程序运作不正常,同样也会影响sendmail对数据(比如statistics文件)的更新。对于使用 flock()进行锁定的系统,如果用户对文件进行了写入锁定,那么其他的sendmail进程就不能对某些文件进行读取,比如说alias或map数据库。你可以用以下命令查出sendmail用哪种锁定方法:
sendmail -bt -d0.10 < /dev/null | grep HASFLOCK
如果输入结果里有HASFLOCK,那么你的系统就是使用flock()进行锁定的,否则就是用fcntl()。在以下系统sendmail缺省下使用flock():
SunOS 4, Ultrix, Tru64 UNIX 4.X and earlier, NeXTstep, Darwin, Mac OS X, Mach386, Convex OS, RISC/OS, Linux 1.3.95 and later, Sony NEWS, and all BSD-based systems
在其他系统里,sendmail缺省使用fcntl()。
由于queue文件应该本身有严格的权限限制,所以要进行调整的文件只有alias、map、statistics和pid文件。可以用 TrustedUser选项把这些文件的主人换成root或者可信任的用记。设置成只有指定用户可以对文件进行读和写已经足够防止拒绝服务攻击。下面为命令例子(按不同路径可能要修改):
|
如果在重启的时候/var/run/会被清除,需要在sendmail启动后把最后对pid文件的chmod命令放到sendmail的启动脚本里。
如果文件权限为0640,那么一定要保证只有可信任的用户属于那一用户组。否则的话,文件不应该设成能让全组读取。
注意对纯文本的alias文件(/etc/mail/aliases)进行拒绝服务攻击,只会使得newaliases不能重建alias。对使用fcntl()锁定的系统,数据库文件也会像alias受攻击时一样。由于攻击不影响一般的操作,可以把这些文件设置成可读。同样也没有必要保护与 map数据库有关的纯文本文件,因为makemap不会锁定这些文件。
sendmail 8.12.4会把新建的map和alias数据库的文件权限更改为0640。同样,在安装过程中如果statistics文件并不存在的话,它的权限会被改为0600。最后,pid文件的权限也会被改为0600。在sendmail的未来版本里会加进对文件进行锁定的时间限制。
解决方案:
由于这两个锁定的方法都会造成本地的拒绝服务攻击,简单的把所有锁定都用fcntl()完成也解决不了问题。但是,只要用户不能打开文件,他们就不能锁定文件。所以暂时的解决方法就是保护所有被应用程序锁定了的文件,这样这些文件就不能被不可信任的用户打开。
(责任编辑:城尘)