Double Evaluation通常出現在巨集指令或模板引擎的運作過程中。簡單來說,這指的是程式碼或字串被處理了兩次。第一次處理時,系統會先解析一部分內容,將變數或巨集展開成新的程式碼;接著系統又對這份新生成的內容進行第二次解析。
這種機制在開發上既是強大工具,也是潛在風險。在正面的使用情境下,它可以讓程式碼具備極高的動態性。例如在編譯時期,透過層層嵌套的巨集,讓編譯器根據不同條件自動生成最終的執行指令。這能減少重覆編寫相似邏輯的負擔,實現類似程式碼自動生成的結果。
但在安全與效能層面,這往往會帶來問題。最常見的負面案例發生在網頁開發或資料庫查詢。如果一個程式先把使用者輸入的字串放入範本中,卻沒有做好過濾,當這份範本被進行第二次解析時,原本只是純文字的輸入內容,可能會被系統誤認成指令來執行。這就是所謂的注入攻擊,攻擊者能藉此執行惡意腳步或竊取資料。
此外,邏輯上的重複計算也是一種Double Evaluation。如果在巨集定義中直接使用傳入的參數,而該參數本身是一個具有副作用的函數呼叫,那麼在巨集展開後,該函數可能會被呼叫兩次,導致結果與預期不符,並造成額外的效能損耗。
總結來說,Double Evaluation的核心在於解析階段的重疊。理解這個概念有助於在設計系統架構時,更謹慎地處理動態內容的邊界,確保每一段資料只在預期的層次被解讀,避免產生非預期的執行結果。
n8n 漏洞解析:當輸入文字變成惡意指令
這篇文章要討論一個發生在自動化工具 n8n 上的嚴重安全漏洞。這個問題的核心在於系統處理使用者輸入資料時,存在一種叫做二次評估的邏輯缺陷。簡單來說,系統把原本應該當作純文字處理的內容,在後續處理中誤認為是可以執行的指令。
漏洞的核心邏輯:兩階段的處理失誤
這個問題主要發生在兩個不同的時間點。第一階段是資料的接收與儲存。當使用者在表單的姓名或任何文字欄位輸入內容時,n8n 會先接收這段字串並將它儲存在資料庫中。在這個階段,系統還只是把它當成一般的資料看待。
第二階段則是漏洞觸發的關鍵。在後續的自動化流程中,特別是當表單需要顯示之前的輸入內容或進行多步驟處理時,n8n 會再次解析這些已經存好的內容。如果系統沒有分清楚資料與指令的界線,災難就會發生。
攻擊是如何發生的:注入點解析
攻擊者利用了 n8n 的特殊語法規則。在 n8n 中,如果一段內容是以等號開頭,後面接著雙大括號,系統就會將其視為一段表達式或程式碼來執行。攻擊者只要在原本應該輸入姓名的欄位中,填入類似下面的內容:
={{ 惡意程式碼 }}
當 n8n 進入第二階段處理這段字串時,它會錯誤地認為這是一段合法的指令,而非單純的姓名文字。這就像是你去餐廳點餐,在菜單的備註欄寫下:請主廚把保險箱密碼交出來。如果餐廳的流程不對,主廚看到這張單子後真的去執行了這個動作,這就是所謂的注入攻擊。
攻擊後果:遠端控制與資料失竊
這個漏洞最直接的威脅就是遠端程式碼執行。雖然 n8n 的表達式通常在沙箱環境中運作,受到一定的限制,但攻擊者可以透過串聯其他的沙箱逃逸漏洞,直接取得主機的控制權。一旦進入主機,攻擊者就能執行任何指令。
更嚴重的後果是憑證竊取。n8n 是一個連結各種服務的核心樞紐,裡面通常儲存了大量的 API 金鑰、資料庫密碼以及各種帳號的授權令牌。攻擊者只要控制了系統,就能讀取環境變數中的 N8N_ENCRYPTION_KEY。有了這把鑰匙,儲存在資料庫中所有經過加密的敏感憑證都會被解開。這對企業來說,等於是把所有對外連線的密鑰拱手讓人。
防範這類問題的最好方式就是確保系統隨時更新到最新版本,並對任何來自使用者的輸入抱持懷疑態度,嚴格區分資料解析與指令執行的邊界。
您想了解如何檢測自己的 n8n 環境是否存在這類安全性風險嗎?