餡子付゛録゛

ソフトウェア開発ツールの便利な使い方を紹介。

Gitを(コンテナと組み合わせて)サプライチェーン攻撃から強くするためのRust製ラッパー

だれか書いている気がするのですが、Gitを(コンテナと組み合わせて)サプライチェーン攻撃から強くするためのRust製ラッパーを書いてみました。サプライチェーン攻撃とAIエージェントの暴走に強い、開発環境のコンテナー運用の話の続きです。

gitのフックは、サプライチェーン攻撃対策の障害

サプライチェーン攻撃対策で開発環境のコンテナ化をしたときに、運用上の脆弱性になるのがGitのhooksです。

  • コンテナー内にsshの秘密鍵などのクレデンシャル情報が置いてあると危険なので、GitHubなどへのpush/fetch/pullはホストで行うべきです。
  • コンテナーがマルウェアで汚染されたときに開発中のアプリケーションのソースコードが入ったGitリポジトリーは安全とは限らず、リポジトリー内のスクリプトなどの実行ファイルはホストから動かしてはいけません。
  • ホストでGitを用いると、その仕組みからリポジトリー内のhooksに設置されたスクリプトを自動実行してしまいます。
  • リポジトリー外からcloneやfetch/pullをしたとしても、Gitはclone元でgit-upload-packを動かします。git-upload-packにはcore.alternateRefsCommand / uploadpack.packObjectsHookが仕掛けられます。

たぶん公式の対策はない

ホストでhooksを動かさなければよいわけですが、Gitのグローバルオプションでhooksを無効にすることはできないようです。

~/.gitconfig に、

[core]
    hooksPath = /dev/null

と書くことで、.git/hooksにあるスクリプトの実行を防ぐことはできるのですが、.git/config に hooksPath = ./hooks と書かれていたら機能しません。グローバル設定よりもローカル設定が有効だからです。./git/hooks を消すか実行属性をなくせば良い気もしますが、hooksPath = ./other_place と書かれてother_placeに悪意のあるスクリプトを配置されたら意味がないです。

コマンドライン引数

コマンドライン引数でhooksPathを指定するのはどうでしょうか。

git -c core.hooksPath=/dev/null

ローカル設定よりも優先されます。しかし、Git 2.54からgitconfigにhookが書けるようになりました。configでの指定は、hooksPathよりも優先されるので、このコマンドライン引数では防止できません。

hookが動かないことを確認してからgitを動かすラッパー

解決策としてhookが動かないことを確認してからgitを動かすラッパーを書いてみました。tomlクレートを使った方がよい気もしますが、正規表現で単純に実装しています。リファクタリングをして、正規表現を用いない素朴な実装になりました。長くなったので、GitHubに置いています。

github.com

Rustのファイルなので、ホストで

git clone https://github.com/uncorrelated/chkgithooks
cargo build --release

とすると、target/release/chkgithooksができるので、

git config --add --global core.hooksPath /dev/null
mkdir -p ~/.local/bin
cp -pr target/release/chkgithooks ~/.local/bin/git
cp ~/.bashrc ~/.bashrc.bak
cat - <<EOL >> ~/.bashrc
export TRUE_GIT_PATH=/usr/bin/git # aptで入れるとここに入ります
export PATH=~/.local/bin:\$PATH
EOL
source ~/.bashrc

とすると、ホストでgitをラッパーとして機能します。ただし目的からホストでフックは使えなくなるのでご注意ください。コンテナ内のgitはラップしないので、フックも使えます。

ラッパーなしにgitを叩きたい場合は、$TRUE_GIT_PATH/git (か /usr/bin/git あたり)を呼びます。

追記(2026/10/17 05:20):.git/configでのhookの設定の記述方法を誤解していたので、コードを修正した。

追記(2026/10/17 16:00):リファクタリングを行って、正規表現を使わないようにした。

追記(2026/10/24 17:03):fsmonitorなどのhook以外の(他人に設定されると)危険な要素もチェックするようにした。

誰かすでに対策を立ててはいないのか

gitのフックを悪用した攻撃はすでに行われており、問題は広く知られているはずです。対策も、発想としては難しくはないです。誰か同じようなことをやっていると思うのですが、見当たらないんですよね。こういうラッパーは何かと問題を引き起こしがちなので、なるべく避けたいところではあるのですが。