更多安全资讯和分析文章请关注启明星辰ADLab微信公众号及官方网站(adlab.venustech.com.cn)
01
漏洞概述
SQLite3具有简单、轻量、高效的特点,广泛应用于小型应用和嵌入式系统的数据存储。在2023年BlackHat-Asian会议上,有三个SQLite3的漏洞被披露,这三个SQLite3的漏洞编号分别是CVE-2022-3039、CVE-2022-3041、CVE-2022-3195。WebSQL是一种前端浏览器数据库API。WebSQL它是在Web浏览器中使用的一种数据库解决方案,允许开发者通过JavaScript使用SQL语句来操作浏览器中的数据库。WebSQL提供了一种简单方式来存储和检索数据,特别适用于离线应用程序和需要在客户端进行数据处理的场景。Chrome和 Safari等都支持通过SQLite来实现WebSQL。
具体漏洞描述如下表所示:
CVE ID
描述
危害
CVESSv3.1得分
CVE-2022-3039
SQLite3在处理SQL语句查询优化时存在UAF漏洞,导致代码执行
代码执行或信息泄露
8.8
CVE-2022-3041
SQLite3在处理SQL语句查询优化时存在UAF漏洞,导致代码执行
代码执行或信息泄露
8.8
CVE-2022-3195
SQLite3存在越界写漏洞,导致堆溢出
代码执行
8.8
02
处置建议
升级到最新版本的Chrome及SQLite3。
03
技术分析
我们选取了CVE-2022-3039作为本次漏洞分析的重点,CVE-2022-3041的原理与CVE-2022-3039类似。
当sqlite3Select函数处理Select语句时,它将处理pElist、 pOrderBy和pHaving节点,并根据不同的AGG_FUNCTION和AGG_COLUMN类型保存到对应的到pAggInfo结构中。这个代码的实现主要是通过addAggInfoColumn及addAggInfoFunc来申请相应的节点内存并保存pAggInfo结构变量中。
`SQLITE_PRIVATE int sqlite3Select(` `Parse *pParse, /* The parser context */` `Select *p, /* The SELECT statement being coded. */` `SelectDest *pDest /* What to do with the query results */``){` ` sqlite3ExprAnalyzeAggList(&sNC, pEList);` `sqlite3ExprAnalyzeAggList(&sNC, sSort.pOrderBy);` `...` `sqlite3ExprAnalyzeAggregates(&sNC, pHaving);` `...`` ` `finalizeAggFunctions(pParse, pAggInfo);` `sqlite3ExprIfFalse(pParse, pHaving, addrOutputRow+1, SQLITE_JUMPIFNULL);`` ``}`` ``static int addAggInfoColumn(sqlite3 *db, AggInfo *pInfo){` `int i;` `pInfo->aCol = sqlite3ArrayAllocate(` `db,` `pInfo->aCol,` `sizeof(pInfo->aCol[0]),` `&pInfo->nColumn,` `&i` `);` `return i;``}`` ``static int addAggInfoFunc(sqlite3 *db, AggInfo *pInfo){` `int i;` `pInfo->aFunc = sqlite3ArrayAllocate(` `db,` `pInfo->aFunc,` `sizeof(pInfo->aFunc[0]),` `&pInfo->nFunc,` `&i` `);` `return i;``}`
为了提高效率,pHaving节点语句在内部代码优化的过程中,将删除pOrderBy节点。
`SQLITE_PRIVATE int sqlite3Select(` `Parse *pParse, /* The parser context */` `Select *p, /* The SELECT statement being coded. */` `SelectDest *pDest /* What to do with the query results */``){``...` `if( pSub->pOrderBy!=0` `&& (p->pOrderBy!=0 || pTabList->nSrc>1) /* Condition (5) */` `&& pSub->pLimit==0 /* Condition (1) */` `&& (pSub->selFlags & SF_OrderByReqd)==0 /* Condition (2) */` `&& (p->selFlags & SF_OrderByReqd)==0 /* Condition (3) and (4) */` `&& OptimizationEnabled(db, SQLITE_OmitOrderBy)` `){` `SELECTTRACE(0x100,pParse,p,` `("omit superfluous ORDER BY on %r FROM-clause subquery\n",i+1));` `sqlite3ExprListDelete(db, pSub->pOrderBy);` `pSub->pOrderBy = 0;` `}``...``}`
但是这个释放的pOrderBy节点可能是一个AGG_FUNCTION函数,并且它的指针之前保存在pAggInfo结构中。
这个指针将在后续的resetAccumulator函数中被使用,这将导致UAF漏洞。
`SQLITE_PRIVATE int sqlite3Select(` `Parse *pParse, /* The parser context */` `Select *p, /* The SELECT statement being coded. */` `SelectDest *pDest /* What to do with the query results */``){`` ` `...` `sqlite3VdbeResolveLabel(v, addrReset);` `resetAccumulator(pParse, pAggInfo);` `sqlite3VdbeAddOp2(v, OP_Integer, 0, iUseFlag);` `VdbeComment((v, "indicate accumulator empty"));` `....`` ``}`
漏洞成因是在代码优化的过程中,程序删除了pOrderBy节点,但是这个节点的指针依然保持在pAggInfo结构中。
我们可以通过堆喷的方式占位,并在resetAccumulator函数中,我们可以任意控制pE指针的指向,所以我们可以伪造有效的pE->x.pList,并调用sqlite3KeyInfoFromExprList,并通过sqlite3KeyInfoFromExprList ->sqlite3ExprNNCollSeq->sqlite3ExprCollSeq->sqlite3GetCollSeq 调用链实现信息泄漏或代码执行。POC验证如下:
参考链接:
[1] https://nvd.nist.gov/vuln/detail/CVE-2022-3195
[3] https://i.blackhat.com/Asia-23/AS-23-Chen-New-Wine-in-an-Old-Bottle-Attacking-Chrome-WebSQL.pdf
启明星辰积极防御实验室(ADLab)
ADLab成立于1999年,是中国安全行业最早成立的攻防技术研究实验室之一,微软MAPP计划核心成员,“黑雀攻击”概念首推者。截止目前,ADLab已通过CVE累计发布安全漏洞1100余个,通过 CNVD/CNNVD/NVDB累计发布安全漏洞3000余个,持续保持国际网络安全领域一流水准。实验室研究方向涵盖基础安全研究、移动与物联网安全研究、工控安全研究、信创安全研究、云安全研究、无线安全研究、高级威胁研究、攻防体系建设。研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。