CVE取得体験記
はじめに
はじめまして。
TIS ペネトレーションテストチームの魏赫です。
当チームは、高度なスキルと豊富な経験を持つセキュリティの専門家集団として、お客様のシステムに対し、高品質な脆弱性診断とペネトレーションテストを提供しています。金融、製造、通信など、様々な業界のお客様にサービスを提供した実績があります。
私は2016年からBug Bountyと脆弱性研究に取り組み、2023年から2024年の間に10件のCVEを取得しました。
本記事では、過去に行ったCVE取得の経験についてご紹介します。
近年、企業の情報システムやWebサービスにおけるセキュリティ対策の重要性はますます高まっています。
巧妙化するサイバー攻撃から組織を守るには、最新の脅威情報を迅速かつ正確に把握し、適切な対策を講じることが不可欠です。そのような状況下で、セキュリティ専門家が共通認識を持つための重要な指標となるのが「CVE(Common Vulnerabilities and Exposures)」です。
本稿では、私の経験を共有することで、皆様のお役に立てれば幸いです。
具体的な脆弱性発見のプロセスについては別の機会にご紹介し、本稿では、個人がCVE番号を申請する方法に焦点を当てて解説します。
CVEとは
CVE(Common Vulnerabilities and Exposures)は「共通脆弱性識別子」と訳され、公開されたセキュリティ脆弱性に対して世界共通で付与される識別子です。米国の非営利団体であるMITREが管理・運営しており、各脆弱性には「CVE-西暦年号-連番」の形式で一意なIDが割り当てられます。
https://www.cve.org/
例えば「CVE-2025-XXXX」のような形式で表記され、このIDを見ることで世界中のセキュリティ関係者は、特定の脆弱性の公開時期や概要を把握できます。
CVEの主な目的は、セキュリティ情報の共有において脆弱性を一意に特定し、混乱を防ぐことです。これにより、脆弱性に関する議論、レポート作成、修正プログラムの開発と適用が円滑に進められます。
CVEが重要な理由は主に以下の3点です。
- 脆弱性情報の標準化:CVEによって情報が標準化され、組織やツール間での共有が容易になります。
- コミュニケーションの効率化:CVE IDを共有するだけで、特定の脆弱性について正確な意思疎通が可能です。
- 迅速な脆弱性対策:CVEを通じて脆弱性情報が標準化され、迅速に共有されることで、ベンダーやシステム管理者は早期に対策を講じられます。
CVEの対象となる脆弱性について
CVEの対象となる脆弱性は、以下のような特徴を持つセキュリティ上の問題です。
主な特徴
- 公開されている脆弱性(Publicly Disclosed Vulnerabilities):CVEは、広く一般に公開され、セキュリティコミュニティやベンダーに認識されている脆弱性を対象とします。クローズドな環境や特定の組織内でのみ認識されている脆弱性は、原則として対象外です。
- 既知の脆弱性(Known Vulnerabilities):CVEは、発見済みで詳細が明らかになっている脆弱性を対象とします。ゼロデイ脆弱性(未知の脆弱性)は、発見・公開された後にCVEが割り当てられます。
- ソフトウェア、ハードウェア、ファームウェアの脆弱性(Software, Hardware, Firmware Vulnerabilities):CVEは、幅広い製品の脆弱性を対象とします。これには、OS、アプリケーション、ネットワーク機器、組み込み機器のファームウェアなどが含まれます。
- セキュリティ上の影響がある脆弱性(Security Impactful Vulnerabilities):CVEは、システムやデータのセキュリティに影響を与える脆弱性を対象とします。具体的には、機密性、完全性、可用性を損なう可能性のある脆弱性(リモートコード実行、権限昇格、サービス拒否、情報漏洩など)が該当します。
- ベンダーによって修正可能な脆弱性(Vendor-Fixable Vulnerabilities):CVEは、ベンダーが修正プログラム(パッチ)を提供できる脆弱性を対象とします。これにより、ユーザーは脆弱性に対処し、セキュリティリスクを低減できます。
具体例
- ソフトウェアのバッファオーバーフロー脆弱性:メモリ領域を超えてデータを書き込むことでプログラムの異常終了や予期しない動作を引き起こし、リモートからのコード実行を可能にする脆弱性です。
- ウェブアプリケーションのSQLインジェクション脆弱性:ウェブアプリケーションがデータベースへの問い合わせを適切に検証しないため、攻撃者が不正なSQLクエリを注入してデータベースを操作できる脆弱性です。
- オペレーティングシステムの権限昇格の脆弱性:一般ユーザーの権限から管理者権限へと不正に昇格できる脆弱性です。
- ネットワーク機器の認証バイパスの脆弱性:認証機能を迂回して不正アクセスを可能にする脆弱性です。
CVEの対象となりにくい脆弱性
- 設定ミスや運用ミス(Configuration and Operational Errors):システムやソフトウェアの設定ミス、誤ったアクセス権の設定などによるセキュリティ問題は、通常CVEの対象外です。ただし、製品のデフォルト設定に重大なセキュリティ上の問題がある場合は、例外となることがあります。
- ポリシー上の問題(Policy Issues):組織のセキュリティポリシーの不備や運用上の問題は、CVEの対象外です。
- カスタムアプリケーションの脆弱性(Custom/In-House Application Vulnerabilities):組織内限定で使用されるアプリケーションの脆弱性は、原則としてCVEの対象外です。ただし、広く配布されているカスタムアプリケーションやオープンソースプロジェクトの場合はCVEの対象となることがあります。
- サービス拒否攻撃(DoS/DDoS):DoSは攻撃手法であり、それ自体は脆弱性ではないため、CVEの対象となりません。ただし、特定のソフトウェアの脆弱性がDoSを引き起こす場合、その脆弱性にCVEが割り当てられることがあります。
- 軽微な情報漏洩(Minor Information Disclosure):エラーメッセージにバージョン情報が含まれるなど、セキュリティへの影響が軽微な情報漏洩は、CVEの対象とならないことがあります。
(補足)Webサイト固有の脆弱性(例: XSSやSQLインジェクションなど)は、CVEの対象外です。CVEは一般的に、特定の製品やソフトウェアに影響を与える脆弱性に対して付与されます。
CVE番号取得プロセス
CVE番号の取得プロセスは、主に3つのステップに分けられます
- 脆弱性の発見
- CVEの申請
- CVEの公開
1.脆弱性の発見
ソースコード解析
- 静的コード解析ツール
- Clang Static Analyzer、SonarQube、Checkmarx などの静的コード解析ツールを使用することで、権限外アクセス、SQLインジェクション、XSS、CSRFなどのセキュリティリスクを発見できます。
- データフローへの手動診断
- データの流れ(データフロー)を把握し、ファイルの読み取りと書き込み、ネットワークI/O、システム呼び出し、暗号化、復号機能などに焦点を当てます。
- プログラムの動作を分析し、ビジネスロジックと組み合わせて、入力検証の欠落、権限チェックの妥当性、メモリ操作の安全性を確認します。
- 脆弱性が存在する可能性のある箇所を詳細に調査
- 疑わしいコード箇所にブレークポイントを設定し、ステップ実行やログ出力を活用してデータフローやコントロールフローを解析します。
イメージしやすいように、発見プロセスの一例を紹介します。 以下はオープンソースプロジェクトからのphpコードスニペットです。
ソースコード解析の結果:
対象のアプリケーションにローカルファイルインクルージョン(LFI)の脆弱性が存在することが判明しました。この脆弱性は、アプリケーションのファイルインクルージョン機能に起因しています。アプリケーションは、適切なフィルタリングを行わずにユーザー入力を直接使用してファイルをインクルードしており、適切なセキュリティチェックが実施されていません。その結果、攻撃者はこの脆弱性を悪用してサーバー上の機密ファイルを読み取ったり、特定の条件下ではリモートコード実行につながる可能性があります。
- アプリケーションは $_GET['page'] パラメータを直接ファイルパスの構築に使用しており、入力検証やフィルタリングを行っていません。
- file_exists() 関数でファイルの存在を確認していますが、これだけではパストラバーサル攻撃を防ぐことはできません。
- 攻撃者は ../ シーケンスを使用してディレクトリトラバーサルを行い、サーバー上の任意のファイルにアクセスすることができます。
ソースコード解析の結果に基づいて、この脆弱性を実証するPoCを作成できます。
以下のリクエストでサーバー上の機密ファイルを読み取ることができます。
http://example.com/index.php?page=../../../etc/passwd](http://example.com/index.php?page=../../../etc/passwd)
古いバージョンのPHP(<5.3.4)を使用している場合、ヌルバイトを使用すると **`.php`** 拡張子による制限を回避できる可能性があります。
http://example.com/index.php?page=../../../etc/passwd%00
PHPラッパーを使用してファイルの内容をbase64エンコードして読み取ることができます。
http://example.com/index.php?page=php://filter/convert.base64-encode/resource=config
Fuzzing
Fuzzing(ファジング)とは、ソフトウェアやシステムに対して、意図的に異常なデータやランダムなデータ(ファズデータ)を大量に入力し、その応答や挙動を監視することで、潜在的な脆弱性やバグを検出するための自動化されたテスト手法です。
例えるなら、ソフトウェアに「めちゃくちゃな食べ物」を大量に与えて、消化不良を起こしたり異常な反応を示したりしないかを観察するようなものです。このように、正常なデータだけでなく、想定外のデータに対しても適切に処理できるかを検証することが目的です。
Fuzzing は、以下のステップで実行されます。
- ターゲット選定: テスト対象となるソフトウェアやシステム、特に脆弱性が潜んでいそうな入力処理部分を特定します。(例:ファイルパーサー、ネットワークプロトコル処理、APIエンドポイントなど)
- 入力データの生成: ファズデータを生成します。生成方法には、完全にランダムなデータ、既知の正常なデータに基づいて変異させたデータ、文法や構造を意識したデータなど、様々な種類があります。
- 実行と監視: 生成されたファズデータをターゲットに入力し、プログラムを実行します。実行中のプログラムの挙動を監視し、異常な動作(クラッシュ、エラーメッセージ、メモリリーク、ハングアップなど)が発生するかどうかをチェックします。
- 異常動作の記録と分析: 異常動作が検出された場合、その原因となった入力データやプログラムの挙動、エラー情報などを記録します。記録された情報を分析することで、脆弱性の種類や原因を特定し、修正に繋げます。
- 繰り返し実行: 上記 2~4 のステップを繰り返し実行し、より多くの脆弱性を検出を目指します。
例えば、私の過去の脆弱性発見の経験では、画像認証コードのエンドポイント(例:https://xxx/validateCode)に対してファジングを実施したところ、認証コードの生成サイズを制御できるパラメータが存在し、これを悪用することで、サービス拒否(DoS)攻撃が可能であることが判明しました。
脆弱性が発見・検証された後、CVE番号の申請準備を開始できます。
2.CVEの申請
まず、脆弱性の影響を受ける製品がCNAメンバーによって管理されているかを確認する必要があります。
https://www.cve.org/programorganization/cnas
CNA(CVE Numbering Authority)とは、CVEプログラムの下で、特定の適用範囲内の脆弱性にCVE IDを割り当て、CVEレコードを公開することが認められた組織です。
これには、ベンダー、研究機関、オープンソースプロジェクト、CERT、ホスティングサービス、バグ報奨金プログラムの提供者、およびコンソーシアム組織が含まれます。
CNAにはさまざまな業種の組織が参加しており、一定の基準を満たす必要がありますが、金銭的な手数料や契約の締結は必要ありません。
CNAの一覧は、以下のリンクから確認できます。
https://www.cve.org/PartnerInformation/ListofPartners
発見した脆弱性がCNAメンバーによって管理されている場合、まず該当するCNAメンバーに脆弱性を報告する必要があります。
例えば、Androidに関する脆弱性を発見した場合は、Googleの定めるプロセスに従って報告する必要があります。
CNAのメンバーごとに異なる報告プロセスやポリシーがあるため、ここでは、オープンソースソフトウェアの脆弱性を報告する手順の一例を紹介します。
脆弱性報告ページにアクセスします。
https://cveform.mitre.org/
「Report Vulnerability/Request CVE ID」を選択
その後、必要事項を記入します。
注意点として、多くの場合、以下のカテゴリに該当する脆弱性のみが申請可能であり、『Other』を選択すると拒否される可能性が高くなります。
詳細な脆弱性の説明とPoC(概念実証)の提出が求められます。また、審査担当者が検証しやすいように、自身のブログやGitHubのリンクを添付することも可能です。
提出後、メールが届きます。
審査には通常5営業日ほどかかり、審査が承認されると、CVE IDが割り当てられたことを知らせるメールが届きます。
このメールの時点でCVE番号が割り当てられていますが、この時点ではCVE IDが仮割り当てされただけで、まだ正式には公開されていません。
CVE IDが割り当てられた後は、公開プロセスを進めることで正式にCVEレコードとして登録されます。
3.CVEの公開
一次審査に合格すると、CVE番号が割り当てられますが、この時点では非公開のため、正式には有効ではありません。
CVEを正式に公開するためには、申請を行い、二次審査を受ける必要があります。
申請リンク:[https://cveform.mitre.org/]
申請後、脆弱性情報は専門家グループによる二次審査と検証を受け、承認されるとメールが届きます。
このプロセスを経て、発見された脆弱性が公式に認定され、CVE脆弱性データベースに登録されます。
注意事項
許可なく第三者のサイトを診断することは、重大な法的リスクを伴います。
セキュリティ診断は、企業や組織のシステムを保護するための重要な取り組みです。しかしながら、診断対象となるサイトやシステムの所有者や管理者から、事前に明確な承諾を得ずに診断ツールを実行すると、不正アクセス禁止法に抵触する可能性があります。たとえ善意の目的であっても、無断で第三者のシステムにアクセスする行為は不正と見なされ、刑事罰の対象となる恐れがあるため、十分な注意が必要です。
不正アクセス行為に該当すると、不正アクセス禁止法第3条違反により、3年以下の懲役または100万円以下の罰金が科される可能性があります。
おわりに
脆弱性は、現代社会において常に存在しうる脅威であり、セキュリティ対策に終わりはありません。CVE脆弱性の研究と申請活動は、セキュリティ業界全体が絶え間なく進化し続けるための重要な取り組みであると認識しています。
当社は、社会的責任を深く認識し、高度なセキュリティサービスを提供することで、業界全体のセキュリティ水準向上に貢献することを企業の使命と位置づけています。脆弱性に関する情報や高度なセキュリティ知見の積極的な共有は、お客様への責務であると同時に、セキュリティサービスプロバイダーとしての社会的責任と考え、その実践に努めてまいります。
オープンな協力と情報共有こそが、複雑化するサイバー攻撃に対抗する鍵になると信じ、今後も業界の発展に微力ながら貢献していきたいと考えています。
本稿が、CVE脆弱性やその申請プロセスについて、読者の皆様の理解を深める一助となれば幸いです。
ご不明な点やご興味がございましたら、お気軽にお問い合わせください。
著者:
魏 赫
TIS株式会社
IT基盤技術事業本部 IT基盤サービス事業部 セキュリティサービス部