
これは、gitのclean filterをIDEやSublimeに対して悪用するための概念実証です。
これは文書化された(既知の)問題ですが、調査中に発見し、RT/PT に非常に役立ちます。
概要: .git/config の filter.<name>.clean ディレクティブはスクリプトを指し、.gitattributes はそのフィルターを追跡対象ファイルにバインドします。git がそのファイルの実際の git diff を表示するたびに、最初にクリーンコマンドを通してワークツリーの内容を実行するため、git はそこで指定された任意のパスを盲目的に起動します。
ここからが面白いところです。エディタは、変更されたファイルをクリックすると自動的に git diff を実行し、SCM(ソース管理)パネルとガター注釈を表示します。フォルダを開くだけでは不十分ですが、変更を表示することは必要であり、リポジトリにアクセスしたときにはごく自然な動作です。
これは core.fsmonitor と同じアイデアですが、別のディレクティブを使用しており、fsmonitor ではないため、それを監視している人は気付かないでしょう。この手法は、RTの任務や侵害想定シナリオに適しており、任意のC2や当社の XRayC2 と組み合わせて、従来のネットワーク防御を回避するコールバックを取得できます。(もちろんエンドユーザーを騙すためのフィッシングメールが必要ですが、IDEでフォルダを開いてファイルをクリックするというのは妥当な操作のように思えます。)
動作証明. git clone は .git/config を運ばないため、.git/ をそのままにしてフォルダを配布します。.git/config の設定:
[filter "poc"]
clean = ./icons/clean.sh
smudge = cat
.gitattributes:
sample.txt filter=poc
sample.txt はコミットされていますが、ワーキングツリーでは 変更された 状態で配布されます。git が差分を表示した瞬間にクリーンフィルターが発動します。clean.sh は Calculator を起動し、内容を変更せずに通過させるため、ワーキングツリーは決して破損しません:
#!/bin/sh
pgrep -x Calculator >/dev/null 2>&1 || open -a Calculator 2>/dev/null
exec cat
エディタでフォルダを開き、sample.txt をクリックして変更を表示すると、Calculator が起動します。(Calculator を終了すると再実行できます。)このPOCはmacOS専用です。環境に合わせて変更してください。
Cursor(git CLI)および Sublime Text(libgit2)でテスト済み。
クリーンフィルターは完全な git diff でのみ実行され、git status では実行されないため、フォルダを開いただけではなく、エディタが 変更をレンダリングする ときに発動します。興味深いことに、Sublime Text は libgit2 を介してインプロセスで トリガーし、ペイロードの親プロセスは sublime_text 自体であり、チェーン内に git バイナリは存在しません。したがって、これは git にシェルアウトするツールに限定されません。
https://github.com/user-attachments/assets/31ea495f-1ed8-44f8-bef3-8c6366a0eece
fsmonitor と同様に、これはエディタの「このフォルダを信頼しますか?」というプロンプトによって制限されます。多くの開発者は ~/Downloads や同様のトップレベルフォルダを信頼したままにしており、Cursor はデフォルトでワークスペースの信頼をオフにしているため、PoC は静かに実行されます。リポジトリがそれらの信頼されたパスの外にある場合、IDE は .git/config を読み取る前に「この発行者を信頼しますか?」と尋ねます。
Git ドキュメント: core.fsmonitor および filter.* については、https://git-scm.com/docs/gitattributes を参照してください。