OWASP Top 10 解説:Webアプリケーションセキュリティの重要リスクを理解する

セキュリティ

Web開発者とセキュリティ担当者必見のガイド 🛡️

現代のビジネスにおいて、Webアプリケーションは不可欠な存在です。しかし、その利便性の裏側には常にサイバー攻撃のリスクが潜んでいます。攻撃者は常にアプリケーションの脆弱性を狙っており、対策を怠れば情報漏洩やサービス停止といった深刻な被害につながる可能性があります。

このような状況に対処するため、Webアプリケーションのセキュリティ向上を目的とした国際的な非営利団体OWASP (Open Worldwide Application Security Project) が存在します。OWASPは、世界中のセキュリティ専門家の協力のもと、様々なプロジェクトを通じて安全なソフトウェア開発を支援しています。

その中でも特に重要なのが、OWASPが定期的に発表している「OWASP Top 10」です。これは、Webアプリケーションにおける最も重大なセキュリティリスクを、世界中から収集されたデータと専門家の知見に基づいて10項目にまとめたリストです。OWASP Top 10は、Web開発者やセキュリティ担当者が最新の脅威を理解し、適切な対策を講じるための標準的なガイドラインとして、世界中で広く参照されています。

最新版は2021年に発表された「OWASP Top 10 2021」であり、約3〜4年ごとに更新され、常に最新の脅威動向を反映しています。このブログでは、OWASP Top 10 2021の各項目について、その内容、影響、対策を詳しく解説していきます。自社のWebアプリケーションを守るための第一歩として、ぜひご一読ください。✨

A01:2021 – アクセス制御の不備 (Broken Access Control)

2017年の5位から1位に上昇。94%以上のアプリケーションで何らかのアクセス制御不備がテストで見つかっています。

概要

アクセス制御とは、ユーザーが許可された権限の範囲内でしか操作できないように強制する仕組みです。この制御が不十分、または設定ミスがあると、「アクセス制御の不備」脆弱性となります。攻撃者はこの不備を利用して、本来アクセス権のない情報(他のユーザーの個人情報、機密ファイルなど)を閲覧したり、データを改ざん・削除したり、管理者権限が必要な機能を実行したりすることが可能になります。

例えば、URLを少し書き換えるだけで他のユーザーの個人情報ページにアクセスできてしまったり、一般ユーザーが管理者用ページに入れてしまったりするケースがこれに該当します。

影響

  • 機密情報(個人情報、財務情報、企業秘密など)の漏洩
  • 不正なデータ改ざん・削除
  • システムへの不正アクセス、管理者権限の奪取
  • サービス妨害 (DoS)
  • 法的・規制上のコンプライアンス違反

事例

アクセス制御の不備は非常に一般的であり、具体的な事例を挙げればきりがありません。例えば、ECサイトで注文IDを連番で管理しており、URL中のIDを変更するだけで他人の注文情報が見えてしまうケースや、社内システムで部署ごとにアクセス権限を設定しているつもりが、設定ミスで誰でも全ての情報にアクセスできてしまうケースなどが考えられます。OWASP API Security Top 10:2023では、このアクセス制御に関する問題がさらに細分化(オブジェクトレベル、機能レベル、オブジェクトプロパティレベル)されており、その重要性が増しています。

対策

アクセス制御の不備を防ぐには、以下の対策が重要です。

  • デフォルト拒否の原則: 公開リソース以外へのアクセスは、デフォルトで全て拒否し、個別に必要な権限のみを許可します。
  • 最小権限の原則: ユーザーやプロセスには、その役割を果たすために最低限必要な権限のみを付与します。
  • アクセス制御メカニズムの一元化と再利用: アプリケーション全体で一貫したアクセス制御ライブラリやコンポーネントを使用し、個別の実装によるミスを防ぎます。
  • 所有権の確認: ユーザーが操作しようとしているデータやリソースの所有者であることを、サーバーサイドで確実に検証します。
  • 機能レベルのアクセス制御: 各機能(特に管理者機能)へのアクセス権限をサーバーサイドで厳密にチェックします。
  • レートリミット: 短時間に大量のリクエストを送る自動化攻撃を防ぐため、APIやコントローラーへのアクセス回数を制限します。
  • セッション管理: セッションIDの無効化(ログアウト時、タイムアウト時)を確実に行います。
  • 徹底的なテスト: アクセス制御の全ての側面(URL、API、機能、データアクセス)について、単体テスト、統合テスト、セキュリティテストを実施します。

A02:2021 – 暗号化の失敗 (Cryptographic Failures)

2017年の3位「機微な情報の露出(Sensitive Data Exposure)」から名称変更し、2位に上昇。暗号化の「失敗」に焦点を当てています。

概要

個人情報、クレジットカード番号、パスワード、医療情報、企業秘密など、保護が必要な機密データ(機微な情報)が、適切な暗号化なしに保存されたり、平文で通信されたりする状態を指します。暗号化自体を行っていないケースだけでなく、古い・弱い暗号アルゴリズムの使用、鍵管理の不備、初期化ベクトル(IV)の不適切な使用なども含まれます。

