GitHubへのヤバいソースコードのお漏らしを発見する方法を夢の中で考えてみる
おはようございます.
今日は朝から GitHub が謎のトレンド入りしていて賑わっていますね. どうやらヤバいコードが GitHub に公開されてしまったみたいです.
ヤバいコードが流出してしまうのはヤバいことです. ヤバいことが起こった場合, 企業は一刻も早く事態を知り, 対処する必要があるかもしれません.
では, 今回のような一個人による GitHub への機密情報大開示を企業がいち早く知ることはできるのでしょうか.
...一つ方法を思いついてしまったので, 思いつきのままに実験をします.
やりたいこと
今回やりたいことは大雑把に説明すると以下のとおりです:
- 任意の GitHub ユーザが自社に関係のあるヤバいコードを Public リポジトリにプッシュしてしまった場合に, 自社の担当者に素早く通知が行くようにしたい
GitHub には毎日無限のコードが投入されており, 一企業がこれらを全てクロールして中身をチェックするのは大分しんどそうです. GitHub に, 任意のユーザのアクションに応じて何か通知を発してくれる夢のような機能は無いのでしょうか.
実は, あるんです.
GitHub Secret Scanning
GitHub Secret Scanning は, 簡単に言うと GitHub 上のリポジトリに各種サービスの API トークンなど機密情報が公開された場合, GitHub がサービスプロバイダに通知をしてくれるサービスです. 例えば, AWS のアクセスキーペア, GitHub のパーソナルアクセストークン等が Secret Scanning に対応しています.
AWS と Secret Scanning
さて, GitHub は Secret Scanning によって機密情報を見つけた場合, その機密情報を生成したサービスプロバイダに通知します. サービスプロバイダは, 通知された情報を元に本当に機密情報が漏洩したかを検証し, ユーザを保護するためのアクションを取ることができます.
上の公式ドキュメントにもある通り, Amazon Web Service (AWS) は GitHub Secret Scanning に対応しているみたいです. 多分 AWS のアカウントに紐付いたアクセスキーペアを GitHub 上に漏らしてしまうと, AWS から何かアクションがあるのではないでしょうか?
試してみる
IAM ユーザ, アクセスキーペアを作成
IAM から適当なユーザを作成し, アクセスキーIDとシークレットアクセスキーを取得します. 決してポリシーをアタッチしないでください. クラウド破産します.
こんな感じのアクセスキーペアが取得できます:
AK*****43KCJL*****UP
Se*****v810Qs*****XuhZA*****MhrZ4*****VP
シンプルなコードで試してみる
非常にシンプルな Python コードで試してみます:
key = "AK*****43KCJL*****UP"
secret = "Se*****v810Qs*****XuhZA*****MhrZ4*****VP"
print("yabai", key, secret)
これを任意の GitHub パブリックリポジトリにプッシュし, 起こることを確かめます.
以下はプッシュした時刻からの経過秒数と起こったことです:
-
(+0s) ヤバいコードを GitHub にプッシュ
-
(+47s) AWS から "漏洩してますよ" メールがルートユーザのメールアドレスへ送られる.
死ぬほど早くてびっくりしました. メールには,
- 漏洩のあったアクセスキー
- ユーザに
AWSCompromisedKeyQuarantine
ポリシーをアタッチした通知 - 対処の手順
等が含まれていました.
-
(+48s) AWS から "サポートチケット建てました" メールがルートユーザのメールアドレスへ送られる.
前のメールとほぼ同時ですね. 前のメールと同じく, 対処の手順などが記載されています. 特にサポートに連絡してくれ, などの記述はないみたいです.
-
(+720s) AWS サポートからルートユーザの連絡先に電話が来ます.
びっくりしました. サイレントモードだったので電話には出れませんでしたが, 発信元はアメリカです.
爆速で対応してくれますね. 事故ってアクセスキーを漏らしてしまっても意外と素早く気づけるかもしれません.
同じアクセスキーペアを再度漏らしてみる
では, 上のステップで一度漏らしてしまったキーを再度漏らした場合はどうなるのでしょうか.
yabai.py
をコピーし, yabai2.py
としてプッシュしましたが, 特に AWS から追加の連絡が来ることはありませんでした.
変なコードで漏らしてみる
先程のコードはいかにもアクセスキーペアっぽい変数にキーが格納されていました. では, 例えば, 下の意味不明なコードではどうなるでしょうか:
#include <stdio.h>
char *AK*****43KCJP*****3I = "a";
char *gF*****sR1cg*****EONG5*****OcmU5*****G9l = "b";
int main(void) {
printf("hi");
return 0;
}
変数名として有効な (無効な記号を含まない) シークレットアクセスキーを取得するためにキー生成ガチャが必要かもしれません.
結果としては, しっかり AWS から通知が来ます. 特にテキストを解釈することなく, それっぽいパターンなら何でも通知してくれそうですね.
実用例
AWS のヤバいアクセスキーペアを漏洩すると, GitHub Secret Scanning と AWS が連携して爆速で通知をくれることがわかりました. では, 実用例を考えてみます. コード中にこんな感じで仕込むのはどうでしょうか? (参考: #俺が見たクソコード選手権 まとめ)
// 絶対消すな!
char *AK*****43KCJP*****3I = "a";
char *gF*****sR1cg*****EONG5*****OcmU5*****G9l = "b";
int main(void) {
...
// 神コード. 消したら動かない. 絶対消すな!!!!!
if (AK*****43KCJP*****3I == gF*****sR1cg*****EONG5*****OcmU5*****G9l) {
printf("これはありえない");
}
...
}
もしこのようなヤバいコードが GitHub パブリックリポジトリにプッシュされた場合, このアクセスキーペアを管理する企業の担当部門に真っ先に警告メールが飛び, 電話が鳴り, 真っ先に大惨事に気づくことができるでしょう. 目的達成ですね!
評価
一応メリット・デメリットを考えてみましょう.
- メリット
- GitHub で全人類の生み出すコードに24時間張り付くことなく機密情報の流出を見つけることができる
- 爆速で気付ける (1分以内)
- デメリット
- 謎の神コードを埋め込む必要がある
- 同じキーペアに対する通知は1度まで?
- ファイルごとにキーペアを変える必要がある
- 同じファイルが複数人によって漏洩されても, 最初の1人しか通知されない
- 漏洩を発見できたところで既に漏洩しており手遅れの可能性もある
兵器としての信頼性、ちと厳し過ぎるわね。
おわりに
本当に真に受けないでください.
もう少し寝ることにします. ありがとうございました.
余談
GitHub リポジトリ内の機密情報をスキャンして教えてくれるのは GitHub Secret Scanning だけではないみたいです. 実際, GitGuardian
と leakd.io
というサービスからもメールが来ていました. これらは善意のクローラかもしれませんが, 悪意のあるクローラも星の数ほどいるかもしれません. 怖いね.
Discussion