文章总结: 搜狗输入法Windows版存在CVE-2026-51990远程代码执行漏洞,攻击者构造恶意sgbiz:协议链接,用户点击一次即可触发内嵌浏览器加载恶意页面,利用旧版Chromium内核CVE-2021-38003漏洞实现RCE。影响版本低于16.3.0.3498,修复版本已推送。建议立即升级至16.3.0.3498及以上版本,不点击来源不明的sgbiz:链接,并关注IOC域名noht1ng[.]top。
综合评分: 88
文章分类: 漏洞分析,漏洞预警,安全工具
【漏洞复现】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 (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¶m=-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 a = []; a[20000] = "A".repeat(1.5 * 1024 * 1024); // 32 位下 1.5MB × 10,8MB 会直接 OOMvar b = []; for (var i = 0; i < 10; i++) b[i] = a;var s = JSON.stringify(b); // 触发
判定是否拿到 TheHole,三个条件必须同时成立:
typeof(s[i]) === "undefined" // 不是 undefinedString(s[i]) === "hole" // 但字符串化是 "hole"s[i] === s[i] // 自反性都不成立
第 2 步:用 TheHole 腐蚀 Map,拿到越界窗口。
把 TheHole 当 key 去操作 Map,触发内部状态机错乱:
var m = new Map();m.set(1, 1);m.set(hole, 1);m.delete(hole);m.delete(hole); // 删两次m.delete(1);// m.size === -1 ← 不报错、不崩溃的“活着的僵尸”
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 expect 0x371337b8 -> IN PLACEf() = 322376503 <<< SENTINEL: our stub executed at this entry[A] store-only write: 128 bytes = 16 x 8B slots[B] verify: ALL 16 SLOTS IN PLACE -- payload fully written[C] calling f() again (calc time) ...f() = 0 <<< PAYLOAD RAN AND RETURNED CLEANLY -- calc.exe should be up[=] DONE. calc.exe popped -> CVE-2026-51990 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¶m=-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版远程代码执行漏洞》