碉堡了!麻省理工學院開發出自動修復 Bug 的系統

Agatha發表於2015-07-30

在六月下旬的計算機學會的程式語言設計與實現大會上,MIT 的研究者們展示了一個新系統,可以通過從其他更加安全的應用中自動匯入相關功能,藉以修復原來軟體中的危險漏洞。

這個引人注目的系統叫做 CodePhage ,它借用其他程式時並不需要訪問借主應用的原始碼。相反,該系統分析這個應用的執行情況,並標記出其安全檢查類別的特性。因此,即使所編寫的語言與被修復應用的語言不同,該系統仍然可以從中匯出檢查功能用來修復應用。

CodePhage 將程式碼匯入易受攻擊的程式後,還會進行進一步分析以確保漏洞被修復。

MIT 電腦科學與人工智慧研究室(CSAIL)的研究員,CodePhage 的研發領導人員 Stelios Sidiroglou-Douskos 表示:

“我們在開源庫裡有大量程式碼可用,數百萬計專案,而且很多專案都有類似的實現了。這些專案總有一些可以與別的許多專案共享功能的子模組,即便那不一定是該程式的核心功能。”

有了 CodePhage,“你將逐漸建立一個集其他應用最優秀部分於一身的混合系統。”

Sidiroglou-Douskos 和他的共同作者——MIT 電腦科學和工程的教授 Martin Rinard,研究生 Fan Long 和 Rinard 組裡的研究員 Eric Lahtinen——將 CodePhage 正在被修復的程式稱作是接受程式,出借功能的程式稱作是捐獻程式。要開始分析,CodePhage 需要兩個輸入樣本:一個導致接受程式崩潰,另一個則不會。今年三月,這個小組報告了一個名為 DIODE 的漏洞定位程式。該程式可以自動產生引起崩潰的輸入資訊。但是使用者也許就很容易發現開啟特定檔案時會崩潰。

承接過去

首先,CodePhage 將“安全的”輸入資訊——那些不會導致崩潰的輸入資訊——傳入捐獻程式。 然後它將追蹤捐獻程式執行的一系列操作,並用一個符號表示式記錄這些操作。這個符號表示式會是一串描述操作所施加的邏輯約束的字元。

比如說,在某個時候,捐獻程式會檢查輸入資訊的大小是否在某些臨界值之下。若是,CodePhage 會在持續增長的符號表示式中加入一個特定的符號,來代表在臨界值之下的狀況。它不會記錄檔案的真實大小——僅僅是這次檢查所施加的約束。

接下來,CodePhage 將會導致崩潰的輸入資訊傳入捐獻程式。像之前那樣,它建立起一條代表捐獻程式執行操作的符號表示式。當新的符號表示式與舊的不同的時候,CodePhage 就中斷這個過程。這一差異表明,這是一個安全輸入能夠滿足的限制條件,而能夠引起程式崩潰的輸入則不能滿足。因此,它可能是一個接受程式缺失的安全檢查。

CodePhage 分析接受程式,來尋找輸入資訊在什麼位置能滿足大多數但不是全部新符號表示式描述的限制。接受程式可以按與捐獻程式不一樣的順序來執行操作,它也可以用不同的形式儲存資料。但符號表達描述的是被處理過的資料的狀態,而不是處理過程本身。

在每個識別出來的位置上,CodePhage 都可以免除符號表示式描述的大多數約束,其中也包括接受程式施加的約束。從第一個位置開始,它將剩下的少量約束轉換成接受程式的語言,並將它們插入到原始碼中去。然後,它會用之前引起過崩潰的輸入再次執行接受程式。

假如程式執行良好,那麼新程式碼就解決了問題。如果程式崩潰了,CodePhage 就移到接受程式的下一個候選位置。如果在嘗試修補了所有的候選位置之後,接收程式依然崩潰,CodePhage 就回到捐獻程式中繼續構建符號表示式,直到它發現了另一個新舊符號表達相異的位置。

自動化未來

研究者們在七個常見的,並已被 DIODE 檢查到漏洞的開源專案上測試了 CodePhage。每個專案從二到四個捐獻程式處引進修補。在所有的例項裡,CodePhage 都能夠修補脆弱的程式碼,而且每次所花的時間通常在兩分鐘到十分鐘。

這些研究者解釋說,在現代商業軟體裡,安全檢查可以佔到程式碼的百分之八十甚至更多。希望未來版本的 CodePhage 能夠通過自動插入這些檢查,大幅度減少軟體開發者們花費在枯燥工作上的時間。

Rinard 表示:

“長遠願景是,你再也不用寫別人寫過的程式碼。系統會找到那段程式碼,並自動幫你把這段程式碼,和其它你所需要的、能讓你的程式運作起來的程式碼放在一起。”

馬薩諸塞大學埃姆郝思特校區的電腦科學教授 Emery Berger 表示:

“這個從別的有相似功能的程式那裡借程式碼,並且能用這個方法修補好一個本質上不能運作的程式的技術,是一個很酷的結果。老實說,我很驚訝這個方法居然真的可行。”

“捐獻程式和接收程式不是同一群人寫的,他們有不同的程式設計標準,他們使用不同方式命名變數,他們使用各種不同型別的變數,變數或許是本地的,或者,他們在棧的更高處。 而 CodePhage 可以識別出這些聯絡,然後說 ‘這些變數和那些變數有關聯。’ 用器官捐獻來比喻,它可以將從捐獻程式借取的程式碼完美移植,就好像程式碼本來就是那樣寫的。CodePhage 可行並且有效的這個事實,令人驚訝,太酷了。”

 

打賞支援我翻譯更多好文章,謝謝!

打賞譯者

打賞支援我翻譯更多好文章,謝謝!

碉堡了!麻省理工學院開發出自動修復 Bug 的系統

相關文章