Moodle是開源基于PHP的學(xué)習(xí)管理系統(tǒng),全球數(shù)以萬計的大學(xué)都在使用它,然而,近日Moodle中發(fā)現(xiàn)的漏洞可能讓服務(wù)器及其數(shù)據(jù)受到攻擊。根據(jù)發(fā)現(xiàn)該漏洞的研究人員表示,Moodle安全漏洞實際由幾個小漏洞組成,它可使攻擊者在相關(guān)服務(wù)器執(zhí)行PHP代碼。那么,這個漏洞執(zhí)行條件是什么,以及我們應(yīng)該如何阻止它?
Michael Cobb:Vaultra公司安全研究人員兼首席執(zhí)行官Netanel Rubin發(fā)現(xiàn),通過利用一系列小漏洞,他可將它們鏈接起來在運行Moodle的服務(wù)器遠程執(zhí)行代碼。
Moodle是一個開源學(xué)習(xí)管理系統(tǒng),它存儲著大量敏感信息,例如學(xué)生成績、測試和隱私數(shù)據(jù),這使其成為黑客的攻擊目標(biāo)。Moodle安全漏洞被跟蹤為CVE-2017-2641以及Moodle Tracker問題MDL-88010。
這種攻擊幾乎可在所有Moodle版本執(zhí)行,因此管理員應(yīng)該升級到最新版本3.2.2,以盡快解決該問題。除了更新到最新版本,管理和還應(yīng)該檢查Moodle內(nèi)任何新管理員、插件或者模板,并在文件系統(tǒng)中搜索任何新文件,以防服務(wù)器遭到入侵。
Moodle系統(tǒng)的規(guī)模和復(fù)雜性導(dǎo)致這些編碼和邏輯缺陷,也最終產(chǎn)生這個Moodle安全漏洞;Moodle系統(tǒng)包含數(shù)千個文件、數(shù)百個組件以及大約200萬行PHP代碼,由不同開發(fā)人員在不同時間編寫和更新。
此前,Moodle中添加了一個新函數(shù)update_user_preferences來替換update_users函數(shù),它會進行特權(quán)檢查,因此即使攻擊者可通過用戶偏好設(shè)置來更改設(shè)置,也只能以自己的權(quán)限更改。
雖然這個新函數(shù)消除了更改每個用戶屬性的可能性,但該代碼無法檢查哪些偏好設(shè)置被更改。前面的函數(shù)使用setuserpref.php文件來檢查需要更新的偏好設(shè)置列在ajax_updatable_user_prefs數(shù)組中,該數(shù)組定義了可通過Ajax更改的偏好設(shè)置,以確保不會更改關(guān)鍵值。
具有諷刺意味的是,為了減少對該用戶屬性更新功能的任何潛在濫用情況,這個新的特權(quán)檢查實際上引入了Moodle安全漏洞。開發(fā)人員可能認為用戶偏好設(shè)置不可能被利用來加載全面攻擊,因為它們只是影響圖形用戶界面部分。
然而,缺乏包含讓對象注入攻擊可更新整個數(shù)據(jù)庫的任何行,例如管理員賬戶、密碼和站點配置。Rubin發(fā)現(xiàn),在代碼開發(fā)過程中做出的這個假設(shè)和其他假設(shè)可能被利用來最終執(zhí)行PHP代碼。
邏輯漏洞可能出現(xiàn)在任何具有大型代碼庫的系統(tǒng)中,特別是在由不斷變化的開發(fā)團隊在長時間開發(fā)的系統(tǒng)。
根據(jù)《Code Complete》作者Steve McConnell表示,超過512000行代碼的軟件項目平均每千行代碼中有4到100個編碼錯誤。典型的Web應(yīng)用會使用多種語言,例如Java、HTML、PHP、Python、CSS、第三方庫和組件等,很少有開發(fā)人員知道或者了解如何使用和整合它們,而不會引入任何安全漏洞。
為了減少開發(fā)人引入邏輯漏洞或者省略安全及驗證檢查,應(yīng)該要求他們使用約定的注釋風(fēng)格來添加最低級別的代碼注釋,以及更詳細的支持文檔。維基百科有完整的注釋樣式列表。
盡管花時間評論和記錄代碼會減緩開發(fā)速度,但這可確保在未來更改代碼的開發(fā)人員可完全了解函數(shù)的作用、操作方式以及需要對處理的數(shù)據(jù)進行哪些檢查。同樣重要的是當(dāng)函數(shù)在接收其他函數(shù)傳遞的數(shù)據(jù)時,不能認為數(shù)據(jù)已經(jīng)經(jīng)過檢查,因為前面的函數(shù)可能通過不同的要求或規(guī)則對其進行檢查。
這方面很好的示例是電話號碼,從數(shù)據(jù)庫檢索和顯示用戶電話號碼的函數(shù)可能會接收+和()符號,但如果該函數(shù)將數(shù)據(jù)傳遞給實際撥打號碼的函數(shù),且在處理前沒有移除這些符號,可能會導(dǎo)致該函數(shù)失效。