在 4.1.3 之前的 tough-cookie 包版本容易受到原型污染攻击,原因在于当 CookieJar 在 rejectPublicSuffixes=false 模式下使用时,对 cookie 的处理不当。此问题源于对象初始化方式。
本项目旨在提供一个修补后的 [email protected] 版本,在消除 CVE-2023-26136 漏洞的同时确保向后兼容性。
为修复该漏洞,我们修改了 memstore.js,通过使用 Object.create(null) 替代标准对象初始化,确保 cookie 存储在一个没有原型污染风险的对象中。这可以防止通过恶意构造的 cookie 名称进行原型操纵。
在 tough-cookie/ 目录下,我们可以找到两个额外的目录,分别包含 tough-cookie 的原始版本和修补版本:
Original v2.5.0/) – 未经修改的 tough-cookie 2.5.0,存在漏洞。v2.5.0-PATCHED/) – 包含针对 CVE-2023-26136 修复的修改版本。安装存在漏洞的原始版本:
npm install [email protected]
应用的补丁修改了 cookie 的存储方式:将 this.idx = {}; 改为 this.idx = Object.create(null);
这可以防止攻击者向原型链注入属性并利用漏洞。
tough-cookie 中的漏洞(CVE-2023-26136)源于使用普通的 JavaScript 对象 {} 来存储 cookie。由于 {} 继承自 Object.prototype,可以通过注入 __proto__ 等属性来利用它,导致原型污染。这可能使攻击者操纵应用程序行为或引发安全问题。
为了缓解该问题,补丁将 {} 替换为 Object.create(null),后者创建了一个没有原型([[Prototype]]: null)的对象。这确保该对象不会继承 Object.prototype 的任何属性,从而防止攻击者注入恶意属性。
通过使用 Object.create(null),我们有效地将 cookie 存储与意外的原型继承隔离开来,使其更安全地抵御原型污染攻击。
要本地安装修补版本,请按以下步骤操作:
tar -tzf tough-cookie-2.5.0.tgz
如果需要,提取它:
tar -xzf tough-cookie-2.5.0.tgz
npm install ./tough-cookie-2.5.0.tgz
node index.js
预期输出:
EXPLOITED SUCCESSFULLY - 对于原始版本
EXPLOIT FAILED - 对于修补版本
修补版本已在 Node.js 20(LTS)上测试,以确保与最新的稳定运行时环境兼容。
原始 tough-cookie 仓库(Salesforce)当前版本为 5.1.1。由于我们使用的是 2.5.0 版本,无法直接从主仓库分支。因此,我们创建了一个单独的仓库,其中包含原始版本和修补版本。您可以在此处找到它:
GitHub 仓库 - 分支版本
有关更多详细信息,请访问官方 CVE 页面:CVE-2023-26136 - NVD