編譯器如何危及應用程序的安全
對于編譯器如何將人類可讀的代碼翻譯成機器運行的機器碼,大多數(shù)程序員通常只有大概的概念。在編譯過程中,編譯器會對代碼進行優(yōu)化,使其能高效的運行。有的時候,編譯器在優(yōu)化上面走的太遠了,它甚至移除了本不應該移除的代碼,導致應用程序更加脆弱。
MIT人工智能和計算機科學實驗室的四位研究人員調查了(PDF) 不穩(wěn)定優(yōu)化(optimization-unstable)代碼的問題——編譯器移除的包含未定義行為的代碼。所謂的未定義行為包括了除以0,空指針間接 引用和緩沖溢出等。在某些情況下,編譯器完整移除未定義行為代碼可能會導致程序出現(xiàn)安全弱點。
研究人員開發(fā)了一個靜態(tài)檢查器STACK去識別不穩(wěn)定的 C/C++代碼,他們在測試的系統(tǒng)中發(fā)現(xiàn)上百個新bug:Linux內核發(fā)現(xiàn)32個bug,Mozilla發(fā)現(xiàn)3個,Postgres 9個和Python 5個。STACK掃描了Debian Wheezy軟件包倉庫8575個含有C/C++代碼的軟件包,發(fā)現(xiàn)其中3471個至少包含一個不穩(wěn)定的代碼。研究人員認為這是一個非常普遍的問題。