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)进行查询操作。

漏洞技术细节

漏洞触发流程

  1. 初始处理阶段

    • 当SQLite处理包含Window函数的SELECT语句时,会调用sqlite3WindowRewrite函数进行转换
    • 代码位置:src/select.c:5643
  2. 表达式重写过程

    • 如果使用了聚合函数(COUNT, MAX, MIN, AVG, SUM等),SELECT对象的表达式列表会被重写
    • Master Window对象(pMWin)从SELECT对象中取出并在重写过程中使用
  3. 回调处理问题

    • 在处理每个表达式时,xExprCallback函数作为处理回调
    • 处理聚合函数(TK_AGG_FUNCTION)时,表达式会被添加到表达式列表后删除
    • 如果表达式被标记为window function,相关的window对象也会被删除
  4. UAF触发点

    • sqlite3WindowRewrite函数中,删除的部分在表达式列表被重写后被错误地重用
    • 关键代码位置:src/window.c:785src/window.c:723

关键代码分析

  1. 表达式删除问题

    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));
                // ...
            }
        }
    
  2. 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对象
            }
        }
    }
    
  3. 释放后重用

    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及更高版本

修复建议

  1. 升级到SQLite 3.27.0或更高版本
  2. 如果无法升级,可以考虑禁用Window Functions功能

技术总结

该漏洞的核心是一个典型的Use-After-Free问题,其根本原因在于:

  1. 在表达式重写过程中过早释放了Window对象
  2. 随后又在重写过程中错误地重用了已释放的内存
  3. 攻击者可以通过精心构造的SQL语句控制释放后的内存内容

这种类型的漏洞如果被成功利用,可能导致任意代码执行,危害性极高。对于使用SQLite的应用程序,特别是那些接受用户输入SQL语句的应用,应及时修复此漏洞。

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 表达式重写过程 : 如果使用了聚合函数(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 关键代码分析 表达式删除问题 : Window对象删除 : 释放后重用 : 漏洞验证与利用 崩溃信息分析 使用SQLite3 debug版本可以验证该漏洞: 释放的缓存内容会被填充为 0xfafafafafafafafa 监控该值附近的崩溃可以证明释放的缓存正在被再次访问 调试信息示例: PoC利用 可以使用sqlite3 shell运行PoC: 影响范围 受影响版本: SQLite 3.26.0 不受影响版本: SQLite 3.27.0及更高版本 修复建议 升级到SQLite 3.27.0或更高版本 如果无法升级,可以考虑禁用Window Functions功能 技术总结 该漏洞的核心是一个典型的Use-After-Free问题,其根本原因在于: 在表达式重写过程中过早释放了Window对象 随后又在重写过程中错误地重用了已释放的内存 攻击者可以通过精心构造的SQL语句控制释放后的内存内容 这种类型的漏洞如果被成功利用,可能导致任意代码执行,危害性极高。对于使用SQLite的应用程序,特别是那些接受用户输入SQL语句的应用,应及时修复此漏洞。