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
- パラメータ: パスワードハッシュ
- 詳細: 漏洩したハッシュの種類と、ブルートフォース攻撃の可能性に関する情報
手動再現例
- データベースやログファイルからBCryptハッシュを特定します。
- オンラインのBCryptクラッカーやローカルのブルートフォースツールを使用して、パスワードの解読を試みます。
まとめ
- CVSS 基本値: 7.5 (High)
- 運用チームや開発者が意識すべきポイント:
- 常に最新のBCryptライブラリを使用する。
- 適切なソルトを使用してパスワードをハッシュ化する。
- データベースやログファイルのアクセス制御を強化する。
- 定期的にセキュリティ監査を実施し、脆弱性を特定する。
- 再発防止:
- 安全なパスワードポリシーを導入し、ユーザーに強力なパスワードの使用を推奨する。
- パスワードハッシュの漏洩を検知するための監視システムを導入する。
- 開発者向けのセキュリティトレーニングを実施する。
補足資料・参考URL
以上の対策と検出方法を活用して、BCryptハッシュの漏洩リスクを低減してください。