猫でもわかるWebプログラミングと副業

本業エンジニアリングマネージャー。副業Webエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

git コマンドの脆弱性が発表されたのでバージョンアップをする【Mac】

f:id:yoshiki_utakata:20200428103449p:plain

git に脆弱性が見つかりました

forest.watch.impress.co.jp

脆弱性の詳細はこちら(英語)

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より大きいので、このバージョンには脆弱性が有りません。