SQLite 远程代码执行缝隙(CVE-2019-5018)

颁布功夫 2019-05-11

01布景描述



SQLite 3.28.0建复了由思科Talos发现并汇报的远程代码执行缝隙(CVE-2019-5018)  。


02影响领域



CVE ID  :   CVE-2019-5018    
缝隙等级:   高危
影响领域:   SQLite 3.26.0、3.27.0
CVSS评分:   8.1


03缝隙详情



SQLite 3.26.0的窗口函数中存在可被利用的use-after-free缝隙 ,攻击者可通过发送恶意SQL号令来触发此缝隙 ,导致远程代码执行  。


具体细节为 ,SQLite在对蕴含窗口函数的SELECT语句进行解析后 ,使用sqlite3WindowRewrite函数对该SELECT语句进行转换  。


首页 | J9集团有限公司官网


在此函数中 ,若是该SELECT语句蕴含聚合函数(COUNT ,MAX ,MIN ,AVG ,SUM) ,则沉写SELECT对象保留的表白式列表(下图中第[0]行)  。

首页 | J9集团有限公司官网


主窗口对象pMWin取自SELECT对象 ,并在沉写期间被使用[1]  。遍历SELECT对象的表白式列表 ,沉写窗口函数以便于处置  。


首页 | J9集团有限公司官网


把稳主窗口对象在WindowRewrite对象中使用  。在循环处置每一个表白式时 ,将xExprCallback函数作为回调函数  。当处置聚合函数(TK AGG FUNCTION)后 ,表白式被删除[2]  。


首页 | J9集团有限公司官网


若是被删除的表白式被象征为窗口函数 ,则也会删除关联的Window对象  。


首页 | J9集团有限公司官网


并删除该Window对象关联的分区  。

首页 | J9集团有限公司官网


回首初始的sqlite3WindowRewrite函数 ,发现该函数在沉写表白式列表[4]之后通过exprListAppendList沉用这个被删除的分区[5] ,从而导致use-after-free和回绝服务  。若是攻击者能够节造free后的内存 ,则可能粉碎更无数据 ,从而导致代码执行  。


首页 | J9集团有限公司官网


能够使用Debug版本的sqlite3先清空被free的缓冲区的内容 ,以更好地进行演示[5]  。


首页 | J9集团有限公司官网


通过gdb sqlite3运行PoC ,可观察到0xfafafafafafafafa左近发生崩溃 ,这意味着对已开释的缓冲区的再次接见:

首页 | J9集团有限公司官网


使用sqlite3 shell 运行PoC:

首页 | J9集团有限公司官网


04建复建议



此缝隙已在SQLite 3.28.0中建复  。


05参考链接



https://blog.talosintelligence.com/2019/05/vulnerability-spotlight-remote-code.html
https://www.sqlite.org/src/info/884b4b7e502b4e99