AidenMohan/dha-encryption-3.3.1-poc

GitHub: AidenMohan/dha-encryption-3.3.1-poc

针对 dha-encryption npm 包加密弱点的概念验证代码,演示了离线恢复明文凭据的完整攻击过程。

Stars: 0 | Forks: 0

# CVE-YYYY-NNNNN — dha-encryption ≤ 3.3.1 ## dha-encryption npm 包中的加密弱点 **包:** [dha-encryption](https://www.npmjs.com/package/dha-encryption) **受影响版本:** ≤ 3.3.1 **CWE:** CWE-916(使用计算量不足的密码哈希) **供应商:** dha-sdk **发现者:** Aiden Mohan ## 概述 `dha-encryption` npm 包通过 PBKDF2 提供基于密码生成密钥的 AES-GCM 加密。它包含三个加密弱点,这些弱点结合在一起,使得拥有密文访问权限的攻击者能够在几秒钟内离线恢复明文凭据。 该包被 `dha-login` 用作多个渐进式 Web 应用的身份验证层。 ## 漏洞 ### 1. 硬编码的默认 Salt `getKeyFromPassword()` 使用 `"h0n3yp0t!@"` 作为默认的 PBKDF2 salt。如果调用方未覆盖 `seed` 参数,所有部署将共享相同的 salt,从而容易受到预计算攻击。 ``` async function getKeyFromPassword(t, e = "h0n3yp0t!@") { ``` ### 2. PBKDF2 迭代次数不足 该库使用 **1,337** 次 PBKDF2-SHA256 迭代。[OWASP 建议至少为 600,000 次](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#pbkdf2) —— 这使得该实现**低于标准 448 倍**。当密码为 4 位数字的 PIN 码时,整个密钥空间(10,000 个值)可以在几秒钟内在普通硬件上被穷举完毕。 ### 3. 确定性 IV 推导(AES-GCM Nonce 重用) AES-256-GCM 密钥和 IV 均从相同的 `deriveBits` 输出中推导得出: ``` PBKDF2(password, salt, 1337, 384 bits) → first 256 bits = AES key, last 128 bits = IV ``` 相同的密码和 salt 始终会生成相同的 IV。在 AES-GCM 中重用 nonce 是一种[已知的灾难性故障](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf) —— 它会破坏身份验证标签的保证,并使得攻击者能够对在同一密钥下加密的密文进行明文恢复。 ## 影响 拥有该库生成的密文访问权限的攻击者(通过物理设备访问、备份提取、XSS 或恶意软件)可以: 1. 在 15 秒内暴力破解整个 4 位数字 PIN 码的密钥空间 2. 解密存储的凭据和安全问题答案 3. 使用恢复的答案重置 PIN 码并获取完整的身份验证会话 此过程不需要服务器交互。攻击完全在离线状态下进行。 ## 概念验证 `poc.mjs` 仅使用公开的 npm 包演示了这三个弱点: ``` npm install dha-encryption@3.3.1 node poc.mjs ``` 示例输出: ``` 3 — ITERATION COUNT vs OWASP MINIMUM dha-encryption: 1,337 iterations OWASP minimum: 600,000 iterations Factor below: 448× 1 — DETERMINISTIC IV REUSE (AES-GCM nonce catastrophe) PIN: 5678 Default salt: h0n3yp0t!@ IV (call 1): 518e3c0d6c60af40192aec669cc21671 IV (call 2): 518e3c0d6c60af40192aec669cc21671 Identical: true 2 — FULL 4-DIGIT PIN BRUTE-FORCE (offline, ~13 s) Victim PIN: 4092 Plaintext: {"username":"jane.doe.mil","answer1":"Fort Campbell","answer2":"Peterson"} Ciphertext (hex): b63738b82a3dec443a111cf8a8ff59b1… Ciphertext size: 90 bytes Brute-forcing all 10,000 PINs against ciphertext… ✓ PIN recovered: 4092 ✓ Plaintext: {"username":"jane.doe.mil","answer1":"Fort Campbell","answer2":"Peterson"} ✓ Attempts: 4,093 of 10,000 ✓ Time: 2.33 s ``` ## 修复建议 - 根据 OWASP 指南,将 PBKDF2 迭代次数增加到 ≥ 600,000 - 每次加密操作均生成具有密码学随机性的 IV - 移除硬编码的默认 salt;要求为每个用户提供唯一的 salt ## 参考 - [OWASP 密码存储备忘单 — PBKDF2](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#pbkdf2) - [NIST SP 800-38D — AES-GCM](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf) - [npm 上的 dha-encryption](https://www.npmjs.com/package/dha-encryption) ## 时间线 | 日期 | 事件 | |------|-------| | 2026-06-16 | 通过 DoD VDP (HackerOne) 报告漏洞 | | 2026-06-26 | 向 MITRE CNA-LR 请求 CVE | | 待定 | 分配 CVE |
标签:GNU通用公共许可证, Maven, MITM代理, Node.js, PoC, StruQ, 密码学, 手动系统调用, 数据可视化, 暗色界面, 暴力破解, 漏洞验证, 自定义脚本