Serverpod安全升级:从漏洞CVE-2024-29886看密码哈希算法的演进与迁移实践

本文详细分析了CVE-2024-29886安全漏洞,该漏洞源于Serverpod身份验证模块使用了不够安全的密码哈希算法。文章深入探讨了升级到OWASP推荐的Argon2Id算法的必要性,并提供了完整的密码哈希迁移方案和示例代码,适用于所有使用serverpod_auth_server 1.2.6之前版本的开发者。

Serverpod改进存储密码哈希的安全性·CVE-2024-29886·GitHub安全公告数据库

漏洞详情

: serverpod_auth_server (Pub)

受影响版本: < 1.2.6 已修复版本: 1.2.6

描述

改进存储密码哈希的安全性

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
46
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总体评分:5.3/10

CVSS v3 基本指标

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

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N

EPSS评分

0.163%(第38百分位)

弱点

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

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