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