git に脆弱性が見つかりました
脆弱性の詳細はこちら(英語)
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-5260
訳
Gitに脆弱性があり、これを利用すると、外部に公開してはいけない認証情報を、外部のサーバーに送ることができてしまいます。攻撃者はこれを利用すると、自分のサーバーに認証情報を送ることができてしまいます。
Gitは credential helper というプログラムを利用しており、パスワードなどを保存しています。この情報は、OSによって、安全な場所に保存されます。
しかし、改行コードを含むURLを利用することで、このパスワードなどの情報を、他のサーバーにHTTPリクエストで送ることができてしまいます。具体的には、 good.example.com
といったURLに対して認証する時に、パスワードの情報だけ evil.example.com
に送る、といったことができてしまいます。この結果、最初に述べたように、攻撃者は自分のサーバーに認証情報を送る事ができてしまいます。
good.example.com と evil.example.com の2つのURLにはなんの関連性がなくても良いので、どんなホストにでも送ることができます。
この脆弱性は、不正なURLを git clone
させることで発生させることが可能です。
不正なURLは、見るからにおかしいURLではありますが、 git submodule や、 git を使ってビルドされるパッケージなどを使えば、ユーザーの目につかないところで不正なURLを git clone
することができます。
この脆弱性は 2020年4月16日のパッチで修正されました。Git 2.17.x 系のバージョン以上であれば、このパッチがあたった修正版があります。
それより古いバージョンを使いたい場合は、 9a6bbee
のコミットを適用させることで修正が可能です(このコミットには git fsck の修正は含まれていませんが、脆弱性を塞ぐだけであればこれで十分です) 。
脆弱性が修正されたバージョン: 2.17.4, 2.18.3, 2.19.4, 2.20.3, 2.21.2, 2.22.3, 2.23.2, 2.24.2, 2.25.3, 2.26.1.
Git をバージョンアップする
現在のGitのバージョンを確認する
Gitのバージョンを確認します。環境は macOS です。
$ git --version git version 2.21.0 (Apple Git-122.2)
2.21.0
と「脆弱性が修正されたバージョン」に挙げられているバージョンのうち、 2.21.x
系のバージョンである 2.21.2
と比べます。
下一桁を比べた時に、今インストールされているバージョンの方が数字が小さい場合は脆弱性を含んでいますのでアップデートしましょう。
今回は、 2.21.0 を最新版の 2.26.2
まで上げることにしました。
現在インストールされているgitがどうインストールされたのか
Macにはデフォルトでgitがインストールされており、を特にいじった記憶がない人はこれを使っていると思います。
git --version
として Apple Git と出てきた人はそれで。
$ which git /usr/bin/git $ git --version git version 2.21.0 (Apple Git-122.2)
面倒なのでHomebrewでgitを入れ直すようにします。
この Git コマンドは消しちゃいます。
$ ls /usr/bin/git* /usr/bin/git* /usr/bin/git-receive-pack* /usr/bin/git-upload-archive* /usr/bin/git-cvsserver* /usr/bin/git-shell* /usr/bin/git-upload-pack $ sudo rm /usr/bin/git*
もし Homebrew でインストールしていた場合はそれを消すだけです。
brew remove git
HomebrewでGitをインストール
まず、ちゃんと最新版のGitが入るように、brew自体を更新します。これをしないと、古いバージョンのGitがインストールされてしまう可能性があります。
brew update
gitをインストールします。
brew install git
gitのバージョンを確認します。
$ git --version git version 2.26.2
バージョンが上がりました。
パッチがあたったgitのバージョンに 2.26.1
があり、下一桁が1より大きいので、このバージョンには脆弱性が有りません。