連金絲雀都找不到的機密掃描器漏洞
運送
在我們販售的任何套件打包之前,一道閘門會掃描其中是否含有我們自己的機密實際值。每次掃描都會先植入金絲雀,每種各一個,若未能全部捕捉到便拒絕執行。它總是能捕捉到它們。但它仍然有一個錯誤。
閘門如何讀取機密
閘門不只尋找形狀像金鑰的東西。它會讀取存放機密的檔案(env 檔案、JSON 設定檔、金鑰檔案),取出名稱顯示為機密的每個值,然後在我們準備出貨的內容中搜尋這些確切的值,包括原樣寫法與 base64 編碼後的寫法。
錯誤所在
對於像這樣的一行:
DB_PASSWORD='Tr0ub4dor-and-3' # 於五月輪換
讀取器只有在值同時以引號字元開始與結束時,才會移除外圍的引號。若值後面有註解,該行便以字母結尾,因此引號保留了下來。接著註解被截斷,閘門繼續搜尋 'Tr0ub4dor-and-3',包含引號在內。若套件中含有不含這些引號的密碼,便會通過檢查。
為何金絲雀從未察覺
金絲雀測試的是偵測網:植入掃描器已知的值,確認它被找到。我們的金絲雀值是直接交給掃描器的,因此從未經過讀取設定行的那段程式碼。每個偵測網都經過測試,但前面的解析器卻沒有。
我們如何發現它
我們正將閘門打造為獨立產品,並撰寫了一個測試,餵給它人們實際撰寫格式的設定檔:export、引號、行尾註解。測試在帶有註解的引號行上失敗。修正後的讀取器會讀取引號值直到其結束引號,並忽略其後的任何內容。
這重要嗎?
在修改任何內容之前,我們先進行了檢查。在我們的建置機器上,閘門從給定的 59 個檔案中讀取 133 個機密值,在第二台機器上則為 499 個;沒有一個具有該種形狀。先前的判定結果皆不受影響:我們已發布的每個套件,掃描時使用的值與現在掃描時使用的值相同。儘管如此,我們仍已在所有三台機器上修正了閘門。
重點整理
如果掃描器會擷取它搜尋的內容,請用真實的輸入資料測試擷取功能,而不只是用預埋值測試搜尋功能。金絲雀測試能證明網子運作正常,卻無法說明正確的魚是否真的進了網裡。Secret Gate 的測試現在涵蓋了兩者,而在發布之前,我們已確認它能讀取與我們建置閘門完全相同的 133 個值。