Dev Study
← OWASP Top 10 の群 — 何のリストで、どう作られ、どう読むか
レッスン 1 / 12·約 8 分·第27期 OWASP Top 10 の群

Top 10 は十数本ある — どれが生きていて、何を数えたか

リクエストがアプリケーションに届くまで
  1. ブラウザURL入力
  2. DNS名前→IP
  3. ルータ経路選択
  4. ロードバランサ振り分け
  5. Nginx受け口
  6. アプリ処理今ここ
  7. DB保存

このコースの入口です。個々の項目に入る前に、一覧そのものが何を数えたものかを読む習慣を作ります。

まず結論

「OWASP Top 10」と呼ばれる一覧は Web 以外にも十数本あり、同じ「10」でも数えたものが違います。Web 2025 は弱点を持つアプリの割合、API 2023 はチームの合意、LLM 2026 は投票と事故記録、Proactive Controls は「やること」を並べています。

番号を読む前に、何を数えた一覧か、どの版か、まだ更新されているかを確かめます。版・日付・archived は手元の git と curl で確かめられ、何を数えたかは原文を読んで確かめます。

? 読む前に予測

Web 2025・API 2023・LLM 2026 の3つの Top 10 は、順位の元になったものについて何が言えるでしょうか。

当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。

抽象原理

同じ「10」でも、数えたものが違う

「OWASP Top 10」と言えば Web アプリの一覧を指すことが多いですが、OWASP の GitHub で名前に top を含むリポジトリを検索すると48件見つかりました(2026-09-28。一覧の本数ではなく、本体とページ用が別のリポジトリになっているものも含む)。API・LLM・モバイル・CI/CD・Kubernetes と、一覧は十数本あります。

並べ方の元になったものは一覧ごとに違います。

  • Web 2025: 提供データで数えた単位は the number of applications with at least one instance of a CWE found in testing。見つかった件数ではなく、弱点を1つ以上持つアプリの割合です。これにコミュニティ調査を加えますが、導入文には「データで12カテゴリを順位づけし、2つを調査で引き上げた」(L48)と「10のうち8つをデータから、2つを調査から」(L79)の2通りの書き方があります。
  • API 2023: Unfortunately, no data was contributed。発生頻度は prevalence results from a consensus among the team members です。
  • LLM 2026: The community vote carries three-quarters of the weight. The incident data covers the remaining quarter.
  • Proactive Controls v4(2024): 危険ではなくやることの一覧で、ordered by order of importance です。
  • Kubernetes 2025: In the future we hope for this to be backed by data。今はデータに基づいていません。

順位が合意で決まる面と、Top 10 が網羅を主張しないことは第15期で扱います。本回は一覧ごとの違いを見ます。

同じ名前の下で、数えたものが分かれる
「Top 10」という名前同じ語・同じ10項目
何を数えたか
アプリの割合Web 2025 + 調査
チームの合意API 2023
投票 + 事故記録LLM 2026(3/4・1/4)
やることProactive v4(重要度順)
だから
番号の意味は一覧ごと・版ごとに違うA03:2025、LLM08:2026 と版を付けて読む
  • ・Kubernetes 2025 は README が「将来はデータで裏付けたい」と書く
具体実物

主な一覧の棚卸し(2026-09-28 時点)

保存した原文と git 履歴から作った表です。日付の列は「何を公開日としたか」が一覧ごとに違うので、何の日付かを添えました。

現行の一覧(根拠は各リポジトリの本文と git 履歴)表
一覧 版 日付(何の日付か) 数えたもの
Web 2025 RC 2025-11-06(文書の自己申告) 弱点を持つアプリの割合 + 調査
RC 表示除去 2025-12-24
API Security 2023 タグ v2.2.0 2023-06-05 公募データ0件 → チームの合意
LLM Apps 2026 ページ公開 2026-08-04 投票 3/4 + 事故記録 1/4
Agentic Apps 2026 ページ表示 2025-12-09 専門家の寄稿とレビュー
Mobile 2024 方法論の表 Initial 2023-08-02 事故報告・脆弱性DB・評価など
方法論の表 Final 2024-01-22
CI/CD v1.0 ロードマップ欄 2022-10 数百の CI/CD 環境の分析など
index 最終変更 2023-02-22(本文に版年なし)
Kubernetes 2025 draft 表記除去 2026-03-18 データなし(final 表明なし)
Proactive v4 2024 やること(重要度順)

