2022年4月13日 星期三

[研究][Fortify SCA]原始碼變數最好不要包含的字串

[研究][Fortify SCA]原始碼變數最好不要包含的字串

2022-04-13

Fortify SCA (Static Cde Analyzer) 做源碼安全掃描時,會把含有某些字串的變數,當成特殊用途的字串,報告又多了一條或數條要修正的。

變數中盡量不要包含的字串:password, pwd

********************************************************************************

High 等級 Password Management Empty Password 問題 (密碼值為空字串)


string newPwdHash = "";


Details

Abstract:

Empty Password 可能會導致無法輕易修正系統安全性的問題。

Explanation:

將空白字串指派給密碼變數絕對不是個好方法。如果使用 Empty Password 成功地在另一個系統驗證,因為對應帳戶接受 Empty Password,其安全性很可能因此受到攻擊。如果在指派合法值給該變數之前,Empty Password 只是預留位置,這樣會讓不熟悉程式碼的使用者感到困惑,而且可能在無法預期的控制流路徑上產生問題。

範例 1:

    NetworkCredential netCred = new NetworkCredential("scott", "", domain);

如果 Example 1 中的程式碼連線成功,表示網路憑證登入「scott」是以 Empty Password 配置,攻擊者可輕易地猜測出此密碼。程式發佈後,需要變更程式碼才可以更新帳戶以使用非 Empty Password。

範例 2:以下程式碼將密碼變數初始化為空白字串,嘗試讀取已儲存的密碼值,並與使用者提供的值進行比較。

    string storedPassword = "";

    string temp;

    if ((temp = ReadPassword(storedPassword)) != null) {

        storedPassword = temp;

    }

    if(storedPassword.Equals(userPassword))

        // Access protected resources

    }

如果 readPassword() 因為資料庫錯誤或其他問題而無法擷取儲存的密碼,攻擊者就可藉由提供空白字串給 userPassword 而輕易地略過密碼檢查。

Recommendations:

務必從加密的外部資源讀取儲存的密碼值,並指派有意義的值給密碼變數。確保絕不要使用空白或 null 密碼來保護敏感資源。

從 Microsoft(R) Windows(R) 2000 開始,Microsoft(R) 提供了 Windows Data Protection Application Programming Interface (DPAPI),這是一個基於 OS 層的服務,可保護敏感的應用程式的資料,如密碼或者密鑰 [1]。

Tips:

1. 為識別 null、Empty Password 或 Hardcoded Password,預設規則只考慮包含 password 一詞的欄位及變數。然而,Fortify Custom Rules Editor 會提供 Password Management 精靈,方便您建立規則來偵測自訂名稱欄位與變數的密碼管理問題。

References:

[1] Windows Data Protection, Microsoft, 2001, https://msdn.microsoft.com/en-us/library/ms995355.aspx

********************************************************************************

High 等級 Password Management Hardcoded Password 問題 ( 變數包含的 password 字串)


string myPassword = value;  

Abstract:

硬式編碼的密碼會導致無法輕易修正系統的安全性問題。

Explanation:

將密碼硬式編碼在程式碼中絕對不是明智的想法。將密碼硬式編碼不僅可讓所有的專案開發人員查看密碼,也會使得修復問題的工作變得很困難。產生程式碼以後,除非修補軟體,否則無法變更密碼。如果受密碼保護的帳戶出現問題,系統的所有者將必須在安全性和可行性之間做出選擇。

在此案例中,密碼用於存取 DataClasses.designer.cs中第 420 行的 Equals() 資源。

範例: 下列程式碼使用 Hardcoded Password 來建立網路憑證:

NetworkCredential netCred =

           new NetworkCredential("scott", "tiger", domain);

此程式碼能夠成功執行,但任何有程式碼存取權的人都可以存取密碼。程式發佈後,除非修補此程式,否則可能無法變更網路憑證使用者「scott」和密碼「tiger」。若員工有此資訊的存取權,則可能會使用此資訊來進入並破壞系統。如果攻擊者可存取應用程式的可執行碼,他們可以將程式碼分解,而此程式碼包含了所使用密碼的值。

Recommendations:

請勿將密碼硬式編碼,且通常應該要將密碼模糊化,並於外部資源中進行管理。 將密碼以純文字方式儲存於系統的任一處,任何有足夠權限的人都可以讀取密碼,並可能誤用密碼。

Microsoft(R) 提供了一個工具,可以與 Windows Data Protection application programming interface (DPAPI) 一起使用以保護組態設定檔案中敏感的應用程式項目 [1]。

Tips:

1. 為識別 null、Empty Password 或 Hardcoded Password,預設規則只考慮包含 password 一詞的欄位及變數。然而,Fortify Custom Rules Editor 會提供 Password Management 精靈,方便您建立規則來偵測自訂名稱欄位與變數的密碼管理問題。

References:

[1] Scott Mitchell, Protecting Connection Strings and Other Configuration Information, Microsoft, https://docs.microsoft.com/en-us/aspnet/web-forms/overview/data-access/advanced-data-access-scenarios/protecting-connection-strings-and-other-configuration-information-cs

********************************************************************************

High等級 Password Management Password in Configuration File 問題

Web.Config 中變數名稱包含 password


<add name="mySysConnectionString" connectionString="Data Source=.;Initial Catalog=myDB;User ID=myAdmin;Password=密碼" providerName="System.Data.SqlClient" />

此處 Password 是語法使用的變數名稱,不可能換掉。

解法(1)

[研究] [ASP.NET] Web.Config 連線字串加密、解密方法
http://shaurong.blogspot.com/2017/09/aspnet-webconfig.html

除了上述方法,(2)也可在人工分析報告說明是誤判;(3)掃描前,先註解掉;或(4)在 Fortify Audit Workbench 要產出 pdf 報告前,選該項,按下滑鼠右鍵,選 Hide an AWB。

********************************************************************************

(完)


沒有留言:

張貼留言