Skip to main content
  1. Blogs/
  2. 前端开发/
  3. 工程化/
  4. npm/

修复sha.js CVE漏洞

·187 words·1 min

漏洞介绍
#

CVE-2025-9288 是 sha.js 库中的一个漏洞,属于输入验证不当(Improper Input Validation)类型。攻击者可以通过操控输入数据,导致哈希计算结果异常,进而可能引发数据完整性问题或其他安全风险。

以下是该漏洞可能造成的四类危害,用更通俗的语言描述:

  • 哈希状态回退:攻击者可以通过伪造输入(如 {length: -x})使哈希状态回退,可能导致加密标签被移除。
  • 值计算错误:伪造输入(如 { length: buf.length, ...buf, 0: buf[0] + 256 })可能生成与原始值相同的哈希,但在其他代码中被视为不同的值。
  • 拒绝服务(DoS):通过输入极端值(如 {length:'1e99'})可能导致程序挂起或崩溃。
  • 私钥泄露:在某些系统中,伪造输入可能导致哈希值匹配但数值表示不同,从而推导出私钥。

代码示例
#

以下是一个使用 JavaScript 的示例代码,展示如何触发该漏洞及对应的危害:

const sha = require('sha.js');

// 1. 哈希状态回退
// 模拟恶意输入,导致哈希状态回退
const maliciousInput1 = { length: -1 };
const hash1 = sha('sha256').update(maliciousInput1).digest('hex');
console.log('哈希状态回退 - Hash:', hash1);

// 2. 值计算错误
// 模拟伪造输入,生成相同哈希值但实际值不同
const buf = Buffer.from('test');
const maliciousInput2 = { length: buf.length, ...buf, 0: buf[0] + 256 };
const hash2 = sha('sha256').update(maliciousInput2).digest('hex');
console.log('值计算错误 - Hash:', hash2);

// 3. 拒绝服务(DoS)
// 模拟输入极端值,导致程序崩溃
try {
    const maliciousInput3 = { length: '1e99' }; // 非法输入
    const hash3 = sha('sha256').update(maliciousInput3).digest('hex');
    console.log('拒绝服务(DoS) - Hash:', hash3);
} catch (error) {
    console.error('拒绝服务(DoS) - Error:', error.message);
}

// 4. 私钥泄露
// 模拟输入推测私钥
const maliciousInput4 = { length: 32, 0: 1 };
const hash4 = sha('sha256').update(maliciousInput4).digest('hex');
console.log('私钥泄露 - Hash:', hash4);

通过以上代码,可以直观地看到每种危害的触发方式及其可能的影响。

处理方案
#

  1. 更新依赖

    • 确保使用的是 sha.js 的最新版本(2.4.12 或更高版本)。
    • 使用以下命令更新:
      npm install sha.js@latest
  2. 验证输入

    • 在使用 sha.js 之前,严格验证输入数据,避免传入恶意内容。
    • 示例:
      function validateInput(input) {
          if (/[^a-zA-Z0-9]/.test(input)) {
              throw new Error('Invalid input detected');
          }
          return input;
      }
      
      const safeInput = validateInput(userInput);
      const hash = sha('sha256').update(safeInput).digest('hex');
  3. 监控依赖

    • 使用工具(如 npm auditSnyk)定期扫描项目中的依赖库,及时发现并修复漏洞。

更多信息请参考 NVD 官方页面