Serverpod修复安全漏洞:升级密码哈希算法至Argon2Id

本文介绍了Dart框架Serverpod因旧密码哈希算法存在彩虹表攻击风险而发布的安全更新(CVE-2024-29886),详细说明了如何升级到1.2.6版本并迁移现有密码哈希至更安全的Argon2Id算法。

漏洞详情:CVE-2024-29886

包信息

  • 包名: serverpod_auth_server (Pub)
  • 受影响版本: < 1.2.6
  • 已修复版本: 1.2.6

严重程度

  • 中等严重性
  • CVSS v3 评分: 5.3

描述 Serverpod 现已采用 OWASP 推荐的 Argon2Id 密码哈希算法来存储电子邮件认证模块的密码哈希,以提升安全性。从 Serverpod 1.2.6 版本开始,所有创建账户或通过服务器进行身份验证的用户,其密码都将使用这种更安全的算法进行存储。开发者无需进行任何更改,即可开始使用新算法存储密码。

更改密码存储方式的原因 旧密码哈希算法存在一个问题:如果数据库被攻破,该算法容易受到彩虹表攻击。因此,强烈建议迁移现有的密码哈希。

迁移现有密码哈希

电子邮件认证模块提供了一个辅助方法来迁移数据库中所有现有的旧版密码哈希。只需使用会话实例作为参数调用 Emails.migrateLegacyPasswordHashes(...) 方法即可迁移密码哈希。

该方法的实现是幂等的,无论调用多少次,都会产生相同的结果。

我们建议实现一个可以远程调用的 Web 服务器路由,或者在服务器启动时调用此方法。

以下为实现 Web 服务器路由的示例代码。

Web 服务器路由代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import 'dart:io';
import 'package:serverpod/serverpod.dart';
import 'package:serverpod_auth_server/module.dart' as auth;

class MigratePasswordsRoute extends Route {
  @override
  Future<bool> handleCall(Session session, HttpRequest request) async {
    request.response.writeln(
      'Migrating legacy passwords, check the server logs for progress updates.',
    );
    _migratePasswords(session);
    return true;
  }
}

Future<void> _migratePasswords(Session session) async {
  session.log('Starting to migrate passwords.');

  var totalMigratedPasswords = 0;
  while (true) {
    try {
      var entriesMigrated = await auth.Emails.migrateLegacyPasswordHashes(
        session,
        // 每次处理 100 条数据库记录
        batchSize: 100,
        // 迁移 500 条记录后停止
        maxMigratedEntries: 500,
      );

      totalMigratedPasswords += entriesMigrated;
      session.log(
        'Migrated $entriesMigrated password entries, total $totalMigratedPasswords.',
      );

      if (entriesMigrated == 0) break;

      // 延迟以避免数据库过载
      await Future.delayed(Duration(seconds: 1));
    } catch (e) {
      session.log('Error migrating passwords: $e');
    }
  }

  session.log('Finished migrating passwords.');
}

现有密码哈希的迁移原理

由于在不知道明文密码的情况下无法重新计算密码哈希,电子邮件认证模块中的方法会对已存储的密码哈希应用新算法。

当受影响的用户随后进行身份验证时,他们的密码哈希将同时使用新旧两种算法进行计算。如果身份验证通过,存储的密码哈希将更新为仅使用新算法,以便后续的身份验证只需运行新算法。

影响范围

所有 serverpod_auth_server 的 1.2.6 之前的版本。

补丁

升级到 1.2.6 版本可解决此问题。

参考

严重性指标

CVSS v3 基础指标

  • 攻击向量: 网络
  • 攻击复杂度: 低
  • 所需权限: 无
  • 用户交互: 无
  • 影响范围: 未改变
  • 机密性影响: 低
  • 完整性影响: 无
  • 可用性影响: 无

CVSS 向量字符串 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N

EPSS 评分

  • EPSS 分数: 0.082% (第 24 百分位)

弱点

CWE-916 使用计算强度不足的密码哈希。该产品为密码生成了哈希,但所使用的方案未能提供足够的计算强度,使得密码破解攻击变得可行或成本低廉。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计