GitHub遭遇Mass Assignment漏洞攻擊
作者 Jonathan Allen 譯者 曹如進
GitHub 最近遭遇了一場 Ruby on Rails 漏洞攻擊,該漏洞被稱為 mass assignment。此漏洞被認為不僅影響了大量基于 Ruby 的網站,還對使用 ASP.NET MVC 和其他 ORM Web 框架的網站造成了破壞。
Mass assignment 用于將表單數據映射為對象,它在單獨使用時是一項安全且高效的技術。這與 ASP.NET 中的數據綁定異曲同工,并且后者在單獨使用時也同樣很安全。其實,真正的漏洞是由于粗心大意地混用了 mass assignment 和 ORM。
考慮這樣的場景:數據庫包含一張“用戶”表,其中混雜了敏感和非敏感數據,例如可能有些列代表用戶顯示姓名、電子郵件地址以及是否為管理員。開發人員希望創建一個頁面修改顯示姓名及電子郵件地址。為了達到這個目的,他們使用 Rails 或 MVC 腳手架自動生成了域對象,或許還有 view 本身。接下去,他們將用戶無法編輯的字段,如“是否為管理員”復選框從 view 中移除。
如果開發人員忘記將 IsAdministrator 屬性從域對象中移除,那么一個安全漏洞便就此產生。如果他們沒有進行移除,那么 mass assignment 或數據綁定器可能會陷入某種圈套,它們會在合法改動中更新不該修改的屬性。接下去,當記錄保存時,ORM 庫會悄無聲息地存儲新值。
有三種靠譜的方案可以解決該問題:
- 標記不可被更新的屬性,讓 mass assignment/數據綁定器將其忽略;
- 徹底清除業務對象中實際不需要的屬性;
- 創建模型專門接受更新請求,并手工將它們映射到 ORM 對象或存儲過程調用。
應當指出,這并不是一個新的漏洞。我們可以很容易地找出4、5年前關于 mass assignment 的警告,例如標題為“Mass Assignment,黑客們的最愛”以及“不想被黑就使用 attr_protected”的文章。這次唯一不同的是受害站點知名度較高。