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に関する情報

手動再現例

  1. Webサイトやアプリケーションのソースコード、ログファイル、バックアップファイルなどを確認し、PIIが意図せず公開されていないか確認します。
  2. APIレスポンスやエラーメッセージなどを確認し、PIIが含まれていないか確認します。
  3. Google dorksなどの検索エンジンを使用して、PIIが公開されていないか確認します。

まとめ

  • CVSS 基本値: 7.5 (High)
  • 運用チームや開発者が意識すべきポイント:
    • 個人情報保護に関する法規制(GDPR、CCPAなど)を遵守する。
    • 開発、テスト、本番環境でPIIの取り扱いに関するポリシーを策定し、遵守する。
    • ログファイルやエラーメッセージにPIIを含めないようにする。
    • データベースやバックアップファイルを適切に保護する。
    • APIレスポンスで不要なPIIを公開しないようにする。
    • ソースコードやコメントにPIIを記述しないようにする。
    • S3バケットなどのクラウドストレージにPIIを保存する場合は、暗号化とアクセス制御を徹底する。
  • 再発防止:
    • 開発プロセス全体でセキュリティを考慮する(Security by Design)。
    • コードレビューを実施し、PII漏洩のリスクを早期に発見する。
    • 自動脆弱性診断ツールを導入し、定期的にスキャンを行う。
    • 開発者向けのセキュリティトレーニングを実施する。
    • PIIを検知するための監視システムを導入する。

補足資料・参考URL

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