API は合意、LLM は投票、Kubernetes はデータなし。Agentic と Mobile は、保存した文書に票や件数が見つかりませんでした。Mobile は方法論で using a data-based approach と名乗りますが、数値は載っていません。集計の数値を示して順位の元にしているのは、この表では Web だけです。それも件数ではなく割合で、調査で選んだ枠を含みます。

止まった一覧もあります。

更新が止まった一覧(archived は GitHub API の値)表
一覧 最後の版 最後の変更 archived
Serverless 2018 解釈版(S1:2017…) 2020-07-27(本体の最終コミット) false
Privacy v2.0(2021) 2022-05-30(index.md) true
Cloud-Native 暫定リスト(2021-07) 2024-01-31(index.md) true

Serverless は archived ではないのに、Web 2017 の読み替え(S1:2017)のまま止まっています。

✓ ここまでの確認

Kubernetes Top 10 2025 について、保存した README・index から言えることはどれですか。

抽象原理

生きているかは、1つの信号では決まらない

「この一覧はまだ生きているか」を判断するのに、本回が使ったのは3つの信号だけです。GitHub の archived の値、本文ファイルの最終変更日、本文に書かれた状態の表記。owasp.org のプロジェクトページにある状態の表示は見ていません。

3つはよく食い違います。

  • Serverless は archived が false でも、本体の最終コミットは 2020-07-27。
  • LLM の旧リポジトリは archived が false のまま、本文で historical archive と名乗り、開発を GenAI Security Project 側へ移したと書きます。
  • Cloud-Native は archived が true でも、本文は very much alive と書きます。

リポジトリの最新コミット(HEAD)の日付も当てになりません。 依存更新やメタデータ追加など、本文以外のコミットで新しくなるからです。CI/CD は HEAD が 2025-11 でも、index.md の最終変更は 2023-02-22 でした。見るのは本文ファイルの変更日です。

archived が付いていても本文は clone して読めました。archived は本文の正誤を表しません。

具体実物

手元で3つの信号を取る

macOS 26.5.2・git 2.50.1・curl 8.7.1、2026-09-28 10:17〜10:20 UTC に実行しました。リポジトリは git clone --filter=blob:none で取得、外部への要求はすべて未認証です。

本文ファイルの最終変更日(run1 の抜粋。run2 も同値)コマンド出力
$ (cd repos/Top10 && git log -1 --format=%ad --date=iso -- 2025/docs/en/0x00_2025-Introduction.md)
2025-12-24 16:17:29 -0500
$ (cd repos/Top10 && git log -1 --format=%ad --date=iso -- 2021/docs/en/0x00_2021-Introduction.md)
$ (cd repos/API-Security && git log -1 --format=%ad --date=iso -- editions/2023/en/0x00-header.md)
2023-06-05 14:21:06 +0100
$ (cd repos/www-project-cloud-native-application-security-top-10 && git log -1 --format=%ad --date=iso -- index.md)
2024-01-31 18:11:21 +0200
$ (cd repos/www-project-top-10-ci-cd-security-risks && git log -1 --format=%ad --date=iso -- index.md)
2023-02-22 10:39:45 +0200
$ (cd repos/www-project-kubernetes-top-ten && git log -1 --format=%ad --date=iso -- README.md)
2026-03-24 01:43:41 +0330

2つめのコマンド(2021 の導入文)は何も出していません。実際のファイル名は 0x00_2021-introduction.md(小文字の i)で、存在しないパスを渡すと git はエラーを出さずに正常終了します。出力が空なら、まずパスを疑います。

次は owasp.org の URL を curl で追った結果です。

curl -sL -A curl -o /dev/null -w '%{http_code} %{num_redirects} %{url_effective} %{size_download}'(先頭の URL と run 番号はループで付けた。run1 のみ)コマンド出力
https://owasp.org/Top10/2025/ run1 200 3 https://top10.owasp.org/2025/ 26117
https://owasp.org/Top10/ run1 200 2 https://top10.owasp.org/ 326
https://owasp.org/www-project-top-ten/ run1 200 2 https://owasp.org/projects/top-ten 91980
https://owasp.org/www-project-api-security/ run1 404 2 https://owasp.org/projects/api-security 16504

