- ブラウザURL入力
- DNS名前→IP
- ルータ経路選択
- ロードバランサ振り分け
- Nginx受け口
- アプリ処理今ここ
- 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 順を同じ語にまとめないでください。
- ・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回走らせ、結果は同じでした。
## Dockerfile.nouserFROM alpine:3.22CMD ["id"]## Dockerfile.user10001FROM alpine:3.22USER 10001CMD ["id"]## docker run --rm l11-nouseruid=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-user10001uid=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 版の番号のままです。
C1 | A01:2021 | A01:2025 | Broken Access ControlC2 | A02:2021 | A04:2025 | Cryptographic FailuresC3 | (Top 10 2021 への参照なし)C4 | A04:2021 | A06:2025 | Insecure DesignC5 | A05:2021 | A02:2025 | Security MisconfigurationC6 | A06:2021 | A03:2025 | Software Supply Chain FailuresC7 | A07:2021 | A07:2025 | Authentication FailuresC8 | (Top 10 2021 への参照なし)C9 | (Top 10 2021 への参照なし)C10 | A10:2021 | A01:2025 | Broken Access Control (SSRF rolled in)## 逆引き: 2025 の各項目を指している controlA01:2025: C1, C10A05: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)が載っています。同じ環境で確かめました。
## uid 10001 で timeout 2 nc -l -p 80(既定の sysctl)0punt!Terminatednc exit=143## 同じことを --sysctl net.ipv4.ip_unprivileged_port_start=1024 で1024nc exit=1nc: 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 未満のポート)に共通する、古くなった理由はどれですか。
やることの一覧: C5 と Docker D01
C5 は Secure By Default Configurations、D01 は USER で root をやめること。自分のイメージに docker inspect を当てれば、できているかが1行で出ます。
危険の一覧: 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期で扱う。
自分の現場で確かめる
読んだだけでは身につきません。手元の環境で実際に見てみてください。
理解度チェック
読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。
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 では拒否された。
出典(一次ソース)
- OWASP Top 10 Proactive Controls — README(repo www-project-proactive-controls @4f5cb10、取得 2026-09-28) ↗
- Proactive Controls — docs/the-top-10/index.md(@4f5cb10。作業中の次版の木だが、2024 版 docs/archive/2024 と同文。取得 2026-09-28) ↗
- Proactive Controls — C1 Implement Access Control(Vulnerabilities Prevented。C2〜C10 も同じ木。Top 10 参照行は 2024 版と同一。@4f5cb10、取得 2026-09-28) ↗
- Proactive Controls — docs/index.md(starting point・ASVS。@4f5cb10、取得 2026-09-28) ↗
- OWASP Docker Top 10 — README(repo Docker-Security @5c8519b、work in progress。取得 2026-09-28) ↗
- OWASP Docker Top 10 — D01 Secure User Mapping(@5c8519b、取得 2026-09-28) ↗
- OWASP Docker Top 10 — プロジェクトページ index.md(ordered by relevance。@975c43f、取得 2026-09-28) ↗
- OWASP Top 10:2025 — Introduction(2021 からの移動・SSRF の統合。@3a31f35、取得 2026-09-28) ↗
- Kubernetes — Pod Security Policies(v1.21 非推奨・v1.25 削除。取得 2026-09-28) ↗
- Docker Docs — Dockerfile reference, USER(取得 2026-09-28) ↗
- Docker Engine 20.10 release notes(moby#41030 の記載。取得 2026-09-28) ↗
- moby/moby PR #41030 — Add default sysctls to allow ping sockets and privileged ports with no capabilities(merged 2020-06-04) ↗