PII Disclosure
概要
- 脆弱性の名前: PII Disclosure (個人情報漏洩)
- 問題の要点: Webサイトやアプリケーションが、意図せず個人情報(PII: Personally Identifiable Information)を公開してしまうこと。
- よくある発生シーン: デバッグモードでのエラーメッセージ、ログファイル、バックアップファイル、APIレスポンス、コメント、公開リポジトリなど
背景
個人情報保護の重要性が高まるにつれて、PIIの漏洩は重大な問題として認識されるようになりました。GDPRやCCPAなどの法規制により、企業は個人情報の保護を徹底することが求められています。
設定ミスや不注意によるPIIの漏洩は後を絶たず、企業の信頼失墜や法的責任につながる可能性があります。
セキュリティ上のリスク
- 攻撃者が漏洩したPIIを悪用し、なりすまし、フィッシング、アカウントの乗っ取りなどの攻撃を行う。
- クレジットカード情報や銀行口座情報が漏洩した場合、金銭的な被害が発生する。
- 医療情報や機密情報が漏洩した場合、プライバシー侵害や差別につながる。
- 企業の評判低下や顧客からの信頼失墜、法的責任の発生。
対処方法の具体例
PHP
誤った設定例
エラーメッセージにPIIを含めてしまう例:
<?php
// 誤った例: エラーメッセージにPIIを含む
error_reporting(E_ALL);
ini_set('display_errors', '1');
$email = $_GET['email'];
// ...
?>
正しい設定例
エラーログにPIIを含めないように設定し、本番環境ではエラー表示をオフにする:
<?php
// 正しい例: エラーログにPIIを含めない
error_reporting(E_ALL);
ini_set('display_errors', '0');
ini_set('log_errors', '1');
ini_set('error_log', '/path/to/error.log');
$email = $_GET['email'];
// ...
?>
Python
誤った設定例
ログファイルにPIIを記録する例:
# 誤った例
import logging
logging.basicConfig(filename='app.log', level=logging.DEBUG)
email = request.args.get('email')
logging.debug(f'Email: {email}')
正しい設定例
ログファイルにPIIを記録しないようにし、必要な場合はPIIをマスクする:
# 正しい例
import logging
logging.basicConfig(filename='app.log', level=logging.INFO)
email = request.args.get('email')
logging.info('Email received') # PIIを直接記録しない
Java
誤った設定例
例外処理でPIIをログに出力する例:
// 誤った例
try {
// ...
} catch (Exception e) {
e.printStackTrace(); // PIIが含まれる可能性
}
正しい設定例
PIIを含まないログメッセージを出力し、例外情報は必要に応じてマスクする:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Example {
private static final Logger logger = LoggerFactory.getLogger(Example.class);
public void process(String email) {
try {
// ...
} catch (Exception e) {
logger.error("Error occurred during processing."); // PIIを含まない
logger.debug("Exception details: {}", e.getMessage()); // 必要に応じてマスク
}
}
}
JavaScript
誤った設定例
コメントにPIIを記述する例:
// 誤った例
// 顧客のメールアドレス: test@example.com
var customerEmail = "test@example.com";
正しい設定例
コメントにPIIを記述しないようにし、必要な場合は変数名などで間接的に参照する:
// 正しい例
// 顧客のメールアドレスはcustomerEmail変数に格納
var customerEmail = "test@example.com";
データベース
誤った設定例
データベースのバックアップファイルを適切に保護せずに公開してしまう例:
正しい設定例
データベースのバックアップファイルを暗号化し、アクセス制御を厳格にする:
AWS
誤った設定例
S3バケットにPIIを含むファイルを保存し、適切なアクセス制限を設けない例:
正しい設定例
S3バケットに保存するPIIを含むファイルを暗号化し、IAMロールやバケットポリシーでアクセス制御を厳格にする:
# S3バケットポリシーの例
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/admin"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::your-bucket/*"
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"NotResource": "arn:aws:s3:::your-bucket/public/*",
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
}
]
}
検出方法
OWASP ZAPでの出力例
- Alert 名: PII Disclosure
- リスク: High
- URL: PIIが漏洩しているURL
- パラメータ: 漏洩しているPIIの種類(メールアドレス、電話番号、クレジットカード番号など)
- 詳細: 脆弱性が存在する場所と、漏洩しているPIIに関する情報
手動再現例
- Webサイトやアプリケーションのソースコード、ログファイル、バックアップファイルなどを確認し、PIIが意図せず公開されていないか確認します。
- APIレスポンスやエラーメッセージなどを確認し、PIIが含まれていないか確認します。
- Google dorksなどの検索エンジンを使用して、PIIが公開されていないか確認します。
まとめ
- CVSS 基本値: 7.5 (High)
- 運用チームや開発者が意識すべきポイント:
- 個人情報保護に関する法規制(GDPR、CCPAなど)を遵守する。
- 開発、テスト、本番環境でPIIの取り扱いに関するポリシーを策定し、遵守する。
- ログファイルやエラーメッセージにPIIを含めないようにする。
- データベースやバックアップファイルを適切に保護する。
- APIレスポンスで不要なPIIを公開しないようにする。
- ソースコードやコメントにPIIを記述しないようにする。
- S3バケットなどのクラウドストレージにPIIを保存する場合は、暗号化とアクセス制御を徹底する。
- 再発防止:
- 開発プロセス全体でセキュリティを考慮する(Security by Design)。
- コードレビューを実施し、PII漏洩のリスクを早期に発見する。
- 自動脆弱性診断ツールを導入し、定期的にスキャンを行う。
- 開発者向けのセキュリティトレーニングを実施する。
- PIIを検知するための監視システムを導入する。
補足資料・参考URL
以上の対策と検出方法を活用して、PIIの漏洩リスクを低減してください。