fix CVE-2026-39113 #287
Open
hanjinpengAdd on Aug 26
Aug 26

当前PR是否有AI参与

[ ] 否

[x] Yes
__1. AI Agent平台: DeepSeek Harness
__2. AI模型: GLM-5.2
__3. Prompt上下文: 基于上游 commit 169f68ed88b34cb68f720191c64c058f2ccec508 生成 backport patch,完成 spec 修改与 changelog 更新

参考:openEuler社区《生成式AI工具使用与开源贡献政策》

PR功能描述 / 为什么需要这个合入

fix CVE-2026-39113: ext/misc/sqlar.c sqlarUncompressFunc() 缓冲区溢出

CVE-2026-39113 中,sqlarUncompressFunc() 使用 sqlite3_value_int() 读取解压后大小 sz,32 位截断后传入 sqlite3_malloc(int) 分配过小缓冲区,uncompress() 实际写入完整解压数据导致堆缓冲区溢出,攻击者可造成拒绝服务。修复方式为改用 sqlite3_value_int64() 读取完整 64 位大小。

上游来源:https://github.com/sqlite/sqlite/commit/169f68ed88b34cb68f720191c64c058f2ccec508

修复类型:Bug修复 / 安全修复

回合说明:基于 sqlite 3.37.2 版本回合上游补丁。ABI:无 ABI 变化(仅 ext/misc/sqlar.c 内部单行修改,不涉及任何导出符号)

CVE 修复补丁实现说明:

漏洞代码(ext/misc/sqlar.c,sqlarUncompressFunc()):

uLong nData;
uLongf sz;

assert( argc==2 );
sz = sqlite3_value_int(argv[1]);        /* 修复前:32 位截断 */

