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