Hash Disclosure - Mac OSX salted SHA-1

概要

  • 脆弱性の名前: Hash Disclosure - Mac OSX salted SHA-1
  • 問題の要点: macOSでソルト付きSHA-1ハッシュが漏洩すると、ブルートフォース攻撃や辞書攻撃によってパスワードが解読されるリスクが高まる。
  • よくある発生シーン: 古いシステムやレガシーアプリケーション、データベースの設定ミス、ログファイルへの記録、バックアップファイルの不適切な管理など

背景

macOSでは、過去にソルト付きSHA-1ハッシュがパスワードの保存に使用されていました。SHA-1自体が脆弱であり、ソルトが付与されていても、現代の計算能力をもってすれば解読が現実的になっています。
特に、古いmacOSバージョンや、過去のシステムから移行したデータを使用している場合にリスクが高まります。

セキュリティ上のリスク

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

対処方法の具体例

PHP

誤った設定例

ソルト付きSHA-1ハッシュを使用する例:

<?php
// 誤った例: ソルト付きSHA-1
$salt = '固定ソルト';
$hashedPassword = sha1($salt . $password);
?>

正しい設定例

password_hash関数を使用して、より安全なアルゴリズム(BCryptやArgon2)を使用する例:

<?php
// 正しい例: Argon2を使用
$hashedPassword = password_hash($password, PASSWORD_ARGON2I);

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

Python

誤った設定例

ソルト付きSHA-1ハッシュを使用する例:

# 誤った例
import hashlib
password = "super_secret"
salt = "fixed_salt"
hashed = hashlib.sha1((salt + password).encode('utf-8')).hexdigest()

正しい設定例

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

誤った設定例

SHA-1を直接使用する例:

// 誤った例
String password = "password";
String salt = "fixed_salt";
String hash = org.apache.commons.codec.digest.DigestUtils.sha1Hex(salt + password);

正しい設定例

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);
    }
}

データベース

誤った設定例

平文パスワードやSHA-1ハッシュを使用する:

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

正しい設定例

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

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

検出方法

OWASP ZAPでの出力例

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

手動再現例

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

まとめ

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

補足資料・参考URL

以上の対策と検出方法を活用して、ソルト付きSHA-1ハッシュの漏洩リスクを低減してください。