本仓库包含 tough-cookie 包 2.5.0 版本的补丁版本,以解决关键的 原型污染 漏洞(CVE-2023-26136)。该漏洞允许攻击者通过向 JavaScript 对象注入属性来操纵原型链。这可能导致意外行为、安全风险(如远程代码执行)以及依赖该包的应用程序中的兼容性问题。
在 tough-cookie 包的 v4.1.3 之前的版本中,当使用 CookieJar 并设置 rejectPublicSuffixes=false 模式时,容易受到 原型污染 的攻击。该漏洞源于对 Cookie 的不正确处理,特别是当 cookie.domain 被设置为 __proto__ 时。这允许攻击者修改核心的 Object.prototype 对象,可能导致整个应用程序出现广泛的问题。
有关 CVE-2023-26136 的更多详细信息,请参阅:
原型污染可能带来多种关键风险,包括:
安全漏洞:通过修改基础的 Object.prototype,攻击者可以操纵对象的行为,可能提升权限、访问敏感数据或绕过应用程序的安全机制。
拒绝服务 (DoS):污染原型链可能导致系统出现意外行为,引发崩溃、无限循环或资源耗尽,使应用程序对合法用户不可用。
兼容性问题:更改 Object.prototype 可能导致与其他库或框架交互时出现错误和意外行为。依赖原型链的依赖项可能会损坏,导致集成问题或更新期间应用程序行为异常。
意外的应用程序行为:原型污染可能导致程序行为不稳定,包括数据损坏、安全漏洞,并可能使应用程序面临进一步的利用。
该补丁涉及修改 MemoryCookieStore 类,特别是 putCookie 方法,通过创建无原型对象来防止原型污染。关键更改包括:
Object.create(null) 而非 {} 来创建无原型的对象。cookie.domain = __proto__ 来污染原型链。要安装补丁版本的 tough-cookie,请使用以下命令:
npm install ./tough-cookie-2.5.0-PATCHED.tgz
本仓库包含一个单元测试,旨在验证原型污染漏洞已成功修复。
名为 prototype_pollution_test 的测试专门检查设置域为 __proto__ 的 Cookie 不再影响 JavaScript 原型链。这确保了原型污染被阻止,维护了应用程序的完整性。
要运行测试并确认修复,请执行以下命令:
npm test
为了演示原始版本和补丁版本中漏洞的利用情况,请遵循以下步骤:
安装有漏洞的 tough-cookie 版本:
npm install [email protected] && node index.js
预期输出:
Polluted object: {
Slonser: Cookie="Slonser=polluted; Domain=__proto__; Path=/notauth; hostOnly=false; aAge=5ms; cAge=5ms",
Auth: Cookie="Auth=Lol; Domain=google.com; Path=/notauth; hostOnly=false; aAge=5ms; cAge=5ms"
} EXPLOITED SUCCESSFULLY
这表明对象的原型已被污染,确认原始版本中存在漏洞。
npm install ./tough-cookie-2.5.0-PATCHED.tgz && node index.js
预期输出:
EXPLOIT FAILED
这表明漏洞利用已被成功阻止,确认原型污染漏洞已修复。
解决 tough-cookie v2.5.0 中 原型污染 漏洞的过程涉及几个有条理的步骤,以确保修复彻底有效。以下是我遵循的方法概述:
我首先研究了 原型污染(CVE-2023-26136)以了解其影响。该漏洞允许攻击者通过 cookie.domain 属性将属性注入原型链,可能导致远程代码执行等安全风险。
我查阅了围绕该漏洞的 GitHub 问题和讨论,包括 tough-cookie v4.1.3 中的修复方案,该方案使用 Object.create(null) 来防止原型污染。这帮助我确定了修复 v2.5.0 所需的更改。
我比较了 v2.5.0 和 v4.1.3,以了解差异并确定必要的更改。关键修改是使用无原型对象来防止利用。
我更新了 MemoryCookieStore 类,使用 Object.create(null) 替代 {},确保没有原型污染。
我编写了单元测试来验证修复,并创建了一个漏洞利用演示脚本(index.js)来展示补丁版本如何防止漏洞。
最后,我记录了修复内容,包括安装和测试说明,并打包了补丁版本(tough-cookie-2.5.0-PATCHED.tgz)以便轻松分发。
从 v2.5.0 添加/编辑的文件
index.js:用于演示漏洞和修复的主脚本。lib/memstore.js:修改后的 MemoryCookieStore 类,用于防止原型污染。test/ietf_data/parser.json:更新以修改测试数据中的过期日期。test/prototype_pollution_test.js:用于验证原型污染已修复的单元测试。tough-cookie-2.5.0-PATCHED.tgz:tough-cookie 包的补丁版本。