こんにちは、ご無沙汰しています。 本日は CVE にコントリビュートしてみた話をします。
CVE (Common Vulnerabilities and Exposures) は、アメリカの非営利団体である MITRE 社が管理している脆弱性のデータベースです。 先日、CVE の中に誤った情報を発見しました。 CVE は多くの人に参照されるので、いい機会だと思い CVE の修正リクエストを投げてみることにしました。
CVE-2021-33194
CVE-2021-33194は Go の golang.org/x/net パッケージに存在していた脆弱性です。 悪意のある文字列をパースさせようとすると、プログラムが無限ループするというものでした。 攻撃者は悪意のある文字列を送信することで、サーバーに DoS 攻撃を仕掛けたり、クライアントのプログラムをクラッシュさせることができます。
Description
golang.org/x/net before v0.0.0-20210520170846-37e1c6afe023 allows attackers to cause a denial of service (infinite loop) via crafted ParseFragment input.
以前は CVE-2021-33194 の Description が以下のように掲載されていました(Internet Archive2021 年 5 月 26 日の記録より)。
Description
Go through 1.15.12 and 1.16.x through 1.16.4 has a golang.org/x/net/html infinite loop via crafted ParseFragment input.
この脆弱性は golang.org/x/net 内の不具合なので、Go のバージョンには依存しません。 おそらく、同時期に報告されたCVE-2021-31525と Description や影響範囲が似ていることから、間違った情報が掲載されたのだと思われます。 現在は正しい Description が反映されています。
CVE リクエストを送る
まずリクエストを送る前に、本当に Go のバージョンに依存しないかを確認しました。 Google Group のアナウンスや修正パッチから、脆弱性の中身や再現手順を確認します。 幸いにも修正パッチには、脆弱性を再現するテストケースに追加されていました。
srcs := []string{
"<math><html><template><mn><template></template></template>",
"<math><math><head><mi><template>",
}
この文字列を使い該当の脆弱性を手元で再現させて、本当に Go のバージョンが関係ないかを確認しました。
Go のバージョンが関係ないという確証が得られると、次は CVE に対して変更リクエストを送ります。 CVE に関する問い合わせはCVE Request Web Formから送信できるのを知りました。 自分は CVE リクエストの作法は知りませんでしたが、以下のように拙い英語で説明しまいsた。
フォームの情報を送信すると、指定したメールアドレスにメールが届きます。
そして 1 日以内に、送ったリクエストが受理されたというメールが届きました。
このメールを受け取った数時間後、自分が送った CVE の変更リクエストが反映されているのを確認しました。
まとめ
自分の中ではセキュリティ界隈は(GitHub の議論より)厳格なものだと思ってたのですが、あっさりと受理してもらえました。 CVE フォームの向こう側にいるのも同じ人間なので、丁寧にリクエストを送ると真摯に対応してもらえます。 今回のケースは決して大きな修正ではないですが、同じ脆弱性を参照する人が正しい情報を参照できれば幸いです。
CVE リクエストを送るのは OSS 活動と似ている部分があります。 OSS でも提案やバグ報告をするだけで、立派なコントリビュートです。 CVE も同じで、管理者が気づかないミスや、改善できる点がまだ眠っているかもしれません。 そういった観点で眺めることができると、CVE をより楽しむことができるでしょう。