if( sz<=0 || sz==(nData = sqlite3_value_bytes(argv[0])) ){
  sqlite3_result_value(context, argv[0]);
}else{
  const Bytef *pData = sqlite3_value_blob(argv[0]);
  Bytef *pOut = sqlite3_malloc(sz);     /* 按截断后的 sz 分配 */
  ...
  if( Z_OK!=uncompress(pOut, &sz, pData, nData) ){  /* zlib 按真实解压大小写入 → 溢出 */

实现原理:

  1. 溢出成因:sqlar 归档中每个条目记录了解压后大小 sz(最大 64 位)。sqlite3_value_int() 返回 int(32 位),当条目声明 sz > 0xFFFFFFFF(如 0x100000001)时被截断为小值(如 1);sqlite3_malloc(sz) 按截断值分配堆缓冲区,而 zlib uncompress() 会将完整解压数据写入该缓冲区,造成堆越界写;
  2. 修复方式:将 sqlite3_value_int(argv[1]) 改为 sqlite3_value_int64(argv[1]),以 sqlite3_int64(64 位)完整读取 sz,使分配大小与实际解压大小一致。sz 过大时 sqlite3_malloc() 分配失败返回 NULL,走既有的 sqlite3_result_error_nomem() 错误路径,不再触发溢出;
  3. 上游对应:本补丁回合自上游 commit 169f68ed88b34cb68f720191c64c058f2ccec508 中 ext/misc/sqlar.c 的改动(上游同 commit 还包含 btree.c/json.c 的无关加固,见下方回合说明);
  4. 行为兼容性:sz 在 32 位范围内时新旧代码行为完全一致(int64 与 int 读出的值相同),不影响正常 .sqlar 归档的解压功能;sz<=0 与 sz==nData 的快捷路径判断逻辑不变。

影响:

  • 受影响场景:仅在使用 sqlar 扩展(SQLite Archive,sqlar_uncompress() SQL 函数)且解压条目声明大小超出 32 位 int 表示范围时触发;常规数据库操作不受影响
  • 攻击向量:构造恶意 .sqlar 归档(或直接调用 sqlar_uncompress() 传入超大 sz 值),导致堆缓冲区溢出 → 拒绝服务(进程崩溃);CVSS 评分 N/A(公开披露信息未给出评分)
  • 修复影响面:ext/misc/sqlar.c 单行修改,仅改变 sz 的读取宽度(32→64 位),正常输入下行为完全一致;不影响任何导出符号/公共 ABI,无需重建依赖组件
  • 该 CVE 影响 3.32.3 / 3.37.2 / 3.42.0(本分支版本在受影响列表内);master(3.53.4)已包含上游修复,不受影响

该PR关联的issue

fixes #98

希望检视人员了解

代码由AI辅助编写,已人工逐行核对逻辑、校验功能正确性,确保与预期一致。

likedislike
Merge blocked
Hhanjinpeng
Aug 26 Created pull request, commit 5b6ca2d5
Hhanjinpeng
Aug 26 Associated issue: CVE-2026-39113
openeuler-ci-botopeneuler-ci-botCollaborators
Aug 26 Set ZhengZhenyu,dillon_chen,xicoding as approver
openeuler-ci-botopeneuler-ci-botCollaborators
Aug 26 Added label: sig/DB
openeuler-ci-bot
openeuler-ci-botCollaborators
Aug 26 Comments:

Welcome To openEuler Community

Hey @protkhn , thanks for your contribution to the community.

Bot Usage Manual

I'm the Bot here serving you. You can find the instructions on how to interact with me at Here . That means you can comment below every pull request or issue to trigger Bot Commands. You can self-configure the PR merge rules for this repository. For more details, please refer to Here.

Contact Guide

If you have any questions, please contact the SIG: DB ,
and any of the maintainers: @ZhengZhenyu, @dillon_chen, @xicoding ,
and any of the committers: @wbq_sky .

likedislike
41 messages are collapsed here。 See more
openeuler-ci-bot
openeuler-ci-botCollaborators
Aug 26 Comments:
Check Name Build Result 详情 Build Details
check_binary_file ✅SUCCESS #161
check_lfsconfig ☑️EXCLUDE
check_package_yaml_file ✅SUCCESS
check_repo_in_maintain ✅SUCCESS
check_consistency ✅SUCCESS
check_spec_file ✅SUCCESS
x86_64 check_build ✅SUCCESS #161
check_install ✅SUCCESS
check_license ✅SUCCESS
aarch64 check_build ✅SUCCESS #161
check_install ✅SUCCESS
check_license ✅SUCCESS
likedislike
openeuler-ci-botopeneuler-ci-botCollaborators
Aug 26 Added label: ci_successful
openeuler-ci-bot
openeuler-ci-botCollaborators
Aug 26 Comments:

如下为接口变更检查结果,目标分支为openEuler-22.03-LTS-SP4,请PR提交者check差异信息

Arch Name Check Items Rpm Name Check Result Build Details
compare_package(x86_64) add_rpms ✅SUCCESS #161
delete_rpms ✅SUCCESS
rpm_abi ✅SUCCESS
rpm_cmd ✅SUCCESS
rpm_files ✅SUCCESS
rpm_header ✅SUCCESS
rpm_lib ✅SUCCESS
rpm_provides ✅SUCCESS
rpm_requires ✅SUCCESS
rpm_symbol ✅SUCCESS
compare_package(aarch64) add_rpms ✅SUCCESS #161
delete_rpms ✅SUCCESS
rpm_abi ✅SUCCESS
rpm_cmd ✅SUCCESS
rpm_files ✅SUCCESS
rpm_header ✅SUCCESS
rpm_lib ✅SUCCESS
rpm_provides ✅SUCCESS
rpm_requires ✅SUCCESS
rpm_symbol ✅SUCCESS
likedislike
openeuler-ci-bot
openeuler-ci-botCollaborators
Aug 26 Comments:
likedislike
ZhengZhenyuCollaborators
18 days ago Comments:

经复核,本 PR 不应合入,建议关闭。两点问题:

  1. 分支不受影响:Debian security-tracker 明确 CVE-2026-39113 的 Introduced by 为 169f68ed(version-3.53.0)、Fixed by 为 34e139d3(version-3.53.0),漏洞代码只存在于 3.53.0 主干约 3 周(2026-03-11 ~ 04-01),从未进入任何发布版本。openEuler 22.03-LTS-SP4(3.37.2)早于引入点,其 ext/misc/sqlar.c 使用 sqlite3_value_int() 且 malloc 与 uncompress 共用同一截断值,不存在 64 位/32 位错配,不构成堆溢出,故本分支不受影响。

  2. 补丁选错 commit:本 PR 回合的 169f68ed 是「引入 commit」而非「修复 commit」。真正的修复 34e139d3(Always use sqlite3_malloc64() in extensions)是把 sqlite3_malloc 改为 sqlite3_malloc64,而非把 sqlite3_value_int 改为 sqlite3_value_int64。若把当前改动应用到 3.37.2,sz 变为完整 64 位,但 sqlite3_malloc(int) 仍按 32 位截断分配,而 uncompress(&sz) 收到完整 64 位值,反而会引入该漏洞。

建议:关闭本 PR,并将 issue #98 的受影响性判定修正为「不受影响」。

likedislike