内容提要
Node.js 18.x、20.x、21.x 版本发布了更新,修复了因不当处理批处理文件导致的安全漏洞。Windows 用户在使用 child_process.spawn 和 child_process.spawnSync 时需注意,未设置 shell 选项将导致 EINVAL 错误,建议传递 { shell: true } 选项以避免此错误。新版本将于2024年4月9日发布。
延伸解读
漏洞影响范围与风险
该漏洞影响 Node.js 18.x、20.x 和 21.x 版本,由于 child_process.spawn 和 child_process.spawnSync 对批处理文件处理不当,攻击者可通过恶意命令行参数注入任意命令并实现代码执行,即使未启用 shell 选项。这意味着在 Windows 环境下,如果应用将未经验证的用户输入传递给这些函数,可能面临远程代码执行风险。
Windows 用户的破坏性变更
修复后,Windows 用户使用 child_process.spawn 或 child_process.spawnSync 时,如果传入 .bat 或 .cmd 文件且未设置 shell 选项,将触发 EINVAL 错误。这是一项破坏性变更,可能导致现有代码在升级后无法正常运行。开发者需要检查代码中是否涉及此类调用,并做好兼容性调整。
应对措施与建议
对于受影响的调用,如果输入已经过清理,可以传递 { shell: true } 选项来避免 EINVAL 错误。虽然也可以通过 --security-revert=CVE-2024-27980 回退安全补丁,但官方强烈建议不要这样做,因为这会重新引入漏洞。最佳实践是升级到修复版本并适配新的行为。
Q&A
Node.js 18.x、20.x、21.x 版本更新了什么内容?
这些版本修复了因不当处理批处理文件导致的安全漏洞。
Windows 用户在使用 child_process.spawn 时需要注意什么?
未设置 shell 选项将导致 EINVAL 错误,建议传递 { shell: true } 选项以避免此错误。
新版本的 Node.js 何时发布?
新版本将于2024年4月9日发布。
如何避免在使用 child_process.spawn 时出现 EINVAL 错误?
可以通过传递 { shell: true } 选项来避免 EINVAL 错误。
Node.js 的安全政策在哪里可以找到?
Node.js 的当前安全政策可以在 https://nodejs.org/en/security/ 找到。
是否可以撤销安全补丁?
可以通过传递 --security-revert=CVE-2024-27980 来撤销安全补丁,但强烈不建议这样做。