7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CVE-2017-1000117 とその修正について

Last updated at Posted at 2017-08-20
1 / 18

説明したいこと

  • git の脆弱性 CVE-2017-1000117 とその修正内容を説明
  • 目標:プログラマ以外の人にも何か持ち帰ってもらう

脆弱性とは

  • もろくて弱い性質
  • セキュリティーホール
  • 悪意のある第三者によりシステムを不正利用され得る

今回問題があったソフトウェア: git

  • ソースコード(など)を管理するツール
  • ローカルで履歴を管理
  • 履歴のリモートへの送受信

開発者がgitを使う流れ

  1. ソースコードの履歴をサーバからダウンロード
  2. ソースコードを変更してリポジトリに格納
  3. ソースコードの履歴をサーバにアップロード

開発者がgitを使う流れ(1)

ソースコードの履歴をサーバからダウンロード

git-clone.png


開発者がgitを使う流れ(2)

ソースコードを変更してリポジトリに格納

git-commit.png


開発者がgitを使う流れ(3)

ソースコードの履歴をサーバにアップロード

git-push.png


ソースコードのありかは 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対応

  • 外部への直接接続を制限している環境のため
  • 中継サーバを経由して外部サーバに接続
  • 中継サーバへの接続のため外部コマンドを実行

proxy.png


今回の問題

  • git の URL パース処理に問題があった
  • "ユーザ@ホスト” が妥当か気にせず ssh を実行
  • ProxyCommand と解釈されたものが実行される
  • 任意のコマンドが実行されてしまう可能性

おかしなURLなら気づくのでは?

知らずに踏んでしまう可能性

  • git には submodule という機能がある
  • https://github.com/greymd/CVE-2017-1000117
  • cf. HTML文書中の <img src=“https://host/resource.png" /> に対するブラウザの動作
    • 書かれているURLからリソースを取得

修正内容


コードによるテスト

  • 修正内容が期待したとおりに動くこと
    • 不正なホスト名が弾かれる
  • 副作用で意図せず動かなくなるものがないこと
      • で始まるリポジトリがcloneできる
  • 以上が、今後の別の変更で壊されないこと

をコードで担保する


まとめ

  • CVE-2017-1000117 とその修正を解説
  • 伝わるといいな:
    • 開発者が使っている git とは何者か
    • 外部コマンド実行する処理の注意点 
    • 修正では副作用出さないように注意
7
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?