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