Help us understand the problem. What is going on with this article?

macOSのgitをXcode Command Line Tools版からHomebrew版に乗り換えてみた

More than 3 years have passed since last update.

最近ようやく内定もらえました、306sanです。

さて、先日Gitに関する脆弱性が見つかりました。

プロではないので細かい説明は省きますが、clone時に任意のコードが実行できるというものです。
脆弱性をつかったサンプルがあるので紹介します。
https://github.com/greymd/CVE-2017-1000117
うーん。恐ろしいですね
(個人的には普段はrecursiveオプション使っていないので日常的な恐ろしさを感じていない)

対策済みのバージョンはこちらで確認できます。
https://www.facebook.com/soudai.sone/posts/1528779273844846?comment_id=1529241370465303

現状確認

さて、みなさんはGitをどうやって入れましたか?
確か初めてターミナルを開いたときにgitと入力したら、
gitは入ってないからXcode Command Line Toolsをインストールしてね(意訳)
みたいな英文が出てインストールしたような気がします。

それではバージョンを見てみましょう

git --version                                                                             
git version 2.11.0 (Apple Git-81)

残念ながら、未対策のバージョンのようです。
試しにサンプルコードをcloneしてみます。

git clone --recursive https://github.com/greymd/CVE-2017-1000117.git
Cloning into 'CVE-2017-1000117'...
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 8 (delta 1), reused 7 (delta 0), pack-reused 0
Unpacking objects: 100% (8/8), done.
Submodule 'subs/morimori' (ssh://-oProxyCommand=echo ZWNobyBINHNJQURuTmtWa0FBNFdSVVE3QUlBaEQvemtGS2Vmci9YK0hMc0dpY1hPSmNiNWFzTHE3Zy9UL1lXTWlWUXM5QnhaTUtUQVdVWlRZN0NDdVRjb1FWeTFnaHhMdkQ3VVpMdW1xT1ZmWllHMWdqSEp0MTJmZnVESWJhWVRTeUs4aXViTlpFU0dCUlBSclhaaGwyNUVScjlqRDE4RVBacHRVQklkTll6Tkh6YzIzbDd3eGV3Qy96SHMvV0FJQUFBPT18YmFzZTY0IC0tZGVjb2RlfGd6aXAgLWQgPiAvZGV2L3R0eQo= | base64 --decode | sh /sub1) registered for path 'subs/morimori'
Cloning into '/private/tmp/CVE-2017-1000117/subs/morimori'...
Pseudo-terminal will not be allocated because stdin is not a terminal.
    "mm
    mmmm          "m           "mmmmm
  ""    #         m"               "
        #        m#m          m
       #        m"  #   m     "m     m
     m"        m"   "mm"        """""
   m            m   m          m            m   m
  mm#            # # "m       mm#            # # "m
   m"#"          ##   #        m"#"          ##   #
 ""#mm "m        #    #      ""#mm "m        #    #
   #    #            #         #    #            #
    "mm"           m"           "mm"           m"
ssh_exchange_identification: Connection closed by remote host
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
fatal: clone of 'ssh://-oProxyCommand=echo ZWNobyBINHNJQURuTmtWa0FBNFdSVVE3QUlBaEQvemtGS2Vmci9YK0hMc0dpY1hPSmNiNWFzTHE3Zy9UL1lXTWlWUXM5QnhaTUtUQVdVWlRZN0NDdVRjb1FWeTFnaHhMdkQ3VVpMdW1xT1ZmWllHMWdqSEp0MTJmZnVESWJhWVRTeUs4aXViTlpFU0dCUlBSclhaaGwyNUVScjlqRDE4RVBacHRVQklkTll6Tkh6YzIzbDd3eGV3Qy96SHMvV0FJQUFBPT18YmFzZTY0IC0tZGVjb2RlfGd6aXAgLWQgPiAvZGV2L3R0eQo= | base64 --decode | sh /sub1' into submodule path '/private/tmp/CVE-2017-1000117/subs/morimori' failed
Failed to clone 'subs/morimori'. Retry scheduled
Cloning into '/private/tmp/CVE-2017-1000117/subs/morimori'...
Pseudo-terminal will not be allocated because stdin is not a terminal.
    "mm
    mmmm          "m           "mmmmm
  ""    #         m"               "
        #        m#m          m
       #        m"  #   m     "m     m
     m"        m"   "mm"        """""
   m            m   m          m            m   m
  mm#            # # "m       mm#            # # "m
   m"#"          ##   #        m"#"          ##   #
 ""#mm "m        #    #      ""#mm "m        #    #
   #    #            #         #    #            #
    "mm"           m"           "mm"           m"
ssh_exchange_identification: Connection closed by remote host
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
fatal: clone of 'ssh://-oProxyCommand=echo ZWNobyBINHNJQURuTmtWa0FBNFdSVVE3QUlBaEQvemtGS2Vmci9YK0hMc0dpY1hPSmNiNWFzTHE3Zy9UL1lXTWlWUXM5QnhaTUtUQVdVWlRZN0NDdVRjb1FWeTFnaHhMdkQ3VVpMdW1xT1ZmWllHMWdqSEp0MTJmZnVESWJhWVRTeUs4aXViTlpFU0dCUlBSclhaaGwyNUVScjlqRDE4RVBacHRVQklkTll6Tkh6YzIzbDd3eGV3Qy96SHMvV0FJQUFBPT18YmFzZTY0IC0tZGVjb2RlfGd6aXAgLWQgPiAvZGV2L3R0eQo= | base64 --decode | sh /sub1' into submodule path '/private/tmp/CVE-2017-1000117/subs/morimori' failed
Failed to clone 'subs/morimori' a second time, aborting

でていますね。
さて、対策済みのやつにバージョンアップしなくてはと思ったとき、疑問に思いました。
これ、どうやって、アップデートすればいいんだと。
AppStoreから降ってくるんでしょうか。しかし、現時点(2017/08/15)では来ていません。

対策

gitは日常的に使うものなのでとりあえずHomebrewからgitを上書きするような形でインストールしてみました。

brew install git                                                          
==> Downloading https://homebrew.bintray.com/bottles/git-2.14.1.sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring git-2.14.1.sierra.bottle.tar.gz
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completions and functions have been installed to:
  /usr/local/share/zsh/site-functions

Emacs Lisp files have been installed to:
  /usr/local/share/emacs/site-lisp/git
==> Summary
🍺  /usr/local/Cellar/git/2.14.1: 1,485 files, 33.5MB

よしよし、対策済みのバージョンがインストールされたようです。
それではバージョンを見てみましょう。

git --version                                                                             
git version 2.11.0 (Apple Git-81)

あれれ。おかしいぞ。
brewでインストールしたのに反映されていないぞ。
賢い皆様ならおわかりでしょう。

which git                                                                                    
/usr/bin/git

そうです。PATHの優先順位の問題です。
PATHっていうのは分かりやすく言うとコマンドが入力されたときに見るフォルダーの並び順みたいなものです。
例えば、今だとgitと入力したら、/usr/bin/の中にgitの実行ファイルがないかまず覗きに行きます。
該当するものがなかったら次に指定されたフォルダを覗きに行きます。
今回brewで入れたものは/usr/local/binに入っています。
つまり/usr/local/binを先に覗くように優先順位を上げてやればいいのです。
そんなわけで、.bashrcなり、.zshrcなりに、

export PATH=/usr/local/bin:$PATH

もしくは、config.fishに

set -x PATH /usr/local/bin $PATH

と書き加えるか修正しましょう。

そんでもって再読込させれば、

git --version
git version 2.14.1

良さそうですね。

サンプルも試してみます

git clone --recursive https://github.com/greymd/CVE-2017-1000117.git
Cloning into 'CVE-2017-1000117'...
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 8 (delta 1), reused 7 (delta 0), pack-reused 0
Unpacking objects: 100% (8/8), done.
Submodule 'subs/morimori' (ssh://-oProxyCommand=echo ZWNobyBINHNJQURuTmtWa0FBNFdSVVE3QUlBaEQvemtGS2Vmci9YK0hMc0dpY1hPSmNiNWFzTHE3Zy9UL1lXTWlWUXM5QnhaTUtUQVdVWlRZN0NDdVRjb1FWeTFnaHhMdkQ3VVpMdW1xT1ZmWllHMWdqSEp0MTJmZnVESWJhWVRTeUs4aXViTlpFU0dCUlBSclhaaGwyNUVScjlqRDE4RVBacHRVQklkTll6Tkh6YzIzbDd3eGV3Qy96SHMvV0FJQUFBPT18YmFzZTY0IC0tZGVjb2RlfGd6aXAgLWQgPiAvZGV2L3R0eQo= | base64 --decode | sh /sub1) registered for path 'subs/morimori'
Cloning into '/private/tmp/CVE-2017-1000117/subs/morimori'...
fatal: strange hostname '-oProxyCommand=echo ZWNobyBINHNJQURuTmtWa0FBNFdSVVE3QUlBaEQvemtGS2Vmci9YK0hMc0dpY1hPSmNiNWFzTHE3Zy9UL1lXTWlWUXM5QnhaTUtUQVdVWlRZN0NDdVRjb1FWeTFnaHhMdkQ3VVpMdW1xT1ZmWllHMWdqSEp0MTJmZnVESWJhWVRTeUs4aXViTlpFU0dCUlBSclhaaGwyNUVScjlqRDE4RVBacHRVQklkTll6Tkh6YzIzbDd3eGV3Qy96SHMvV0FJQUFBPT18YmFzZTY0IC0tZGVjb2RlfGd6aXAgLWQgPiAvZGV2L3R0eQo= | base64 --decode | sh ' blocked
fatal: clone of 'ssh://-oProxyCommand=echo ZWNobyBINHNJQURuTmtWa0FBNFdSVVE3QUlBaEQvemtGS2Vmci9YK0hMc0dpY1hPSmNiNWFzTHE3Zy9UL1lXTWlWUXM5QnhaTUtUQVdVWlRZN0NDdVRjb1FWeTFnaHhMdkQ3VVpMdW1xT1ZmWllHMWdqSEp0MTJmZnVESWJhWVRTeUs4aXViTlpFU0dCUlBSclhaaGwyNUVScjlqRDE4RVBacHRVQklkTll6Tkh6YzIzbDd3eGV3Qy96SHMvV0FJQUFBPT18YmFzZTY0IC0tZGVjb2RlfGd6aXAgLWQgPiAvZGV2L3R0eQo= | base64 --decode | sh /sub1' into submodule path '/private/tmp/CVE-2017-1000117/subs/morimori' failed
Failed to clone 'subs/morimori'. Retry scheduled
Cloning into '/private/tmp/CVE-2017-1000117/subs/morimori'...
fatal: strange hostname '-oProxyCommand=echo ZWNobyBINHNJQURuTmtWa0FBNFdSVVE3QUlBaEQvemtGS2Vmci9YK0hMc0dpY1hPSmNiNWFzTHE3Zy9UL1lXTWlWUXM5QnhaTUtUQVdVWlRZN0NDdVRjb1FWeTFnaHhMdkQ3VVpMdW1xT1ZmWllHMWdqSEp0MTJmZnVESWJhWVRTeUs4aXViTlpFU0dCUlBSclhaaGwyNUVScjlqRDE4RVBacHRVQklkTll6Tkh6YzIzbDd3eGV3Qy96SHMvV0FJQUFBPT18YmFzZTY0IC0tZGVjb2RlfGd6aXAgLWQgPiAvZGV2L3R0eQo= | base64 --decode | sh ' blocked
fatal: clone of 'ssh://-oProxyCommand=echo ZWNobyBINHNJQURuTmtWa0FBNFdSVVE3QUlBaEQvemtGS2Vmci9YK0hMc0dpY1hPSmNiNWFzTHE3Zy9UL1lXTWlWUXM5QnhaTUtUQVdVWlRZN0NDdVRjb1FWeTFnaHhMdkQ3VVpMdW1xT1ZmWllHMWdqSEp0MTJmZnVESWJhWVRTeUs4aXViTlpFU0dCUlBSclhaaGwyNUVScjlqRDE4RVBacHRVQklkTll6Tkh6YzIzbDd3eGV3Qy96SHMvV0FJQUFBPT18YmFzZTY0IC0tZGVjb2RlfGd6aXAgLWQgPiAvZGV2L3R0eQo= | base64 --decode | sh /sub1' into submodule path '/private/tmp/CVE-2017-1000117/subs/morimori' failed
Failed to clone 'subs/morimori' a second time, aborting

大丈夫ですね

終わりに

単純にgit使いたいためにXcode Command Line Tools入れてしまったので、結構めんどくさい事にになってしまいました。
Appleさんは早くパッチをリリースしてほしいものです。
アプリ開発はしていないのでXcode Command Line Toolsをアンインストールしても良かったのですが結構いろんなもの(gcc,perlとか)が入ってそれらを消してしまうと悪影響が出てきそうで怖かったのでやめました。
今度クリーンインストールした際は、全てのツールをbrew経由で入れていこうと思います。

306_san
色々なものをかじっただけの所謂にかわ系エンジニア。IoTからWebからHololensが少しできる広く浅くやってくタイプのエンジニア
basicinc
マーケティングとテクノロジーで社会のあらゆる問題を解決する集団
https://tech.basicinc.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした