JavaScript生態系廣泛使用的Protocol Buffers函式庫protobuf.js揭露嚴重漏洞,CVSS評分9.4。漏洞允許攻擊者透過惡意結構定義(Schema)檔案,在應用程式正常處理訊息時觸發任意程式碼執行。受影響版本為8.0.0,以及7.5.4以下版本,修補版本8.0.1與7.5.5已發布,官方建議立即升級。
protobuf.js是JavaScript環境中,處理Protocol Buffers資料格式的主流函式庫,資安公司Endor Labs研究人員估計,每周protobuf.js在NPM下載量接近5,200萬次,並以傳遞依賴(Transitive Dependency)的形式內嵌於@grpc/proto-loader、Firebase SDK與Google Cloud用戶端函式庫中。
protobuf.js採用動態編譯設計,每次載入Schema時,函式庫會根據訊息型別名稱動態生成JavaScript原始碼,再透過Function()建構子執行,以提升執行效能。研究人員指出該漏洞在於,函式庫在修補前未對型別名稱進行任何過濾或驗證,直接將其拼接至生成的程式碼字串中。Function()的行為本質上與eval()相同,要是型別名稱包含惡意內容,即可在字串中插入並執行任意JavaScript指令。
漏洞不是在載入Schema時觸發,而是應用程式第一次需要該型別建構子時才會觸發,實務上通常發生在首次解碼、編碼或建立該型別訊息時。
要觸發此漏洞,攻擊者需能影響應用程式載入的protobuf定義或描述子,研究人員提到,雖然這聽起來條件有限,但在實務上卻涵蓋多種常見情境。gRPC定義了標準的伺服器反射協定,允許用戶端向伺服器請求Schema定義,若伺服器遭入侵,即可在同一個回應中夾帶惡意型別名稱。此外,企業內部或第三方Schema Registry的存取控制一旦出現缺口,或開發人員在本機載入來源不明的.proto檔案進行除錯,都可能成為攻擊入口。
上游修補僅新增一行程式碼,在型別名稱進入程式碼生成流程前,以正規表達式移除所有非英數字與底線以外字元,切斷惡意內容的注入路徑。
開發人員可執行NPM ls protobufjs指令確認專案中是否存在該套件,包含傳遞依賴,並依使用的版本升級至8.0.1或7.5.5。要是生產環境不需要在執行時期動態編譯Schema,protobuf.js函式庫官方也建議改用pbjs與pbts工具預先生成靜態程式碼,從根本上縮小攻擊面。
Comments (0)