---
session: S04
exercise: B-6
title: 脅威モデリングを回す
duration: 7min
difficulty: 2
prerequisite: [B-4]
phases:
  作らせる: 2min
  待つ: 3min
  読む: 2min
files_to_edit:
  - kadaiB/THREAT_MODEL.md  # threat-model Skill が作ります
hints: hints/step07_skill_and_threat.md
challenge: false
tags: [脅威モデリング, threat-model, 設計の判断]
---

# 演習B-6 脅威モデリングを回す

| 項目 | 内容 |
|---|---|
| 所要時間 | 7分（実行に3分から5分かかります） |
| 難易度 | 中 |
| 使うもの | Claude Code パネル ／ `threat-model` Skill |
| 前提 | [B-4](exB4_fix_and_test.md) でバグを2件直していること |
| 次のステップ | 演習Bの最後です。まとめのセッションに戻ります |

---

## 目的

**「バグを直す」と「危険を減らす」が別の作業である**ことを、実物の出力で確かめます。

B-4 で直した2件は、どちらも「壊れているから直した」ものです。エラーが出る、ルールと違う。だから直しました。

このステップで扱うのは、**壊れていないのに危ないもの**です。いまのコードは仕様どおりに動きますが、誰でも貸出操作ができます。ログインの仕組みがありません。これはバグではありません。そう作ったからです。それでも、社内に置くなら考えなければならないことです。

演習Bの締めであり、第2回研修への入り口になるステップです。

---

## 操作

### 1. 脅威モデルを作らせる

Claude Code パネルで送ります。

```
@kadaiB のコードベースの脅威モデルを作ってください。
```

`threat-model` Skill が発火します。最初の応答の冒頭に、次の趣旨の宣言が出ます。

```
この Skill は静的解析のみを行います。対象コードの実行、外部への通信、
ファイルの変更（THREAT_MODEL.md の作成を除く）は行いません。
```

**この1行が出ることを確認してください。** セキュリティの調査は、やり方によっては調査そのものが危険な操作になります。何をやって何をやらないかを、始める前に宣言させています。

### 2. 質問に答える

コードから読み取れないことを、3問まで聞いてきます。たとえば次のようなことです。

- 利用者は社内の人だけですか、社外にも公開しますか
- 扱っているデータに、個人情報は含まれますか
- 本番ではどこに置く想定ですか

研修の想定でかまいません。「社内のみ」「個人情報は含まない」「社内ネットワーク内のサーバー」と答えると進みます。答えられない場合は「わからないので既定値でお願いします」で進みます。

### 3. 待つ

実行には3分から5分かかります。**待っている間に、次の問いを考えておいてください。**

「脅威」と「脆弱性」は、何が違うと思いますか。日本語としてはどちらも危ないことのように読めます。この2つを分けて使う理由を、あとで講師が説明します。

### 4. 出力を読む

`handson/kadaiB/THREAT_MODEL.md` が作られます。開いて、次の4か所を読んでください。

| 読む場所 | 何を見るか |
|---|---|
| 守るべきもの | このアプリで失われると困るものは何とされているか |
| 入口 | 外から入ってこられる場所が何件挙がっているか |
| 信頼の境目 | どこから先を信用していないと書かれているか |
| 脅威の並び | いちばん上に何が来ているか。なぜそれが上なのか |

**脅威の並び順に注目してください。** 起こりやすさと影響の大きさで並べ替えられています。順番が付いていることに意味があります。全部に同時に対応することはできないからです。

### 5. 一番上の脅威を、コードに紐づけさせる

```
この脅威モデルの一番上の項目について、kadaiB のコードのどこが該当するか、ファイルと行を挙げて教えてください。
```

**ファイルと行が返ってきたら、自分で開いて見てください。** 該当する行が、あなたが B-4 で直した箇所と同じかどうかも確認してください。

---

## 自分で考える

B-4 で直した2件は、この `THREAT_MODEL.md` に出てきましたか。

**出てこなかったとしたら、それはなぜだと思いますか。**

考える材料として、2つの言葉を置きます。

- **脅威**: 設計と露出の性質から生じるもの。1行直しても消えません（例: 認証が無いので誰でも貸出操作ができる）
- **脆弱性**: 個別の不具合。1行直せば消えます（例: null チェックが無くて500エラーになる）

