本篇文章探討的也是資安系列問題,而這次的目標主角則是 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
「正規表達式測試」的推薦目錄:
正規表達式測試 在 矽谷牛的耕田筆記 Facebook 的精選貼文
本篇文章探討的是 Terraform 12.20 所推出的兩個新功能, can() 以及 try(),來聊聊這兩個新功能對於開發者來說能夠帶來什麼樣的效益
can 這個功能主要是用在變數的簡單測試,譬如幫你確認變數的數值是否符合預期,這邊也可以搭配 regex 這種正規表達式的方式來幫你驗證輸入值是否符合規範。
try 這個功能目前使用起來跟大家寫程式所習慣的 try/catch 有點類似, try 之中要傳入一系列的參數,然後 try 會回傳第一個沒有發生錯誤的參數。因此如果今天有一些資料處理比較複雜的部分,可以考慮使用 try 來幫忙驗證。
舉例來說,今天需要透過 yamldecode/jsondecode 的方式來處理一些動態資料,我們可以撰寫類似下列的程式碼
locals {
raw_value = yamldecode(file("${path.module}/example.yaml"))
normalized_value = {
name = tostring(try(local.raw_value.name, null))
groups = try(local.raw_value.groups, [])
}
}
來幫忙判斷到底該資料有沒有成功抓取並且解析,此外我們也可以透過 try 的方式來達到一些變數的兼容性。
譬如說我希望當某個變數是字串時,回傳一個長度是一的陣列,當變數是一個陣列時,直接回傳一個陣列。 參考用法如下
locals {
example = try(
[tostring(var.example)],
tolist(var.example),
)
}
點選下列文章或是官方文件來學習更多!
https://levelup.gitconnected.com/using-terraforms-try-can-and-input-validation-eb45037af2b2
正規表達式測試 在 雷艾美 Emmie Ries Facebook 的最佳貼文
有人說學英文最快的方法,就是交一位外國男/女朋友!但如果沒有的話,線上學習也是個不錯的方法💡而且你還可以遠距離多位老師(咦?)
我自己其實一直都在自學英文,還有點強迫症的那種;手機是英文介面、app裡面第一頁就有Google翻譯、在家講全英文、大學主修英國文學、還曾經有一任老外男朋友(??🙊)
今天我跟TutorABC的老師,她叫Kaleigh,加拿大人住在墨西哥🇲🇽,剛結婚,會知道那麼多是因為我們幾乎一直在聊天,沒在上課😂 因為我就是想加強我的口說跟表達,最後才上了一些課是因為我想要學習新的單字,老師知道我喜歡旅遊,還很貼心的幫我找Road trip(公路旅行)的題材
TutorABC的最大好處就是,你是跟當地的人在對話,是最正規、道地的英文,而且跟著他們練口說,你的口音才會愈來愈漂亮(跟訓練跑姿一樣啦!)還交到了一個好朋友,她說我如果有一天要拜訪墨西哥,她要來當我導遊✌🏻
我們活在2020年,以後的世界只會愈來愈融合,Learning is never too late! 我還想要更刁鑽我的英文,之前參與過大型的中英雙主持活動,未來我還想要參與更大、更國際的拍攝或主持,那你們呢?
底下送美寶們
一堂TutorABC課程
連結索取
👉🏻 https://reurl.cc/v1gm9o
這裡測試最適合
我的學習模式
👉🏻 https://reurl.cc/gmzQLX
正規表達式測試 在 【學習筆記】JavaScript:Regex 正則表達式 - 前端新米 的推薦與評價
正則表達式(Regular Expression),常簡寫為RegEx、RegExp 或RE,代表描述一種字串匹配的 ... 在正規表達式中,某些特殊字元或符號屬於保留字:. ... <看更多>
正規表達式測試 在 【Java】需要線上測試你的正規表示式(Regular... - Steven 的IT ... 的推薦與評價
【Java】需要線上測試你的正規表示式(Regular Expression)嗎? http://regexr.com/ ... <看更多>
正規表達式測試 在 我作了一個正規表達式測試工具(Regular Expression) - YouTube 的推薦與評價
基礎介紹 正規表達式 的規則。工具網頁:https://cyublog.com/tools/regular-expression/Chapters02:42 網頁工具03:17 . 的說明06:16 *的說明07:06 +的 ... ... <看更多>