以前は「機微な情報の露出」という結果に注目した名称でしたが、今回はその根本原因である「暗号化の失敗」という点に焦点を当てています。データの重要性が増す現代において、このリスクは非常に深刻です。

影響

  • 機密情報(個人情報、認証情報、決済情報など)の漏洩・窃取
  • 中間者攻撃による通信内容の盗聴・改ざん
  • なりすまし、不正アクセス
  • データ改ざんによるシステムの不正操作
  • 法的・規制上のコンプライアンス違反(GDPR、PCI DSSなど)とそれに伴う罰金
  • 企業の信頼失墜

事例

古いWebサイトが依然としてHTTP通信を使用しており、ログイン情報やフォーム入力内容が平文で送信されているケース。データベースにパスワードを平文や弱いハッシュ(MD5など)で保存しており、データベース侵害時にパスワードが容易に解読されてしまうケース。Wi-Fi通信が古い暗号化方式(WEPなど)で保護されている、あるいは暗号化されていないケースなどが挙げられます。ハードコードされたパスワードやAPIキーがソースコードに含まれている場合もこれに該当します。

対策

暗号化の失敗を防ぐためには、包括的なアプローチが必要です。

  • データの分類: アプリケーションが扱うデータを機密度に応じて分類し、どのデータを暗号化する必要があるか明確にします。
  • 不要なデータの不保持: 必要のない機密データはそもそも保存・収集しないようにします。
  • 強力な暗号化アルゴリズムとプロトコルの使用: 保存データ、通信データともに、現在推奨されている強力な標準アルゴリズム(AESなど)、プロトコル(TLS 1.2以上)、鍵長を使用します。
  • 鍵管理の徹底: 暗号鍵は安全に生成・保管し、定期的にローテーションします。鍵をソースコードにハードコードしてはいけません。
  • 通信の暗号化: 全ての通信経路(ブラウザ-サーバー間、サーバー間通信など)でHTTPS (TLS) を強制します。HSTS (HTTP Strict Transport Security) ヘッダの使用を検討します。
  • 認証付き暗号: データの機密性に加えて完全性も保証する認証付き暗号(例:AES-GCM)の使用を検討します。
  • パスワードのハッシュ化: パスワードは適切なストレッチング(反復回数増加)を伴う強力なハッシュ関数(例:Argon2, scrypt, bcrypt)を用いてハッシュ化し、ソルトを使用します。
  • 初期化ベクトル(IV)の適切な管理: 暗号化モードに応じて、安全な乱数生成器を用いてIVを生成し、適切に管理します(再利用しないなど)。
  • キャッシュ制御: 機密情報がブラウザや中間プロキシにキャッシュされないよう、適切なHTTPヘッダ(Cache-Control: no-store, Pragma: no-cacheなど)を設定します。

A03:2021 – インジェクション (Injection)

2017年の1位から3位に後退しましたが、依然として深刻な脅威です。クロスサイトスクリプティング(XSS)もこのカテゴリに統合されました。94%のアプリケーションで何らかのインジェクション脆弱性がテストで見つかっています。

概要

インジェクションとは、信頼できない外部からの入力データ(ユーザー入力、ファイル、他のシステムからのデータなど)が、アプリケーション内で解釈されるコマンドやクエリの一部としてそのまま埋め込まれてしまうことにより、意図しない動作を引き起こす脆弱性の総称です。

最も有名なのはSQLインジェクションで、データベースへの問い合わせ(SQLクエリ)に悪意のある文字列を注入することで、データベース内の情報を不正に取得・改ざん・削除したりします。他にも、OSコマンドインジェクション(OSコマンドを注入)、LDAPインジェクション(LDAPクエリを注入)、XPathインジェクション(XPathクエリを注入)、そして以前は独立したカテゴリだったクロスサイトスクリプティング (XSS)(HTML/JavaScriptコードを注入)などもこのカテゴリに含まれます。

影響

  • SQLインジェクション: データベース内の全データの漏洩、改ざん、削除、データベースサーバーの乗っ取り。
  • XSS: ユーザーのセッションハイジャック、Cookie窃取、フィッシング詐欺、マルウェア感染、Webページの改ざん。
  • OSコマンドインジェクション: サーバー上で任意のOSコマンドを実行され、サーバーの完全な乗っ取り。
  • LDAPインジェクション: LDAPディレクトリ情報の不正アクセス、改ざん。
  • XPathインジェクション: XMLデータの不正アクセス、認証バイパス。

事例

  • SQLインジェクション: ログインフォームで、ユーザーID入力欄に `’ OR ‘1’=’1` のような文字列を入力することで認証をバイパスする。検索窓に不正なSQL文を入力し、非公開情報を取得する。(多数の企業で個人情報漏洩事例あり)
  • XSS: 掲示板の投稿フォームに悪意のあるJavaScriptを埋め込み、閲覧者のブラウザで実行させ、Cookie情報を盗む。
  • OSコマンドインジェクション: IPアドレスを入力してpingを実行する機能で、`; rm -rf /` のような文字列を入力し、サーバー上のファイルを削除しようとする。

