現代のビジネスにおいて、Webアプリケーションは顧客との接点や業務の中核を担う、不可欠な存在です。しかし、その利便性の裏側には、常にサイバー攻撃の脅威が潜んでいます。企業の信頼や事業継続性を守るためには、Webアプリケーションのセキュリティ対策が極めて重要です。
そこで世界中の開発者やセキュリティ専門家が指針としているのが「OWASP Top 10」です。これは、Webアプリケーションにおける最も重大なセキュリティリスクをランキング形式でまとめたもので、対策の優先順位を判断するための世界的なデファクトスタンダードとなっています。
この記事では、2021年に発表された最新版「OWASP Top 10 2021」に焦点を当て、10個のリスクそれぞれがどのような脅威であり、どのように対策すべきかを、初心者にも分かりやすく徹底的に解説します。さらに、2017年版からの変更点や、OWASP Top 10を自社のセキュリティ対策に具体的に活かす方法まで、網羅的にご紹介します。
この記事を読み終える頃には、Webアプリケーションセキュリティの最前線で議論されている脅威の全体像を理解し、自社の状況に合わせた具体的な第一歩を踏み出せるようになっているはずです。
OWASP Top 10とは
まずはじめに、「OWASP Top 10」という言葉の背景にある「OWASP」というコミュニティと、Top 10が持つ意味について理解を深めていきましょう。この基本的な知識が、10大リスクをより深く理解するための土台となります。
OWASPというコミュニティについて
「OWASP」とは、「Open Web Application Security Project」の頭文字を取ったもので、ウェブアプリケーションのセキュリティ向上を目的としたオープンなコミュニティです。読み方は「オワスプ」が一般的です。
このコミュニティの最大の特徴は、特定の企業や政府機関に属さない非営利団体(NPO)である点です。これにより、ベンダーニュートラル、つまり特定企業の製品やサービスに偏らない、中立的で客観的な情報を提供できます。世界中のセキュリティ専門家、開発者、研究者などがボランティアとして参加し、知識や経験、ツールを共有することで、Webセキュリティ全体のレベルを引き上げる活動を行っています。
OWASPが提供するリソースは多岐にわたります。
- ドキュメント: 最も有名なのが「OWASP Top 10」ですが、その他にもセキュアコーディングの指針を示す「OWASP Secure Coding Practices」、脆弱性診断の基準となる「OWASP Web Security Testing Guide (WSTG)」、モバイルアプリ向けの「OWASP Mobile Top 10」など、数多くの実践的なガイドラインを公開しています。これらのドキュメントは、世界中の専門家の知見が集約されており、無料で誰でも利用できます。
- ツール: 開発や診断の現場で役立つオープンソースのツールも提供しています。代表的なものに、Webアプリケーションの脆弱性診断ツール「OWASP ZAP (Zed Attack Proxy)」があります。これは、開発者が手軽に自身のアプリケーションの脆弱性をテストできるように設計されており、世界中で広く利用されています。
- チャプター(支部)とイベント: 世界各地に「チャプター」と呼ばれる支部があり、日本にも「OWASP Japan」が存在します。各チャプターでは、定期的に勉強会やカンファレンスが開催され、地域のセキュリティコミュニティのハブとして機能しています。これにより、最新の脅威情報や対策技術がグローバルかつローカルに共有される仕組みができています。
OWASPがこれほどまでに広く受け入れられている理由は、そのオープン性と実践性にあります。理論だけでなく、実際の攻撃データや現場の経験に基づいた具体的な情報を提供してくれるため、開発者やセキュリティ担当者にとって非常に信頼性が高く、実用的なリソースとなっています。
Webアプリの脆弱性に関する世界的な指標
OWASPの数あるプロジェクトの中でも、最も知名度が高く、影響力を持つのが「OWASP Top 10」です。これは、Webアプリケーションに存在する数多くの脆弱性の中から、「特に重大で、発生頻度が高い」とされる10のリスクをまとめたリストです。
このリストは、単なる専門家の意見の寄せ集めではありません。OWASPは、世界中の数百の組織や数千のアプリケーションから提供された、実際の脆弱性データを分析しています。発生頻度、攻撃の検知しやすさ、攻撃の容易さ、技術的な影響度といった複数の観点から各脆弱性を評価し、その結果を基にランキングを作成しています。参照:OWASP Top 10 2021
このプロセスにより、OWASP Top 10は、現実世界の脅威を色濃く反映した、信頼性の高い指標となっています。そのため、多くの企業や組織が、自社のセキュリティ対策の優先順位を決定するための基準として採用しています。例えば、「まずはOWASP Top 10に含まれる脆弱性から潰していこう」といった形で、限られたリソースを最も効果的な対策に集中させるための羅針盤の役割を果たします。
OWASP Top 10は、約3〜4年ごとに更新されるのが通例です。これは、テクノロジーの進化、攻撃手法の巧妙化、開発スタイルの変化などに応じて、重要となるセキュリティリスクも変化するためです。例えば、クラウドサービスの普及に伴い新たな設定ミスのリスクが浮上したり、APIの利用拡大によって新たな攻撃対象が生まれたりします。定期的な更新により、OWASP Top 10は常に最新の脅威トレンドを反映した「生きたドキュメント」であり続けるのです。
また、OWASP Top 10は、クレジットカード業界のセキュリティ基準である「PCI DSS」など、様々なセキュリティ基準やコンプライアンス要件でも参照されています。これは、OWASP Top 10が単なる啓発文書に留まらず、業界標準として広く認知されていることの証左です。
開発者にとってはセキュアコーディングの学習教材として、セキュリティ担当者にとっては脆弱性診断のチェックリストとして、そして経営層にとってはセキュリティ投資の妥当性を判断する材料として、OWASP Top 10は様々な立場の関係者にとっての共通言語となり、組織全体のセキュリティ意識を向上させるための強力なツールなのです。
OWASP Top 10 2021 10大リスクと対策
ここからは、本題である「OWASP Top 10 2021」の10大リスクについて、一つずつ詳しく見ていきます。それぞれのリスクが「どのような脅威」であり、それに対して「どのような対策が有効か」を具体的に解説します。
① A01:2021 – アクセス制御の不備
2021年版で第1位となったのが「アクセス制御の不備」です。これは、認証されたユーザーが、本来アクセス権のない機能やデータにアクセスできてしまう脆弱性を指します。言い換えれば、「あなたは誰ですか?」という認証は通過したものの、「あなたに何をする権限がありますか?」という認可(権限管理)の仕組みが壊れている状態です。
どのような脅威か
アクセス制御の不備は、非常に広範囲にわたる深刻な問題を引き起こします。
- 権限昇格: 一般ユーザーが、管理者しか使えないはずの機能(ユーザー管理、システム設定変更など)を不正に実行できてしまう脅威です。例えば、URLを少し書き換えるだけで管理者用の画面にアクセスできてしまうケースがこれにあたります。
- 具体例: 一般ユーザーがログイン後、ブラウザのアドレスバーに表示されている
https://example.com/user/mypage
というURLをhttps://example.com/admin/dashboard
に書き換えてアクセスしたところ、本来見えないはずの管理者用ダッシュボードが表示されてしまった。
- 具体例: 一般ユーザーがログイン後、ブラウザのアドレスバーに表示されている
- 他者情報の不正閲覧・改ざん: 自分のアカウント情報しか見られないはずのページで、IDを別のユーザーのものに書き換えることで、他人の個人情報(住所、氏名、購入履歴など)を閲覧したり、改ざんしたりできてしまう脅威です。
- 具体例: 自分の注文履歴を見るページのURLが
https://example.com/orders?user_id=123
となっていた。ここで、user_id
を124
に書き換えてアクセスすると、別のユーザーの注文履歴が丸見えになってしまった。
- 具体例: 自分の注文履歴を見るページのURLが
- 機能の不正利用: 本来は特定の条件下でのみ実行可能なはずの操作が、その条件を無視して実行できてしまう脅威です。
- 具体例: ECサイトで、商品の購入手続きを完了させずに、最後の決済完了ページに直接URLでアクセスしたところ、なぜか決済が完了したことになり、商品が発送されてしまった。
これらの脅威は、ユーザーのプライバシー侵害や金銭的被害に直結するだけでなく、システム全体の乗っ取りや、大規模な情報漏洩につながる可能性も秘めています。認証さえ突破すれば、内部の機能やデータにアクセスし放題になるため、攻撃者にとって非常に魅力的な標的となります。
具体的な対策
アクセス制御の不備を防ぐための基本的な考え方は、「最小権限の原則」と「デフォルト拒否」です。
- 最小権限の原則 (Principle of Least Privilege): ユーザーやシステムに、業務を遂行するために必要最小限の権限のみを与えるという原則です。例えば、ブログ記事を投稿する権限を持つユーザーには、他のユーザーのアカウントを削除する権限は与えません。これにより、万が一アカウントが乗っ取られた際の被害を最小限に抑えます。
- デフォルト拒否 (Deny by Default): 明示的に許可されていないアクセスは、すべてデフォルトで拒否するという考え方です。特定の役割にのみアクセスを許可し、それ以外はすべてブロックする「ホワイトリスト方式」でアクセス制御を実装します。
これらの原則に基づき、以下の具体的な対策を講じることが重要です。
- サーバーサイドでの一元的なアクセス制御: アクセス制御のロジックは、クライアントサイド(ブラウザ側)ではなく、必ずサーバーサイドで一元的に実装・強制します。ブラウザ側でボタンを非表示にするだけでは、リクエストを直接サーバーに送信することで簡単にバイパスされてしまいます。
- ロールベースアクセス制御 (RBAC) の導入: 「管理者」「編集者」「閲覧者」といった役割(ロール)を定義し、各ロールに対してアクセス可能な機能やデータの権限を割り当てます。ユーザーには適切なロールを付与することで、権限管理を体系的かつ効率的に行えます。
- アクセス制御ロジックの徹底: ユーザーがアクセスしようとするすべての機能やデータに対して、リクエストごとに権限チェック処理を必ず実行します。特に、データベースからレコードを取得する際には、そのレコードの所有者がリクエスト元のユーザーと一致するかどうかを必ず検証します。
- 推測困難なIDの使用: ユーザーIDやレコードIDに、連番(1, 2, 3…)のような推測しやすい値を使用するのを避け、UUID(Universally Unique Identifier)のような長く、ランダムで推測困難な識別子を使用します。これにより、IDを推測して他人の情報にアクセスする攻撃を防ぎます。
- CORS (Cross-Origin Resource Sharing) の適切な設定: APIなど、異なるオリジンからのリクエストを受け付ける場合は、信頼できるオリジンのみを許可するようにCORSポリシーを厳格に設定します。
アクセス制御は、アプリケーションの根幹をなすセキュリティ機能です。設計段階からこれらの対策を織り込み、すべてのエンドポイントで徹底することが不可欠です。
② A02:2021 – 暗号化の失敗
第2位は「暗号化の失敗」です。これは、パスワード、クレジットカード情報、個人情報といった機密性の高いデータが、保管時(at-rest)や転送時(in-transit)に適切に暗号化されていない、あるいは暗号化が不十分であるために、情報漏洩のリスクに晒される状態を指します。以前は「機密データの公開」という名称でしたが、データそのものよりも「暗号化という行為の失敗」に焦点を当てる形に名称が変更されました。
どのような脅威か
暗号化の失敗が引き起こす脅威は、極めて直接的かつ深刻です。
- 通信の盗聴による情報漏洩: Webサイトとユーザーのブラウザ間の通信が暗号化されていない(HTTP通信である)場合、攻撃者はネットワーク経路上で通信内容を盗聴(パケットスニッフィング)し、送受信されるID、パスワード、個人情報などを平文のまま盗み取ることが可能です。これは特に、公衆Wi-Fiなど信頼性の低いネットワークで顕著な脅威となります。
- データベースからの情報漏洩: サーバー上のデータベースに保存されているパスワードや個人情報が、平文のまま、あるいは脆弱な方法で暗号化されて保存されている場合、SQLインジェクション攻撃やサーバーへの不正侵入によってデータベースが窃取された際に、すべての機密情報が流出してしまいます。
- 暗号鍵の不適切な管理による漏洩: データを適切に暗号化していても、その暗号化・復号に使用する「鍵」の管理が杜撰であれば、意味がありません。ソースコード内に鍵をハードコーディングしたり、誰でもアクセスできる場所に鍵ファイルを置いたりしていると、攻撃者に鍵を奪われ、暗号化されたデータを簡単に復号されてしまいます。
これらの脅威は、個人情報の大量漏洩、金銭的被害、なりすまし、企業の信用の失墜など、壊滅的な結果を招く可能性があります。
具体的な対策
機密データを守るためには、転送時と保管時の両方で、強力な暗号化を徹底する必要があります。
- すべての通信をTLSで暗号化 (HTTPS化):
- Webサイト全体でTLS (Transport Layer Security) を有効にし、常時HTTPS通信とすることが基本中の基本です。これにより、ユーザーのブラウザとサーバー間の通信がすべて暗号化され、中間者攻撃による盗聴を防ぎます。
- HSTS (HTTP Strict Transport Security) ヘッダを設定し、ブラウザに今後必ずHTTPSで接続するよう強制することも推奨されます。
- 利用するTLSのバージョンや暗号スイートも重要です。SSL 3.0やTLS 1.0/1.1といった古いプロトコルは脆弱性が発見されているため無効化し、TLS 1.2以上、可能であればTLS 1.3を使用します。
- 保管するデータの暗号化:
- パスワードのハッシュ化: パスワードは絶対に平文で保存してはいけません。復号できないように、BcryptやArgon2といった、計算コストが高く、ソルト(ランダムな付加データ)を自動で生成・管理してくれる現代的なハッシュ関数を用いてハッシュ値を保存します。MD5やSHA-1のような古いハッシュ関数は、レインボーテーブル攻撃などに対して脆弱なため使用を避けるべきです。
- 機密データの暗号化: パスワード以外の機密データ(個人情報、医療情報など)で、後で元のデータに戻す必要があるものは、データベースやファイルシステムレベルで暗号化します。AES (Advanced Encryption Standard) の256ビット鍵(AES-256)などが標準的な選択肢です。
- 強力な鍵管理:
- 暗号鍵は、データとは別の安全な場所に保管します。HSM (Hardware Security Module) や、クラウドサービスが提供する鍵管理サービス (KMS) の利用が最も安全な方法です。
- ソースコードや設定ファイルに鍵を直接書き込む(ハードコーディングする)のは絶対に避けてください。環境変数や専用のシークレット管理ツールを利用して、鍵を安全にアプリケーションに渡す仕組みを構築します。
- 不要なデータの破棄:
- そもそも、業務上必要のない機密データは収集・保存しないことが最も効果的な対策です。データ最小化の原則に従い、保持するデータは必要最低限に留め、保持期間が過ぎたデータは速やかに、かつ安全に消去するプロセスを確立します。
暗号化は「やっていれば良い」というものではなく、「正しく、強力な方法で」実装されて初めて意味をなします。常に最新のベストプラクティスを追いかけ、適切な技術を選択することが重要です。
③ A03:2021 – インジェクション
第3位の「インジェクション」は、長年にわたりWebアプリケーションにおける主要な脅威として知られています。これは、信頼できない外部からの入力データ(ユーザーからの入力など)が、アプリケーションが解釈するコマンドやクエリの一部として、そのまま組み込まれてしまうことで発生する脆弱性の総称です。2021年版では、これまで別項目だったクロスサイトスクリプティング(XSS)が、このインジェクションカテゴリに統合されました。
どのような脅威か
インジェクション攻撃は、注入(inject)されるコードの種類によって様々なバリエーションがありますが、代表的なものとして以下が挙げられます。
- SQLインジェクション: 最も古典的かつ破壊的なインジェクション攻撃です。Webフォームの入力欄などに、データベースへの命令文(SQL)の断片を注入することで、アプリケーションが意図しないデータベース操作を実行させます。これにより、データベース内の全データの窃取、改ざん、削除、場合によってはデータベースサーバーを足がかりにOSコマンドを実行され、サーバーを乗っ取られる可能性もあります。
- 具体例: ログインフォームのユーザーID入力欄に
' OR '1'='1
という文字列を入力する。もしアプリケーションがSELECT * FROM users WHERE user_id = '...' AND password = '...'
のように単純な文字列連結でSQLを生成している場合、最終的なSQLはSELECT * FROM users WHERE user_id = '' OR '1'='1' AND password = '...'
となり、'1'='1'
が常に真であるため、パスワードチェックを回避してログインできてしまう。
- 具体例: ログインフォームのユーザーID入力欄に
- クロスサイトスクリプティング (XSS): 攻撃者が、脆弱性のあるWebサイトに悪意のあるスクリプト(主にJavaScript)を注入し、そのサイトを訪れた他のユーザーのブラウザ上で実行させる攻撃です。XSSには、スクリプトがデータベース等に保存され、ページを閲覧するたびに実行される「格納型XSS」と、URLのパラメータなどを通じて一時的に実行される「反射型XSS」があります。これにより、セッションCookieの窃取(なりすまし)、個人情報の詐取(偽フォームの表示)、Webページの改ざんといった被害が発生します。
- OSコマンドインジェクション: ユーザーからの入力を、OS(オペレーティングシステム)のコマンドの一部として使用している箇所で発生します。攻撃者は、
&&
や;
などのメタ文字を使って、本来のコマンドに続けて任意のOSコマンドを注入し、サーバー上で実行させます。これにより、サーバー内のファイルへの不正アクセス、設定の変更、マルウェアのダウンロード、サーバーの完全な乗っ取りなど、極めて深刻な被害につながります。
具体的な対策
インジェクション攻撃を防ぐための核心は、「入力値を『データ』として扱い、決して『コード(命令)』の一部として解釈させない」ことです。そのための対策は、インジェクションの種類に応じて異なりますが、基本原則は共通しています。
- サーバーサイドでの検証とサニタイズ:
- 入力値検証(バリデーション): すべての外部からの入力(URLパラメータ、フォームの入力値、HTTPヘッダなど)に対して、それが期待される形式(数値、メールアドレス形式など)や文字種、長さに合致しているかを厳密にチェックします。想定外の入力はすべて拒否します。これは「許可リスト(ホワイトリスト)方式」で行うのが理想です。
- サニタイズ(無害化): 入力値をデータとして扱うために、文脈に応じて適切にエスケープ処理を行います。
- SQLインジェクション対策: 文字列連結でSQL文を組み立てるのをやめ、プレースホルダ(バインド機構)を必ず使用します。これは、SQL文の構造(コード)と、後から埋め込む値(データ)を明確に分離するための仕組みであり、SQLインジェクション対策の最も確実な方法です。
- XSS対策: HTMLの文脈に出力するデータは、
<
を<
に、>
を>
に変換するなど、HTMLエンティティエスケープを必ず行います。また、JavaScriptの文脈に出力する場合は、JavaScript用のエスケープ処理が必要です。フレームワークが提供するテンプレートエンジンなどを利用すると、自動で適切なエスケープが行われるため安全です。さらに、Content Security Policy (CSP) を導入し、信頼できるソースからのスクリプト実行のみを許可することも非常に効果的です。 - OSコマンドインジェクション対策: そもそも、外部からの入力値を使用してOSコマンドを生成することを極力避けるべきです。どうしても必要な場合は、コマンド実行用の安全なAPIや関数を使用し、引数を渡す際には厳密なバリデーションとエスケープを徹底します。
- Web Application Firewall (WAF) の活用: WAFを導入することで、既知のインジェクション攻撃パターンを含む不正なリクエストを検知し、ブロックできます。WAFは多層防御の一環として有効ですが、WAFだけに頼るのではなく、アプリケーション本体での根本的な対策(セキュアコーディング)と組み合わせることが不可欠です。
インジェクションは、わずかなコーディングミスから壊滅的な被害を生む可能性があります。すべての入力は信頼できないものとして扱い、適切な防御策を講じる習慣を開発者全員が身につけることが求められます。
④ A04:2021 – 安全でない設計
2021年版で新たに追加され、第4位にランクインしたのが「安全でない設計」です。これは、特定の脆弱性を指すのではなく、開発ライフサイクルの上流工程(要件定義や設計段階)におけるセキュリティ考慮の欠如そのものをリスクとして捉える、より広範で根本的な問題です。脅威モデリングが不十分であったり、セキュリティに関する設計パターンが適用されていなかったりすることが原因で、後工程で数多くの脆弱性が作り込まれてしまいます。
どのような脅威か
安全でない設計は、アプリケーションに内在する「設計上の欠陥」として現れます。これは、個々の実装のバグとは異なり、アプリケーションの構造そのものに問題を抱えている状態です。
- ビジネスロジックの悪用: 設計段階で、正常系だけでなく異常系のユースケースや攻撃者の視点が考慮されていない場合、ビジネスロジックの隙を突かれます。
- 具体例1(価格改ざん): ECサイトで、商品の価格がクライアント側(ブラウザ)から送信されるリクエストに含まれていた。攻撃者はそのリクエストを改ざんし、10,000円の商品を1円で購入することに成功した。これは、価格はサーバー側で確定させるべきという設計が欠如していたために発生しました。
- 具体例2(無限クーポン利用): 一度しか使えないはずのクーポンコードが、サーバー側で使用済みチェックを厳密に行う設計になっていなかったため、同じコードを何度も利用して商品を不正に安く購入されてしまった。
- 脅威モデリングの欠如: アプリケーションの資産(データ、機能)、脅威、脆弱性を体系的に洗い出し、対策を検討する「脅威モデリング」を行わずに開発を進めた結果、予期せぬ攻撃経路が見過ごされてしまいます。例えば、パスワードリセット機能の設計において、リセットトークンが推測可能であったり、有効期限がなかったりする設計ミスがこれにあたります。
- 不十分な分離・隔離: 異なる権限レベルや信頼レベルのコンポーネントが、適切に分離されていない設計。例えば、一般ユーザーが利用する機能と、機密データを扱う管理機能が、同じネットワークセグメントやプロセス内で密接に結合していると、一つの脆弱性を突かれた際に被害がシステム全体に波及しやすくなります。
- リソース消費攻撃への無配慮: ファイルアップロードの容量制限、APIのレート制限、パスワード試行回数の制限といった保護メカニズムが設計に盛り込まれていない場合、サービス妨害(DoS)攻撃に対して脆弱になります。
これらの問題は、後からパッチを当てて修正するのが非常に困難、あるいは不可能な場合があります。アプリケーションの土台となる設計図自体に欠陥があるため、根本的な解決には大規模な改修が必要となり、多大なコストと時間がかかります。
具体的な対策
安全でない設計を防ぐには、「シフトレフト」の考え方が不可欠です。これは、開発ライフサイクルの早い段階(左側)でセキュリティを組み込むアプローチを指します。
- セキュア開発ライフサイクル (SDL) の導入:
- 要件定義、設計、実装、テスト、デプロイ、運用のすべてのフェーズに、セキュリティ活動を統合します。これには、Microsoft SDLやOWASP SAMM (Software Assurance Maturity Model) といったフレームワークが参考になります。
- 脅威モデリングの実践:
- 設計段階で、「このアプリケーションの守るべき資産は何か?」「どのような攻撃者が、どのような手口でそれを狙う可能性があるか?」「どこに脆弱性が生まれそうか?」といったことを体系的に分析します。STRIDE(なりすまし、改ざん、否認、情報漏洩、サービス拒否、権限昇格)のようなフレームワークを用いて、潜在的な脅威を洗い出し、それに対する設計レベルでの対策(コントロール)を決定します。
- セキュア設計パターンの活用:
- 過去の教訓から生まれた、セキュリティ上の問題を解決するための再利用可能な設計パターン(例:エラーハンドリング、認証・認可、ログ記録など)を積極的に活用します。これにより、車輪の再発明を避け、実績のある安全な設計を効率的に導入できます。
- セキュリティ要件の定義:
- 機能要件と並行して、「パスワードはBcryptでハッシュ化すること」「すべての個人情報を含む通信はTLS 1.2以上で暗号化すること」といった具体的な非機能要件(セキュリティ要件)を明確に定義し、開発チーム全体で共有します。
- 設計レビューの実施:
- 実装に入る前に、セキュリティ専門家を交えて設計書をレビューし、設計上の欠陥がないか、脅威モデリングの結果が適切に反映されているかを確認するプロセスを設けます。
安全なソフトウェアは、後からセキュリティを追加するのではなく、最初から安全に設計されるべきです。この「A04: 安全でない設計」は、その原則の重要性を強く訴えかける項目と言えます。
⑤ A05:2021 – セキュリティ設定のミス
第5位は「セキュリティ設定のミス」です。これは、アプリケーション、フレームワーク、Webサーバー、データベース、クラウドサービスなどの各種コンポーネントにおいて、セキュリティに関する設定が不適切、あるいはデフォルトのまま運用されていることが原因で生じる脆弱性です。
どのような脅威か
セキュリティ設定のミスは、非常に広範囲に及び、攻撃者に侵入の足がかりを与えてしまうケースが後を絶ちません。
- 不要な機能やポートの有効化:
- Webサーバーやアプリケーションサーバーに、デバッグ機能やサンプルアプリケーション、管理コンソールなどがデフォルトで有効化されたまま本番環境で運用されていると、それらが攻撃の入口となる可能性があります。また、ファイアウォールで不要なポート(通信の出入口)が開いていると、そこから内部ネットワークへ侵入されるリスクが高まります。
- デフォルトアカウントとパスワードの利用:
- 多くのミドルウェアや管理ツールには、
admin/admin
やroot/password
のような、よく知られたデフォルトの認証情報が設定されています。これを変更せずに運用していると、攻撃者は簡単にログインできてしまいます。
- 多くのミドルウェアや管理ツールには、
- 冗長なエラーメッセージの表示:
- アプリケーションでエラーが発生した際に、データベースのバージョン、内部のファイルパス、ソースコードの断片といった、システムの内部構成に関する詳細な情報をエラーメッセージとしてユーザーに表示してしまうケースです。これらの情報は、攻撃者がさらなる攻撃を計画するための重要なヒントとなります。
- クラウドサービスの設定不備:
- 近年、特に深刻化しているのがクラウドサービス(AWS, Azure, GCPなど)の設定ミスです。例えば、Amazon S3バケットのアクセス権限を誤って「公開」に設定してしまい、保存されていた顧客情報や機密ファイルが誰でも閲覧可能な状態になっていた、というインシデントが頻発しています。
- 不適切なHTTPヘッダ:
- セキュリティを強化するためのHTTPヘッダ(
Content-Security-Policy
,X-Content-Type-Options
など)が設定されていなかったり、逆にサーバーのバージョン情報などを開示してしまう不要なヘッダ(Server
,X-Powered-By
)が表示されていたりする状態です。
- セキュリティを強化するためのHTTPヘッダ(
これらの設定ミスは、一つ一つは些細に見えるかもしれませんが、組み合わさることで深刻なセキュリティホールとなり得ます。
具体的な対策
セキュリティ設定のミスを防ぐ基本は、不要なものを無効化し、必要なものを最小限の権限で安全に設定する「ハードニング(堅牢化)」というプロセスです。
- 安全な構成プロセスの確立:
- 再現可能で自動化されたプロセスを構築します。手作業でのサーバー構築やデプロイは、設定ミスや漏れの原因となります。Infrastructure as Code (IaC) ツール(Terraform, Ansibleなど)を用いて、セキュリティ設定を含んだ構成をコードで管理し、誰がやっても同じ安全な環境が構築できるようにします。
- 不要な機能・コンポーネントの無効化:
- アプリケーションやサーバーをセットアップする際は、業務に不要な機能、ポート、アカウント、サービスはすべて無効化、あるいはアンインストールします。最小限の構成で運用することが、攻撃対象領域(アタックサーフェス)を減らす上で極めて重要です。
- デフォルト設定の変更:
- 提供されているコンポーネントのデフォルトの認証情報は、必ず運用開始前に推測困難なものに変更します。
- エラーハンドリングの統一:
- アプリケーションで例外が発生した場合は、ユーザーには「エラーが発生しました。管理者にお問い合わせください」のような汎用的なメッセージのみを表示します。詳細なエラー情報(スタックトレースなど)は、ユーザーに見せず、サーバー側のログにのみ記録するようにします。
- クラウドセキュリティポスチャ管理 (CSPM):
- クラウド環境を利用している場合、CSPMツールを導入し、セキュリティ設定のベストプラクティスからの逸脱(例:公開されているS3バケット、広すぎるネットワークアクセスルールなど)を継続的に監視し、自動で検知・修正する仕組みを整えることが強く推奨されます。
- 定期的な設定レビュー:
- 一度設定して終わりではなく、定期的に(例えば四半期に一度)サーバーやクラウドのセキュリティ設定を見直し、最新のベストプラクティスに沿っているか、新たな脅威に対応できているかを確認するプロセスを設けます。
セキュリティ設定は、アプリケーションコードと同様に、継続的なメンテナンスが必要な対象であるという認識を持つことが重要です。
⑥ A06:2021 – 脆弱で古くなったコンポーネント
第6位は「脆弱で古くなったコンポーネント」です。現代のWebアプリケーションは、オープンソースのライブラリやフレームワーク、サードパーティ製のAPIなど、無数の「コンポーネント(部品)」を組み合わせて作られています。このリスクは、そうしたコンポーネント自体に既知の脆弱性が存在する場合や、バージョンが古くメーカーのサポートが終了している場合に、アプリケーション全体が危険に晒される状態を指します。
どのような脅威か
コンポーネントの脆弱性を利用した攻撃は、攻撃者にとって非常に効率的です。なぜなら、一つの人気ライブラリに脆弱性が見つかれば、そのライブラリを利用している世界中の何万ものWebサイトを、同じ手口で攻撃できる可能性があるからです。
- 既知の脆弱性の悪用:
- ライブラリやフレームワークにセキュリティ上の欠陥(脆弱性)が発見されると、その情報はCVE (Common Vulnerabilities and Exposures) のようなデータベースに登録され、一般に公開されます。攻撃者はこれらの情報を常に監視しており、脆弱性が公表されたにもかかわらず、修正パッチを適用していない(アップデートしていない)システムを狙って攻撃を仕掛けます。2017年に発生したEquifax社の大規模情報漏洩事件は、Apache Struts2というフレームワークの既知の脆弱性を放置していたことが原因であり、このリスクの深刻さを象徴する事例です。
- サポート切れ(EOL)コンポーネントの使用:
- ソフトウェアには、メーカーがセキュリティパッチの提供を含むサポートを終了する「End of Life (EOL)」が設定されています。EOLを迎えたOS、ミドルウェア、ライブラリを使い続けると、新たに見つかった脆弱性に対する修正パッチが提供されないため、無防備な状態になります。
- ソフトウェアサプライチェーン攻撃:
- 攻撃者が、広く使われているオープンソースライブラリの開発プロセスに侵入し、悪意のあるコードを正規のアップデートに紛れ込ませる攻撃です。開発者は、信頼しているライブラリをいつも通りアップデートしただけで、意図せずマルウェアを自身のアプリケーションに組み込んでしまうことになります。これは、コンポーネントの依存関係が複雑に絡み合う現代の開発において、非常に深刻な脅威となっています。
自分の書いたコードには一点の曇りもなくても、利用しているコンポーネントの一つに問題があるだけで、アプリケーション全体が危険に晒される。これが「脆弱で古くなったコンポーネント」の脅威の本質です。
具体的な対策
このリスクに対処するには、自分のアプリケーションが「何に依存しているのか」を正確に把握し、それらを常に最新かつ安全な状態に保つための仕組み作りが不可欠です。
- ソフトウェア部品表 (SBOM) の作成と管理:
- アプリケーションが利用しているすべてのコンポーネント(ライブラリ、フレームワークなど)とそのバージョンを一覧化した「SBOM (Software Bill of Materials)」を作成し、維持管理します。これにより、どのコンポーネントを利用しているかを正確に把握できます。Node.jsの
package-lock.json
やJavaのMaven/Gradleの依存関係定義ファイルなどが、SBOMの元情報となります。
- アプリケーションが利用しているすべてのコンポーネント(ライブラリ、フレームワークなど)とそのバージョンを一覧化した「SBOM (Software Bill of Materials)」を作成し、維持管理します。これにより、どのコンポーネントを利用しているかを正確に把握できます。Node.jsの
- 脆弱性スキャンツールの導入:
- SCA (Software Composition Analysis) ツールを開発パイプライン(CI/CD)に組み込みます。SCAツールは、SBOMを基に、利用しているコンポーネントに既知の脆弱性(CVE)が存在しないかを自動でスキャンし、問題があれば警告を発してくれます。GitHubのDependabotやSnyk、Trivyといったツールが広く利用されています。
- 不要な依存関係の削除:
- 定期的にプロジェクトの依存関係を見直し、現在使用していないライブラリや機能は削除します。これにより、管理対象を減らし、潜在的な攻撃対象領域を最小化します。
- コンポーネントの定期的なアップデート:
- セキュリティパッチがリリースされたら、速やかに適用するプロセスを確立します。CI/CDパイプラインで自動テストを整備しておけば、ライブラリのアップデートによる意図しない不具合(デグレード)を検知しやすくなり、安全かつ迅速にアップデートできるようになります。
- 信頼できるソースからの取得:
- コンポーネントは、公式のリポジトリ(NPM, Maven Centralなど)から取得します。信頼性の低い、あるいは非公式なソースからダウンロードしたコンポーネントは、マルウェアが混入しているリスクがあるため、使用を避けるべきです。
もはや、自社のコードだけを管理していれば安全だという時代は終わりました。利用するすべてのコンポーネントを含めた、ソフトウェアサプライチェーン全体を管理するという視点が、現代のアプリケーション開発には不可欠です。
⑦ A07:2021 – 識別と認証の失敗
第7位は「識別と認証の失敗」です。これは、ユーザーが「誰であるか」を正しく確認するための機能(認証)や、セッション(ログイン状態)を管理する仕組みに関連する脆弱性を指します。以前は「認証の不備」という名称でしたが、アカウントの存在を確認する「識別」段階の問題も含む、より広い概念として更新されました。
どのような脅威か
認証メカニズムの不備は、攻撃者によるアカウントの乗っ取りに直結します。
- ブルートフォース攻撃(総当たり攻撃):
- 特定のユーザーIDに対して、考えられるすべてのパスワードの組み合わせを機械的に試行し、ログインを試みる攻撃です。パスワードが単純であったり、ログイン試行回数に制限がなかったりすると、成功する可能性が高まります。
- クレデンシャルスタッフィング:
- 他のサービスから漏洩したIDとパスワードのリストを利用し、標的のサイトで同じ組み合わせを試してログインを試みる攻撃です。多くのユーザーが複数のサービスで同じパスワードを使い回している傾向を悪用します。これは現代において非常に一般的で、成功率の高い攻撃手法です。
- セッション管理の不備:
- セッション固定化(Session Fixation): 攻撃者が事前に用意したセッションIDをユーザーに使わせることで、ユーザーがログインした後にそのセッションを乗っ取る攻撃。
- セッションタイムアウトの欠如: ユーザーがログアウトし忘れたり、ブラウザを閉じたりしても、サーバー側でセッションが長時間有効なままである場合、第三者がそのPCを操作してなりすましができてしまいます。
- URLへのセッションIDの埋め込み: セッションIDがURLのパラメータに含まれていると、ブラウザの履歴やログファイル、リファラ情報などからセッションIDが漏洩し、乗っ取られるリスクがあります。
- 脆弱なパスワードリカバリー:
- パスワードを忘れた際の再設定プロセスが脆弱な場合、それを悪用してアカウントを乗っ取られる可能性があります。「秘密の質問」が母親の旧姓など、ソーシャルエンジニアリングで容易に推測できるものであったり、再設定用のURLが推測可能であったりするケースが該当します。
これらの攻撃により、正規のユーザーになりすまして個人情報を盗んだり、不正な取引を行ったり、他のユーザーを攻撃する踏み台にしたりすることが可能になります。
具体的な対策
強力な認証と安全なセッション管理を実装することが、このリスクへの対策の鍵となります。
- 多要素認証 (MFA) の導入:
- 最も効果的な対策の一つがMFA(Multi-Factor Authentication)の導入です。パスワード(知識情報)に加えて、スマートフォンアプリへの通知(所有物情報)や指紋認証(生体情報)など、複数の要素を組み合わせることで、たとえパスワードが漏洩しても不正ログインを劇的に防ぐことができます。特に管理者アカウントや機密情報を扱うアカウントには必須とすべきです。
- 強力なパスワードポリシーの強制:
- パスワードの最小文字数(例:12文字以上)、複雑性(大文字、小文字、数字、記号を含む)を要求します。
- よく使われる単純なパスワード(”password”, “123456”など)のリスト(NISTなどが公開)と照合し、それらの使用を禁止します。
- パスワードの定期的な強制変更は、ユーザーがより弱いパスワードを使い回す原因になるため、現在では非推奨とされています。代わりに、パスワード漏洩が検知された場合にのみ変更を要求するアプローチが推奨されます。
- ログイン試行の保護:
- 短時間に複数回のログイン失敗があった場合、アカウントを一時的にロックアウトする(例:5回失敗したら15分間ログイン不可)機能を実装し、ブルートフォース攻撃を緩和します。
- 安全なセッション管理:
- ログイン成功後には、必ず新しく、長く、ランダムなセッションIDを生成してユーザーに割り当てます(セッション固定化対策)。
- セッションIDは、安全な
HttpOnly
属性とSecure
属性を付けたCookieに保存し、URLパラメータには含めません。 - 一定時間操作がない場合には自動的にセッションが切れるタイムアウト(例:30分)と、ログイン後の最大有効期間である絶対タイムアウト(例:8時間)を設定します。
- ログアウト時には、サーバー側でセッション情報を確実に破棄します。
- 安全なパスワードリセット機能:
- パスワードリセットを要求したユーザー本人であることを確認するために、登録済みのメールアドレスや電話番号に、有効期限が短く、一度しか使えない、推測困難なランダムなトークンを含むリンクを送信します。
認証は、Webアプリケーションの「玄関」です。この玄関の鍵を堅牢にすることで、多くの脅威を未然に防ぐことができます。
⑧ A08:2021 – ソフトウェアとデータの整合性の不具合
2021年版で新たに追加された第8位のリスクは「ソフトウェアとデータの整合性の不具合」です。これは、コードやインフラストラクチャ、そしてアプリケーションが処理するデータが、そのライフサイクルを通じて意図せず改ざんされていないこと(=整合性)を検証する仕組みの欠如を指します。特に、自動化されたCI/CD (継続的インテグレーション/継続的デプロイメント) パイプラインや、外部ソースからのデータ取り込みプロセスが主な攻撃対象となります。
どのような脅威か
このリスクは、ソフトウェアのサプライチェーンやデータの信頼性そのものを揺るがす、巧妙で検知が難しい攻撃につながります。
- CI/CDパイプラインへの攻撃:
- 攻撃者がソースコードリポジトリ(Gitなど)やビルドサーバーに侵入し、開発者が気づかないうちに悪意のあるコードを紛れ込ませます。そのコードは正規のビルド・デプロイプロセスを経て、本番環境にリリースされてしまいます。これにより、バックドアが設置されたり、顧客データが外部に送信されたりする可能性があります。
- 信頼できないソースからのアップデート:
- アプリケーションやサーバーが、安全性が検証されていないネットワーク上の場所からソフトウェアのアップデートを取得するよう設定されている場合、攻撃者はその通信に割り込み(中間者攻撃)、正規のアップデートの代わりにマルウェアを送り込むことができます。
- 安全でないデシリアライゼーション:
- 多くのプログラミング言語には、オブジェクト(データの塊)をバイトストリーム(送受信や保存が可能な形式)に変換する「シリアライゼーション」と、その逆を行う「デシリアライゼーション」という機能があります。外部から受け取った信頼できないデータを無防備にデシリアライズすると、攻撃者が細工したオブジェクトを生成させられ、予期せぬコード実行(リモートコード実行)やサービス拒否攻撃につながる可能性があります。これは非常に深刻な脆弱性であり、アプリケーションを完全に制御される危険性をはらんでいます。
これらの脅威は、信頼されているはずのプロセスやデータソースを悪用するため、従来のファイアウォールやアンチウイルスソフトでは検知が困難な場合があります。
具体的な対策
ソフトウェアとデータのライフサイクル全体で、その「正しさ」を検証する仕組みを導入することが対策の核となります。
- デジタル署名による完全性検証:
- ソフトウェアのアップデートや重要なライブラリを配布・取得する際は、デジタル署名を用いて、それが正規の提供元から発行され、途中で改ざんされていないことを検証します。多くのOSやパッケージマネージャーは、この仕組みを標準で備えています。
- CI/CDパイプラインの保護:
- ビルドサーバーやソースコードリポジトリへのアクセス制御を厳格化し、最小権限の原則を徹底します。
- コミット(コードの変更)に対して作者の電子署名を要求する(例:GPG署名)ことで、なりすましによる不正なコードの混入を防ぎます。
- パイプラインの各ステップ(ビルド、テスト、デプロイ)で使用するツールやスクリプト自体の整合性も定期的に検証します。
- 安全なデシリアライゼーションの実践:
- 可能な限り、信頼できないソースからのデータをデシリアライズすることは避けるべきです。JSONやXMLのような、コード実行の危険性がない、より安全なデータ形式の利用を優先します。
- どうしてもデシリアライゼーションが必要な場合は、デシリアライズされるオブジェクトの型を厳密に制限(ホワイトリスト化)し、意図しない型のオブジェクトが生成されないようにします。また、デシリアライゼーション処理を監視し、不審な挙動を検知する仕組みを導入することも有効です。
- 依存関係の整合性チェック:
npm
のpackage-lock.json
やyarn
のyarn.lock
、pip
のrequirements.txt
とハッシュ値など、パッケージマネージャーが提供するロックファイルとハッシュ検証の仕組みを活用し、インストールされるライブラリが意図したバージョンであり、改ざんされていないことを保証します。
このリスクは、開発プロセスの信頼性そのものに関わる問題です。開発から運用に至るまで、すべてのコンポーネントとデータが「信頼できるものである」ことを継続的に検証する文化と仕組みを構築することが求められます。
⑨ A09:2021 – セキュリティログとモニタリングの失敗
第9位は「セキュリティログとモニタリングの失敗」です。これは、セキュリティに関連するイベント(ログイン試行、アクセス制御の失敗、重要なトランザクションなど)が十分に記録(ロギング)されていなかったり、記録されたログが適切に監視(モニタリング)・分析されていなかったりする状態を指します。
どのような脅威か
ログとモニタリングの不備は、直接的な脆弱性ではありませんが、他の脆弱性を突かれた際の被害を拡大させる重大な要因となります。言わば、建物の防犯カメラが動いていない、あるいは録画データを見ていない状態と同じです。
- 攻撃の検知の遅れ:
- 不正アクセスやその試みがあっても、それを記録・監視する仕組みがなければ、攻撃が行われていること自体に気づくことができません。攻撃者は数週間から数ヶ月もの間、システム内部で潜伏し、自由に活動できてしまいます。検知までの時間が長引けば長引くほど、被害は深刻化します。
- インシデント対応の困難化:
- 万が一セキュリティインシデント(情報漏洩など)が発生した際に、ログがなければ、「いつ、誰が、どこから、何をしたのか」という攻撃の全容を解明することができません。原因究明ができなければ、根本的な対策を講じることも、被害範囲を特定することも困難になります。
- 証拠の喪失:
- ログは、攻撃者を特定し、法的な措置を取るための重要な証拠となります。適切なログがなければ、攻撃の事実を証明することができず、泣き寝入りせざるを得ない状況に陥る可能性があります。
- コンプライアンス違反:
- PCI DSSやGDPR、各種法令など、多くの規制やガイドラインでは、セキュリティイベントのログを適切に取得・保管することが義務付けられています。これを怠ることは、コンプライアンス違反となり、罰金などのペナルティを課される可能性があります。
ログとモニタリングは、受動的ながらも極めて重要なセキュリティ対策です。これがなければ、セキュリティ対策が有効に機能しているかどうかの確認すらできません。
具体的な対策
効果的なログとモニタリング体制を構築するには、何を、どのように記録し、どう監視するかを計画的に実装する必要があります。
- 十分なログの取得:
- どのようなイベントをログに記録すべきかを明確に定義します。OWASPでは、以下のようなイベントのロギングを推奨しています。
- 認証イベント: ログインの成功・失敗、パスワードリセット、ログアウトなど。
- アクセス制御: 権限のないリソースへのアクセス試行(成功・失敗)。
- 入力値検証: バリデーションに失敗した入力。
- 重要なトランザクション: 支払い、送金、個人情報の変更など。
- 管理者による操作: ユーザーの追加・削除、権限変更など。
- 各ログには、いつ(タイムスタンプ)、どこから(ソースIPアドレス)、誰が(ユーザーID)、何をしたか(イベント内容)といった、事後調査に必要な情報を含めます。
- どのようなイベントをログに記録すべきかを明確に定義します。OWASPでは、以下のようなイベントのロギングを推奨しています。
- ログフォーマットの標準化と集中管理:
- 複数のサーバーやアプリケーションからログを収集する場合、フォーマットがバラバラだと分析が困難になります。JSON形式など、機械処理しやすい共通のフォーマットでログを出力するようにします。
- 収集したログは、改ざん防止機能を持つ中央集権的なログ管理サーバーに集約します。
- SIEM/SOARの活用による監視とアラート:
- 集約したログを目視で常に監視するのは不可能です。SIEM (Security Information and Event Management) ツールを導入し、ログをリアルタイムで相関分析させ、不審なアクティビティのパターン(例:短時間に同一IPから多数のログイン失敗)を自動で検知し、セキュリティ担当者にアラートを通知する仕組みを構築します。
- さらに、SOAR (Security Orchestration, Automation and Response) を組み合わせることで、特定のアラートに対してIPアドレスのブロックなどの対応を自動化することも可能です。
- 定期的なテストとレビュー:
- ログが正しく取得できているか、アラートが期待通りに機能するかを定期的にテストします。また、インシデントを想定した訓練(サイバー演習)を行い、ログを活用した対応プロセスが有効かを確認・改善します。
ログは、インシデントが発生した後の「最後の砦」です。攻撃を防ぐだけでなく、「攻撃されたことに気づき、対応する」ための準備を怠らないことが、事業継続性の観点から極めて重要です。
⑩ A10:2021 – サーバサイドリクエストフォージェリ(SSRF)
2021年版で新たに追加され、第10位にランクインしたのが「SSRF (Server-Side Request Forgery)」です。これは、攻撃者が、脆弱性のあるサーバーを「踏み台」にして、そのサーバーから意図しないリクエストを別のサーバー(外部の第三者サーバーや、通常はアクセスできないはずの内部ネットワーク上のサーバー)に送信させることができる攻撃です。
どのような脅威か
SSRFの脆弱性があると、攻撃者はWebサーバーを代理人として、様々な悪意のある活動を行うことができます。特にクラウド環境の普及に伴い、その脅威は増大しています。
- 内部ネットワークへのポートスキャン:
- 攻撃者は、脆弱なサーバーを踏み台にして、ファイアウォールの内側にある内部ネットワーク(イントラネット)に対してポートスキャンを実行できます。これにより、内部にどのようなサーバーが存在し、どのサービスが動いているかといった、内部ネットワークの構成情報を偵察することが可能になります。
- 内部サービスへの攻撃:
- 偵察によって明らかになった内部サーバー(データベース、ファイルサーバー、社内システムなど)に対して、脆弱なサーバー経由で攻撃を仕掛けます。これらは通常、外部から直接アクセスできないように保護されているため、SSRFはファイアウォールを迂回して内部システムを攻撃するための強力な手段となります。
- クラウドのメタデータサービスへのアクセス:
- AWSやGCPなどのクラウド環境では、仮想サーバー(インスタンス)は、特別なIPアドレス(例:AWSでは
169.254.169.254
)にアクセスすることで、自身のメタデータ(インスタンスID、セキュリティグループ情報など)や、一時的な認証情報(IAMロールのクレデンシャル)を取得できます。SSRFの脆弱性があると、攻撃者はこのメタデータサービスにアクセスさせ、クラウド環境の認証情報を窃取することができてしまいます。この情報を悪用されると、クラウドアカウントを乗っ取られ、甚大な被害につながる恐れがあります。
- AWSやGCPなどのクラウド環境では、仮想サーバー(インスタンス)は、特別なIPアドレス(例:AWSでは
- 外部の第三者への攻撃:
- 脆弱なサーバーから、全く無関係の第三者のWebサイトへ大量のリクエストを送信させ、DDoS攻撃の踏み台として悪用することも可能です。この場合、攻撃元は脆弱なサーバーのIPアドレスとなるため、攻撃者は自身の身元を隠蔽できます。
SSRFは、Webサーバーの信頼性を悪用して、本来届かないはずの場所に攻撃を到達させる、非常に巧妙な攻撃手法です。
具体的な対策
SSRF攻撃を防ぐには、アプリケーションがサーバーサイドからリクエストを送信する際の、宛先URLの検証を厳格に行うことが基本となります。
- ネットワークレベルでの分離:
- Webサーバーからの外部へのリクエストを、プロキシサーバー経由に限定したり、ファイアウォールで送信先を制限したりすることで、意図しない場所への通信を防ぎます。特に、クラウドのメタデータサービスへのアクセスは、特別な理由がない限り、Webサーバーからは禁止すべきです。
- アプリケーションレベルでのURL検証:
- ユーザーが指定したURLをリクエストの宛先として使用する場合、そのURLを厳密に検証する必要があります。
- 許可リスト(ホワイトリスト)方式の採用: 最も安全な方法は、アクセスを許可するドメイン名やIPアドレス、ポート、スキーマ(
http
,httpsa
など)をあらかじめリスト化しておき、それ以外の宛先へのリクエストはすべて拒否することです。 - 拒否リスト(ブラックリスト)方式の回避:
localhost
や127.0.0.1
、169.254.169.254
といった特定の文字列を禁止する「拒否リスト」方式は、127.0.0.1
を[::1]
(IPv6表記)や2130706433
(十進数表記)のようにエンコードすることで回避される可能性があるため、不完全であり避けるべきです。
- レスポンスの無効化:
- リクエスト先のサーバーからのレスポンスを、クライアント(攻撃者)にそのまま返さないようにします。レスポンスボディを返す必要がない場合は、ヘッダー情報のみを処理するなど、返す情報を最小限にすることで、攻撃者が内部情報を偵察するのを困難にします。
- WAF/APIゲートウェイの活用:
- WAFやAPIゲートウェイの中には、SSRF攻撃のパターンを検知してブロックする機能を持つものがあります。多層防御の一環として活用することが有効です。
Webページの内容を取得したり、Webhookを送信したりと、サーバーから外部へリクエストを送信する機能は一般的ですが、その実装には細心の注意が必要です。ユーザーからの入力を信用せず、送信先を厳密に制御することが、SSRF対策の鉄則です。
2017年版からの変更点
OWASP Top 10は、脅威の動向を反映して定期的に更新されます。2021年版は、2017年版からいくつかの重要な変更が加えられました。データ収集の方法論が改善され、より広範なデータセットに基づいた分析が行われた結果、3つの新しいカテゴリが追加され、いくつかのカテゴリが統合・名称変更されました。
順位 | OWASP Top 10 2021 | 順位 | OWASP Top 10 2017 | 変更の概要 |
---|---|---|---|---|
1 | A01:2021 – アクセス制御の不備 | 5 | A5:2017 – 壊れたアクセス制御 | 順位が上昇。「壊れた」から「不備」へ名称変更。 |
2 | A02:2021 – 暗号化の失敗 | 3 | A3:2017 – 機密データの公開 | 順位が上昇。名称変更で「失敗」という行為に焦点。 |
3 | A03:2021 – インジェクション | 1 | A1:2017 – インジェクション | 順位は下降したが、A7:2017-XSSを統合。 |
4 | A04:2021 – 安全でない設計 | – | – | 新規追加カテゴリ |
5 | A05:2021 – セキュリティ設定のミス | 6 | A6:2017 – 安全でない設定 | A4:2017-XXEを統合し、順位が上昇。 |
6 | A06:2021 – 脆弱で古くなったコンポーネント | 9 | A9:2017 – 既知の脆弱性を持つコンポーネントの使用 | 順位が大幅に上昇。名称変更。 |
7 | A07:2021 – 識別と認証の失敗 | 2 | A2:2017 – 認証の不備 | 順位は下降したが、より広い概念に名称変更。 |
8 | A08:2021 – ソフトウェアとデータの整合性の不具合 | – | – | 新規追加カテゴリ |
9 | A09:2021 – セキュリティログとモニタリングの失敗 | 10 | A10:2017 – 不十分なロギングとモニタリング | 順位が上昇。名称変更。 |
10 | A10:2021 – サーバサイドリクエストフォージェリ(SSRF) | – | – | 新規追加カテゴリ |
参照:OWASP Top 10 2021
新しく追加された3つのリスク
2021年版では、現代のアプリケーション開発と脅威の状況を反映した3つのリスクが新たに追加されました。
- A04:2021 – 安全でない設計:
これは、2021年版の最も象徴的な変更点の一つです。これまでのTop 10が実装レベルの脆弱性に焦点を当てていたのに対し、このカテゴリは「シフトレフト」の重要性を明確に示しています。つまり、セキュリティは開発の後工程で付け加えるものではなく、ライフサイクルの最初期、設計段階から組み込まれるべきだという考え方です。脅威モデリングやセキュア設計パターンの欠如が、いかに多くの脆弱性の根源となるかを強調しています。 - A08:2021 – ソフトウェアとデータの整合性の不具合:
このカテゴリの追加は、ソフトウェアサプライチェーン攻撃の脅威の高まりを背景としています。CI/CDパイプラインの普及により開発プロセスが自動化される一方で、そのパイプライン自体が新たな攻撃対象となっています。また、外部ライブラリへの依存度の高まりや、安全でないデシリアライゼーションのような高度な攻撃手法への警鐘も含まれており、開発プロセス全体の信頼性を確保する必要性を訴えています。 - A10:2021 – サーバサイドリクエストフォージェリ (SSRF):
SSRF自体は新しい攻撃手法ではありませんが、コミュニティからの注目度が非常に高かったことから、独立したカテゴリとして追加されました。これは、クラウドネイティブなアーキテクチャの普及と密接に関連しています。アプリケーションが内部のマイクロサービスやクラウドのメタデータサービスと通信する機会が増えたことで、SSRFの脆弱性が悪用された際のインパクトが格段に大きくなったためです。
統合・名称変更されたリスク
新しいカテゴリの追加に伴い、既存のカテゴリも整理・再編されました。
- A03:2021 – インジェクション (XSSを統合):
2017年版では独立したカテゴリだった「A7:2017 – クロスサイトスクリプティング (XSS)」が、「インジェクション」に統合されました。データ分析の結果、XSSは依然として頻度の高い脆弱性であるものの、他のインジェクション(SQLi, NoSQLiなど)と同様に「信頼できない入力をコマンドやクエリとして解釈させてしまう」という根本原因は共通しているため、より大きな概念であるインジェクションの一部として扱われることになりました。 - A05:2021 – セキュリティ設定のミス (XXEを統合):
2017年版の「A4:2017 – XML外部実体参照 (XXE)」が、「セキュリティ設定のミス」に統合されました。これは、多くのアプリケーションでXMLパーサーのデフォルト設定が安全でないことがXXE脆弱性の主な原因であり、設定ミスの一種として捉えるのが妥当と判断されたためです。 - 名称の変更:
A01
: 「壊れたアクセス制御」→「アクセス制御の不備」A02
: 「機密データの公開」→「暗号化の失敗」A07
: 「認証の不備」→「識別と認証の失敗」
これらの名称変更は、より正確で包括的な表現を目指したものです。「暗号化の失敗」のように、問題の原因となる「行為」に焦点を当てることで、対策の方向性をより明確に示唆する意図があります。
これらの変更は、OWASP Top 10が単なる脆弱性のリストではなく、セキュリティコミュニティの共通認識の変化や、技術トレンドの進化を反映するダイナミックな指標であることを示しています。
OWASP Top 10を自社のセキュリティ対策に活かす方法
OWASP Top 10は、単に読んで理解するだけでは意味がありません。自社のWebアプリケーションや開発プロセスに照らし合わせ、具体的なアクションに繋げることが重要です。ここでは、OWASP Top 10を自社のセキュリティ対策に活かすための4つの具体的な方法を紹介します。
脆弱性診断で自社サイトをチェックする
まず最初に行うべきことは、自社のWebアプリケーションがOWASP Top 10で指摘されているようなリスクを抱えていないか、現状を把握することです。そのための最も効果的な手段が「脆弱性診断」です。
脆弱性診断とは、専門のツールや技術者が、実際にアプリケーションを動作させたりソースコードを解析したりして、セキュリティ上の問題点(脆弱性)を洗い出す検査のことです。
- 診断におけるOWASP Top 10の活用:
多くの脆弱性診断サービスやツールは、OWASP Top 10を診断項目の中核に据えています。診断を依頼する際に、「OWASP Top 10 2021の項目を網羅した診断をお願いします」とリクエストすることで、自社サイトが世界的な基準に対してどの程度安全かを客観的に評価できます。 - 診断の種類:
- ツール診断(動的スキャン/DAST): 実際に動作しているアプリケーションに対して、ツールが自動で様々な攻撃パターンを模したリクエストを送信し、脆弱な応答がないかを確認します。インジェクションやセキュリティ設定のミスなど、多くの脆弱性を効率的に発見できます。
- 手動診断(ペネトレーションテスト): セキュリティ専門家が、ツールの診断結果を元に、より深く、ビジネスロジックの欠陥やアクセス制御の不備など、ツールでは発見が難しい脆弱性を手動で探索・検証します。より高度で実践的な診断方法です。
- ソースコード診断(静的スキャン/SAST): アプリケーションのソースコードを解析し、脆弱性が潜んでいる可能性のあるコードの記述パターンを検出します。開発の早期段階で問題を発見できるのが利点です。
定期的な脆弱性診断の実施は、人間ドックと同じです。新規開発時や大規模な改修時はもちろん、年に1回など定期的に診断を行い、新たな脆弱性が生まれていないか、継続的にチェックする体制を築くことが不可欠です。診断結果を元に、リスクの高い脆弱性から優先順位をつけて修正していくことで、効率的にセキュリティレベルを向上させられます。
WAF(Web Application Firewall)を導入して防御する
脆弱性を根本的に修正するには、アプリケーションのコードを改修する必要がありますが、それには時間とコストがかかります。また、修正が完了するまでの間、アプリケーションは無防備な状態になってしまいます。そこで有効なのが「WAF (Web Application Firewall)」の導入です。
WAFは、Webアプリケーションの前面に設置され、送受信されるHTTP/HTTPS通信を監視し、サイバー攻撃と判断される不正な通信を検知・遮断するセキュリティ製品です。
- WAFによるOWASP Top 10への対応:
WAFは、特にOWASP Top 10の上位にランクインする多くの攻撃に対して効果を発揮します。- A03: インジェクション: SQLインジェクションやXSSで使われる典型的な攻撃パターン(
' OR '1'='1'
や<script>
タグなど)を検知し、ブロックします。 - A10: SSRF: 内部ネットワークやクラウドメタデータサービスへのリクエストなど、SSRF攻撃特有のパターンを検知します。
- その他の攻撃: OSコマンドインジェクションやディレクトリトラバーサルなど、様々な既知の攻撃シグネチャに基づいて防御を行います。
- A03: インジェクション: SQLインジェクションやXSSで使われる典型的な攻撃パターン(
WAFを導入することで、アプリケーション本体に脆弱性が存在していたとしても、攻撃がアプリケーションに到達する前に防ぐことができ、即効性のある防御層を構築できます。これは「仮想パッチ」とも呼ばれます。
ただし、WAFは万能ではありません。「A04: 安全でない設計」に起因するビジネスロジックの欠陥や、「A07: 識別と認証の失敗」における多要素認証の欠如といった、アプリケーションの設計や仕様に根差した問題は、WAFだけでは防ぎきれない場合があります。
したがって、WAFはあくまで多層防御の一環と位置づけ、WAFによる防御と、アプリケーション自体の脆弱性修正(セキュアコーディング)を両輪で進めることが、最も堅牢なセキュリティ体制の構築につながります。
開発ライフサイクル全体でセキュリティを意識する
OWASP Top 10 2021で「A04: 安全でない設計」が新たに追加されたことは、セキュリティ対策が「シフトレフト」すべきであるという強いメッセージです。シフトレフトとは、開発ライフサイクルの後工程(運用段階)で行われがちだったセキュリティ活動を、より前工程(要件定義、設計、実装段階)に移行させるアプローチです。
- 要件定義フェーズ: 新機能の要件を定義する際に、どのようなデータを取り扱い、どのような脅威が想定されるかを議論し、「パスワードはハッシュ化する」「個人情報は暗号化する」といったセキュリティ要件を明確にします。
- 設計フェーズ: 脅威モデリングを実施し、設計上の弱点を洗い出します。アクセス制御の仕組みやエラーハンドリングの方針など、セキュリティに関する基本設計をこの段階で固めます。
- 実装フェーズ: 開発者は、セキュアコーディングガイドラインに従ってコーディングを行います。IDEのプラグインやSASTツールを導入し、コードを書きながら脆弱性をチェックできる環境を整えることも有効です。
- テストフェーズ: 機能テストと並行して、セキュリティテスト(DASTや手動診断)をCI/CDパイプラインに組み込み、デプロイ前に脆弱性を自動で検出します。
- 運用フェーズ: WAFやSIEMによる監視を継続し、定期的な脆弱性診断を実施して、新たな脅威に対応します。
このように、開発のすべての段階に関わる全員がセキュリティを「自分ごと」として捉え、プロセスに組み込むことで、手戻りが少なく、本質的に安全なアプリケーションを効率的に開発できます。これを「DevSecOps」と呼び、現代のアプリケーション開発における重要な考え方となっています。
開発者へのセキュリティ教育を徹底する
どのような優れたツールやプロセスを導入しても、最終的にコードを書くのは「人」です。開発者自身がセキュリティに関する知識を持っていなければ、意図せず脆弱性を作り込んでしまいます。したがって、開発者に対する継続的なセキュリティ教育は、最も根本的で効果的な投資の一つです。
- 教育コンテンツとしてのOWASP Top 10:
OWASP Top 10は、開発者が学ぶべきセキュリティの基礎知識として最適な教材です。10大リスクのそれぞれについて、「なぜそれが危険なのか」「どのようなコードが脆弱性を生むのか」「どう書けば安全なのか」を具体例とともに学ぶことで、実践的なスキルが身につきます。 - 効果的な教育方法:
- 座学: 定期的に勉強会を開催し、OWASP Top 10の各項目や、最近の攻撃トレンドについて情報共有を行います。
- ハンズオン・トレーニング: 実際に脆弱なアプリケーションを攻撃・修正する演習(CTF: Capture The Flag 形式など)を行うことで、知識を体験として定着させます。
- セキュアコーディングガイドラインの整備: 組織独自のコーディング規約にセキュリティの項目を盛り込み、いつでも参照できるドキュメントとして整備します。
- 情報共有の文化醸成: 新しい脆弱性情報が見つかった際に、Slackなどのチャットツールで気軽に共有し、議論できる文化を作ることが重要です。
セキュリティは一度学べば終わりではありません。攻撃手法は日々進化するため、開発者も継続的に学び続ける必要があります。組織として教育の機会を提供し、セキュリティ意識の高い開発文化を醸成することが、脆弱性の発生を未然に防ぐための最も確実な道です。
まとめ
本記事では、Webアプリケーションセキュリティの世界的な指標である「OWASP Top 10 2021」について、その概要から10大リスクの詳細な解説、2017年版からの変更点、そして自社の対策に活かすための具体的な方法まで、網羅的に解説しました。
OWASP Top 10 2021が示す10のリスクは以下の通りです。
- A01: アクセス制御の不備
- A02: 暗号化の失敗
- A03: インジェクション
- A04: 安全でない設計
- A05: セキュリティ設定のミス
- A06: 脆弱で古くなったコンポーネント
- A07: 識別と認証の失敗
- A08: ソフトウェアとデータの整合性の不具合
- A09: セキュリティログとモニタリングの失敗
- A10: サーバサイドリクエストフォージェリ (SSRF)
これらのリスクは、単独で存在するのではなく、互いに関連し合っています。例えば、「安全でない設計」が原因で「アクセス制御の不備」や「インジェクション」が生まれ、「セキュリティログとモニタリングの失敗」がその発見を遅らせ、被害を拡大させます。
OWASP Top 10は、単なるチェックリストではなく、現代のWebアプリケーションが直面する脅威の全体像を理解し、セキュリティ対策を体系的に考えるためのフレームワークです。この記事で紹介した対策を参考に、まずは自社のアプリケーションがどこにリスクを抱えているのかを把握することから始めてみましょう。脆弱性診断の実施や、開発チーム内での勉強会の開催が、その第一歩としておすすめです。
サイバー攻撃はますます巧妙化・自動化しています。しかし、OWASP Top 10という先人たちの知恵が詰まった指針を活用し、技術的な対策(セキュアコーディング、WAF導入など)と組織的な対策(開発プロセスの見直し、教育)を両輪で進めることで、脅威に対して効果的に立ち向かうことが可能です。安全なアプリケーションは、ビジネスの信頼性の基盤です。継続的なセキュリティ改善への取り組みを、今日から始めていきましょう。