はじめに
脆弱性を報告してCVE識別番号(CVE-ID:以下CVEと記す)を取りたい若者がいるみたいなので、そういう人に向けて持続可能(だと思っているけれども他の人がどう感じるかは不明)なやり方をざっくりとガイドする。
筆者は主にWebアプリケーションの脆弱性を報告してCVEを取得しているので(どういうものを見つけているのは各自探してください)、本稿ではWebアプリケーションで脆弱性を見つけて報告してCVEをもらうためのアプローチと具体的なやり方についてざっくり書く。他のスマホアプリとかネイティブアプリとかネットワーク層より下には基本的に触れないつもりだが、基本的には似たような流れだ。
必要な環境
PC
スマホとかタブレットだけだとたぶんつらい。とはいえ筆者が最初に脆弱性報告した際に使用していたPCではスペックが低くてプロキシソフトが動かなかったので、最悪Webサーバーとブラウザーさえ動けば何とかなる。
インターネット接続
脆弱性を見つけるだけならインターネットは必ずしも必要ではないが、報告するのに必要となる。
必要な知識
まずざっくり必要となる知識。このあたりは脆弱性を探すのにも報告するのにも必要となる。
インターネット、Webに関する知識
- IPアドレス
- ホスト、ポート
- http
- html
- JavaScript
自分がブラウザからどのようにインターネット上にあるWebサイトから情報を取得しているのかざっくりと知っておく必要がある。3層より下はあまり知らなくても何とかなる気もする。
基本的なプログラムの知識
特に脆弱性を見つけたいWebアプリケーションが書かれている言語(php/python/JavaScript/go/Javaなど)のことは知っておいた方がいい気がする。知らなくても最悪何とかなる。
基本的な脆弱性についての知識
特に自分が探したいと思っている脆弱性の基本原理は知っておいた方いい。クリックジャッキングとかクロスサイトスクリプティングとかカタカナがたくさんあるが名称についてはそれほど知らなくてもいい。重要なものは知らないうちに覚えてる。
攻撃方法を知っておくとより楽しめるし、報告する際にこういう攻撃でこういうデータが取れました、みたいなことを書くと修正される確率が上がると思う。プラットフォームによっては詳細書かないと却下されることがあるかもしれない。クリックジャッキングの攻撃方法はよく知らなくても報告はできると思う。
CVSSについての知識
最近報告するのにスコアを計算することが求められることが多い。IPAもそうなので知っておいた方がいい。わからない場合は他の似たような前例をパクってそれっぽいものにすればいい。
その他必要なもの
気持ち
運が良ければなくても見つかるとは思うが、報告するのには元気とやる気が必要。
脆弱性報告とCVE番号
CVE番号を取得するには、まず脆弱性を見つけて報告することが必要となる。他人が見つけた脆弱性を報告して自分のものにすることができるかは筆者には経験がないので不明。
報告した脆弱性が修正され、その後CVE番号が付与されるという流れになるが、修正されずに付与されることもあるはずだがちょっとよくわからない。
脆弱性の見つけ方
まず大きく分けて見つけ方は2種類ある。好きな方でやればいい。Webの場合だと動作確認する必要があるので最終的には動かす必要はあると思う。(筆者はソースコードだけの指摘をしたことがないが、直接プルリクを送って自力で取得する方法もあるかもしれない)
ソースコードから見つける(ホワイトボックス的なアプローチ)
ソースコードを読んだりgrepしたりしてがんばって探す。
echo $_GET('id');
みたいなのがあれば勝ち確。昔みたいにこの関数使ってたらXXE確定みたいなのは今はないと思う。
動かして見つける(ブラックボックス的なアプローチ)
まず、Webアプリケーションを動かす必要がある。いろいろな問題があるので外部のサーバーで動かすことはお勧めしない。ざっくりとやり方はこんなかんじ。
- 手元でWebアプリケーションを動かす
手元でApacheとかMySQLとか立ち上げたりして、そこにWebアプリケーションを動かす。XAMMPとか使ってもいいかも。pythonとかnodeとかだとプログラムを立ち上げるとWebサーバーも立ち上がることになるので別にWebサーバーを建てる必要はないかもしれない。アプリによってはインストーラーが提供されているのでインストールするだけでいいかもしれない。
- 仮想環境でWebアプリケーションを動かす
WebアプリによってはDocker環境が準備されてたりするので、それを使うと何も考えず動かすことができるかも
動かしてみて動作確認してX-Frame-Options
ヘッダを送信していないならクリックジャッキング脆弱性があるかもしれない、みたいなかんじでいろいろやっているうちに脆弱性が見つかるはず。
見つからない場合はアプリケーションを変えるか探す脆弱性を変えるかあきらめるかする。クリックジャッキングなら簡単に見つかるとは思う。
CVE番号を付与してもらう流れ
脆弱性を見つけたら報告して、修正されて、CVE番号を付与してもらうという流れになる。
CVE番号を付与してもらうには4パターンある気がする。他にもあるかもしれない。
- IPAに報告してIPAがCVEを取ってくれる
日本だとこれが一般的で楽なやり方。
- 製作者に直接報告して企業がCVEを取ってくれる
製作者が脆弱性報告に乗り気ならこちらの方がすぐに修正してもらえるかも。修正してもらうのと並行してIPAに報告というやり方もある。
- バグバウンティサイト経由でバグバウンティサイトがCVEを取ってくれる
バグバウンティサイトによっては報告するとCVE番号をもらってくれるところもある。
- mitre経由で自力取得する
修正完了後、IPAではなくmitreに直接報告する方法もある。筆者は未経験。
- 自分のブログで攻撃コードを公開してると誰かがCVE番号を取ってくれる
自分のブログでの攻撃コード公開は海外でたまに見かける。日本だと法的な問題があるのかもしれない。日本でセキュリティエンジニアとして活動していこうと思うならあまりお勧めしない。
脆弱性を見つけて報告する
前述のように手元で動かしたり、ソースコードを読んだりして脆弱性を見つけるとようやく報告できる。
どこに報告するにせよ、報告を書く必要がある。報告にはこうすれば攻撃できるよというPoC(Proof of Concept)のようなものが必要となる。
クロスサイトスクリプティング(XSS)のようによく知られた脆弱性だと、こういうURLにアクセスするとアラートが出たのでXSSでしょ、くらいの簡単なもので納得してもらえるが、ぼくの考えた最強の脆弱性みたいなものは、相手に納得してもらえるような攻撃方法の詳細と被害の詳細が必要となる気がする。
クリックジャッキングの場合はレスポンスヘッダにX-Frame-Options
がないログを送るということになるのだろう。
修正してもらう
脆弱性を見つけたら修正してもらう必要がある。いくら見つけて報告しても修正されないとCVE番号は取得できない。
クリックジャッキングを見つけるのは簡単で報告も簡単だと思うのだが、CVE番号があまり発行されていないということは報告しても修正されない可能性が高いのではないか、と推測できる能力も必要になるかもしれない。
オープンソースのWebアプリケーションの場合、修正コードのプルリクを送って修正してもらうというやり方もある。
PoCが出回って実際に攻撃に使用されている場合は、誰かがCVE番号を付けてくれるかもしれないが、経験がないのでよくわからない。
CVE番号が付与される
報告した脆弱性が修正されるとCVE番号が付与される。IPAに報告した場合は、公表前に謝辞の再確認のような連絡がくるので修正されたことはなんとなくわかるが、その他のケースは知らないうちに付いてることもあるので期待せず待とう。