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, 密码学, 手动系统调用, 数据可视化, 暗色界面, 暴力破解, 漏洞验证, 自定义脚本