脆弱性報告で GitHub から $4,000 貰った話
はじめに
こんにちは、ダイニーの ogino です。
この記事では GitHub の bug bounty で脆弱性を報告し、実際に報奨金を受け取った時の体験を共有します。
私は特にセキュリティの専門家ではなく、偶然に問題を見つけて初めて報告をしました。読者の方が同じようなチャンスに遭遇した時スムーズに行くように、海外からお金を受け取る上での意外なつまずきポイントや、実際に貰える金額などについて紹介します。
どんな問題を見つけたのか
今回見つけたのは、GitHub Copilot の VSCode 拡張機能に関する問題です。
この拡張機能のソースコードは本来公開されていないはずですが、TypeScript のソースマップによって元のコードが露出していました。
そもそも VSCode の拡張機能は .vsix
という拡張子の付いたパッケージ形式で配布されます。これは実態としてはただの zip フォルダで、中に JavaScript のコードや manifest ファイルなどが含まれています。
├── assets
├── dist
│ ├── extension.js
│ ├── extension.js.map
│ ├── language-server.js
│ ├── language-server.js.map
...
│ └── tree-sitter-typescript.wasm
└── package.json
GitHub Copilot の拡張機能のソースコードは TypeScript で書かれており、バンドルされ難読化された後に配布されています。
原理的には、難読化されているとはいえコードを読み解くことは可能です。しかし元のソースコードを読むよりは遥かに労力がかかるので、クローズドなプロダクトであっても大したリスクにはなりません。
今回は配布されているパッケージの中にソースマップ (*.js.map
) ファイルが含まれており、かつその中に sourcesContent
フィールドがあったのが問題でした。
ソースマップは下記のような形式の JSON ファイルです。
{
"version" : 3,
"sources": [
"ghostText.ts",
"telemetry.ts",
...
],
"sourcesContent": [
"// ghostText.ts のソースコード",
"// telemetry.ts のソースコード",
...
],
"file": "extension.js",
"sourceRoot": "",
"names": [...],
"mappings": "A,AAAB;;ABCDE;..."
}
TSConfig の inlineSources オプションや、esbuild の sources content オプションを true に設定してビルドすると、ソースマップの sourcesContent
に元のコードの中身がそのまま含まれます。
これにより、わずかなスクリプトを書くだけで GitHub Copilot 拡張のソースコードをディレクトリ構造ごと復元できる状態になっていました。
問題を報告して報奨金を受け取るまでの流れ
企業ごとの脆弱性報告ルールを確認する
企業によってそもそも脆弱性報告を受け付けていなかったり、それぞれ異なる報告のルールがあったりします。まずは対象企業の脆弱性報告プログラムの説明を探しましょう。
多くの場合 HackerOne というプラットフォーム経由で報告を受け付けていて、そこにガイドラインや過去の報奨金実績などのデータが載っています。
レポートを書いて結果を待つ
用意されているテンプレートに沿って、以下のような情報を記入して報告します。
- 影響範囲
- 脆弱性の種類
- 再現手順
- ビジネスやユーザーへのインパクト
HackerOne のレポート提出画面
今回のケースでは、報告から 5 日後に問題を認識して修正中という旨の返信があり、約 3 ヶ月半後に解決の報告と報奨金確定がありました。
アメリカの税金に関する書類を提出
初めて HackerOne から報奨金を受け取る時、Form W-8BEN という書類の記入を求められます。
報奨金には税金がかかります。HackerOne 本社があるアメリカと、日本の税金を二重に納めないようにするため、この書類によって米国での源泉徴収を免除してもらいます。
送金方法を選択
HackerOne では以下の 3 種類の送金方法を選択できます。(参照)
手数料 | 受け取りまでの日数 | |
---|---|---|
PayPal | 円で引き出す場合 3% | 1, 2 日 |
銀行振込 | 銀行によるが 5,000 円程度 | 1~10 日 |
仮想通貨 (Bitcoin, USD coin) | ? | 1, 2 日 |
私の場合 PayPal だと手数料が 18,000 円ほどかかる計算のため銀行振込を選びました。その結果、後述する通り思わぬ手間が発生する形にはなりました。
銀行から電話が来る (!)
報奨金の支払いが行われたタイミングで、銀行から電話がありました。
マネーロンダリング等の対策のため、国際送金に関するチェックが厳しくなっているようで、受け取った金額や理由と送金元が誰かについて確認されました。
特に心の準備が無い中、脆弱性報告プログラムというエンジニア以外に馴染みの無い概念を電話越しに説明するのはなかなか難しく、かなり怪しい回答をしていたと思います。
特に、アメリカ企業からの受け取りだと答えた時に、「イギリスからの送金のようですが」と質問された時には肝が冷えました。(HackerOne はイギリスにもオフィスがあり、そこから送金されていました。)
後日、送金の証明になる書類を提出するため銀行に直接出向きました。HackerOne では Verification letter という PDF を発行してくれますが、中身が薄く証明書としては不安を感じる見た目です。
念の為 HackerOne のサイトや脆弱性報告について説明した日本語サイトを印刷して持っていき説明したところ、無事に解放されました。
Verification letter を発行するための画面
Verification letter
確定申告
報奨金を受け取ったら、その額によっては確定申告が必要になります。
そのためにまず、所得の区分として脆弱性報告の報奨金がどこに該当するのか調べなければいけません。
関係しそうなのは「一時所得」と「雑所得」の二つです。
一時所得とは、上記利子所得から譲渡所得までのいずれの所得にも該当しないもので、営利を目的とする継続的行為から生じた所得以外のものであって、労務その他の役務の対価としての性質や資産の譲渡による対価としての性質を有しない一時の所得をいいます。
雑所得とは、上記利子所得から一時所得までの所得のいずれにも該当しない所得をいいます。
今回は、業務や副業として継続的に取り組んでいるわけではないので、一時所得として申告しました。一時所得は雑所得と比べて少し有利で控除額が 50 万円となっており、所得がそれを超す場合は申告が必要になります。
受け取った報奨
GitHub の脆弱性報告には low, medium, high, critical のいずれの severity が割り当てられ、それによって報奨金のレンジが決まります。今回は medium の判定で、$4,000 (約 60 万円)の報奨金を受け取りました。
またそれに加えて以下のようなオマケがあり、脆弱性報告をして受理されたことの証明にもなります。
- GitHub Pro が永年無料
- GitHub のプロフィールページに “Security Bug Bounty Hunter” という Highlight が付く
- GitHub Security Bug Bounty という organization に招待される
GitHub プロフィールの左下。Highlight と Organization が脆弱性報告の証明になる
最後に
当初この問題を見つけた時、脆弱性と言うには大袈裟で報告するまでもないかと考えていましたが、実際報告してみると思いがけず高額の報奨金が得られました。
この記事が同じように踏み出すきっかけになったり、その時の諸々の手続きの助けになれば幸いです。
円安の今、外貨を稼いで日本の経済を回していきましょう。
We’re Hiring!
ダイニーでは、セキュリティに関心のあるエンジニアを歓迎しています。
Discussion
すごいね!友達もアンドロイドの脆弱性を報告し、3000ドルを貰った
すごすぎわろた。。。。。
メシウマです。 ごちそうさまでした\(^o^)/