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/