対策

インジェクション攻撃を防ぐための最も重要な原則は、「信頼できない入力をコマンドやクエリの一部として直接結合しない」ことです。

  • サーバーサイドでの入力検証: 受け付けるデータの形式、文字種、長さなどを厳密に検証し、想定外の入力は拒否します(ホワイトリスト方式が望ましい)。
  • プリペアードステートメント(パラメータ化クエリ)の使用: SQLインジェクション対策の基本。SQL文の構造(テンプレート)と、埋め込む値を分離してデータベースエンジンに渡すことで、入力値がSQLコードとして解釈されるのを防ぎます。
  • エスケープ処理: 入力データをコマンドやクエリに埋め込む前に、そのコンテキスト(HTML、SQL、OSコマンドなど)で特別な意味を持つ文字を無害化(エスケープ)します。ただし、エスケープ漏れのリスクがあるため、プリペアードステートメントなどが使える場合はそちらを優先します。
  • 安全なAPIの使用: OSコマンド実行などを避け、より安全な代替APIを使用します。
  • コンテキストに応じた出力エンコーディング: XSS対策として、HTMLに出力する際はHTMLエンティティエンコーディング、JavaScript内に埋め込む際はJavaScriptエンコーディングなど、出力先のコンテキストに合わせて適切にエンコーディングします。
  • 最小権限での実行: データベース接続やプログラム実行時の権限を必要最小限に絞り、万が一インジェクションが成功した場合の被害を局所化します。
  • Web Application Firewall (WAF) の活用: 既知の攻撃パターンを検知・防御するWAFを導入することも有効な対策の一つですが、根本的な解決策ではありません。

概要

安全でない設計とは、ソフトウェアやシステムの設計・アーキテクチャ段階でセキュリティが十分に考慮されていない、あるいは脅威に対する防御策が欠けている、または不十分である状態を指します。これは、個々のコードのバグ(実装上の欠陥)とは異なり、より根本的な問題です。たとえ完璧な実装がなされたとしても、設計自体に問題があれば脆弱性となり得ます。

脅威モデリングの不足、ビジネスロジックにおけるセキュリティ考慮漏れ、不適切な信頼境界の設定などが原因となります。例えば、「パスワードを忘れた場合、秘密の質問に答える」という機能自体が、現在のセキュリティ標準では安全でない設計とみなされます(知識ベース認証の問題)。

影響

  • ビジネスロジックの悪用による不正行為(不正購入、不正な権限昇格など)
  • 設計上の欠陥を利用した情報漏洩
  • サービス妨害 (DoS)
  • 規制要件やコンプライアンス違反
  • 後からの修正が困難で、コストが高くつく

事例

  • チケット予約サイトで、購入確定前に大量の座席を仮押さえできてしまい、他のユーザーが購入できなくなる(リソース枯渇攻撃の一種)。(2022年の情報)
  • オンラインバンキングで、送金処理の途中でブラウザの「戻る」ボタンを押して再度送金操作を行うと、残高チェックが適切に行われず二重送金できてしまう。
  • ユーザー登録時にメールアドレスの検証を行わない設計のため、他人のメールアドレスでアカウントを作成できてしまう。
  • 機密データを扱う処理フローで、一時ファイルに平文で情報を書き出す設計になっている。

対策

安全でない設計を防ぐには、開発ライフサイクルの早期段階からの取り組みが不可欠です。

  • セキュア開発ライフサイクル (Secure SDLC) の導入: 設計、開発、テスト、運用の各段階でセキュリティ活動(脅威モデリング、セキュリティ要件定義、設計レビュー、セキュアコーディング、セキュリティテストなど)を組み込みます。
  • 脅威モデリングの実施: 設計段階で、潜在的な脅威、攻撃経路、脆弱性を体系的に洗い出し、必要な対策(セキュリティ制御)を特定します。
  • 安全な設計パターンの活用: 認証、アクセス制御、セッション管理など、セキュリティ機能の実装には、実績のある安全な設計パターンやフレームワークの機能を活用します。
  • ドメインロジックにおける分離と検証: ビジネスロジックとセキュリティ制御を明確に分離し、重要な操作(決済、権限変更など)の前には必ずサーバーサイドで厳密な検証を行います。
  • 段階的な改善: 全ての設計を最初から完璧にするのは難しいため、リスクの高い領域から優先的に脅威モデリングや設計レビューを行い、継続的に改善します。
  • セキュリティ専門家との連携: 設計段階からセキュリティ専門家(セキュリティアーキテクトなど)を関与させ、レビューや助言を得ます。
  • コンポーネントの再利用: セキュリティが確保されたコンポーネントやライブラリを積極的に活用し、車輪の再発明を避けます。

A05:2021 – セキュリティ設定ミス (Security Misconfiguration)

2017年の6位から5位に上昇。以前の「XML外部エンティティ参照(XXE)」もこのカテゴリに統合されました。90%以上のアプリケーションで何らかの設定ミスが見つかっています。

概要

