はじめに
脅威モデリングは、システムが攻撃を受ける前に「何が起こり得るか」を検討するための実践的な手法です。ツールから始めるのではなく、まずは何を保護する必要があるのか、データはどこで信頼境界(trust boundaries)を越えるのか、攻撃者はシステム内をどのように移動できるのか、そしてどのコントロール(対策)がリスクを低減できるのかを特定します。
この実験では、小規模なローカルログインサービスを調査し、security-model.json に構造化された脅威モデルを完成させます。このモデルは自由形式のレポートではなく、各ステップで特定の JSON エントリを追加し、検証スクリプトによってチェックされる仕組みになっています。
ログインサービスの調査
このステップでは、モデル化の対象となる小規模なサービスを調査します。脅威モデルは、アプリケーションの動作、使用するファイル、攻撃者にとって重要となり得る情報など、観測可能なシステム動作から始まります。
まず、プロジェクトディレクトリに移動します。
cd /home/labex/project
準備されたファイルを確認します。
ls -l
app.py、users.json、sessions.json、security-model.json、および uploads ディレクトリが表示されるはずです。
次に、デモアプリケーションのルート(routes)を表示させます。ルートとは、何らかのリクエストを受け付けるアプリケーションのエントリポイントのことです。
python3 app.py routes
出力には 4 つのルートが表示されます。
/login - ユーザー名とパスワードを受け取り、セッショントークンを作成する
/files - ログイン中のユーザーが所有するファイルの一覧を表示する
/download - uploadsディレクトリから要求されたファイル名を読み込む
/admin - 管理者のみにアカウントレコードを表示する
最後に、現在のモデルチェッカーを実行します。モデルは意図的に空の状態であるため、不足しているセクションが報告されます。
python3 model-check.py all
各セクションに必要なエントリが不足しているというメッセージが表示されるはずです。これがこの実験の出発点となります。
資産の特定
このステップでは、モデルに資産(assets)を追加します。脅威モデリングにおいて、資産とはシステムが保護しなければならないあらゆるものを指します。このログインサービスにおいて、重要な資産はファイルだけでなく、認証データやセッション状態も含まれます。
cat コマンドを使用してユーザーデータベースを調査します。
cat users.json
このファイルにはユーザー名、パスワード、ロールが含まれています。そのため、user_credentials と admin_records は重要な資産となります。
セッションファイルと uploads ディレクトリを調査します。
cat sessions.json
ls -l uploads
セッションファイルにはログイン用トークンが含まれる可能性があり、uploads ディレクトリにはユーザーのプライベートコンテンツが含まれています。これらは session_tokens および private_uploads に対応します。
次に、security-model.json の assets 配列を更新します。以下のコマンドでは Python のヒアドキュメントを使用しています。ヒアドキュメントは、PY マーカーで囲まれた行を短いスクリプトとして python3 に送信します。
python3 - <<'PY'
import json
from pathlib import Path
path = Path("security-model.json")
model = json.loads(path.read_text())
model["assets"] = [
"user_credentials",
"session_tokens",
"private_uploads",
"admin_records",
]
path.write_text(json.dumps(model, indent=2) + "\n")
PY
資産セクションのみをチェックします。
python3 model-check.py assets
期待される結果は以下の通りです。
assets: complete
信頼境界のマッピング
このステップでは、信頼境界(trust boundaries)を追加します。信頼境界とは、制御レベルや信頼レベルの異なる領域間でデータが移動する場所のことです。多くの攻撃は、信頼されていない入力が信頼されたコード、ファイル、または特権機能に渡される際に発生するため、境界を特定することは非常に重要です。
再度ルートリストを確認します。
python3 app.py routes
/login、/files、/download の各ルートは、ユーザー側のインターフェースから入力を受け取り、サーバーのロジックに渡します。この小規模なモデルでは、これが browser_to_server 境界となります。
/download ルートはリクエストからファイル名を読み取り、uploads ディレクトリにアクセスします。これにより server_to_filesystem 境界が作成されます。/admin ルートは一般ユーザーと管理者専用データを分離しているため、user_to_admin_area 境界が作成されます。
これらの境界をモデルに追加します。
python3 - <<'PY'
import json
from pathlib import Path
path = Path("security-model.json")
model = json.loads(path.read_text())
model["trust_boundaries"] = [
"browser_to_server",
"server_to_filesystem",
"user_to_admin_area",
]
path.write_text(json.dumps(model, indent=2) + "\n")
PY
信頼境界セクションをチェックします。
python3 model-check.py trust_boundaries
期待される結果は以下の通りです。
trust_boundaries: complete
攻撃経路の追加
このステップでは、攻撃経路(attack paths)を追加します。攻撃経路とは、攻撃者がエントリポイントから資産に向かって移動するための具体的な方法です。これは脅威モデリングの核心であり、資産と境界を現実的な攻撃者の行動と結びつける作業です。
デモ用の認証情報を使用して、一度ログインを試みます。
python3 app.py login alice wonderland
出力としてセッショントークンが表示されます。
session-alice-demo
この動作は、なぜパスワードとセッショントークンが重要なのかを示しています。弱いパスワードは credential_guessing(認証情報推測)を可能にし、盗まれたトークンは session_token_theft(セッショントークン盗難)を可能にします。
/download ルートは要求されたファイル名を受け入れるため、実装が不十分であれば path_traversal(パストラバーサル)を許す可能性があります。/admin ルートは管理者レコードを保護しているため、ロールチェックが欠けていれば admin_area_abuse(管理者エリアの悪用)を許す可能性があります。
これらの攻撃経路をモデルに追加します。
python3 - <<'PY'
import json
from pathlib import Path
path = Path("security-model.json")
model = json.loads(path.read_text())
model["attack_paths"] = [
"credential_guessing",
"session_token_theft",
"path_traversal",
"admin_area_abuse",
]
path.write_text(json.dumps(model, indent=2) + "\n")
PY
攻撃経路セクションをチェックします。
python3 model-check.py attack_paths
期待される結果は以下の通りです。
attack_paths: complete
緩和策の選択
このステップでは、緩和策(mitigations)を追加してモデルを完成させます。緩和策とは、攻撃経路の発生確率や影響を低減するためのコントロールです。優れた脅威モデルは、重要な各攻撃経路に対して少なくとも 1 つの実践的なコントロールを組み合わせています。
この小規模なログインサービスには、以下の組み合わせを使用します。
credential_guessingはrate_limit_loginで低減できる。session_token_theftはprotect_session_tokensで低減できる。path_traversalはvalidate_download_pathsで低減できる。admin_area_abuseはenforce_admin_authorizationで低減できる。
これらの緩和策をモデルに追加します。
python3 - <<'PY'
import json
from pathlib import Path
path = Path("security-model.json")
model = json.loads(path.read_text())
model["mitigations"] = [
"rate_limit_login",
"protect_session_tokens",
"validate_download_paths",
"enforce_admin_authorization",
]
path.write_text(json.dumps(model, indent=2) + "\n")
PY
最後に、モデル全体のチェックを実行します。
python3 model-check.py all
すべてのセクションが完了しているはずです。
assets: complete
trust_boundaries: complete
attack_paths: complete
mitigations: complete
最終的な構造化モデルを確認することもできます。
cat security-model.json
重要な成果は、このモデルが同じ小規模サービスに対して、保護すべき資産、信頼境界、攻撃経路、そして緩和策を接続できたという点です。
まとめ
小規模なログインサービスを対象に、実践的な脅威モデリングのワークフローを体験しました。サービスを調査し、資産を特定し、信頼境界をマッピングし、攻撃経路を追加し、それらの経路に対して構造化された JSON モデル内で緩和策を組み合わせました。
このワークフローは、脅威モデリングを単なる別個の書面レポートとして扱うのではなく、セキュリティに関する思考を観測可能なシステム動作と結びつけるのに役立ちます。



