SQLite 遠程代碼執行漏洞安全通告

發布時間 2019-05-13

漏洞編號和級別


CVE編號:CVE-2019-5018,危險級別:高級,CVSS分值:廠商自評:8.1,官方未評定


影響版本

SQLite 3.26.0、3.27.0


漏洞概述


SQLite是一款流行的SQL數據庫引擎,具有小型,快速,可靠的特點,廣泛用于移動設備,瀏覽器,硬件設備以及用戶應用程序。


SQLite的窗口函數中存在可被利用的use-after-free漏洞,攻擊者可通過發送惡意SQL命令來觸發此漏洞,導致遠程代碼執行。


漏洞驗證


具體細節為,SQLite在對包含窗口函數的SELECT語句進行解析后,使用sqlite3WindowRewrite函數對該SELECT語句進行轉換。



在此函數中,如果該SELECT語句包含聚合函數(COUNT,MAX,MIN,AVG,SUM),則重寫SELECT對象保存的表達式列表(下圖中第[0]行)。



主窗口對象pMWin取自SELECT對象,并在重寫期間被使用[1]。遍歷SELECT對象的表達式列表,重寫窗口函數以便于處理。



注意主窗口對象在WindowRewrite對象中使用。在循環處理每一個表達式時,將xExprCallback函數作為回調函數。當處理聚合函數(TK AGG FUNCTION)后,表達式被刪除[2]。



如果被刪除的表達式被標記為窗口函數,則也會刪除關聯的Window對象。



并刪除該Window對象關聯的分區。



回顧初始的sqlite3WindowRewrite函數,發現該函數在重寫表達式列表[4]之后通過exprListAppendList重用這個被刪除的分區[5],從而導致use-after-free和拒絕服務。如果攻擊者可以控制free后的內存,則可能破壞更多數據,從而導致代碼執行。



可以使用Debug版本的sqlite3先清空被free的緩沖區的內容,以更好地進行演示[5]。



通過gdb sqlite3運行PoC,可觀察到0xfafafafafafafafa附近發生崩潰,這意味著對已釋放的緩沖區的再次訪問:



使用sqlite3 shell運行PoC:



修復建議


目前SQLite廠商針對該漏洞發布了漏洞補丁,請更新至SQLite3 3.28.0:https://www.sqlite.org/src/info/69bad9257f8db6a2。


參考鏈接


https://www.talosintelligence.com/vulnerability_reports/TALOS-2019-0777/