2014-07-01 88 views
1

我可能在我的Windows應用程序中發現了一個安全漏洞。它接受來自用戶的字符串,並應用以下邏輯:Windows文件路徑中特殊字符的安全缺陷

string fileName = userInput + ".notSecret"; 
return new FileStream(fileName, FileMode.Open, FileAccess.Read); 

是否有可能在用戶輸入,讓他們通過早期終止的文件名,進入一個新的文件擴展名的人物?

例如:

「secret_file.Secret \ 0」

+0

在你問這個問題後的50分鐘內,你可以在你的代碼中設置一個斷點,按F5並自己嘗試。只是說。 – Tim

+0

@ Tim-我嘗試了大約20個不同的特殊字符,包括這一個,並在谷歌上進行了大量搜索。說到安全性,我寧願安全而不後悔,所以我問了這個問題,以免我錯過了一個可能的漏洞。 – CodeMonkey

回答

1

您指定的情況最有可能不是一個安全漏洞。首先,.NET字符串不是空截斷的,可能包含空字符。此外,如果您嘗試在StreamWriter構造與控制字符來創建一個文件,其中包括\0,你會發現它拋出一個異常:

Unhandled Exception: System.ArgumentException: Illegal characters in path. 
    at System.IO.Path.CheckInvalidPathChars(String path, Boolean checkAdditional) 
    at System.IO.Path.GetFileName(String path) 
    at System.IO.StreamWriter.CreateFile(String path, Boolean append, Boolean checkHost) 
    at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize, Boolean checkHost) 
    at System.IO.StreamWriter..ctor(String path) 

注意,有是一個安全漏洞,如果.NET IO框架支持備用數據流;用戶可以寫入「userInput.secret:.notSecret」,強制寫入「userInput.secret」的備用數據流。由於System.IO類不支持備用數據流,因此拋出了NotSupportedException,並且未編寫惡意文件。

將文件擴展名作爲安全控制使用時存在潛在的文件系統影響。例如,如果用戶將擴展名爲.notSecret的文件映射爲hard link到擴展名爲.secret的文件,則寫入一個文件也會寫入另一個文件(因爲在硬鏈接中,單個文件可以具有多個不同的路徑擴展)。

假設userInput是用戶提供的原始代碼,代碼無法消毒用戶輸入。處理來自不受信任來源的輸入時,代碼應假定爲all user input is evil until proven otherwise。如果用戶的輸入被期望是一個特定的值(例如,沒有特殊字符),處理輸入的代碼應該確保它匹配,並且如果沒有特殊字符則處理它(或拋出異常)。只允許已知好的輸入比只知道輸入不好的輸入更安全。

+0

感謝您的意見。我一定會對它進行消毒。 – CodeMonkey