今天,我們來學習Unix操作系統的知識。也許這個話題並不新鮮,因為LD_PRELOAD所產生的問題由來已久。不過,在這裡,我還是想討論一下這個環境變量。因為這個環境變量所帶來的安全問題非常嚴重,值得所有的Unix操作系統下的程序員的注意。
在開始講述為什麼要當心Unix操作系統LD_PRELOAD環境變量之前,請讓我先說明一下程序的鏈接。所謂鏈接,也就是說編譯器找到程序中所引用的函數或全局變量所存在的位置。
一般來說,Unix操作系統程序的鏈接分為靜態鏈接和動態鏈接,靜態鏈接就是把所有所引用到的函數或變量全部地編譯到可執行文件中。動態鏈接則不會把函數編譯到可執行文件中,而是在程序運行時動態地載入函數庫,也就是運行鏈接。
所以,對於Unix操作系統動態鏈接來說,必然需要一個動態鏈接庫。動態鏈接庫的好處在於,一旦動態庫中的函數發生變化,對於可執行程序來說是透明的,可執行程序無需重新編譯。這對於程序的發布、維護、更新起到了積極的作用。對於靜態鏈接的程序來說,函數庫中一個小小的改動需要整個程序的重新編譯、發布,對於程序的維護產生了比較大的工作量。
當然,世界上沒有什麼東西都是完美的,有好就有壞,有得就有失。動態鏈接所帶來的壞處和其好處一樣同樣是巨大的。
因為程序在運行時動態加載函數,這也就為他人創造了可以影響你的主程序的機會。試想,一旦,你的Unix操作系統程序動態載入的函數不是你自己寫的,而是載入了別人的有企圖的代碼,通過函數的返回值來控制你的程序的執行流程,那麼,你的程序也就被人“劫持”了。
關於這次對Unix操作系統的介紹到這裡了。