owasp.org/Top10/ は 200 でも 326 バイトで、中身は meta refresh で 2025 版へ送るだけのページでした。curl は meta refresh を追いません。www-project-api-security/ は転送された先が 404 です(run2 では本文量が 16461 に揺れた)。200 は本文があることの証明ではなく、404 はその一覧が無いことの証明でもありません。 API の正本へは owasp.org/API-Security/ から転送されました。

✓ ここまでの確認

Cloud-Native の index.md は「very much alive」と書き、GitHub API は `"archived": true` を返しました。扱いとして適切なのはどれですか。

⇄ 2つを見比べる
具体例 A

Web 2025(RC から現行版へ)

導入文の履歴に RC 表示の除去が残っています。同じ 2025-12-24 に、owasp.org のページの元になるリポジトリにも現行版は 2025 という文言が入りました。final を宣言するコミットは無く、この2点から現行版と読みます。

git log -- 2025/docs/en/0x00_2025-Introduction.md(先頭5行)コマンド出力
cd2d585 2025-12-24 16:17:29 -0500 Removed RC
d4d000e 2025-12-24 15:24:03 -0500 Remove RC notice
6565ca1 2025-12-24 10:58:21 -0500 Fix Probely supporter typo
2a2effd 2025-12-13 20:23:36 +0100 Fix #847: Rename A09 to 'Security Logging & Alerting Failures' Rename A09 from 'Logging & Alerting Failures' to 'Security Logging & Alerting Failures' and update all dependencies. INFO: Without redirects, as it is still a release candidate.
160f841 2025-12-07 11:05:39 -0500 Reorganize 2021 and 2025 versions with backward-compatible redirects
具体例 B

Cloud-Native(本文は生きていると書く)

本文は生きていると書き、同じ文で最終更新を April 2022 としています。index.md の最終変更は 2024-01-31、GitHub の値は archived です。本文の表記とフラグが逆を向いています。

3つの信号(本文は index.md L14 の逐語、他は実行結果から抜粋)表
本文の表記 **Important Note:** This project is **very much alive**, and was last updates in April 2022.
本文の変更 git log -1 -- index.md → 2024-01-31 18:11:21 +0200
GitHub の値 "archived": true,

片方は履歴から現行版と読め、片方は信号が食い違いました。2つに共通する読み方は何でしょうか。

「生きている」「現行版」と書くとき、自分がどの信号を見たかを数えてみてください。

この章のまとめ

  • 「Top 10」は十数本あり、数えたものが違う。Web 2025 はアプリの割合と調査、API 2023 は合意、LLM 2026 は投票 3/4 と事故記録 1/4、Proactive はやること、Kubernetes 2025 はデータなし。
  • 番号は版を付けて読む(A03:2025、LLM08:2026)。版が変わると同じ番号が別の項目を指す。
  • 更新の間隔は一覧ごとに違う。Serverless は 2018 の解釈版で止まり、CI/CD は本文(index・各項目)に版の年を書かない(ロードマップ欄には v1.0・2022年10月とある)。
  • 生死は archived・本文ファイルの最終変更・本文の表記を並べて読む。本回は owasp.org の状態表示を見ていない。
  • 空の出力、200 のスタブ、404 は、どれも「無い」「ある」の証明にならない。

自分の現場で確かめる

読んだだけでは身につきません。手元の環境で実際に見てみてください。

環境:

理解度チェック

読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。

問題 1 / 3正解: 0

`owasp.org/Top10/` を curl で取ると 200 で本文は 326 バイトでした。何が起きていますか。

用語集(3語)
RC(Release Candidate)
公開前の候補版。Web 2025 は文書自身が RC を 2025年11月6日に公開したと書き、2025-12-24 のコミットでその表記を消した。
archived
GitHub のリポジトリに付く状態の値。API の応答では `"archived": true` のように出る。本文が正しいかどうかは表さない。
版つきの番号
A03:2025、LLM08:2026 のように番号に版の年を付けた書き方。版が変わると同じ番号が別の項目を指すため、本コースは常にこの形で引く。