資安JAVA(十二):Log Forging

來源:John Melton's Weblog
標題:YEAR OF SECURITY FOR JAVA – WEEK 12 – LOG FORGING PREVENTION
作者:John Melton
內文:
Hear me bark!!
What is it and why should I care?


「Log 偽造 」,表示你的應用程式允許非信任來源的資料寫入到Log。攻擊者的目的是掩飾他的蹤跡,或至少讓你更難去追蹤他的行為。不幸的是,當你需要Log的時候才會發現被偽造的嚴重性,就像所有Log的問題一樣。

以下是範例說明了如何偽造:
String someVar = getRequestParameter("xyz");
log("Data is: " + someVar);

接著是正常的紀錄行為,送出正常的Request:
?xyz=my name is Bob

於是你的Log多出這筆正常的記錄:
[2012-03-15 02:04:31] [bob] Data is: my name is Bob

而偽造的紀錄可能送出這樣的Request: ?xyz=my name is Bob\r\n[2012-03-15 02:04:39] [mary] Mary created new user\r\n[2012-03-15 02:04:46] [josh] Josh logged out\r\n[2012-03-15 02:04:55] [susan] Susan performed an important transaction

於是你的Log多出以下的紀錄:
[2012-03-15 02:04:31] [bob] Data is: my name is Bob
[2012-03-15 02:04:39] [mary] Mary created new user
[2012-03-15 02:04:46] [josh] Josh logged out
[2012-03-15 02:04:55] [susan] Susan performed an important transaction

攻擊的內涵是,攻擊者猜測Log紀錄的格式,並利用換行字元(Windows for \r \n,Linux for \n),假造正常的Log紀錄。

註:假使你用資料庫存取Log,你大概不會有這個困擾,因為每條Log紀錄都是單行資料。如果你的Log的檢視程式(Web、Windows form...)無法分辨不同資料列的差異,也是會造成影響。然而此時你還要注意是否有Sql injection的威脅。

What should I do about it?

還好,「Log 偽造 」是可以簡單修正的問題。

主要方法就是驗證輸入資料和編碼輸出資料。驗證輸入資料並不能真正阻止別人偽造Log,因為換行字元是被允許輸入的。編碼輸出資料能更進一步的驗證輸入的資料,兩者方法的結合才能解決以上的問題。根據你的需求,目前的編碼有許多方式。

一個方法是,寫一簡單個修補程式,專門用來刪除"使用者輸入的換行字元"或是替換成良性的字元。

另一個方法是,先將輸入資料做 HTML 編碼,然後儲存。當你需要輸出原始資料到網頁時,再作 HTML解碼。若你剛好需要實作Web based的,具有良好檢視功能的Log 檢視器,這會是個好辦法。

「Log偽造」是很容易了解和解決的問題,只要你花點時間,去計畫如何適當的達成。當你接到凌晨三點的電話,你會很高興曾經做過這些努力。作者曾經寫過一篇 長篇幅文章,關於如何避免「Log 偽造 」,而本篇文章的價值是精簡扼要的、且合適的融入到整個「year of security for Java」系列專欄。

參考資料
http://www.jtmelton.com/2010/09/21/preventing-log-forging-in-java/
http://samlin35.blogspot.com/2007/11/unix-windows.html

———–———–
資安Java: 上一篇 || 下一篇
———–———–

留言

這個網誌中的熱門文章

資安JAVA(十一):X-XSS-Protection

資安JAVA(十):X-Content-Type-Options

以 SharpPcap 實作可收聽封包的 C# 程式