高下載量protobuf.js函式庫爆RCE漏洞,波及gRPC與Firebase套件
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)