pbkdf2 静默地忽略 Uint8Array 输入,返回静态密钥
平台
nodejs
组件
pbkdf2
已修复版本
3.1.3
### 摘要 在历史的但声明为支持的 Node.js 版本 (0.12-2.x) 上,pbkdf2 静默地忽略 Uint8Array 输入 这仅影响 Node.js <3.0.0,但 `pbkdf2` 声称: * 支持 Node.js [>= 0.12](https://github.com/browserify/pbkdf2/blob/v3.1.2/package.json#L62)(并且此存储库中似乎正在进行维护) * 支持 `Uint8Array` 输入(输入根据 Uint8Array 进行类型检查,并且错误消息包括例如“Password must be a string, a Buffer, a typed array or a DataView”) ### 详情 错误在 `toBuffer` 方法中 此漏洞甚至以某种方式进入了测试:https://github.com/browserify/pbkdf2/commit/eb9f97a66ed83836bebc4ff563a1588248708501 在那里,`resultsOld`(其中不匹配 `results`)只是从空密码/盐生成的无效输出,而不是提供的密码/盐 ### PoC 在 Node.js/io.js < 3.0.0 上 ```console > require('pbkdf2').pbkdf2Sync(new Uint8Array([1,2,3]), new Uint8Array([1,3,4]), 1024, 32, 'sha256') <Buffer 21 53 cd 5b a5 f0 15 39 2f 68 e2 40 8b 21 ba ca 0e dc 7b 20 d5 45 a4 8a ea b5 95 9f f0 be bf 66> // 但这只是一个带有空密码的空数据的哈希值: > require('pbkdf2').pbkdf2Sync('', '', 1024,
修复方法
暂无官方补丁。请查找临时解决方案或持续关注更新。