1. 程式人生 > >Fortify漏洞之Dynamic Code Evaluation: Code Injection(動態腳本註入)和 Password Management: Hardcoded Password(密碼硬編碼)

Fortify漏洞之Dynamic Code Evaluation: Code Injection(動態腳本註入)和 Password Management: Hardcoded Password(密碼硬編碼)

mys info 用戶輸入 strong 獲取 center 連接數 密碼 new

  繼續對Fortify的漏洞進行總結,本篇主要針對 Dynamic Code Evaluation: Code Injection(動態腳本註入) 和 Password Management: Hardcoded Password(密碼硬編碼) 的漏洞進行總結,如下:

1.1、產生原因:

  許多現代編程語言都允許動態解析源代碼指令。這使得程序員可以執行基於用戶輸入的動態指令。當程序員錯誤地認為由用戶直接提供的指令僅會執行一些無害的操作時(如對當前的用戶對象進行簡單的計算或修改用戶的狀態),就會出現 code injection 漏洞。然而,若不經過適當的驗證,用戶指定的操作可能並不是程序員最初所期望的。

示例:在這個經典的 code injection 實例中,應用程序可以實施一個基本的計算器,該計算器允許用戶指定執行命令。
...
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();

ScriptEngine scriptEngine = scriptEngineManager.getEngineByExtension("js");
userOps = request.getParameter("operation");
Object result = scriptEngine.eval(userOps);


...

  如果 operation 參數的值為良性值,程序就可以正常運行。例如,當該值為 "8 + 7 * 2" 時,result 變量被賦予的值將為 22。然而,如果攻擊者指定的語言操作既有可能是有效的,又有可能是惡意的,那麽,只有在對主進程具有完全權限的情況下才能執行這些操作。如果底層語言提供了訪問系統資源的途徑或允許執行系統命令,這種攻擊甚至會更加危險。例如,JavaScript 允許調用 Java 對象;如果攻擊者計劃將 " java.lang.Runtime.getRuntime().exec("shutdown -h now")" 指定為 operation 的值,則主機系統就會執行關機命令。

1.2、修復方案:

  在任何時候,都應盡可能地避免解析動態代碼。如果程序必須動態地解釋代碼,您可以通過以下方式將這種攻擊獲得成功的可能性降到最低:盡可能限制程序中動態執行的代碼數量,將代碼限制到基本編程語言的程序特定的和上下文特定的子集。程序絕對不能直接解析和執行未經驗證的用戶輸入。而應采用間接方法:創建一份合法操作和數據對象列表,用戶可以指定其中的內容,並且只能從中進行選擇。利用這種方法,就絕不會直接執行由用戶提供的輸入。

技術分享圖片

圖1.2.1:對js引擎方法執行的源代碼指令添加白名單過濾

2、Password Management: Hardcoded Password(密碼硬編碼)

2.1、產生原因:

  使用硬編碼方式處理密碼絕非好方法。這不僅是因為所有項目開發人員都可以使用通過硬編碼方式處理的密碼,而且還會使解決這一問題變得極其困難。一旦代碼投入使用,除非對軟件進行修補,否則您再也不能改變密碼了。如果帳戶中的密碼保護減弱,系統所有者將被迫在安全性和可行性之間做出選擇。

例 1以下代碼用 hardcoded password 來連接數據庫:...
DriverManager.getConnection(url, "scott", "tiger");
...

  該代碼可以正常運行,但是任何有該代碼權限的人都能得到這個密碼。一旦程序發布,將無法更改數據庫用戶“scott”和密碼“tiger”,除非是要修補該程序。雇員可以利用手中掌握的信息訪問權限入侵系統。更糟的是,如果攻擊者能夠訪問應用程序的字節代碼,那麽他們就可以利用 javap -c 命令訪問已經過反匯編的代碼,而在這些代碼中恰恰包含著用戶使用過的密碼值。我們可以從以下看到上述例子的執行結果:

javap -c ConnMngr.class
22: ldc #36; //String jdbc:mysql://ixne.com/rxsql
24: ldc #38; //String scott
26: ldc #17; //String tiger

  在移動世界中,由於設備丟失的幾率較高,因此密碼管理是一個非常棘手的問題。

技術分享圖片

圖2.1.1:使用硬編碼的方式設置密碼

2.2、修復方案:

  絕不能對密碼進行硬編碼。通常情況下,應對密碼加以模糊化,並在外部資源文件中進行管理。在系統中采用明文的形式存儲密碼,會造成任何有充分權限的人讀取和無意中誤用密碼。至少,密碼要先經過 hash 處理再存儲。

技術分享圖片

圖2.2.1:獲取配置文件配置好的密碼

技術分享圖片

圖2.2.2:配置文件配置好且加密的密碼

Fortify漏洞之Dynamic Code Evaluation: Code Injection(動態腳本註入)和 Password Management: Hardcoded Password(密碼硬編碼)