masterブランチを荒らされた時の復旧法

2 min read読了の目安(約2000字

皆さんは、gitのパスワードは十分に複雑ですか?
ある日いきなり「gitのパスワード割られとるで」とブラウザに表示された事はありますか?
私はついさっき表示され、あれこれ調べてたった今復旧しました。
根本的な解決には至っていないので、同じことが起きたときのために記録しておきます。

環境

AWSのCloud9で開発、gitのホスティングサービスはgithubではなくbitbucket。
「なんでそんなどマイナーな所を……」という声もあるでしょうが、これは昔のRoRチュートリアル環境だからです。

トラブル内容

ブラウザに「bitbucketのパスワードに漏洩の恐れがあります」という旨の警告表示。
しかし私は自他共に認める底なしの間抜け。「bitbucketはグーグルアカウント使ってるんだから、割られたんだったらグーグルから警告が来てるはずだろアホらしい」と無視してCloud9にアクセスし、ちょこちょことコードを書いてテストを走らせてみたらEの文字すら出ずに丸ごとエラー。仕方ないからロールバックしようとgit logしてみれば身に覚えのないコミットがターミナルを埋め尽くし、git branchしてみればこれまた謎のブランチがズラリ。
怠惰が服を着て歩いているような私ですが、さすがにbitbucketを見に行きました。自分ひとりの勉強用に去年作ったプライベートリポジトリなのに、日本人とロシア人が四年前から共同開発しているアプリが入っていました。どうやらリモートリポジトリの中身が丸ごと入れ替えられ、さらにローカルリポジトリのmasterブランチまで書き換えられていたようです。rails tもrails sも動かなかったのは、gemやbundlerなんかのバージョン不整合だったのでしょうか?

そうはならんやろ!
と叫んでみても、なっとる物は仕方がありません。

復旧手順

リモートリポジトリは丸ごと吹き飛んでいるし、ローカルリポジトリのmasterブランチと作業中ブランチはどちらも汚染されています。
こまめにブランチを削除いたのが仇となりました。

ローカルリポジトリで未汚染のブランチを復元

https://www.genius-web.co.jp/blog/web-programming/git-removed-branches-can-be-resurrectedfrom-gits-beginners-to-the-middle-class.html
git reflogで履歴を並べ、記憶を頼りにブランチをgit branch ブランチ名 HEAD@{ログ番号}で復元します。
ここでテストが動かなくて焦りました。bundlerがおかしくなっていただけだったのでbundle installで解決。

ローカルリポジトリでmasterブランチを上書き

ここでmergeしてしまってはいけません。せっかく動くブランチと汚染されたmasterブランチを混ぜても動くわけありません。
「git master 書き換え」「git master 置き換え」「git master 変更」とあれこれ検索ワードを変えた挙げ句、「git master 上書き」という当たり前のワードで目的の記事に到達。

https://saba.omnioo.com/note/585/branchの内容でmasterを上書きする/
masterブランチ上でgit reset --hard 未汚染ブランチ。これでローカルリポジトリのmasterブランチは復旧できます。

リモートリポジトリを上書き

後はリモートリポジトリの中身もgit push origin --forceで書き換えておけば終了です。作業は以上です。

https://qiita.com/ftnext/items/be166d3eaa511ee068b5#git-push

しかし今回の荒らしはどんな手段で侵入したのでしょう?
前述の通り、bitbucketを使うためのAtlassianログインにはグーグルアカウントを使っています。グーグルアカウントを割られたのなら新しいデバイスがうんぬんと警告メールが来るはずではないでしょうか? 私はまだまだ勉強中の身ですが、さすがに赤の他人がプライベートリポジトリの中身を丸ごと上書きできる設定にしたつもりはありません。
ローカルリポジトリまでおかしくなっていたのも妙な話で、Cloud9を操作するためのAWSのアカウントを割られた形跡がないのです。ローカルからリモートにpushする事はあっても、逆にpullした事はここ半年ないはずなのですが……。
bitbucketのパスワードを変えるよう勧められていますが、この場合はグーグルアカウントのパスワードを変えればいいのでしょうか?
誰か詳しい方がいらっしゃったらご教授お願いします。