OS、Webサーバー、アプリケーションサーバー、データベース、フレームワーク、ライブラリ、クラウドサービスなど、アプリケーションを構成する様々な要素において、セキュリティ設定が不適切である状態を指します。デフォルト設定のまま運用している、不要な機能やサービスが有効になっている、エラーメッセージで詳細な内部情報が漏洩している、クラウドストレージのアクセス権限が不適切である、などが典型例です。

設定ミスは、開発、テスト、本番といった環境移行の過程や、パッチ適用、システム変更時などに発生しやすい傾向があります。自動化されたスキャナーでも検知しやすい脆弱性の一つです。

影響

  • 不要な機能・ポートの開放による攻撃経路の提供
  • デフォルトアカウントや推測容易なパスワードによる不正アクセス
  • 詳細なエラーメッセージによる内部情報の漏洩(バージョン情報、ファイルパスなど)
  • クラウド設定ミスによるデータ漏洩(S3バケットの公開設定など)
  • 不必要な権限付与による被害拡大
  • ディレクトリリスティングによる機密ファイルの発見
  • セキュリティヘッダの不足による各種攻撃(XSS、クリックジャッキングなど)の助長

事例

  • データベースサーバーにインストール時のデフォルト管理者アカウントとパスワードがそのまま残っており、外部からアクセスされてしまう。(普遍的な事例)
  • Webサーバーの設定でディレクトリリスティングが有効になっており、URLを直接指定することで非公開ファイル一覧が見えてしまう。
  • デバッグモードが有効なまま本番環境にデプロイされ、エラー発生時に詳細なスタックトレースがユーザーに表示されてしまう。
  • Amazon S3バケットのアクセス権限を誤って「公開」設定にしてしまい、保存されていた顧客情報が誰でも閲覧可能になる。(多数の事例あり)
  • セキュリティ関連のHTTPヘッダ(Strict-Transport-Security, Content-Security-Policy, X-Frame-Optionsなど)が設定されていない。

対策

設定ミスを防ぐには、体系的かつ継続的な管理プロセスが必要です。

  • セキュアな構成プロセスの確立: 開発、QA、本番の各環境に対して、再現可能でセキュアな構成プロセスを確立し、自動化します。
  • 不要な機能・サービスの無効化: アプリケーションや基盤ソフトウェアの不要な機能、サンプルファイル、デフォルトアカウントなどを削除・無効化します(最小権限の原則)。
  • 構成の見直しと更新: 定期的に、全ての環境(特にクラウドサービス)のセキュリティ設定を見直し、最新のセキュリティ推奨事項に合わせて更新します。パッチ適用後なども見直しのタイミングです。
  • 構成管理ツールの活用: Chef, Puppet, Ansible, Terraformなどの構成管理ツールや、Infrastructure as Code (IaC) を活用し、設定の一貫性と再現性を確保します。
  • 自動化されたスキャン: 設定ミスを検出する自動スキャンツールをCI/CDパイプラインや運用プロセスに組み込み、定期的にチェックします。
  • セグメンテーション: アプリケーションアーキテクチャを適切にセグメンテーション(ネットワーク分離、コンテナ化など)し、一つの設定ミスがシステム全体に影響を及ぼさないようにします。
  • 適切なエラーハンドリング: ユーザーには必要最小限のエラー情報のみを表示し、詳細なエラー情報はサーバーサイドのログに記録します。
  • セキュリティヘッダの設定: 適切なセキュリティ関連HTTPヘッダを設定し、ブラウザレベルでの防御を強化します。

A06:2021 – 脆弱で古いコンポーネント (Vulnerable and Outdated Components)

2017年の9位「既知の脆弱性を持つコンポーネントの使用」から名称が変更され、6位に上昇。範囲が広がり、単に脆弱性だけでなく「古い(サポートされていない)」コンポーネントのリスクも強調されています。

概要

現代のアプリケーション開発では、オープンソースソフトウェア (OSS) やサードパーティ製のライブラリ、フレームワーク、APIなどを利用することが一般的です。これらの「コンポーネント」に既知の脆弱性が存在する、あるいは開発元によるサポートが終了していて新たな脆弱性が発見されても修正されない(古い)場合に、このリスクが発生します。

アプリケーションが直接利用しているコンポーネントだけでなく、コンポーネントが依存している別のコンポーネント(推移的依存関係)に脆弱性が含まれている場合も問題となります。サプライチェーン攻撃の起点ともなりうる、非常に重要なリスクです。

影響

  • コンポーネントの脆弱性を悪用したアプリケーションの乗っ取り、情報漏洩、サービス妨害など(影響は脆弱性による)
  • サポート切れコンポーネントの利用による、未知の脆弱性への対応不可
  • ライセンス違反のリスク
  • システム全体の信頼性低下

