本篇文章探討的也是資安系列問題,而這次的目標主角則是 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 commit多行 在 Git 中提交一大段、多行的注释| Hmgqzx's Wiki 的推薦與評價
Aborting commit due to empty commit message. 在终端修改git config 如下:. 1, git config --global core. ... <看更多>
git commit多行 在 在命令行中使用Git rebase 的推薦與評價
这些更改都有相同的提交消息: "Patch B" 。 Git 开始 edit dd1475d 操作,停止,然后将以下消息打印到终端: You can amend the commit now, with git ... ... <看更多>
git commit多行 在 [討論] 不思進取的長輩同事如何面對? - 看板Tech_Job 的推薦與評價
公司來了一個4x歲講話很油的禿頭工程師 當初來幾天 就說自己就是不想寫code之前工作
寫太多,只想透過原廠提供的config tool做一些config就好,想當然爾怎麼可能。
很愛講廢話,聊天,敘述能力差,意見多,最煩的是很愛把"你了解我的意思嗎" "不是啦
"掛嘴邊,對每個同事都這樣說話方式。
說完 不是啦 結果講的東西跟我剛才敘述的九成像。
最雷的就是Git,很多人的確都不會用,但這老兄完全不思進取,
每次要他用Git做一些基本動作如Commit/Push,就好像要他頭髮一樣,開始不耐煩稀哩呼
嚕 然後說"不然我把code給你 然後你幫我push 這樣怎麼樣?"
什麼怎麼樣? 不然我把頭髮給你 用你的禿頭長出來 天底下有這種事?
如果是很難的操作還能理解,這種基本流程都不願意學習,一天到晚不願面對。
之前他跟另一個同事合作就是這樣,一直跟同事說你push就好了。
最近又跟我還有一個主管合作,剛剛又跑來跟主管說,少加一行程式,主管我code給你,
幫推一下我怕我弄錯啦(笑
我說 "你真的很誇張 才一行自己推也不行? 難道以後一行都要我們幫你推?"
他就跑來我這說 "不行 不然你幫我推" 在那邊嘻嘻笑的嘴臉真想貓下去。
我:"幹= = 自己推啦" 他就笑:"嘿嘿 還說幹 你看你@#./@!" 然後繼續鬼扯,後來完全沒鳥他就悻悻然回去..最後還不
是push成功了,在那邊推來諉去的是很爽膩,這種老兄大家都如何面對?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.168.140.30 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Tech_Job/M.1638541773.A.328.html
... <看更多>