任何使用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或者可信任的用記。設置成只有指定用戶可以對文件進行讀和寫已經足夠防止拒絕服務攻擊。下面為命令例子(按不同路徑可能要修改):
|
(責任編輯:城塵)