事例

  • Log4Shell (2021年12月): Javaのロギングライブラリ「Apache Log4j」に発見された極めて深刻なリモートコード実行脆弱性(CVE-2021-44228)。世界中の非常に多くのシステムに影響を与え、大きな混乱を引き起こしました。
  • Apache Struts2 の脆弱性 (継続的に発生): JavaのWebアプリケーションフレームワーク「Apache Struts2」では、過去に何度も深刻なリモートコード実行脆弱性が発見されています。これらを悪用した大規模な情報漏洩事件も発生しています。(例: 2017年のEquifax情報漏洩事件)
  • サポート切れライブラリの使用: 例えば、サポートが終了した古いバージョンのjQueryを使用し続けているWebサイトは、そのバージョンに存在する既知のXSS脆弱性を悪用される可能性があります。

対策

コンポーネントのリスク管理は、継続的なプロセスです。

  • コンポーネントインベントリの作成と維持: アプリケーションが利用している全てのコンポーネント(直接依存、推移的依存を含む)とそのバージョンを正確に把握し、リストを維持します。
  • 脆弱性情報の監視: 利用しているコンポーネントに関する脆弱性情報(CVEなど)を継続的に監視します。
  • ソフトウェアコンポジション分析 (SCA) ツールの導入: コンポーネントの依存関係を解析し、既知の脆弱性やライセンス問題を自動的に検出するSCAツール(OWASP Dependency-Checkなど)を活用します。
  • 不要なコンポーネントの削除: 使用していない機能、ファイル、コンポーネント、依存関係は定期的に削除します。
  • 信頼できるソースからの取得: コンポーネントは公式リポジトリなどの信頼できるソースからのみ取得します。可能であれば、内部で検証済みのコンポーネントリポジトリを運用することも検討します。
  • パッチ適用とバージョンアップ: 脆弱性が修正されたバージョンがリリースされたら、速やかにテストを行い、アップデートします。サポートが終了したコンポーネントは、代替を探し移行します。
  • セキュリティパッチ適用方針の策定: 脆弱性の深刻度に応じて、パッチを適用するまでの期間などを定めた方針を策定し、運用します。

A07:2021 – 識別と認証の失敗 (Identification and Authentication Failures)

2017年の2位「認証の不備 (Broken Authentication)」から名称変更し、7位に後退。識別(Identification)の失敗に関するCWEも含まれるようになりました。多要素認証(MFA)の普及などが順位後退の要因と考えられます。

概要

ユーザーが誰であるかを正しく識別(Identification)し、そのユーザー本人であることを確認(Authentication)するプロセス、および認証後のセッション管理に関する脆弱性を指します。「認証の不備」という従来の概念に加え、「ユーザーが誰であるか」を特定する段階での失敗も含まれるようになりました。

具体的な問題としては、推測容易なパスワードの許可、ブルートフォース攻撃への耐性不足、安全でないパスワードリカバリ機構、不適切なセッション管理(セッションIDの漏洩、固定化、無効化不備)、多要素認証(MFA)の欠如または不備などが挙げられます。

影響

  • アカウント乗っ取りによるなりすまし
  • 個人情報や機密情報への不正アクセス
  • 不正な操作(不正送金、不正購入など)
  • 権限昇格
  • サービス妨害

事例

  • クレデンシャルスタッフィング: 他のサービスから漏洩したID/パスワードのリストを用いて、自動的にログインを試行する攻撃。多くのサイトで成功しています。(継続的に発生)
  • セッション固定化攻撃 (Session Fixation): 攻撃者が用意したセッションIDをユーザーに使わせ、ユーザーがログインした後にそのセッションを乗っ取る攻撃。
  • パスワードリセット機能で、「秘密の質問」のような推測可能な情報のみでリセットできてしまう。(設計上の問題でもある)
  • ログアウト時にサーバー側でセッションが無効化されず、ブラウザに残ったセッションIDが再利用できてしまう。
  • 多要素認証が導入されているものの、特定条件下でバイパスできてしまう。
  • 2023年9月時点の情報によると、Microsoft Exchange Serverのハッキング事例では認証の失敗が悪用された一因とされています。

対策

強力な認証とセキュアなセッション管理が鍵となります。

  • 多要素認証 (MFA) の導入: 可能な限り全てのユーザー、特に管理者や特権ユーザーに対してMFAを必須とします。
  • デフォルト認証情報の禁止: デプロイ時にデフォルトのパスワードやアカウントが存在しないようにします。
  • 強力なパスワードポリシーの強制: NIST SP 800-63Bなどのガイドラインに基づき、適切なパスワード長、複雑性(ただし過度な複雑性要求は避ける)、および定期的な変更(ただし、侵害の兆候がない限り強制的な定期変更は推奨されない傾向)ポリシーを適用します。よく使われる弱いパスワードのリスト(Top 10,000など)との比較チェックも実装します。
  • ブルートフォース攻撃対策: アカウントロックアウト(ただしDoS攻撃に注意)、CAPTCHA、レートリミットなどを実装し、自動化されたパスワード試行攻撃を困難にします。
  • クレデンシャルスタッフィング対策: 漏洩パスワードリストとの照合、MFAの導入、不審なログイン試行の監視とアラートを行います。
  • 安全なパスワードリカバリ: 知識ベース認証(秘密の質問など)を避け、メールやSMSを用いた安全なリセットフローを実装します。
  • セキュアなセッション管理:
    • ログイン成功後に新しいセッションIDを生成します(セッション固定化対策)。
    • セッションIDはURLパラメータに含めず、安全なCookie属性(HttpOnly, Secure, SameSite)を使用します。
    • 十分なエントロピーを持つ、長くランダムなセッションIDをサーバーサイドで生成します。
    • ログアウト時や一定の無通信期間後に、サーバーサイドでセッションを確実に無効化します。
    • セッションタイムアウトを適切に設定します。
  • 認証失敗ログの記録と監視: 全ての認証試行(成功・失敗)をログに記録し、異常なパターン(大量の失敗、短時間での複数アカウント試行など)を監視・アラートします。

