任何使用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或者可信任的用记。设置成只有指定用户可以对文件进行读和写已经足够防止拒绝服务攻击。下面为命令例子(按不同路径可能要修改):
|
(责任编辑:城尘)