通常、秘密鍵やAPI Tokenはソースコードとは分離させ、.envファイルなどに保存しておいて、Gitのコミットには含めない。しかし、実装の初期には.envを一時的にコミットに含めている事例も珍しくない。それを後で削除してコミットしても、履歴としては残っている。
この記事では、スマートコントラクト用の秘密鍵や、APIトークンなどの情報をGitのコミット履歴から検索し、リポジトリを公開する前に安全を確認できるツールを紹介する。
##コミット履歴を展開する
私の作ったesightというツールを使う。
git logを使って確認するのが一般的だが、一度全て展開した方が、後の編集や確認が楽になる。
インストール
pip3 install git+https://github.com/TakutoYoshikai/elemental-sight.git
コミット履歴の展開
出力先ディレクトリに、全てのコミットの差分ファイルが展開される。そこからターゲットとなる文字列を検索し、それを修正すればよい。
esight /path/to/repo {BRANCH} -o {OUTPUT DIR}
コミットが順番に番号のディレクトリに出力されて、差分のファイルが保存されている。
APIトークンや秘密鍵などの文字列を検索するツール
このesightを使用して、gitのコミット履歴を展開した後、正規表現でランダムな文字列を検索するツールshibaを開発した。
このshibaは、正規表現によってhex文字列や、普通の文字列を検索した後に、その文字列がランダムに生成されたかどうか、文字の出現頻度の分散を計算し、閾値以上のものを表示する。
インストール
git clone https://github.com/TakutoYoshikai/shiba
cd shiba
./install.sh
#パスを通す
echo "export PATH=\$PATH:/path/to/shiba/bin" >> ~/.bash_profile
使い方
# APIトークンを探す
shiba /path/to/repo {BRANCH} {TOKEN LENGTH}
# ./SHIBA_RESULT にコミット履歴が展開されている
# hex文字列を探す
shiba /path/to/repo {BRANCH} hex {TOKEN LENGTH}
#例: ローカルにcloneしたreactのリポジトリの中から32文字のhex文字列を検索する
shiba ./react master hex 32
結果は以下のように表示される
./0/message.json 4hQ0v2z7fNRvvOji0jShV5SpNqYEgajJ
./1/message.json zkjhJgeY336mqEADvkvE494xxi2XyB8u
./2/env oe7tGfeBW1YJga7DieAjtrxCgNhs1c5X
##コミット履歴を確認した後
公開してはいけないデータを見つけた場合の対処法が、以下のメルカリの記事に修正の方法がまとめられている。