A08:2021 – ソフトウェアとデータの整合性の不具合 (Software and Data Integrity Failures)

2021年版で新設されたカテゴリ。ソフトウェアアップデート、機密データ、CI/CDパイプラインなどにおける「完全性(Integrity)」の検証不備に焦点を当てています。2017年の「安全でないデシリアライゼーション」もこのカテゴリに一部含まれます。

概要

ソフトウェアやデータが、意図しない形で変更(改ざん)されていないこと、そして信頼できるソースから来たものであること(真正性)を確認する「完全性(Integrity)」の検証が不十分であることに起因する脆弱性です。

具体的には、以下のような状況が該当します。

  • 信頼できないソースからのコンポーネント利用: 出所が不明、または検証されていないリポジトリやCDNからライブラリやプラグインをダウンロードして利用する。
  • 安全でないCI/CDパイプライン: ビルド、テスト、デプロイのプロセスが保護されておらず、不正なコードが混入したり、設定が改ざんされたりする可能性がある。
  • 安全でない自動更新: ソフトウェアのアップデート機能で、ダウンロードした更新ファイルの完全性(デジタル署名など)を検証せずに適用してしまう。
  • 安全でないデシリアライゼーション: 外部から受け取ったシリアライズされたデータ(オブジェクトをバイト列などに変換したもの)を、内容を検証せずにデシリアライズ(元のオブジェクトに戻す)することで、意図しないコード実行やデータ改ざんを引き起こす。これは2017年版の独立カテゴリでしたが、データ整合性の問題としてここに統合されました。

影響

  • 悪意のあるコードの実行、マルウェア感染
  • システム全体の乗っ取り
  • 機密データの漏洩、改ざん
  • サプライチェーン攻撃による広範囲な被害
  • サービス停止

事例

  • SolarWindsサプライチェーン攻撃 (2020年12月): ネットワーク管理ソフトウェア「SolarWinds Orion」のアップデートサーバーが侵害され、正規のアップデートファイルに悪意のあるコードが埋め込まれました。このアップデートを適用した多数の組織がバックドアを仕掛けられ、大規模な情報漏洩につながりました。これはCI/CDパイプラインとソフトウェア更新における整合性検証の失敗例です。
  • 安全でないデシリアライゼーション: Javaアプリケーションで、信頼できないソースからのシリアライズされたオブジェクトを受け入れ、デシリアライズする際に、特定のクラス(Gadget Chainと呼ばれる)が悪用され、リモートで任意のコードを実行されてしまう脆弱性(Apache Commons Collectionsの脆弱性など)。
  • npmなどのパッケージマネージャで、タイプミスを狙った悪意のあるパッケージ(タイポスクワッティング)や、正規パッケージに不正コードが混入されたものが公開され、開発者が気付かずにインストールしてしまう。

対策

ソフトウェアとデータの完全性を確保するには、サプライチェーン全体での検証が必要です。

  • デジタル署名やハッシュ値による検証: ソフトウェア、ライブラリ、更新ファイルなどを取得・利用する際に、デジタル署名やハッシュ値を検証し、提供元が正当であること、および改ざんされていないことを確認します。
  • 信頼できるリポジトリの使用: npm, Maven, PyPIなどのパッケージリポジトリは、公式で信頼できるものを使用します。リスクが高い場合は、内部で検証済みのコンポーネントのみを格納するプライベートリポジトリの運用を検討します。
  • ソフトウェアサプライチェーンセキュリティツールの活用: OWASP Dependency Check, OWASP CycloneDXなどのツールやSCAツールを用いて、コンポーネントの脆弱性だけでなく、その出所や完全性を検証するプロセスを強化します。
  • CI/CDパイプラインの保護: ビルド、テスト、デプロイの各ステップを保護し、不正アクセスや改ざんを防ぎます。アクセス制御、監査ログ、署名付きビルドなどを実装します。
  • デシリアライゼーションの安全な取り扱い:
    • 信頼できないソースからのデータをデシリアライズしないことを原則とします。
    • やむを得ず行う場合は、デシリアライズするクラスを厳密にホワイトリストで制限します。
    • 可能であれば、JSONやXMLなど、より安全なデータ交換フォーマットを使用します。
    • デシリアライズ処理自体の完全性を検証する仕組みを導入します。
  • コードと構成変更のレビュー: コードや設定ファイルに対する変更は、レビュープロセスを経て、悪意のあるコードや設定ミスが混入するリスクを低減します。

A09:2021 – セキュリティログとモニタリングの失敗 (Security Logging and Monitoring Failures)

2017年の10位「不十分なロギングとモニタリング」から名称が変更され、9位に上昇。インシデントの検知、対応、フォレンジックに不可欠な要素です。

概要

セキュリティイベント(ログイン試行、アクセス制御の失敗、重要なトランザクション、サーバーエラーなど)が適切にログ記録されていない、または記録されたログが効果的に監視・分析されていない状態を指します。この脆弱性は直接的な攻撃を可能にするものではありませんが、攻撃の検知を遅らせたり、インシデント発生後の原因調査や影響範囲特定を困難にしたりします。

具体的には、重要なイベントがログ記録されていない、ログの内容が不十分(発生時刻、ユーザーID、IPアドレスなどが欠けている)、ログが改ざん可能な状態で保存されている、ログが長期間保存されていない、ログを監視する仕組みがない、アラートが適切に設定されていない、などが該当します。

OWASPによると、ほぼ全ての主要なセキュリティインシデントは、不十分なログ記録と監視の悪用から始まっているとされています。

影響

  • 攻撃や不正行為の検知遅延、または検知不可
  • インシデント発生時の原因究明、影響範囲特定の困難化
  • フォレンジック調査の妨害
  • システムの不正利用やデータ漏洩の隠蔽
  • コンプライアンス要件(ログ保存期間など)の違反
  • 問題発生時のデバッグやトラブルシューティングの困難化

事例

  • Target データ侵害 (2013年): 攻撃者はサードパーティベンダー経由で侵入しましたが、初期の不正アクセス試行やマルウェアの活動を示すログが十分に監視されておらず、長期間にわたり攻撃が発覚しませんでした。結果として約4,000万件のクレジットカード情報などが漏洩しました。
  • ログイン失敗のログが記録されておらず、ブルートフォース攻撃やクレデンシャルスタッフィング攻撃が行われていても気づかない。
  • 重要な設定変更のログが記録されておらず、誰がいつ変更したのか追跡できない。
  • ログは記録されているものの、監視システムやアラートがなく、異常が発生しても担当者が気づかない。
  • ログファイルへのアクセス権限が緩く、攻撃者によってログが改ざん・削除されてしまう。

対策

効果的なログ記録と監視体制の構築が必要です。

  • 記録すべきイベントの定義: 監査やセキュリティインシデント対応に必要なイベント(ログイン成功/失敗、アクセス制御失敗、入出力バリデーション失敗、重要なビジネスロジックの実行、設定変更、管理者アクティビティなど)を明確にし、記録対象とします。
  • 十分な情報の記録: 各ログエントリには、イベント発生時刻、ソースIPアドレス、ユーザーID(可能な場合)、イベントの種類、対象リソース、成功/失敗ステータスなど、状況を理解するために十分なコンテキスト情報を含めます。
  • ログフォーマットの標準化: ログ解析ツールで処理しやすいように、一貫したログフォーマット(例:JSON, CEF)を使用します。
  • ログの完全性と機密性の保護: ログが改ざんされたり、不正に削除されたりしないように保護します(例:追記専用ファイル、安全なログ転送、アクセス制御)。機密情報を含むログは適切にマスキングまたは暗号化します。
  • 中央ログ管理システムの導入: 複数のサーバーやアプリケーションからのログを一元的に収集、保存、分析するシステム(SIEM: Security Information and Event Management など)を導入します。
  • リアルタイム監視とアラート: 重要なセキュリティイベントや異常なパターン(例:短時間の大量ログイン失敗、通常と異なる時間帯のアクセス)を検知し、担当者にリアルタイムで通知するアラートを設定します。
  • インシデント対応計画との連携: ログと監視システムをインシデント対応計画に組み込み、インシデント発生時に迅速かつ効果的に対応できるように準備しておきます。
  • 定期的なテストとレビュー: ログ記録と監視システムが期待通りに機能しているか、定期的にテストし、設定やアラートルールを見直します。

A10:2021 – サーバーサイドリクエストフォージェリ (Server-Side Request Forgery, SSRF)

2021年版で新設されたカテゴリ。コミュニティ調査で上位にランクインした比較的新しい脅威ですが、クラウド環境の普及などにより重要性が増しています。

概要

サーバーサイドリクエストフォージェリ(SSRF)とは、攻撃者がWebアプリケーションを騙して、そのアプリケーションが動作しているサーバー自身から、意図しない別のサーバー(内部ネットワーク上のサーバーや、外部の特定のサーバー)に対してリクエストを送信させることができる脆弱性です。

通常、Webアプリケーションがユーザーの指定したURLに基づいて外部リソース(画像、ファイル、APIデータなど)を取得する機能において、そのURLの検証が不十分な場合に発生します。攻撃者は、内部ネットワークのIPアドレスや `localhost`、あるいはクラウドサービスのメタデータエンドポイントなどをURLとして指定することで、本来外部からはアクセスできないはずの内部システムに関する情報を窃取したり、内部サービスを攻撃したりします。

