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

危険の一覧と、やることの一覧 — Proactive Controls と Docker Top 10

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

同じ「Top 10」の名前でも、危険を数えた一覧と、やることを並べた一覧があります。今回は後者を読みます。

まず結論

Proactive Controls v4(2024)と Docker Top 10 は、危険を数えた一覧ではなく「やること」を並べた一覧だと自分で書いています。並べ方も、前者は重要度順、後者は relevance 順です。

やることは自分のコンテナで合否を確かめられます。ただし、やることの一覧は書かれた時点の危険の一覧と環境を指しており、番号も前提も古くなります。

? 読む前に予測

Proactive Controls v4 の各 control には「Vulnerabilities Prevented」節があります。そこで Web Top 10 の番号はどう指されているでしょうか。

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

抽象原理

数えた一覧と、並べた一覧

Web Top 10 2025 は、提供されたデータで number of applications with at least one instance of a CWE found in testing を数えました。弱点を1つ以上持つアプリの割合です。危険を、他人のアプリで数えた一覧です。

Proactive Controls v4(2024)は、危険を数えた値を示していません(確認範囲: README と index.md)。README はこう書きます。

The OWASP Top Ten Proactive Controls is a list of security techniques that should be included in every software development project. They are ordered by order of importance, with control number 1 being the most important.

作り方は、リーダーが有志と作り、世界に公開して匿名の提案も受けたと書かれています(Hundreds of changes were accepted from this open community process.)。並べたのは技法で、順は重要度です。

Docker Top 10 は README で It's a work in progress. と名乗り、自分をこう説明します。

First, it is not about risks which are based on data collected as the OWASP Top 10. Secondly the 10 bullet points here resemble (proactive) controls.

プロジェクトページは Those 10 points are ordered by relevance. と書きます。重要度順と relevance 順を同じ語にまとめないでください。

同じ「Top 10」でも、並んでいるものが違う
危険の一覧Web Top 10 2025: 弱点を持つアプリの割合
やることの一覧Proactive v4: 重要度順 / Docker: relevance 順
自分のコードに当てると
「無い」とは言い切れない多数のアプリの集計だから
合否が出るUSER はあるか・uid は何か
ただし、やることは書かれた時点を指す
指す番号が旧版Proactive は 2021 版の番号
前提の既定値が変わるD01 の PSP と 1024 未満のポート
  • ・Docker README は「データに基づくリスクではない」と自分で書く
  • ・Proactive は starting point と書き、網羅は ASVS などに送る

Proactive 自身も this document is a starting point rather than a comprehensive set of techniques and practices と書き、ASVS へ送ります。一覧を満たしたことを網羅の証拠にしない話は、第15期で扱います。

具体実物

USER の1行で、合否が出る

Docker Top 10 の D01 は、コンテナ内のアプリが root で動くことを問題にし、USER <username> で切り替えるよう書きます。確かめ方として docker inspect の Config/User を見る手順も載せています。

Docker Desktop 4.47.0(Engine 28.4.0、linux/arm64)、alpine:3.22 で2つのイメージを作りました。3回走らせ、結果は同じでした。

run2.txt より抜粋(該当の行を選んだ。各行は生のまま。2026-09-28)コマンド出力
## Dockerfile.nouser
FROM alpine:3.22
CMD ["id"]
## Dockerfile.user10001
FROM alpine:3.22
USER 10001
CMD ["id"]
## docker run --rm l11-nouser
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)
## docker run --rm l11-user10001
uid=10001 gid=0(root) groups=0(root)
## docker inspect -f '{{.Config.User}}' (image)
l11-nouser -> []
l11-user10001 -> [10001]

USER の行が無いと uid=0(root) で、Config.User は空です。USER 10001 の1行で uid が変わります。やることは、自分のイメージに当てて「できているか」を機械で判定できます。 危険の一覧の割合からは、この判定は出ません。

gid が 0(root) なのは、Dockerfile reference の Warning どおりです(主グループの無い利用者は root グループで動く)。

✓ ここまでの確認

alpine:3.22 に `USER 10001` の1行だけを足したイメージで `id` を実行した結果(Docker Engine 28.4.0)はどれですか。

抽象原理

やることの一覧は、書かれた時点の危険を指す

Proactive の各 control には Vulnerabilities Prevented 節があり、OWASP TOP 10 Risk, CWE, etc. を並べます。そこから Top 10 の番号をスクリプトで抜き、Web 2025 の導入文にある移動(2021 の A05 が 2025 の A02 へ、SSRF は A01 へ統合、など)で引き直しました。引き直しはこちらの作業で、原文は 2021 版の番号のままです。

map_2021_to_2025.py の出力を整形(control 名と file:line 列を省いた。逆引きは A01 と、指す control の無い行だけ)表
C1 | A01:2021 | A01:2025 | Broken Access Control
C2 | A02:2021 | A04:2025 | Cryptographic Failures
C3 | (Top 10 2021 への参照なし)
C4 | A04:2021 | A06:2025 | Insecure Design
C5 | A05:2021 | A02:2025 | Security Misconfiguration
C6 | A06:2021 | A03:2025 | Software Supply Chain Failures
C7 | A07:2021 | A07:2025 | Authentication Failures
C8 | (Top 10 2021 への参照なし)
C9 | (Top 10 2021 への参照なし)
C10 | A10:2021 | A01:2025 | Broken Access Control (SSRF rolled in)
## 逆引き: 2025 の各項目を指している control
A01:2025: C1, C10
A05:2025: (指す control なし)
A08:2025: (指す control なし)
A09:2025: (指す control なし)
A10:2025: (指す control なし) ← Mishandling of Exceptional Conditions (L43 is a new category for 2025)

