使用 BinaryFormatter 和相關類型的還原序列化風險
本文適用於下列類型:
本文適用於下列 .NET 實作:
- .NET Framework 所有版本
- .NET Core 2.1 - 3.1
- .NET 5 和更新版本
警告
BinaryFormatter 類型很危險,不建議用於資料處理。 即使應用程式相信所處理的數據值得信任,應用程式 也應該儘快停止使用 BinaryFormatter
。 BinaryFormatter
不安全且無法確保安全。
注意
從 .NET 9 開始,內建 BinaryFormatter 實作會在使用時擲回例外狀況,即使先前啟用其使用設定也是如此。 這些設定也會移除。 如需詳細資訊, 請參閱 BinaryFormatter 移轉指南 。
還原序列化弱點
還原序列化弱點是威脅類別,因為會以不安全的方式處理要求承載。 成功利用這些應用程式弱點的攻擊者,可能會導致拒絕服務 (DoS)、資訊洩漏或在目標應用程式內部執行遠端程式碼。 此風險類別時常成為 OWASP 前 10 名。 目標包含以各種語言撰寫的應用程式,語言可包含 C/C++、Java 和 C#。
在 .NET 中,最大的風險目標為對還原序列化資料使用 BinaryFormatter 型別的應用程式。 BinaryFormatter
廣泛在 .NET 生態系統中使用,因為其功能性和易於使用。 不過,此相同功能可讓攻擊者影響目標應用程式內的控制流程。 成功的攻擊可能會導致攻擊者可在目標程序的環境內執行程式碼。
以更簡單的類比,假設透過承載呼叫 BinaryFormatter.Deserialize
相當於將該承載解譯為獨立可執行檔並加以啟動。
BinaryFormatter 安全性弱點
警告
當搭配使用不受信任的輸入時,BinaryFormatter.Deserialize
方法一律不安全。 強烈建議取用者改為考慮使用本文稍後所述的其中一個替代方案。
在還原序列化弱點為充分理解的威脅類別之前,已實作 BinaryFormatter
。 因此,程式碼不會遵循新式最佳做法。 Deserialize
方法可用來作為向量,可讓攻擊者針對取用的應用程式執行 DoS 攻擊。 這些攻擊可能會使應用程式沒有回應,或導致非預期的處理序終止。 此類別的攻擊無法使用 SerializationBinder
或其他 BinaryFormatter
設定參數來降低風險。 .NET 會將此行為視為設計出來的,且不會發出程式碼更新以修改行為。
BinaryFormatter.Deserialize
可能會受到其他攻擊類別的影響,例如資訊洩漏或遠端程式代碼執行。 使用自定義 SerializationBinder 等功能可能不足以適當降低這些風險。 攻擊者可能會發現略過現有風險降低的新惡意探索。 .NET 不會認可發佈修補程式,以回應任何這類略過。 此外,開發或部署這類修補程式在技術上可能不可行。 您應該評估您的案例,並考慮可能暴露在這些風險。
我們建議 BinaryFormatter
取用者在應用程式上執行個別風險評估。 取用者必須負責判斷是否要使用這些 BinaryFormatter
。 如果您正在考慮使用,您應該對安全性、技術、信譽、法律和法規後果進行風險評估。
偏好的替代方案
.NET 提供數個附隨序列化程式,可安全處理不受信任的資料:
- XmlSerializer 和 DataContractSerializer,用於從 XML 序列化。 請不要將
DataContractSerializer
與 NetDataContractSerializer 混淆。 - BinaryReader 和 BinaryWriter 適用於 XML 和 JSON。
- System.Text.Json API,用於將物件圖序列化成 JSON。
危險替代方案
避免下列序列化程式:
上述序列化程式都會執行不受限制的多型還原序列化,而且如同 BinaryFormatter
一樣危險。
假設資料可信任的風險
應用程式開發人員通常會認為本身僅處理受信任的輸入。 在極少的情況下,安全輸入的案例如實安全。 但是,承載通常會在開發人員未發現的情況下越過信任界限。
請考慮內部部署伺服器,員工可從工作站使用桌面用戶端來與服務互動。 此案例可能單純視為「安全」設定,因為使用 BinaryFormatter
在可接受範圍內。 不過,此案例呈現惡意程式碼的向量,其可存取單一員工的電腦以在整個企業中進行散佈。 該惡意程式碼可利用員工對 BinaryFormatter
的使用,從員工的工作站水平移至後端伺服器。 接著,造成公司敏感性資料外泄。 這類資料可能包含營業秘密或客戶資料。
請也考量應用程式會使用 BinaryFormatter
來保存儲存狀態。 這看似可能為安全的案例,因為您的硬碟上的讀取和寫入資料代表小型威脅。 不過,跨電子郵件或在網際網路之間共用文件是很常見且大部分的使用者都不會認為開啟這些下載的檔案是有風險的行為。
此案例可能會被用於產生負面影響。 如果應用程式是遊戲,共用儲存檔案的使用者會在不自覺的情況下置於風險中。 開發人員自身也可能成為目標對象。 攻擊者可能會將電子郵件給開發人員的技術支援,其中附加惡意資料檔案並要求支援人員開啟。 這種攻擊可能會讓攻擊者在企業中擁有立足點。
另一個案例為資料檔案儲存在雲端儲存空間中,並在使用者電腦之間自動同步處理。 可存取雲端儲存空間帳戶的攻擊者可能會危害資料檔案。 此資料檔案會自動同步處理至使用者的電腦。 下次使用者開啟資料檔案時,攻擊者的承載會隨即執行。 因此,攻擊者可利用雲端儲存空間帳戶入侵來取得完整的程式碼執行權限。
請考量從桌面安裝模型移轉成雲端優先模型的應用程式。 此案例包含從桌面安裝模型或豐富型用戶端模型移轉成 Web 型模型的應用程式。 針對桌面應用程式所繪製的任何威脅模型不一定適用於雲端式服務。 傳統型應用程式的威脅模型可能會認為「用戶端攻擊自己並不有趣」,從而對威脅置之不理。但是,當考慮到遠端使用者 (用戶端) 攻擊雲端服務本身時,同樣的威脅可能會變得有意義。
注意
一般而言,序列化的意圖是將物件傳送到應用程式或移出應用程式。 威脅模型化練習幾乎一律會將這種資料傳輸標示為跨越信任界限。
另請參閱
- BinaryFormatter 移轉指南
- 二進位序列化
- YSoSerial.Net,用於研究敵對攻擊者如何使用
BinaryFormatter
來攻擊應用程式。 - 還原序列化弱點的一般背景: