Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】OWASP Top Ten 2021 explained with simple Java examples and SAST insights

2025年09月23日に「Dev.to」が公開したITニュース「OWASP Top Ten 2021 explained with simple Java examples and SAST insights」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

OWASP Top Ten 2021はウェブアプリのセキュリティ脆弱性上位10項目だ。この記事では、Javaコードの具体例を通じて各カテゴリの脆弱性を解説。静的解析ツール(SAST)であるPVS-Studioが、これら脆弱性をどう検出するかを示す。安全なシステム開発に役立つ情報を提供する。

ITニュース解説

ソフトウェア開発においてセキュリティは非常に重要であり、開発の初期段階で脆弱性を見つけることは、後で発見するよりも修正コストを大幅に削減できる。この考え方を「シフトレフト」と呼ぶ。静的アプリケーションセキュリティテスト(SAST)は、プログラムのソースコードを分析して潜在的なセキュリティ脆弱性を検出するテスト手法であり、シフトレフトを実現するための重要なツールの一つである。PVS-Studioは、約18年間にわたりC、C++、C#、Javaなどの言語に対応する静的解析ツールを開発してきた企業で、特にJava言語におけるSASTソリューションとしての機能を強化している。

SASTツールがどのような診断ルールを追加するかを決定する際の主要な基準の一つに、OWASP Top Tenがある。OWASP Top Tenは、OWASP(Open Worldwide Application Security Project)という団体が公開している、ウェブアプリケーションで最も重大なセキュリティリスクをランク付けしたリストだ。このリストは数年ごとに更新され、セキュリティ専門家やバグバウンティ企業、ウェブ開発者からの報告に基づいて作成される。この記事では2021年版を中心に解説するが、最新版のOWASP Top Ten 2025も近い将来発表される予定だ。

年々、発見される脆弱性の数は増加しており、CVE(Common Vulnerabilities and Exposures)統計からもその傾向は明らかである。CVEは、一般に知られているセキュリティ脆弱性のデータベースだ。脆弱性の増加傾向を見ると、包括的で詳細なテストが予防的な検出を保証するために不可欠であることがわかる。静的解析や動的解析によって問題が早期に検出されれば、手動テストや、最悪の場合、本番環境で問題が発覚するよりも修正費用は格段に安くなるため、SASTツールの需要は高まっている。PVS-StudioのJavaアナライザーは、OWASP Top Tenの10カテゴリ中9カテゴリをカバーしている。

OWASP Top Ten 2021のカテゴリを見てみよう。

A01:2021 - アクセス制御の不備 このカテゴリは、権限のないユーザーによる情報の漏洩、改ざん、破壊、またはユーザーの範囲外の業務機能の実行につながる脆弱性だ。 例えば、ユーザーからのURLパラメータを検証せずにリダイレクトに使用すると、攻撃者はフィッシングサイトへ誘導するURLを挿入できる。これにより、ユーザーが正規サイトと誤認して認証情報を入力し、それが攻撃者の手に渡る可能性がある。対策としては、リダイレクト先のURLをホワイトリストで厳格に管理し、許可されたドメイン以外へのリダイレクトを禁止することが重要だ。 また、アップロードディレクトリに「rwxrwxrwx」のような全ユーザーに完全な権限を与える設定も問題だ。攻撃者が実行可能なファイルをアップロードした場合、それが実行されてしまい、リモートコード実行(RCE)につながる。これを防ぐには、「最小権限の原則」に従い、必要最低限の権限のみを付与することが不可欠である。

A02:2021 - 暗号化の不備 このカテゴリは、機密データの不適切な暗号化に関する脆弱性だ。古い暗号化アルゴリズムやハッシュ関数の使用、暗号化されていない情報の送信などが含まれる。 例えば、SSL/TLSプロトコルの古いバージョン(例: TLSv1)を使用して外部APIに接続すると、中間者攻撃(Man-in-the-middle attack)などのリスクにさらされる。攻撃者は、送受信されるデータを傍受、解読、改ざんする可能性がある。これを防ぐためには、「TLSv1.2」や「TLSv1.3」のような、より新しい安全なバージョンのプロトコルを使用すべきである。

A03:2021 - インジェクション インジェクションは、信頼できないデータがアプリケーションの重要な部分(SQLクエリの実行など)に渡され、プログラムの意図した動作を改変してしまう脆弱性だ。これにより、機密データが漏洩したり、プログラムが停止したりする可能性がある。 最も一般的な例はSQLインジェクションである。ユーザーからの入力値をそのままSQLクエリに連結して使用すると、攻撃者は「' or 1=1; drop table demoTable; --」のような悪意のある文字列を挿入し、データベースから情報を不正に取得したり、テーブルを削除したりできる。これを防ぐには、入力データを無害化(サニタイズ)するか、パラメータ化されたクエリ(プリペアドステートメント)を使用することが必須だ。

