程序可能無法處置利用非受管系統資源的受管對象。
該程序不能正確處置使用非受管系統資源的受管對象。
導致正確處理使用非受管系統資源的受管對象失敗的原因至少為兩個:
- 錯誤狀況及其他異常情況。
- 未明確程序的哪一部份負責釋放資源。
受管的 .NET 對象的小子集使用非受管的系統資源。.NET 垃圾收集器可能不會按預測的方式釋放初始受管對象。如此,當垃圾收集器未意識到非受管資源消耗的內存時,應用程序可能耗盡所有內存。大部分非受管資源泄露問題會導致一般的軟件可靠性問題,但如果攻擊者能夠故意觸發非受管資源泄漏,該攻擊者就有可能通過耗盡資源池的方式發起 denial of service ?攻擊。
例 1:以下方法可從來源流 incomingStream 創建受管的 Bitmap Object。Bitmap 被操縱并連接至外部流 outgoingStream。incomingBitmap 和 outgoingBitmap 的 Dispose() 方法從未被明確調用過。
通常可以依賴垃圾收集器來在一個安全的時間對受管對象執行此操作,這些受管對象不使用未受管系統資源。當垃圾收集器看到相適的對象時會調用 Bitmap.Dispose()。然而,Bitmap 對象使用稀缺的非受管系統資源。垃圾收集器在耗盡非受管資源池之前會調用 Dispose() 失敗。
private void processBitmap(Stream incomingStream, Stream outgoingStream, int thumbnailSize)
{
Bitmap incomingBitmap = (Bitmap)System.Drawing.Image.FromStream(incomingStream);
bool validBitmap = validateBitmap(incomingBitmap);
if (!validBitmap)
throw new ValidationException(incomingBitmap);
Bitmap outgoingBitmap = new Bitmap(incomingBitmap, new Size(thumbnailSize, thumbnailSize));
outgoingBitmap.Save(outgoingStream, ImageFormat.Bmp);
}
[1] Standards Mapping - OWASP Top 10 2004 - (OWASP 2004) A9 Application Denial of Service
[2] Standards Mapping - Security Technical Implementation Guide Version 3 - (STIG 3) APP6080 CAT II
[3] Standards Mapping - Security Technical Implementation Guide Version 3.4 - (STIG 3.4) APP6080 CAT II
[4] Standards Mapping - Common Weakness Enumeration - (CWE) CWE ID 404
[5] Standards Mapping - Payment Card Industry Data Security Standard Version 1.1 - (PCI 1.1) Requirement 6.5.9
[6] Standards Mapping - SANS Top 25 2009 - (SANS 2009) Risky Resource Management - CWE ID 404