本篇文章探討的也是資安系列問題,而這次的目標主角則是 MAC 系統上廣為流傳的 Homebrew 系統。
結論:
作者透過觀察 Homebrew 的 Github Action 流程,成功得上傳一個會列印一行的程式碼到 iterm2 套件中,讓所有安裝的使用者都會於 Terminal 上看到一行作者客製化的訊息。
本次的漏洞是作者刻意從 Homebrew 的 Vulnerability Disclosure Program 專案中去嘗試尋找可能的問題,所有的操作都有跟官方專案的人探討過流程,並且一切的 PoC 都是單純證明該攻擊的可行性,所以有興趣研究的人請遵循一樣的想法去做,不要認真的想攻擊。
原因:
1. Homebrew 透過 Github Action 執行 CI/CD 動作
2. Homebrew 撰寫了一個自動合併 Pull Request 的 Action
3. CI 內會透過一個Ruby的 Git Diff 第三方函式庫來驗證,只要符合下列條件就可以自動合併
- Modifying only 1 file
- Not moving/creating/deleting file
- Target filepath matches \ACasks/[^/]+\.rb\Z
- Line count of deletions/additions are same
- All deletions/additions matches /\A[+-]\s*version "([^"]+)"\Z/ or - -\A[+-]\s*sha256 "[0-9a-f]{64}"\Z
- No changes to format of versions (e.g. 1.2.3 => 2.3.4)
作者一開始想要從該規則下手,找尋有沒有可能塞入惡意攻擊並且騙過系統讓其自動合併,然而這些規則看起來沒有什麼太多問題,於是作者轉往其他領域去找尋問題,其中一個想法就是到底該 Ruby 的 Git Diff 是如何實作,也許從實作下手更有辦法去欺騙這一切。
很順利的是,作者真的於該函式庫中找到問題,對於一個 Git Diff 的結果來說,該函式庫會透過 +++ "?b/(.*) 這樣的正規表達式來判別檔案路徑的資訊而並非程式修改內容,譬如下列 diff
```
diff --git a/source file path b/destination file path
index parent commit hash..current commit hash filemode
--- a/source file path
+++ b/destination file path
@@ line information @@
Details of changes (e.g.: `+asdf`,`-zxcv`)
```
作者就開始思考,如果讓程式碼可以符合 +++ "?b/(.*) 的規則,是否有辦法讓程式碼不被視為一個檔案的修改,因此就可以修改多行程式碼但是讓 CI 系統認為只有一行程式碼於是進行自動合併
作者最初的想法如下,第一行用來放惡意程式碼,第二行用來偽裝檔案路徑,經過一番嘗試後作者真的成功塞入了類似 PRINTF 的程式碼到環境中並觸發自動合併。接者各地使用者透過 brew 安裝 iterm 版本都會看到使用者塞入的程式碼。
```
++ "b/#{Arbitrary codes here}"
++ b/Casks/cask.rb
```
原文還有更多作者的思路過程,有興趣的不要錯過
原文:
https://blog.ryotak.me/post/homebrew-security-incident-en/#fn:7
測試用PR:
https://github.com/Homebrew/homebrew-cask/pull/104191
「git diff檔案」的推薦目錄:
- 關於git diff檔案 在 矽谷牛的耕田筆記 Facebook 的精選貼文
- 關於git diff檔案 在 軟體開發學習資訊分享 Facebook 的精選貼文
- 關於git diff檔案 在 紀老師程式教學網 Facebook 的最佳貼文
- 關於git diff檔案 在 Git 版本控制系統- 比對檔案版本差異與標示說明 - Roya's Blog 的評價
- 關於git diff檔案 在 顯示特定檔案或目錄的差異- git-diff - 他山教程 的評價
- 關於git diff檔案 在 Git 概念、常用語法及GitHub 使用介紹 - HackMD 的評價
- 關於git diff檔案 在 Mm c github 的評價
- 關於git diff檔案 在 Xxd Github 的評價
git diff檔案 在 軟體開發學習資訊分享 Facebook 的精選貼文
Git也可以比對Word檔案(還有OpenOffice的Odt)做diff, 仔細將這篇看完, 還支援Xcode的*.pbxproj, 不過都要特別設定.gitattributes這個檔案.
Soft & Share提供職缺刊登服務, 歡迎來使用 https://goo.gl/5IrXKM
https://git-scm.com/…/Git-%E5%AE%A2%E8%A3%BD%E5%8C%96-Git-%…
git diff檔案 在 紀老師程式教學網 Facebook 的最佳貼文
[好文分享] Unix as IDE
寫過程式的朋友大概都用過 IDE (Integrated Development Environment)。那種什麼事情都交給 IDE 處理的感覺,真是方便又美好。但是有一部分的人(比如我,哈哈),對 IDE 大致滿意,但對某部分的功能頗有微辭,希望能「換掉」它,又礙於 IDE 是整個包在一起的,沒辦法抽換「部分功能」。
此時這群人就會傾向「不使用 IDE」,改用在「檔案管理、專案管理、文字編輯、編譯、建構工具、除錯工具、版本控制」各自領域首屈一指的工具,嘗試將它們兜在一起。目前,擁有大量這類「優秀小工具」、又「免費」的環境,大概只有 Unix / Linux 了。所以這類人,最後很容易迷上 Linux 環境(而且還是命令列工具),最後成為該領域的「傳教士」。在各領域常用的工具列表如下:
檔案與專案管理 — ls, find, grep/ack, bash
文字編輯軟體 — vim, awk, sort, column
編譯器或直譯器 — gcc, perl
建構工具 — make
除錯器 — gdb, valgrind, ltrace, lsof, pmap
版本控制軟體 — diff, patch, svn, git
底下這篇,正是一位勇闖 Linux 世界,最後愛上 Command Line 工具的朋友,所寫作的文章。跟他有類似經驗的我,看完此篇後心有戚戚焉。也希望能推薦給朋友,讓更多人能了解用 Linux Command Line Tools 整合以後的美好世界。文章有點長,不過相信喜歡的朋友,會忘卻時間,一直看下去的:
http://blog.sanctum.geek.nz/series/unix-as-ide/
git diff檔案 在 顯示特定檔案或目錄的差異- git-diff - 他山教程 的推薦與評價
placeholderCopy git diff myfile.txt. 顯示上一次提交指定檔案( myfile.txt )與尚未暫存的本地修改版本之間的更改。 這也適用於目錄: ... <看更多>
git diff檔案 在 Git 概念、常用語法及GitHub 使用介紹 - HackMD 的推薦與評價
新的檔案,尚未加入版本控制( git add )也還沒建立好版本( git commit )的 ... git diff :再更改後的檔案再次加入版本控制前,可用 git diff 看出版本更改的東西 ... ... <看更多>
git diff檔案 在 Git 版本控制系統- 比對檔案版本差異與標示說明 - Roya's Blog 的推薦與評價
這樣就可以確保當前比對的版本為HEAD (指最新commit 紀錄) 與HEAD 的前一個版本。 比對不同版本間差異. 事實上,剛剛的 git diff HEAD~2 等同於以下指令: ... ... <看更多>