A04:2021 - 安全でない設計 このカテゴリは、脆弱で安全でないアプリケーションアーキテクチャに起因する広範な脆弱性を指す。 例えば、ユーザーが指定したセッションIDに基づいてセキュリティ上の判断を行うことは危険だ。HttpServletRequest#getRequestedSessionIdのようなメソッドは、ユーザーが指定したセッションIDを返すため、攻撃者が偽のIDを送信して認証を回避する可能性がある。CWE(Common Weakness Enumeration)というセキュリティ脆弱性のリストにも関連するこの問題への対策は、ユーザー入力に依存せず、現在のセッションが持つ正規のIDを使用することである。

A05:2021 - セキュリティ設定の不備 セキュリティ設定の不備は、不要なポートやサービスの有効化、安全でない設定の使用、システムプロパティの設定に外部データを使用することなどに起因する脆弱性だ。 例えば、ユーザーが指定したキーと値でシステムプロパティを直接設定できる機能は非常に危険だ。これにより、機密情報が漏洩したり、プログラムがクラッシュしたりする可能性がある。このような設定は、特別な理由がない限り避けるべきであり、もし必要であれば、値をホワイトリストで厳しく制限することが必要だ。

A06:2021 - 脆弱で古いコンポーネント このカテゴリは、既知の脆弱性を含むライブラリやフレームワークのバージョンを使用していることに起因する問題だ。PVS-Studioアナライザーは、現在このカテゴリには対応していない。脆弱なライブラリのバージョン情報を集約・追跡する機能の実装に取り組んでおり、今後のアップデートで対応を予定している。

A07:2021 - 認証と識別の失敗 このカテゴリは、セッション管理やユーザー認証におけるエラーに関連する脆弱性だ。パスワード、セキュリティキー、セッショントークンが侵害され、識別データが盗まれる可能性がある。 例えば、CORS(Cross-Origin Resource Sharing)設定でAccess-Control-Allow-Originヘッダーに*(全て許可)を設定したり、ユーザー入力からこのヘッダーを生成したりすることは危険だ。これにより、任意のドメインからのリクエストを許可してしまい、外部ホストがブラウザにロードされたクロスドメインコンテンツにアクセスできるようになる。プライベートデータの漏洩や、攻撃者がウェブアプリケーションのAPIになりすましてユーザーのブラウザデータを盗むなど、深刻な影響を引き起こす可能性がある。対策としては、信頼できるドメインのホワイトリストを作成し、そのリストに含まれるドメインからのリクエストのみを許可するように設定すべきである。

A08:2021 - ソフトウェアとデータの整合性の不備 このカテゴリは、デジタル署名のないアップデート、安全でないデシリアライズ、安全でないリポジトリからの依存関係のダウンロードなど、ソフトウェアの整合性に関する脆弱性だ。 非安全なデシリアライズは典型的な例だ。リクエストからバイトストリームを受け取り、そのデータに基づいてオブジェクトを復元する際に、オブジェクトの種類を検証しないと、攻撃者は悪意のあるオブジェクトを注入してRCEを引き起こす可能性がある。Javaの標準的なデシリアライズメカニズムは推奨されないが、もし使用する必要がある場合は、デシリアライズするオブジェクトのクラスが許可された型のホワイトリストに含まれているかを確認するなどの対策が必要だ。

A09:2021 - セキュリティログと監視の失敗 このカテゴリは、不適切なロギングシステムによる問題検出の妨げ、ログからの情報漏洩、ロギングシステムを介したインジェクションなど、ログと監視に関するすべての状況をカバーする。 ログインジェクションは、ユーザー入力(例えば、URLのクエリストリング)に改行文字などを含ませてログに出力することで発生する。これにより、ログファイルが意図的に汚され、誤った情報が挿入され、実際のセキュリティ問題の特定と修正が困難になる。これを防ぐためには、ログに出力する前にすべての外部データをサニタイズ(無害化)することが重要だ。

A10:2021 - サーバサイドリクエストフォージェリ (SSRF) SSRFは、サーバがリモートリソースに接続する際に、そのリソースを事前に検証しないことで発生する脆弱性だ。この種の攻撃の目的は、標的システムの内部インフラに関する情報の漏洩、機密データの窃取、侵害されたサーバに代わって悪意のあるリクエストを送信することなど多岐にわたる。 例えば、ユーザーから提供されたURLを検証せずに直接接続しようとすると、攻撃者はhttp://127.0.0.1:8080/adminのような内部アドレスを指定し、通常はアクセスできないはずの内部サービスにアクセスできる可能性がある。SSRFに対する防御策は、外部URLを厳しく検証し、許可されたURLのホワイトリストを作成して、そのリストに含まれるURLのみに接続を許可することだ。

以上のように、OWASP Top Tenの各カテゴリは、ウェブアプリケーションに潜む一般的な脆弱性を示している。これらの脆弱性は、PVS-StudioのようなSASTツールを使用することで、開発プロセスの早い段階で検出できる。SASTツールの活用は、堅牢なセキュリティ体制を構築し、安全なソフトウェアを開発するために不可欠である。アナライザーの品質と診断ルールの数を継続的に強化していくことが重要である。

関連コンテンツ

関連IT用語

関連ITニュース