番号を書くのは10本中7本です。C3 は CWE Top 25 を、C8 は脆弱性の名前を、C9 は1行だけを挙げ、Top 10 の番号は書きません。指される 2025 の項目は6つで、A01:2025 に2本が集まります。対策の一覧として1対1に読むと外れます。

C7 は Mobile Top 10 2016 の M4 も指します(Mobile の現行は 2024 版)。やることの一覧は、書かれた時点の危険の一覧に錨を下ろしています。

具体実物

同じ文書の中の、古くなった前提

Docker Top 10 の本文は README が 2021-06、D01 が 2021-04 から変わっていません。D01 には、書かれた後に外が動いた文が2つあります。

1つ目は In an orchestrated environment make sure that you have a proper pod security policy.(2020-12-29 に追加)。kubernetes.io は PodSecurityPolicy was deprecated in Kubernetes v1.21, and removed from Kubernetes in v1.25. と書きます。後継は Pod Security Admission などです。

2つ目は Configuring a user doesn't let you bind the server on any port below 1024.。Docker Engine 20.10 のリリースノートに moby#41030(特権ポートと ping を capability なしで許す既定の sysctl)が載っています。同じ環境で確かめました。

run2.txt より抜粋(## の見出し行は短く書き換えた。それ以外は生のまま)コマンド出力
## uid 10001 で timeout 2 nc -l -p 80(既定の sysctl)
0
punt!
Terminated
nc exit=143
## 同じことを --sysctl net.ipv4.ip_unprivileged_port_start=1024 で
1024
nc exit=1
nc: bind: Permission denied

先頭の 0 はコンテナ内の ip_unprivileged_port_start です。exit 143 は bind して待ち受け、timeout に止められた終わり方です。sysctl を 1024 に戻すと、D01 の書く状態が再現します。確かめたのは Docker Engine 28.4.0 だけで、他のランタイムや Kubernetes 上では試していません。この sysctl はコンテナが自分のネットワーク名前空間を持つときだけ入り、--network host の uid 10001 では値が 1024 のままで nc: bind: Permission denied になりました(監査役の実測、同じ Engine)。

✓ ここまでの確認

Docker Top 10 の D01 にある2つの古い記述(pod security policy と 1024 未満のポート)に共通する、古くなった理由はどれですか。

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

やることの一覧: C5 と Docker D01

C5 は Secure By Default Configurations、D01 は USER で root をやめること。自分のイメージに docker inspect を当てれば、できているかが1行で出ます。

具体例 B

危険の一覧: A02:2025 Security Misconfiguration

2021 の5位から 2025 の2位へ上がった項目です。数えたのは提供データで弱点を持つアプリの割合で、自分のアプリに無いかどうかは教えません。

C5 は A05:2021、つまり A02:2025 を指しています。同じ題材の2つの一覧は、それぞれ何に使えるでしょうか。

「自分の成果物に当てたとき、何が返ってくるか」で比べてください。

この章のまとめ

  • Proactive Controls v4(2024)は技法を重要度順に、Docker Top 10 は relevance 順に並べた一覧。後者は「データに基づくリスクではない」と自分で書く。
  • やることは合否で確かめられる。USER が無いと uid=0(root)、USER 10001 で uid=10001 gid=0(root)。
  • Proactive で Top 10 の番号を書くのは10本中7本、しかも 2021 版。2025 へ引き直すと A01 に2本が集まり、4項目は指されない。1対1ではない。
  • D01 の PodSecurityPolicy(v1.25 で削除)と 1024 未満のポート(Engine 20.10 以降の既定では bind できる。コンテナが自分のネットワーク名前空間を持つ場合で、--network host では 1024 のまま)は、外が動いて古くなった前提。
  • やることの一覧も、版と環境を確かめてから使う。網羅の主張は第15期で扱う。

自分の現場で確かめる

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

環境:

理解度チェック

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

問題 1 / 3正解: 0

Docker Top 10 の README は、自分と OWASP Top 10 の違いをどう書いていますか。

用語集(4語)
Proactive Controls
OWASP の、開発者がやるべき安全の技法を並べた一覧。v4 は 2024 年。README は重要度順と書く。
Vulnerabilities Prevented
Proactive Controls の各 control にある節。防ぐ脆弱性や危険(Top 10・CWE など)を列挙する。
USER 命令
Dockerfile で、以降の RUN と実行時の既定の利用者(と任意でグループ)を決める命令。
ip_unprivileged_port_start
特権ポートの扱いに関わる Linux の sysctl。Docker は 20.10 から既定で 0 にしている(コンテナが自分のネットワーク名前空間を持つ場合。`--network host` では 1024 のまま)。実測では 0 で uid 10001 が port 80 に bind でき、1024 では拒否された。