工程趣聞 2026 年 10 月 4 日

2026-10-04 — 釣魚專案包夾帶 .git:post-checkout hook 下載木馬

primary=https://frankwiles.com/posts/i-got-targeted/ primary=https://git-scm.com/docs/githooks

釣魚專案包夾帶 .git:post-checkout hook 下載木馬

Frank Wiles 個人部落格 · 2026-10-02

攻擊者不再把惡意程式藏進原始碼,而是藏進 .git/hooks/post-checkout:你只要照指示「切換分支」,hook 就替你下載並執行木馬。Frank Wiles 在 2026-10-02 公開了自己遇到這種釣魚的經過。

這個手法的巧妙處在於,多數人檢查程式碼時看的是工作目錄,沒人會去翻 .git 裡的 hook。

原本的問題

面對陌生人寄來的專案,工程師的防線通常是「不要直接執行裡面的腳本」。但 git hook 不算在這個心智模型裡:它不是專案檔案,而是 repo 本機設定的一部分,由 git 在特定時機自動觸發。

依 githooks 文件,post-checkout 會在 git checkout 或 git switch 更新工作樹之後執行,git clone 與 git worktree add 也會觸發(除非加 --no-checkout)。文件列出的正當用途是檢查 repo 狀態、顯示差異、設定工作目錄中繼資料,沒有任何一項需要連網下載。

攻擊經過

Wiles 收到一封假冒教育科技專案詢問的信,寄件者冒充某家開發公司,附上 Dropbox 資料夾,說裡面是專案規格。他一開始沒注意到分享內容裡含有 .git 資料夾。

對方接著要求他「切換到」一個 NDA 分支。這個指令本身就是觸發條件,Wiles 因此起疑,進入 .git/hooks 查看,在一堆範例檔之中只找到一個啟用的 post-checkout。他沒有執行,而是小心地打開來讀。

hook 的行為依他的描述有四步:

  • 透過 Vercel 上的應用程式(作為 command and control)下載與作業系統對應的二進位檔
  • 把檔案設成可執行
  • 執行它
  • 執行完刪除檔案

最後一步讓事後鑑識更困難:磁碟上不留檔案,只剩 hook 腳本本身。原文未公布二進位檔的實際功能,Wiles 的警語是「watch your credentials like a hawk」,因此這類攻擊的目標可推測是憑證。

影響範圍

最直接受影響的是會接案、會收外部專案包的人:自由工作者、顧問、開源維護者、面試的 take-home 作業。判斷方式很簡單:

情境風險
用 git clone 取得 repohook 不隨 repo 內容傳輸(hook 位於本機 .git/hooks)
收到 zip 或雲端資料夾,內含 .githook 隨資料夾一起到你手上,之後的 checkout 或 switch 會執行它

githooks 文件在 post-checkout 一節並未明說 clone 是否複製 hook,上表第一列是依 hook 位於 $GIT_DIR/hooks 這點推得的結論。

收到這類資料夾時,先看 .git/hooks 裡有沒有不帶 .sample 後綴的檔案,再決定要不要動 git 指令。更穩的做法是只拿工作樹內容、重新 git init,或在拋棄式虛擬機裡處理。

ls .git/hooks | grep -v '\.sample$'
# 有輸出就先讀內容,再決定要不要 checkout

Wiles 事後通知了 Dropbox 與 Vercel 的資安團隊,請他們停用惡意帳號,也告知冒名的開發公司負責人。

原始來源:Frank Wiles:I got targeted、git githooks 文件


End of article
0
Would love your thoughts, please comment.x
()
x