影響

  • 内部ネットワークのスキャン、ポートスキャン
  • 内部ネットワーク上の機密情報(ファイル、サービス情報など)へのアクセス・漏洩
  • 内部サービス(データベース、管理インターフェースなど)への不正アクセス・攻撃
  • クラウド環境における認証情報(メタデータサービス経由)の窃取
  • 他のサーバーへのDoS攻撃の踏み台
  • ファイアウォールやアクセス制御リスト(ACL)のバイパス

事例

  • Capital One データ侵害 (2019年): 攻撃者は、Web Application Firewall (WAF) の設定ミスとSSRF脆弱性を組み合わせて利用し、AWSのメタデータサービスにアクセスして一時的な認証情報を窃取しました。これにより、S3バケットに保存されていた約1億人分の個人情報が漏洩しました。(ただし、主因はWAFの設定ミスとも言われる)
  • Accellion FTA データ侵害 (2021年1月): ファイル転送アプライアンス(FTA)に存在したSSRF脆弱性(CVE-2021-27103)が悪用され、本来アクセスできないはずの内部SOAP Webサービスにアクセスされ、データ侵害につながりました。
  • URLを指定して画像を表示する機能で、`http://127.0.0.1:8080/admin` のような内部URLを指定することで、外部には公開されていない管理画面の情報の一部を取得する。
  • Webhook機能で、通知先URLとして内部ネットワークのサーバーを指定し、その応答から内部サービスの存在を確認する。

対策

SSRFを防ぐには、ネットワークレベルとアプリケーションレベルの両方での対策(多層防御)が重要です。

  • アプリケーションレベルでの対策:
    • 入力検証の強化: ユーザーが指定するURLに対して、許可されたプロトコル(HTTP/HTTPSのみなど)、ポート、ドメイン、パスを厳密に検証します。
    • ホワイトリスト方式の採用: アクセスを許可するIPアドレスやドメインのリスト(ホワイトリスト)を定義し、それ以外へのリクエストは全て拒否します。ブラックリスト方式(特定の内部IP範囲を禁止するなど)は、バイパス手法が存在するため推奨されません。
    • URL解析ライブラリの慎重な選択と利用: URLのパース処理自体に脆弱性がある場合があるため、安全なライブラリを使用し、その挙動を理解した上で利用します。
    • 応答データの制限: 取得したリソースの応答データを直接ユーザーに返さないようにします。必要な情報のみを抽出し、整形して返すようにします。応答サイズや読み取り時間に制限を設けることも有効です。
    • リダイレクトの無効化: サーバーサイドからのリクエストでHTTPリダイレクト(3xx応答)を追跡しないように設定します。追跡が必要な場合は、リダイレクト先のURLも再度検証します。
  • ネットワークレベルでの対策:
    • ファイアウォールによるアクセス制御: アプリケーションサーバーから他の内部サーバーや外部への不要なネットワークアクセスをファイアウォールで制限します(最小権限の原則)。
    • ネットワークセグメンテーション: ネットワークを適切に分割し、万が一SSRFが発生してもアクセスできる範囲を限定します。
    • “Deny by default” ポリシー: 明示的に許可されていない限り、全てのネットワークトラフィックを拒否するポリシーを適用します。
  • クラウド環境特有の対策:
    • メタデータサービスへのアクセス制御:可能であれば、インスタンスメタデータサービスへのアクセスを無効化するか、必要なプロセスからのみアクセスできるように制限します。バージョン2 (IMDSv2) など、SSRF対策が強化されたメタデータサービスを利用します。

まとめ

OWASP Top 10 2021は、現代のWebアプリケーションが直面する最も重大なセキュリティリスクを浮き彫りにしています。アクセス制御の不備、暗号化の失敗、インジェクションといった古典的な脅威に加え、安全でない設計、ソフトウェアとデータの整合性の不具合、SSRFといった、よりアーキテクチャやサプライチェーンに関わる新たなリスクが登場・重要度を増しています。

これらのリスクに対処するには、単一の技術やツールに頼るのではなく、開発ライフサイクル全体を通じてセキュリティを組み込む「シフトレフト」のアプローチ、そして運用段階での継続的な監視と改善が不可欠です。

  • 🔒 設計段階からの脅威モデリングとセキュア設計原則の適用
  • ⚙️ 安全なコーディング慣行の遵守と、フレームワークやライブラリの安全な利用
  • 📈 ソフトウェアコンポジション分析(SCA)や動的/静的アプリケーションセキュリティテスト(DAST/SAST)ツールの活用
  • 🔑 強力な認証とアクセス制御の実装
  • 🛡️ 適切なログ記録とリアルタイム監視体制の構築
  • 🔗 サプライチェーンリスクの管理とコンポーネントの完全性検証

OWASP Top 10を理解し、自社のアプリケーションに潜むリスクを評価し、継続的な対策を講じることが、安全なWebサービスを提供し、ユーザーとビジネスを守るための重要な鍵となります。セキュリティは一度達成すれば終わりではなく、常に進化する脅威に対応し続ける旅路です。🚀

コメント

タイトルとURLをコピーしました