CVE-2019-5018:Sqlite3 Window function远程代码执行漏洞
字数 1247 2025-08-29 08:32:25
SQLite3 Window Function 远程代码执行漏洞分析 (CVE-2019-5018)
漏洞概述
CVE-2019-5018是SQLite 3.26.0版本中Windows函数功能存在的一个Use-After-Free (UAF)漏洞。攻击者可以通过构造特殊的SQL命令触发该漏洞,可能导致远程代码执行。该漏洞由Talos团队发现并报告,编号为TALOS-2019-0777。
漏洞背景
SQLite是一个广泛使用的轻量级SQL数据库引擎,被应用于:
- 移动设备
- 浏览器
- 硬件设备
- 各种用户应用程序
Window Functions是SQL标准中的特性,允许对行的子集(Subset/window)进行查询操作。
漏洞技术细节
漏洞触发流程
-
初始处理阶段:
- 当SQLite处理包含Window函数的SELECT语句时,会调用
sqlite3WindowRewrite函数进行转换 - 代码位置:
src/select.c:5643
- 当SQLite处理包含Window函数的SELECT语句时,会调用
-
表达式重写过程:
- 如果使用了聚合函数(COUNT, MAX, MIN, AVG, SUM等),SELECT对象的表达式列表会被重写
- Master Window对象(
pMWin)从SELECT对象中取出并在重写过程中使用
-
回调处理问题:
- 在处理每个表达式时,
xExprCallback函数作为处理回调 - 处理聚合函数(TK_AGG_FUNCTION)时,表达式会被添加到表达式列表后删除
- 如果表达式被标记为window function,相关的window对象也会被删除
- 在处理每个表达式时,
-
UAF触发点:
- 在
sqlite3WindowRewrite函数中,删除的部分在表达式列表被重写后被错误地重用 - 关键代码位置:
src/window.c:785和src/window.c:723
- 在
关键代码分析
-
表达式删除问题:
static int selectWindowRewriteExprCb(Walker *pWalker, Expr *pExpr){ // ... case TK_AGG_FUNCTION: case TK_COLUMN: { Expr *pDup = sqlite3ExprDup(pParse->db, pExpr, 0); p->pSub = sqlite3ExprListAppend(pParse, p->pSub, pDup); if( p->pSub ){ ExprSetProperty(pExpr, EP_Static); sqlite3ExprDelete(pParse->db, pExpr); // [2] 漏洞点 ExprClearProperty(pExpr, EP_Static); memset(pExpr, 0, sizeof(Expr)); // ... } } -
Window对象删除:
static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){ if( !ExprHasProperty(p, (EP_TokenOnly|EP_Leaf)) ){ if( ExprHasProperty(p, EP_WinFunc) ){ assert( p->op==TK_FUNCTION ); sqlite3WindowDelete(db, p->y.pWin); // 删除关联的Window对象 } } } -
释放后重用:
selectWindowRewriteEList(pParse, pMWin, pSrc, p->pEList, &pSublist); // [4] selectWindowRewriteEList(pParse, pMWin, pSrc, p->pOrderBy, &pSublist); pMWin->nBufferCol = (pSublist ? pSublist->nExpr : 0); pSublist = exprListAppendList(pParse, pSublist, pMWin->pPartition); // [5] 使用已释放的内存
漏洞验证与利用
崩溃信息分析
使用SQLite3 debug版本可以验证该漏洞:
- 释放的缓存内容会被填充为
0xfafafafafafafafa - 监控该值附近的崩溃可以证明释放的缓存正在被再次访问
调试信息示例:
[─────────────────────REGISTERS──────────────────────]
*RAX 0xfafafafafafafafa
...
[───────────────────────DISASM───────────────────────]
► 0x4db723 <exprListAppendList+240> mov eax, dword ptr [rax]
PoC利用
可以使用sqlite3 shell运行PoC:
./sqlite3 -init poc
影响范围
受影响版本:
- SQLite 3.26.0
不受影响版本:
- SQLite 3.27.0及更高版本
修复建议
- 升级到SQLite 3.27.0或更高版本
- 如果无法升级,可以考虑禁用Window Functions功能
技术总结
该漏洞的核心是一个典型的Use-After-Free问题,其根本原因在于:
- 在表达式重写过程中过早释放了Window对象
- 随后又在重写过程中错误地重用了已释放的内存
- 攻击者可以通过精心构造的SQL语句控制释放后的内存内容
这种类型的漏洞如果被成功利用,可能导致任意代码执行,危害性极高。对于使用SQLite的应用程序,特别是那些接受用户输入SQL语句的应用,应及时修复此漏洞。