IPBUF安全漏洞报告
English
CVE-2026-22028 CVSS 6.1 中危

CVE-2026-22028: Preact框架JSON序列化保护回归导致HTML注入漏洞

披露日期: 2026-01-08

漏洞信息

漏洞编号
CVE-2026-22028
漏洞类型
HTML注入/跨站脚本(XSS)
CVSS评分
6.1 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
Preact

相关标签

HTML注入XSSPreactJSON注入Virtual DOM回归漏洞CSP绕过前端框架CVE-2026-22028

漏洞概述

CVE-2026-22028是Preact框架中的一个安全漏洞,CVSS评分6.1,属于中危级别。Preact是一个轻量级的Web开发框架,该漏洞源于10.26.5版本中引入的回归问题,导致原本用于防止Virtual DOM元素被任意JSON构造的保护机制被削弱。在满足特定条件的应用中,攻击者可以构造特殊的JSON payload,这些payload会被错误地视为有效的VNode(虚拟DOM节点),从而导致HTML注入。如果应用未通过CSP或其他机制进行缓解,还可能导致任意脚本执行。此漏洞影响所有使用受影响Preact版本且将用户数据直接传递给渲染树的应用。

技术细节

Preact框架为了防止通过JSON构造Virtual DOM元素实现了JSON序列化保护机制。然而在10.26.5版本中,这种保护被意外削弱。漏洞的核心在于:当应用满足以下条件时会被利用——1)将来自API、数据库、本地存储等用户可修改数据源的未消毒值直接传入渲染树;2)假设这些值都是字符串,但数据源可能返回JavaScript对象;3)数据源未执行类型消毒或已被破坏。攻击者可以通过在JSON payload中嵌入特殊构造的对象,这些对象会被Preact错误地解析为有效的VNode标识符(如'h'、'div'等),从而在渲染时注入任意HTML内容。如果目标应用未启用Content Security Policy,注入的script标签可被执行,导致XSS攻击。修复版本(10.26.10、10.27.3、10.28.2)恢复了严格的相等性检查,确保JSON解析后的对象不会被误认为有效VNode。

攻击链分析

STEP 1
步骤1
攻击者识别目标应用使用受影响的Preact版本(10.26.5-10.26.9、10.27.0-10.27.2、10.28.0-10.28.1)且存在将外部数据直接渲染的行为
STEP 2
步骤2
攻击者通过API响应、数据库记录、localStorage或Cookie注入恶意构造的JSON对象,该对象包含有效的VNode标识符
STEP 3
步骤3
目标应用从数据源读取数据,由于数据源未进行类型验证,返回的JavaScript对象被直接传递给Preact的render函数
STEP 4
步骤4
Preact错误地将JSON解析后的对象识别为有效VNode,生成对应的DOM元素(如<script>、<img>等可执行脚本的标签)
STEP 5
步骤5
如果应用未启用Content Security Policy,注入的HTML会被浏览器解析执行,导致XSS攻击成功

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2026-22028 PoC - Preact JSON VNode Injection // This PoC demonstrates how malicious JSON can be interpreted as VNode // Malicious JSON payload that can be interpreted as VNode const maliciousPayload = JSON.stringify({ type: 'script', props: { dangerouslySetInnerHTML: { __html: 'alert("XSS via Preact VNode Injection")' } } }); // Vulnerable code pattern - directly rendering JSON.parse result function vulnerableRender(data) { // If data is supposed to be string but is actually an object const parsed = JSON.parse(data); // Preact would incorrectly treat this as valid VNode return parsed; } // Another exploitation vector - localStorage poisoning localStorage.setItem('userData', JSON.stringify({ type: 'img', props: { src: 'x', onError: 'alert(document.cookie)' } })); // Safe rendering requires type checking function safeRender(data) { // Verify data is actually a string before parsing if (typeof data !== 'string') { throw new Error('Invalid input type'); } const parsed = JSON.parse(data); // Additional validation if (typeof parsed === 'object' && parsed !== null) { // Reject objects that could be VNodes return null; } return parsed; }

影响范围

Preact 10.26.5 - 10.26.9
Preact 10.27.0 - 10.27.2
Preact 10.28.0 - 10.28.1

防御指南

临时缓解措施
对于无法立即升级的用户,建议采取以下临时缓解措施:1)严格验证所有外部数据的类型,确保传入渲染树的数据确实是字符串;2)对从API、数据库等获取的数据进行类型强制转换和验证;3)启用严格的Content Security Policy策略,禁止内联脚本执行;4)对localStorage、sessionStorage等客户端存储进行数据完整性检查;5)使用DOMPurify等HTML消毒库对所有用户输入进行消毒处理。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表