Hash Disclosure - BCrypt

概要

  • 脆弱性の名前: Hash Disclosure - BCrypt
  • 問題の要点: BCryptハッシュが漏洩した場合、ブルートフォース攻撃や辞書攻撃によってパスワードが解読される可能性がある。
  • よくある発生シーン: データベースの設定ミス、ログファイルへの記録、バックアップファイルの不適切な管理など

背景

BCryptは、比較的高コストな計算処理により、レインボーテーブル攻撃やブルートフォース攻撃に対する耐性を持つように設計されています。しかし、ハッシュ自体が漏洩すると、攻撃者はオフラインでパスワードを解読する試みを行うことができます。
過去には、大規模なデータ漏洩事件でハッシュ化されたパスワードが公開され、多くのユーザーアカウントが危険にさらされる事例が発生しています。

セキュリティ上のリスク

  • 漏洩したハッシュに対してブルートフォース攻撃や辞書攻撃が行われ、パスワードが解読される。
  • 解読されたパスワードが他のサービスで再利用されている場合、アカウントの乗っ取りにつながる。
  • 企業の評判低下や顧客からの信頼失墜。

対処方法の具体例

PHP

誤った設定例

ソルトなしでBCryptを使用する、または固定ソルトを使用する例:

<?php
// 誤った例: ソルトなし
$hashedPassword = password_hash($password, PASSWORD_BCRYPT);

// 誤った例: 固定ソルト
$hashedPassword = crypt($password, '$2y$10$固定されたソルトの文字列$');
?>

正しい設定例

password_hash関数を使用して、自動的にソルトを生成する例:

<?php
// 正しい例: 自動ソルト生成
$hashedPassword = password_hash($password, PASSWORD_BCRYPT);

// パスワードの検証
if (password_verify($password, $hashedPassword)) {
    echo 'パスワードは正しいです。';
} else {
    echo 'パスワードが間違っています。';
}
?>

Python

誤った設定例

ソルトを手動で生成し、安全でない方法で保存する例:

# 誤った例
import bcrypt
password = b"super_secret"
salt = bcrypt.gensalt()
hashed = bcrypt.hashpw(password, salt)

正しい設定例

bcryptライブラリを使用して、安全なソルトを自動生成する例:

# 正しい例
import bcrypt
password = b"super_secret"
hashed = bcrypt.hashpw(password, bcrypt.gensalt())

# パスワードの検証
if bcrypt.checkpw(password, hashed):
    print("It Matches!")
else:
    print("Not a Match :(")

Java

誤った設定例

BCryptを直接実装せずに、脆弱なハッシュ関数を使用する例:

// 誤った例
String password = "password";
String hash = String.valueOf(password.hashCode());

正しい設定例

Spring SecurityのBCryptPasswordEncoderを使用して安全にハッシュ化する例:

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

public class PasswordUtils {

    public static String hashPassword(String password) {
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        return passwordEncoder.encode(password);
    }

    public static boolean verifyPassword(String password, String hashedPassword) {
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        return passwordEncoder.matches(password, hashedPassword);
    }
}

データベース

誤った設定例

平文パスワードや脆弱なハッシュ関数を使用する:

-- 誤った例
INSERT INTO users (username, password) VALUES ('user1', 'password');

正しい設定例

アプリケーションでBCryptハッシュを生成し、データベースに保存する:

-- 正しい例
INSERT INTO users (username, password) VALUES ('user1', '$2a$10$xxxxxxxxxxxxxxxxxxxxxxxxxxxxx');

検出方法

OWASP ZAPでの出力例

  • Alert 名: Hash Disclosure - BCrypt
  • リスク: High
  • URL: ハッシュが漏洩した可能性のあるURL
  • パラメータ: パスワードハッシュ
  • 詳細: 漏洩したハッシュの種類と、ブルートフォース攻撃の可能性に関する情報

手動再現例

  1. データベースやログファイルからBCryptハッシュを特定します。
  2. オンラインのBCryptクラッカーやローカルのブルートフォースツールを使用して、パスワードの解読を試みます。

まとめ

  • CVSS 基本値: 7.5 (High)
  • 運用チームや開発者が意識すべきポイント:
    • 常に最新のBCryptライブラリを使用する。
    • 適切なソルトを使用してパスワードをハッシュ化する。
    • データベースやログファイルのアクセス制御を強化する。
    • 定期的にセキュリティ監査を実施し、脆弱性を特定する。
  • 再発防止:
    • 安全なパスワードポリシーを導入し、ユーザーに強力なパスワードの使用を推奨する。
    • パスワードハッシュの漏洩を検知するための監視システムを導入する。
    • 開発者向けのセキュリティトレーニングを実施する。

補足資料・参考URL

以上の対策と検出方法を活用して、BCryptハッシュの漏洩リスクを低減してください。