**今日直したのは、どちらでしたか。**

<details>
<summary>考えた後で開いてください</summary>

今日直した2件は脆弱性です。1行から数行で消えました。だから、直した時点で脅威モデルには残りません。

一方、`THREAT_MODEL.md` の上位に来るのは、直せば消えるものではありません。「誰でも貸出できる」を消すには、ログインの仕組みを足すことになります。これは1行の修正ではなく、設計の変更です。**どこまでやるかは、費用と、扱っているものの重みで決める判断**になります。技術の問題ではありません。

演習Bの最初に「動かしてから読む」で始めたのと同じで、ここでも順番があります。まず何が危ないかを並べ、次にどこまでやるかを決めます。並べる作業はAIが速く、決める作業は人がやります。

</details>

---

## 生成物の名前と場所

`handson/kadaiB/THREAT_MODEL.md`

途中経過の記録が `handson/.work/threat_model_checkpoints.jsonl` に残ります。この記録は消さないでください。

---

## OK基準

- 最初の応答で、静的解析のみを行うという宣言が出た
- `THREAT_MODEL.md` が生成されている
- 守るべきもの・入口・脅威の並びが読み取れる
- 一番上の脅威について、コード上の該当箇所（ファイルと行）を挙げさせられた
- 今日直した2件が脅威と脆弱性のどちらだったかを、自分の言葉で言える

---

## 追加と考察

この Skill の元になっている実装は、Anthropic が公開しているリファレンス実装です。公開されているもののうち、今回配ったのは**コードを実行しない読み取り専用の部分だけ**です。

元の実装には、対象のコードを隔離した環境で実際に動かして挙動を確かめる仕組みが含まれています。そちらは Docker と隔離実行の環境を必要とするため、研修の環境では動きません。同梱していません。

ここで確認しておきたいのは、**セキュリティの調査は「読むだけ」と「動かす」で必要な環境がまったく違う**という点です。読むだけなら普段の開発環境で回せます。動かすなら、壊れても困らない隔離された場所が要ります。社内で試すときも、この線引きから入ると話が進みます。

もう1点。`THREAT_MODEL.md` は完成品ではありません。人に確認しないと埋まらない前提が残っています（手順2で3問しか聞いていません）。**AI が作れるのは、議論の出発点になる一覧までです。** ここから先、どれを受け入れてどれに対処するかを決めるのは、いまのところ人の仕事です。

---

## 発展課題

`THREAT_MODEL.md` に挙がった脅威のうち1つを選び、次のように聞いてください。

```
この脅威に対して、いまのコードに足りていない対策を3つ挙げてください。優先順位を付けてください。それぞれ、どのくらいの作業量になるかも書いてください。
```

**優先順位の根拠に納得できましたか。** 納得できない場合、あなたが重く見ているものと、AI が重く見ているものが違います。何を重く見ているかを伝えると変わります。

```
このアプリは社内ネットワークからしか使えません。その前提で優先順位を付け直してください。
```

前提を1行足すだけで、上位が入れ替わることがあります。**前提を伝えていないと、AI は一般的な想定で答えます。** これは今日の演習全体を通して繰り返し出てきたことです。

---

## 詰まったときは

**`threat-model` が発火しない**

依頼の言い方を変えてください。

```
kadaiB のセキュリティ上の危険を洗い出して、脅威モデリングをしてください。
```

`handson/.claude/skills/threat-model/SKILL.md` と `handson/.claude/skills/_lib/checkpoint.py` の両方があるかも確認してください。`_lib` をコピーし忘れていると、途中の記録で止まります。

**5分待っても終わらない**

対象を絞って依頼し直してください。

```
@kadaiB/src/main/java だけを対象にして、脅威モデルを作ってください。
```

**質問が3問より多く来る**

答えられる範囲で答え、残りは次のように伝えてください。

```
残りは既定値で進めてください。既定値で進めた項目は報告に書いてください。
```

**`THREAT_MODEL.md` が作られない**

出力先を明示してください。

```
結果を kadaiB/THREAT_MODEL.md に書き出してください。
```

**内容が一般論ばかりで、このアプリの話になっていない**

該当箇所を挙げさせると具体化します。

```
挙げた脅威それぞれについて、kadaiB のどのファイルのどの行が該当するかを書き足してください。該当箇所を挙げられない脅威は削除してください。
```
