簡體   English   中英

打開文件流進行寫入 - 加強路徑操作

[英]Open Filestream For Writing - fortify Path Manipulation

尋找解決打開文件的強化發現(路徑操作):

public FileStream OpenFile(string directory, string filename)
{
    FileStream fs = null;
    string pathname = string.Empty;
    pathname = Path.Combine(directory, filename);
    fs = new FileStream(pathname , FileMode.OpenOrCreate);
    return (fs);
}

此代碼在 .NET 應用程序中運行,但不寫入虛擬目錄。

Fortify 幫助/建議表明將有效目錄列入白名單,但這相當於對應用程序中的目錄進行硬編碼。 它可能是安全的,但它不是一個好的編程習慣。

提前致謝

@James Nix 提供了 Fortify 發現漏洞的原因(在評論中):

您之所以得到此結果,是因為此方法接受“用戶提供的”路徑和文件名。 如果攻擊者將此方法發送參數directory=C:\\Windowsfilename=notepad.exe ,如果您的應用程序對該文件具有寫入權限,他們就可以用惡意內容覆蓋notepad.exe – 詹姆斯尼克斯 1 月 6 日 17:17

如果您有興趣修復漏洞,那么您需要:

  1. 如果可能,將方法簽名從公共更改為私有。
  2. 為所提供的文件路徑(如“D:\\Temp\\”或 Application("files_root"))提供一個固定前綴,您可以將其添加到您的應用程序配置中。
  3. 不允許在文件名參數中使用“/”或“\\”或“..”或“:”。 或者在適當的情況下限制為 8.3 之類的內容。
  4. 不允許在路徑參數中使用“..”或“:”。 或者只是限制在可接受的字符范圍內(例如 az)。
  5. 不要返回打開的 FileStream 對象。 您無法控制它是否曾經關閉(拒絕服務漏洞)。 相反,在從方法返回之前獲取您需要的數據並關閉 FileStream。

如果您想要更有針對性的補救建議,您需要描述您的應用程序需要使用此方法做什么。

在調用 FileStream 之前,您需要添加代碼來檢查“目錄”和“路徑名”以確保它們在系統上存在。 對於 .NET,您可以使用 stat() 函數進行檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM