更多安全资讯和分析文章请关注启明星辰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
技术分析
当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 subqueryn",i+1));
sqlite3ExprListDelete(db, pSub->pOrderBy);
pSub->pOrderBy = 0;
}
...
}
但是这个释放的pOrderBy节点可能是一个AGG_FUNCTION函数,并且它的指针之前保存在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 */
){
...
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
[2] https://crbug.com/1358381
[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余个,持续保持国际网络安全领域一流水准。实验室研究方向涵盖基础安全研究、移动与物联网安全研究、工控安全研究、信创安全研究、云安全研究、无线安全研究、高级威胁研究、攻防体系建设。研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。
原文始发于微信公众号(ADLab):SQLite3漏洞分析(CVE-2022-3039)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论