报告编号:B6-2019-051001
报告来源:360-CERT
报告作者:360-CERT
更新日期:2019-05-10
0x00 事件背景
SQLite是一款流行的SQL数据库引擎,具有小型,快速,可靠的特点,广泛用于移动设备,浏览器,硬件设备以及用户应用程序。2019年5月9日,Cisco Talos 发布漏洞信息:在SQLite3 3.26.0和3.27.0版本中的窗口功能存在UAF漏洞,攻击者可以通过发送恶意的SQL命令触发此漏洞,可能导致远程代码执行。(TALOS-2019-0777/CVE-2019-5018)
0x01 影响范围
-
SQLite3 3.26.0
-
SQLite3 3.27.0
0x02 漏洞细节
触发漏洞的函数调用关系如下:
(1)SQLite在对窗口进行查询时,会通过sqlite3WindowRewrite函数解析SELECT语句
(2)如果SELECT语句中包含(COUNT,MAX,MIN,AVG,SUM)等函数,则会通过selectWindowRewriteEList函数重写SELECT对象保存的表达式列表
(3)在重写过程中,会循环处理每一个表达式,并将selectWindowRewriteExprCb作为回调函数将表达式删除
(4)如果删除的表达式标记为窗口函数,则删除与之关联的窗口对象
(5)删除关联的窗口分区
上述只是将窗口对象删除,但是在后续exprListAppendList函数中重新使用了该对象,导致了UAF漏洞。
src/window.c:785
selectWindowRewriteEList(pParse, pMWin, pSrc, p->pEList, &pSublist);
selectWindowRewriteEList(pParse, pMWin, pSrc, p->pOrderBy, &pSublist);
pMWin->nBufferCol = (pSublist ? pSublist->nExpr : 0);
...
pSublist = exprListAppendList(pParse, pSublist, pMWin->pPartition); //<--------
src/window.c:723
static ExprList *exprListAppendList(
Parse *pParse,
ExprList *pList,
ExprList *pAppend [5]
){
if( pAppend ){
int i;
int nInit = pList ? pList->nExpr : 0;
for(i=0; i<pAppend->nExpr; i++){
Expr *pDup = sqlite3ExprDup(pParse->db, pAppend->a[i].pExpr, 0);
pList = sqlite3ExprListAppend(pParse, pList, pDup);
if( pList ) pList->a[nInit+i].sortOrder = pAppend->a[i].sortOrder;
}
}
return pList;
}
如果攻击者能够控制free后的内存,则有可能破坏更多数据,从而可能导致代码执行。
0x03 修复建议
-
使用最新版本SQLite3 3.28.0
-
SQLite产商针对该漏洞发布了漏洞补丁。请受影响的用户,访问下面的补丁链接,对产品进行修补。
https://www.sqlite.org/src/info/69bad9257f8db6a2
0x04 时间线
2019-02-05 Cisco Talos的Cory Duplantis发现漏洞并向产商披露
2019-03-07 对产商进行30天的漏洞跟进
2019-03-28 产商对漏洞进行修补
2019-05-09 Cisco Talos 发布漏洞信息
2019-05-10 360CERT发布预警
0x05 参考链接
- https://www.talosintelligence.com/vulnerability_reports/TALOS-2019-0777
- https://blog.talosintelligence.com/2019/05/vulnerability-spotlight-remote-code.html
声明:本文来自360CERT,版权归作者所有。文章内容仅代表作者独立观点,不代表士冗科技立场,转载目的在于传递更多信息。如有侵权,请联系 service@expshell.com。