Unix操作系統(tǒng)下的LD_PRELOAD環(huán)境變量
今天,我們來學(xué)習(xí)Unix操作系統(tǒng)的知識(shí)。也許這個(gè)話題并不新鮮,因?yàn)長(zhǎng)D_PRELOAD所產(chǎn)生的問題由來已久。不過,在這里,我還是想討論一下這個(gè)環(huán)境變量。因?yàn)檫@個(gè)環(huán)境變量所帶來的安全問題非常嚴(yán)重,值得所有的Unix操作系統(tǒng)下的程序員的注意。
在開始講述為什么要當(dāng)心Unix操作系統(tǒng)LD_PRELOAD環(huán)境變量之前,請(qǐng)讓我先說明一下程序的鏈接。所謂鏈接,也就是說編譯器找到程序中所引用的函數(shù)或全局變量所存在的位置。
一般來說,Unix操作系統(tǒng)程序的鏈接分為靜態(tài)鏈接和動(dòng)態(tài)鏈接,靜態(tài)鏈接就是把所有所引用到的函數(shù)或變量全部地編譯到可執(zhí)行文件中。動(dòng)態(tài)鏈接則不會(huì)把函數(shù)編譯到可執(zhí)行文件中,而是在程序運(yùn)行時(shí)動(dòng)態(tài)地載入函數(shù)庫(kù),也就是運(yùn)行鏈接。
所以,對(duì)于Unix操作系統(tǒng)動(dòng)態(tài)鏈接來說,必然需要一個(gè)動(dòng)態(tài)鏈接庫(kù)。動(dòng)態(tài)鏈接庫(kù)的好處在于,一旦動(dòng)態(tài)庫(kù)中的函數(shù)發(fā)生變化,對(duì)于可執(zhí)行程序來說是透明的,可執(zhí)行程序無需重新編譯。這對(duì)于程序的發(fā)布、維護(hù)、更新起到了積極的作用。對(duì)于靜態(tài)鏈接的程序來說,函數(shù)庫(kù)中一個(gè)小小的改動(dòng)需要整個(gè)程序的重新編譯、發(fā)布,對(duì)于程序的維護(hù)產(chǎn)生了比較大的工作量。
當(dāng)然,世界上沒有什么東西都是完美的,有好就有壞,有得就有失。動(dòng)態(tài)鏈接所帶來的壞處和其好處一樣同樣是巨大的。
因?yàn)槌绦蛟谶\(yùn)行時(shí)動(dòng)態(tài)加載函數(shù),這也就為他人創(chuàng)造了可以影響你的主程序的機(jī)會(huì)。試想,一旦,你的Unix操作系統(tǒng)程序動(dòng)態(tài)載入的函數(shù)不是你自己寫的,而是載入了別人的有企圖的代碼,通過函數(shù)的返回值來控制你的程序的執(zhí)行流程,那么,你的程序也就被人“劫持”了。
關(guān)于這次對(duì)Unix操作系統(tǒng)的介紹到這里了。
【編輯推薦】