- 設計
脅威モデリングのやり方|STRIDEの例と脅威一覧テンプレート
脅威モデリングとは、システムの設計図を見ながら「どこで・何が起こりうるか」を洗い出し、対策を決めて一覧に残す作業です。 STRIDE は、その洗い出しで使う6つの分類(なりすまし・改ざん・否認・情報漏えい・サービス拒否・権限昇格)の頭文字です。
この記事は「洗い出しの手順」に絞り、架空の会員サイトを題材に、DFD(データフロー図)の Mermaid コード、要素の種類ごとに見る分類の早見表、表計算ソフトに貼れる脅威一覧テンプレートと10行の記入例を載せます。攻撃の手順は扱わず、脅威の分類と対策の方向までを対象にします。
確認環境(確認日 2026-10-06):Mermaid のコードは @mermaid-js/mermaid-cli 12.0.0 と Chromium で描画できることを確認、件数の計算と DREAD の点数は Python 3.11 で検算。STRIDE・DREAD の定義は、今回開いた Microsoft と OWASP の公開ページ(末尾の参考・出典)によります。
この記事の結論
- DFD を描く(外部実体・プロセス・データストア・データフロー・信頼境界の5つ)。
- 信頼境界をまたぐ矢印に番号を振る。またぐ矢印と、その両端の要素から先に見る。
- 要素の種類ごとに、当てはまる STRIDE だけを見る。外部実体は S と R、プロセスは6つすべて、データストアとデータフローは T・I・D。
この記事の題材(要素16個)では、総当たりなら 96 件の確認が、種類で絞ると 51 件、1巡目は 30 件になりました。1件あたり1分なら、1巡目は30分、図と対策の記入を合わせて1時間に収まります。
STRIDE の早見表
| 分類 | 日本語 | 損なわれる性質 | 問いかけ | 対策の方向 |
|---|---|---|---|---|
| S(Spoofing) | なりすまし | 認証 | 相手が名乗るとおりの本人だと、何で確かめているか | 認証の強化、秘密情報の保護 |
| T(Tampering) | 改ざん | 完全性 | データや処理が書き換えられたら、気づけるか | 入力の検証、権限の最小化、署名・ハッシュ |
| R(Repudiation) | 否認 | 否認防止 | 「やっていない」と言われたとき、記録で示せるか | 操作ログ、ログの保護 |
| I(Information Disclosure) | 情報漏えい | 機密性 | 見せる相手以外に、見える経路はないか | 暗号化、アクセス制御、出力の最小化 |
| D(Denial of Service) | サービス拒否 | 可用性 | 大量の要求や大きな入力で、止まらないか | レート制限、上限値、タイムアウト |
| E(Elevation of Privilege) | 権限昇格 | 認可 | 許可されていない操作が、通る経路はないか | 認可チェック、権限の分離 |
要素別の STRIDE 該当早見表
| DFD の要素 | S | T | R | I | D | E | 見る数 |
|---|---|---|---|---|---|---|---|
| 外部実体(利用者・外部システム) | ○ | ○ | 2 | ||||
| プロセス(処理) | ○ | ○ | ○ | ○ | ○ | ○ | 6 |
| データストア(DB・ファイル) | ○ | ○ | ○ | 3 | |||
| データフロー(矢印) | ○ | ○ | ○ | 3 |
この対応は、Microsoft の MSDN Magazine(2006年11月号)の記事「Uncover Security Design Flaws Using The STRIDE Approach」にある要素別の表によります。なお、操作ログのように「記録そのもの」を保管するデータストアは、否認(R)への備えを支える場所なので、この記事の記入例では、ログの改ざん(T)を否認とひも付けて書いています。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「脅威モデリングのやり方|STRIDEの例と脅威一覧テンプレート」
1時間で進める手順
| 順 | すること | 時間の例 | できあがるもの |
|---|---|---|---|
| 1 | 対象を決める(今回見る機能・範囲) | 5分 | 対象範囲の1行メモ |
| 2 | DFD を描く | 15分 | 要素に ID を振った図 |
| 3 | 信頼境界を引き、またぐ矢印に印を付ける | 5分 | 1巡目に見る要素の一覧 |
| 4 | 要素の種類ごとに STRIDE を当てはめる | 25分 | 脅威一覧の「脅威」「影響」列 |
| 5 | 対策と状態を書く | 10分 | 脅威一覧の「対策」「状態」列 |
時間は目安の例です。OWASP の Threat Modeling Cheat Sheet は、脅威モデリングを4つの問い(何を作っているか/何が起こりうるか/それにどう対処するか/十分にできたか)で整理しています。上の手順1〜3が1つ目、4が2つ目、5が3つ目の問いにあたり、4つ目は後述の見直しで扱います。
手順1〜2:DFD を描く(架空の会員サイト)
題材は、会員登録・ログイン・プロフィール変更ができ、管理者が会員を検索して利用停止にできる、架空の会員サイトです。
要素の一覧
| ID | 種類 | 名前 | 説明 |
|---|---|---|---|
| E1 | 外部実体 | 会員 | ブラウザから利用する人 |
| E2 | 外部実体 | 管理者 | 社内ネットワークから管理画面を使う人 |
| E3 | 外部実体 | メール配信サービス | 登録確認メールなどを送る外部のサービス |
| P1 | プロセス | 会員向けWebアプリ | 登録・ログイン・プロフィール変更 |
| P2 | プロセス | 管理画面 | 会員の検索・利用停止 |
| D1 | データストア | 会員DB | 会員情報、パスワードのハッシュ |
| D2 | データストア | 操作ログ | だれが・いつ・何をしたかの記録 |
| F1〜F9 | データフロー | 下の図の矢印 | 9本 |
DFD の Mermaid コード
信頼境界は subgraph で表し、プロセスは円、データストアは円柱、外部実体は四角にしています。
flowchart LR
subgraph TB1["信頼境界:インターネット"]
E1["E1 会員<br/>(ブラウザ)"]
end
subgraph TB2["信頼境界:社内ネットワーク"]
E2["E2 管理者<br/>(ブラウザ)"]
end
subgraph TB3["信頼境界:アプリケーション基盤"]
P1(("P1 会員向け<br/>Webアプリ"))
P2(("P2 管理画面"))
D1[("D1 会員DB")]
D2[("D2 操作ログ")]
end
subgraph TB4["信頼境界:外部サービス"]
E3["E3 メール配信<br/>サービス"]
end
E1 -- "F1 ログイン・登録情報" --> P1
P1 -- "F2 画面・セッションCookie" --> E1
P1 -- "F3 会員情報の登録・更新" --> D1
D1 -- "F4 会員情報の読み取り" --> P1
P1 -- "F5 メール送信依頼(宛先・本文)" --> E3
E2 -- "F6 管理操作(検索・利用停止)" --> P2
P2 -- "F7 会員の検索・更新" --> D1
P1 -- "F8 操作の記録" --> D2
P2 -- "F9 操作の記録" --> D2
描くときの決まり
| 決まり | 理由 |
|---|---|
| すべての要素に ID を振る(E・P・D・F + 番号) | 脅威一覧の「対象要素」列で指せるようにする |
| 矢印はデータの向きごとに1本ずつ描く | 行きと帰りで起こりうることが違う(F1 と F2) |
| 矢印には「運ぶデータ」を名詞で書く | 「何が漏れるか・書き換わるか」を考えやすくなる |
| 1枚に収まる粒度にする(要素は20個前後まで) | 多すぎると手順4が1時間に収まらない |
| 細部は後回しにし、まず外部との出入りを描き切る | 信頼境界をまたぐ矢印の抜けを防ぐ |
手順3:信頼境界をまたぐ矢印に番号を振る
信頼境界とは、「ここから先は、相手や内容をそのまま信じない」と決める線です。ネットワークの境目、権限の境目、自社と他社の境目に引きます。
| 境界 | 内側にあるもの | 境界を引く理由 |
|---|---|---|
| インターネット | E1 会員 | だれでも接続できる |
| 社内ネットワーク | E2 管理者 | 接続できる人は限られるが、アプリの外側 |
| アプリケーション基盤 | P1、P2、D1、D2 | 自分たちが管理する範囲 |
| 外部サービス | E3 メール配信サービス | 他社が管理する範囲 |
またぐ矢印は次の4本です。
| 矢印 | 向き | 運ぶデータ | またぐ境界 |
|---|---|---|---|
| F1 | E1 → P1 | ログイン・登録情報 | インターネット → アプリケーション基盤 |
| F2 | P1 → E1 | 画面・セッションCookie | アプリケーション基盤 → インターネット |
| F5 | P1 → E3 | メール送信依頼(宛先・本文) | アプリケーション基盤 → 外部サービス |
| F6 | E2 → P2 | 管理操作(検索・利用停止) | 社内ネットワーク → アプリケーション基盤 |
1巡目は、この4本と、その両端の要素(E1・E2・E3・P1・P2)を見ます。 境界の内側だけを流れる矢印(F3・F4・F7・F8・F9)とデータストアは2巡目に回します。
手順4:要素の種類ごとに STRIDE を当てはめる
要素の一覧から、見るべき「要素×分類」の組み合わせを作る Python のコードです。出力はタブ区切りなので、そのまま表計算ソフトに貼って、洗い出しの記入シートとして使えます。
# stride_cells.py : DFD の要素一覧から「見るべき STRIDE の組み合わせ」を作る(標準ライブラリのみ)
import csv
import sys
# 要素の種類ごとに当てはまる分類(S なりすまし / T 改ざん / R 否認 / I 情報漏えい / D サービス拒否 / E 権限昇格)
APPLIES = {
"外部実体": "SR",
"プロセス": "STRIDE",
"データストア": "TID",
"データフロー": "TID",
}
# (ID, 種類, 名前, 信頼境界をまたぐ・またぐ矢印につながるか)
ELEMENTS = [
("E1", "外部実体", "会員", True),
("E2", "外部実体", "管理者", True),
("E3", "外部実体", "メール配信サービス", True),
("P1", "プロセス", "会員向けWebアプリ", True),
("P2", "プロセス", "管理画面", True),
("D1", "データストア", "会員DB", False),
("D2", "データストア", "操作ログ", False),
("F1", "データフロー", "ログイン・登録情報", True),
("F2", "データフロー", "画面・セッションCookie", True),
("F3", "データフロー", "会員情報の登録・更新", False),
("F4", "データフロー", "会員情報の読み取り", False),
("F5", "データフロー", "メール送信依頼", True),
("F6", "データフロー", "管理操作", True),
("F7", "データフロー", "会員の検索・更新", False),
("F8", "データフロー", "操作の記録(P1)", False),
("F9", "データフロー", "操作の記録(P2)", False),
]
rows = []
for eid, kind, name, boundary in ELEMENTS:
for letter in APPLIES[kind]:
rows.append((1 if boundary else 2, eid, kind, name, letter))
rows.sort(key=lambda r: r[0]) # 並びは保ったまま、1巡目を先に
first = sum(1 for r in rows if r[0] == 1)
print(f"要素数: {len(ELEMENTS)}", file=sys.stderr)
print(f"全分類を総当たり: {len(ELEMENTS) * 6} 件", file=sys.stderr)
print(f"種類で絞った後 : {len(rows)} 件(1巡目 {first} 件、2巡目 {len(rows) - first} 件)", file=sys.stderr)
for kind in APPLIES:
n = sum(1 for e in ELEMENTS if e[1] == kind)
print(f" {kind}: {n} 要素 × {len(APPLIES[kind])} 分類 = {n * len(APPLIES[kind])} 件", file=sys.stderr)
w = csv.writer(sys.stdout, delimiter="\t", lineterminator="\n")
w.writerow(["巡", "対象要素", "種類", "名前", "分類", "脅威", "影響", "対策", "状態"])
for r in rows:
w.writerow(list(r) + ["", "", "", ""])
実行コマンドと、件数の表示(標準エラー出力)です。
python3 stride_cells.py > cells.tsv
要素数: 16
全分類を総当たり: 96 件
種類で絞った後 : 51 件(1巡目 30 件、2巡目 21 件)
外部実体: 3 要素 × 2 分類 = 6 件
プロセス: 2 要素 × 6 分類 = 12 件
データストア: 2 要素 × 3 分類 = 6 件
データフロー: 9 要素 × 3 分類 = 27 件
cells.tsv の先頭です(全52行のうち、見出しと11行)。
巡 対象要素 種類 名前 分類 脅威 影響 対策 状態
1 E1 外部実体 会員 S
1 E1 外部実体 会員 R
1 E2 外部実体 管理者 S
1 E2 外部実体 管理者 R
1 E3 外部実体 メール配信サービス S
1 E3 外部実体 メール配信サービス R
1 P1 プロセス 会員向けWebアプリ S
1 P1 プロセス 会員向けWebアプリ T
1 P1 プロセス 会員向けWebアプリ R
1 P1 プロセス 会員向けWebアプリ I
1 P1 プロセス 会員向けWebアプリ D
1行ずつの進め方
各行について、早見表の「問いかけ」を要素の名前に置き換えて読み上げます。
| 行 | 読み上げる問い | 書くこと |
|---|---|---|
| E1 × S | 会員が本人だと、何で確かめているか | 確かめ方が弱ければ「脅威」列に書く |
| P1 × E | 会員向けWebアプリで、許可されていない操作が通る経路はないか | 思い当たる経路を書く |
| F5 × I | メール送信依頼の内容が、見せる相手以外に見える経路はないか | 外部に渡すデータの範囲を書く |
思い当たらない行は空欄のまま進めます。 全行を埋めることが目的ではなく、「見たうえで空欄」と「見ていない」を区別できることが大切です。空欄の行には状態列に「該当なし」と書いておくと、後から見た人にも伝わります。
脅威一覧テンプレート
列の定義
| 列 | 書く内容 | 書き方の決まり |
|---|---|---|
| ID | 脅威の通し番号 | T-01 から。欠番は詰めない |
| 対象要素 | DFD の要素 ID と名前 | 1行に1要素 |
| 分類 | S/T/R/I/D/E | 1行に1分類。迷ったら主なものを1つ |
| 脅威 | 何が起こりうるか | 「だれが(何が)・何を・どうする」の1文 |
| 影響 | 起きたときに困ること | 利用者または運営にとっての結果 |
| 対策 | 設計で取る手立て | 設計書のどこに反映するかが分かる粒度 |
| 状態 | 未対応/対応中/対応済み/受容/該当なし | 受容は理由と見直し時期を添える |
空のテンプレート(タブ区切り)
表計算ソフトの A1 セルに貼り付けると、列に分かれます。
ID 対象要素 分類 脅威 影響 対策 状態
T-01
T-02
T-03
記入例10行(Markdown の表)
| ID | 対象要素 | 分類 | 脅威 | 影響 | 対策 | 状態 |
|---|---|---|---|---|---|---|
| T-01 | E1 会員 | S | 他人のIDとパスワードで会員としてログインされる | 会員情報の閲覧・変更 | 多要素認証、ログイン試行回数の制限、ログイン通知メール | 対応中 |
| T-02 | E2 管理者 | R | 管理者が行った利用停止の操作を、後から確かめられない | 誤操作の経緯を追えない | 操作者・対象・日時・操作内容を操作ログに記録する(F9) | 対応済み |
| T-03 | P1 会員向けWebアプリ | T | 入力値がそのままSQLに組み込まれ、意図しない更新が行われる | 会員情報の書き換え | プレースホルダの使用、入力値の検証 | 対応済み |
| T-04 | P1 会員向けWebアプリ | E | 一般の会員が、他の会員のIDを指定して情報を参照・変更できる | 他の会員の情報の閲覧・変更 | リクエストごとにログイン中の会員と対象データの持ち主を照合する | 未対応 |
| T-05 | P1 会員向けWebアプリ | D | 登録・ログインへの大量のリクエストで応答が遅くなる | サイトを利用できない時間が生じる | レート制限、タイムアウト、同時接続数の上限 | 対応中 |
| T-06 | F1 ログイン・登録情報 | I | 通信の途中でログイン情報が読み取られる | 認証情報の漏えい | TLSの必須化、HSTS | 対応済み |
| T-07 | F2 画面・セッションCookie | I | セッションCookieがページ内のスクリプトから読み取れる | なりすまし(T-01)につながる | CookieにHttpOnly・Secure・SameSite属性を付ける | 対応済み |
| T-08 | F5 メール送信依頼 | I | メール本文に必要以上の会員情報が含まれ、外部サービス側に残る | 会員情報が管理の外に広がる | 本文は最小限にし、詳細は期限つきリンクで案内する | 受容(次回見直し) |
| T-09 | P2 管理画面 | S | 管理者になりすまして管理画面にログインされる | 全会員の情報の閲覧・利用停止 | 接続元の制限、多要素認証、会員向けとは別の認証 | 対応中 |
| T-10 | D2 操作ログ | T | 操作ログが書き換え・削除され、記録を信頼できなくなる | 否認(T-02)への備えが働かなくなる | アプリからは追記のみ許可し、別の保管先へ転送する | 未対応 |
記入例10行(タブ区切り)
ID 対象要素 分類 脅威 影響 対策 状態
T-01 E1 会員 S 他人のIDとパスワードで会員としてログインされる 会員情報の閲覧・変更 多要素認証、ログイン試行回数の制限、ログイン通知メール 対応中
T-02 E2 管理者 R 管理者が行った利用停止の操作を、後から確かめられない 誤操作の経緯を追えない 操作者・対象・日時・操作内容を操作ログに記録する(F9) 対応済み
T-03 P1 会員向けWebアプリ T 入力値がそのままSQLに組み込まれ、意図しない更新が行われる 会員情報の書き換え プレースホルダの使用、入力値の検証 対応済み
T-04 P1 会員向けWebアプリ E 一般の会員が、他の会員のIDを指定して情報を参照・変更できる 他の会員の情報の閲覧・変更 リクエストごとにログイン中の会員と対象データの持ち主を照合する 未対応
T-05 P1 会員向けWebアプリ D 登録・ログインへの大量のリクエストで応答が遅くなる サイトを利用できない時間が生じる レート制限、タイムアウト、同時接続数の上限 対応中
T-06 F1 ログイン・登録情報 I 通信の途中でログイン情報が読み取られる 認証情報の漏えい TLSの必須化、HSTS 対応済み
T-07 F2 画面・セッションCookie I セッションCookieがページ内のスクリプトから読み取れる なりすまし(T-01)につながる CookieにHttpOnly・Secure・SameSite属性を付ける 対応済み
T-08 F5 メール送信依頼 I メール本文に必要以上の会員情報が含まれ、外部サービス側に残る 会員情報が管理の外に広がる 本文は最小限にし、詳細は期限つきリンクで案内する 受容(次回見直し)
T-09 P2 管理画面 S 管理者になりすまして管理画面にログインされる 全会員の情報の閲覧・利用停止 接続元の制限、多要素認証、会員向けとは別の認証 対応中
T-10 D2 操作ログ T 操作ログが書き換え・削除され、記録を信頼できなくなる 否認(T-02)への備えが働かなくなる アプリからは追記のみ許可し、別の保管先へ転送する 未対応
10行で、6つの分類すべて(S 2件、T 2件、R 1件、I 3件、D 1件、E 1件)を1回以上使っています。
状態の選び方
OWASP の Threat Modeling Cheat Sheet は、脅威への対応を4つに分けています。状態列と合わせて使います。
| 対応 | 意味 | 一覧での書き方 |
|---|---|---|
| 軽減(Mitigate) | 起こりにくくする対策を入れる | 対策列に内容、状態は未対応→対応中→対応済み |
| 排除(Eliminate) | 原因になる機能や要素をなくす | 対策列に「機能を外す」、DFD も直す |
| 移転(Transfer) | 責任を別の当事者へ移す | 対策列に移す先と取り決めの場所 |
| 受容(Accept) | 対策を取らないと決める | 状態を「受容」、理由と見直し時期を添える |
手順5の後:見直しのチェック表
| 確認項目 | 見るところ |
|---|---|
| 信頼境界をまたぐ矢印のすべてに、1行以上の検討結果があるか | 対象要素列に F1・F2・F5・F6 があるか(空欄なら「該当なし」と書いてあるか) |
| プロセスごとに、6分類を見たか | P1・P2 について S〜E の検討結果があるか |
| 対策が「気をつける」ではなく、設計に反映できる内容か | 対策列 |
| 未対応の行に、担当と期限があるか | 課題管理表など、別の管理先とひも付いているか |
| 受容の行に、理由と見直し時期があるか | 状態列 |
| DFD を変えたとき、一覧も見直したか | 図の更新日と一覧の更新日 |
脅威モデリングは一度で終わりではなく、DFD が変わったとき(外部との出入りが増えた、データストアが増えた)にその差分だけを見直します。 差分なら、増えた要素の行を cells.tsv に足すだけで済みます。
STRIDE と DREAD・アタックツリー・リスクアセスメントの違い
| 手法 | 目的 | 入力 | 出力 | 使うタイミング |
|---|---|---|---|---|
| STRIDE | 脅威を漏れなく洗い出す | DFD | 脅威の一覧 | 設計の初期〜変更のたび |
| DREAD | 洗い出した脅威に優先順位を付ける | 脅威の一覧 | 脅威ごとの点数 | 洗い出しの後 |
| アタックツリー(脅威ツリー) | 1つの脅威を、成立する条件へ分解する | 重要な脅威1件 | 目標を頂点にした木 | 重要な脅威を深く見るとき |
| リスクアセスメント | 組織や業務全体のリスクを評価し、扱い方を決める | 資産・業務・脅威 | リスクの一覧と対応方針 | 定期的、または体制・業務の変更時 |
STRIDE は「何があるか」、DREAD は「どれからやるか」、アタックツリーは「どう成立するか」に答える道具で、置き換えではなく順に使う関係です。リスクアセスメントは対象が広く、個別システムの脅威モデリングの結果を材料の1つとして取り込みます。
どれを使うかの判断基準
| 状況 | 選ぶもの |
|---|---|
| 設計中のシステムで、何を心配すべきか分からない | STRIDE(この記事の手順) |
| 脅威は出そろったが、数が多くて着手順を決めたい | DREAD、または「影響×起こりやすさ」の高・中・低 |
| 特定の脅威について、対策の抜けを確かめたい | アタックツリー |
| 個別のシステムではなく、部門や会社全体の優先度を決めたい | リスクアセスメント |
| 実装の確認項目がほしい | OWASP Top 10 などのチェックリスト(次の節) |
DREAD の点数の付け方
DREAD は、Damage(被害の大きさ)、Reproducibility(再現のしやすさ)、Exploitability(必要な手間や技能の少なさ)、Affected Users(影響を受ける利用者の数)、Discoverability(見つかりやすさ)の5項目です。Microsoft のドライバー向け脅威モデリングの解説では、各項目を1〜10で評価し、合計を5で割った値を使うと説明されています。
記入例のうち3件に、説明用の点数を付けて計算しました(点数は例です)。
| ID | 被害 D | 再現 R | 手間 E | 利用者 A | 発見 D | 合計 | 平均 |
|---|---|---|---|---|---|---|---|
| T-01 | 8 | 9 | 7 | 9 | 8 | 41 | 8.2 |
| T-05 | 6 | 5 | 4 | 8 | 5 | 28 | 5.6 |
| T-08 | 5 | 8 | 6 | 3 | 6 | 28 | 5.6 |
T-05 と T-08 は内訳が違うのに、平均は同じ 5.6 になりました。点数は並べ替えの材料であり、同点のときは内訳(とくに被害の大きさ)を見て決めます。 OWASP の Threat Modeling Process のページでは、DREAD のような数値ではなく、定性的な値(高・中・低など)で評価するやり方も紹介されています。人によって点数がばらつくときは、高・中・低の3段階のほうがそろえやすくなります。
OWASP Top 10 のチェックとの関係
OWASP Top 10 は、Web アプリケーションで重要なリスクを10カテゴリにまとめた文書で、今回確認した最新版は OWASP Top 10:2025 です。脅威モデリングは「自分たちの設計図から出発して探す」、Top 10 は「よく知られたリスクの一覧から出発して確かめる」という向きの違いがあります。
| 観点 | 脅威モデリング(STRIDE) | OWASP Top 10 のチェック |
|---|---|---|
| 出発点 | 自分たちの DFD | 公開されているカテゴリの一覧 |
| 見つけやすいもの | そのシステム固有の経路、境界の抜け | よく知られた種類の弱点 |
| 向く工程 | 設計 | 設計レビュー、実装、テスト |
| 成果物 | 脅威一覧 | 確認結果(はい/いいえ) |
| 手間 | 図を描く時間が要る | 一覧があればすぐ始められる |
STRIDE で出した脅威を、Top 10:2025 のどのカテゴリで確かめるかの対応づけです(この記事での整理です)。
| STRIDE | 関係が深い OWASP Top 10:2025 のカテゴリ |
|---|---|
| S なりすまし | A07 Authentication Failures |
| T 改ざん | A05 Injection、A08 Software or Data Integrity Failures |
| R 否認 | A09 Security Logging and Alerting Failures |
| I 情報漏えい | A04 Cryptographic Failures、A01 Broken Access Control |
| D サービス拒否 | A10 Mishandling of Exceptional Conditions |
| E 権限昇格 | A01 Broken Access Control |
| 分類をまたぐもの | A02 Security Misconfiguration、A03 Software Supply Chain Failures、A06 Insecure Design |
A06 Insecure Design(安全でない設計)は、設計段階の検討そのものを指すカテゴリで、脅威モデリングはその代表的な取り組みです。設計では脅威モデリングで固有の脅威を出し、レビューとテストでは Top 10 で抜けを確かめる、という組み合わせが使いやすい形です。
確かめて分かったこと
- 要素の種類で絞ると、確認する件数は 96 件から 51 件になりました。 さらに信頼境界で分けると、1巡目は 30 件です。件数が先に分かると、会議の時間を決めやすくなります。
- 件数のいちばん大きな割合を占めるのはデータフローでした(51 件中 27 件)。矢印を細かく描きすぎると、手順4の時間がそのまま伸びます。
- Mermaid の subgraph で信頼境界を表すと、境界をまたぐ矢印が枠の外を通るので見分けやすく描画されました。 境界の名前を subgraph のタイトルに書いておくと、図だけで境界の意味が伝わります。
- DREAD の平均は、内訳が違っても同じ値になることがありました(T-05 と T-08 がどちらも 5.6)。平均だけで順位を決めず、内訳を一緒に残します。
- OWASP の Threat Modeling Cheat Sheet には、今回開いた時点で DREAD の説明がありませんでした。 DREAD の5項目と計算方法は、Microsoft のページで確認しています。
- Microsoft の STRIDE の解説ページ(Threat Modeling Tool)の最終更新は 2022-08-25 でした。 6分類の名前は、2006年の MSDN Magazine の記事と同じです。
よくある質問
Q. 脅威モデリングとは何ですか? A. 設計図をもとに、起こりうる脅威を洗い出して対策を決め、一覧に残す作業です。実装の前に行うと、設計の変更だけで済む対策が増えます。
Q. STRIDE と DREAD の違いは何ですか? A. STRIDE は脅威を洗い出すための6分類、DREAD は洗い出した脅威に優先順位を付けるための5項目です。STRIDE の後に DREAD を使います。
Q. DFD が無いシステムでは、どこから始めればよいですか? A. 外部との出入りだけを描いた1枚の図から始めます。利用者・外部システムを四角、自分たちのシステムを1つの円で描き、矢印に運ぶデータを書けば、信頼境界をまたぐ矢印がそろいます。
Q. 脅威が思いつかないときはどうすればよいですか? A. 早見表の「問いかけ」を、要素の名前に置き換えて読み上げます。それでも出ない行は「該当なし」と書いて次へ進み、後日、別の人に同じ行を見てもらいます。
Q. 脅威モデリングとリスクアセスメントの違いは何ですか? A. 対象の広さが違います。脅威モデリングは1つのシステムの設計を対象にし、リスクアセスメントは組織や業務全体を対象に、リスクの大きさと扱い方を決めます。
まとめ
- 手順は 「DFD を描く → 信頼境界をまたぐ矢印に番号を振る → 要素の種類ごとに当てはまる STRIDE だけを見る」 の3つ。
- 外部実体は S・R、プロセスは6つすべて、データストアとデータフローは T・I・D を見る。
- 題材の会員サイトでは、96 件が 51 件、1巡目は 30 件に絞れた。
- 脅威一覧は ID・対象要素・分類・脅威・影響・対策・状態 の7列。空欄は「該当なし」と書いて、見たことを残す。
- STRIDE で洗い出し、DREAD や高・中・低で順位を付け、重要なものはアタックツリーで深く見る。
- OWASP Top 10 は、設計レビューやテストで抜けを確かめる一覧として組み合わせる。
- DFD が変わったら、増えた要素の行だけを足して見直す。
参考・出典
- Microsoft Learn「Microsoft Threat Modeling Tool threats」(STRIDE の6分類、最終更新 2022-08-25): https://learn.microsoft.com/en-us/azure/security/develop/threat-modeling-tool-threats
- Microsoft MSDN Magazine 2006年11月号「Uncover Security Design Flaws Using The STRIDE Approach」(要素別の該当表): https://learn.microsoft.com/en-us/archive/msdn-magazine/2006/november/uncover-security-design-flaws-using-the-stride-approach
- Microsoft Learn「Threat modeling for drivers」(DREAD の5項目と計算、脅威ツリー): https://learn.microsoft.com/en-us/windows-hardware/drivers/driversecurity/threat-modeling-for-drivers
- OWASP Cheat Sheet Series「Threat Modeling Cheat Sheet」(4つの問い、対応の4分類): https://cheatsheetseries.owasp.org/cheatsheets/Threat_Modeling_Cheat_Sheet.html
- OWASP「Threat Modeling Process」(DFD の記号、信頼境界、脅威ツリー): https://community.owasp.org/Threat_Modeling_Process
- OWASP Top 10:2025: https://owasp.org/Top10/2025/
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「脅威モデリングのやり方|STRIDEの例と脅威一覧テンプレート」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。