説明したいこと
- git の脆弱性 CVE-2017-1000117 とその修正内容を説明
- 目標:プログラマ以外の人にも何か持ち帰ってもらう
脆弱性とは
- もろくて弱い性質
- セキュリティーホール
- 悪意のある第三者によりシステムを不正利用され得る
今回問題があったソフトウェア: git
- ソースコード(など)を管理するツール
- ローカルで履歴を管理
- 履歴のリモートへの送受信
開発者がgitを使う流れ
- ソースコードの履歴をサーバからダウンロード
- ソースコードを変更してリポジトリに格納
- ソースコードの履歴をサーバにアップロード
開発者がgitを使う流れ(1)
ソースコードの履歴をサーバからダウンロード
開発者がgitを使う流れ(2)
ソースコードを変更してリポジトリに格納
開発者がgitを使う流れ(3)
ソースコードの履歴をサーバにアップロード
ソースコードのありかは URL で表わす
clone するとき明示、push は保存された値を使う
- スキーム://ユーザ@ホスト/リソースパス
https://github.com/user/repo.git
ssh://git@github.com/user/repo.git
- スキームが ssh の場合、ssh プロトコルで通信
sshプロトコルで通信
- git は内部で ssh コマンドを実行している
- 実際何をしているのか見てみよう
- デモ: GIT_SSH 環境変数で次のコードを指定
- ssh コマンドの代わりに実行される
- どのように実行されているのかを表示
#!/usr/bin/env python
import sys
for i, v in enumerate(sys.argv):
sys.stderr.write('argv[{}]="{}"\n'.format(i, v))
通常の用法
$ GIT_SSH=/tmp/ssh_vulnerability/git-ssh.py git clone ssh://git@github.com/yoichi/sandbox.git
Cloning into 'sandbox'...
argv[0]=“/tmp/ssh_vulnerability/git-ssh.py"
argv[1]="git@github.com"
argv[2]="git-upload-pack '/yoichi/sandbox.git'"
fatal: Could not read from remote repository.
- ssh を別プログラムに置き換えてどういう引数が渡るか確認した
- 引数に "ユーザ@ホスト” と "ごにょごにょする指示” が渡ってる
悪意のある用法
$ GIT_SSH=/tmp/ssh_vulnerability/git-ssh.py git clone ssh://-oProxyCommand=hoge/yoichi/sandbox.git
Cloning into 'sandbox'...
argv[0]=“/tmp/ssh_vulnerability/git-ssh.py"
argv[1]="-oProxyCommand=hoge"
argv[2]="git-upload-pack '/yoichi/sandbox.git'"
fatal: Could not read from remote repository.
- ユーザ@ホスト” のところに妙な文字列を指定
- 本物の ssh の場合、接続には失敗するが、hoge は実行されてしまう
利用された機能
sshのproxy対応
- 外部への直接接続を制限している環境のため
- 中継サーバを経由して外部サーバに接続
- 中継サーバへの接続のため外部コマンドを実行
今回の問題
- git の URL パース処理に問題があった
- "ユーザ@ホスト” が妥当か気にせず ssh を実行
- ProxyCommand と解釈されたものが実行される
- 任意のコマンドが実行されてしまう可能性
おかしなURLなら気づくのでは?
知らずに踏んでしまう可能性
- git には submodule という機能がある
- https://github.com/greymd/CVE-2017-1000117
- cf. HTML文書中の
<img src=“https://host/resource.png" />
に対するブラウザの動作- 書かれているURLからリソースを取得
修正内容
- "ユーザ@ホスト” の部分が “-“ で始まっているなら弾くように
-
https://github.com/git/git/commit/4274c698f46a9bc45834c4904e7e113450c042fb
- 追加されたテストにも注目
コードによるテスト
- 修正内容が期待したとおりに動くこと
- 不正なホスト名が弾かれる
- 副作用で意図せず動かなくなるものがないこと
-
- で始まるリポジトリがcloneできる
-
- 以上が、今後の別の変更で壊されないこと
をコードで担保する
まとめ
- CVE-2017-1000117 とその修正を解説
- 伝わるといいな:
- 開発者が使っている git とは何者か
- 外部コマンド実行する処理の注意点
- 修正では副作用出さないように注意