執行不可信賴資源中的命令,或在不可信賴的環境中執行命令,都會導致程序以攻擊者的名義執行惡意命令。
Command Injection 漏洞主要表現為以下兩種形式:
- 攻擊者能夠篡改程序執行的命令:攻擊者直接控制了所執行的命令。
- 攻擊者能夠篡改命令的執行環境:攻擊者間接地控制了所執行的命令。
在這種情況下,我們著重關注第一種情況,即攻擊者控制所執行命令的可能性。這種形式的 Command Injection 漏洞在以下情況下發生:
1. 數據從不可信賴的數據源進入應用程序。
2. 數據被用作代表應用程序所執行命令的字符串,或字符串的一部分。
3. 通過命令的執行,應用程序會授予攻擊者一種原本不該擁有的特權或能力。
例 1:下面這段來自系統實用程序的代碼根據系統屬性 APPHOME 來決定其安裝目錄,然后根據指定目錄的相對路徑執行一個初始化腳本。
...
Dim cmd
Dim home
home = Environ$("AppHome")
cmd = home & initCmd
Shell cmd, vbNormalFocus
...
APPHOME 而指向一個包含惡意版本 INITCMD 的其他路徑,從而提高自己在應用程序中的權限,繼而隨心所欲地執行命令。由于程序不會驗證從環境中讀取的值,所以如果攻擊者能夠控制系統屬性 APPHOME 的值,他們就能欺騙應用程序去運行惡意代碼從而取得系統控制權。rman 實用程序的批處理文件包啟動 Oracle 數據庫備份,然后運行 cleanup.bat 腳本刪除一些臨時文件。腳本文件 rmanDB.bat 接受一個命令行參數,其中指明了需要執行的備份類型。由于訪問數據庫受限,所以應用程序執行備份需要具有較高權限的用戶。
...
btype = Request.Form("backuptype")
cmd = "cmd.exe /K " & Chr(34) & "c:\util\rmanDB.bat " & btype & "&&c:\utl\cleanup.bat" & Chr(34) & ";
Shell cmd, vbNormalFocus
...
backuptype 參數做任何驗證。一旦調用了該 shell,它即會心甘情愿地執行用兩個與號分隔的多條命令。如果攻擊者傳遞了一個形式為 "&& del c:\\dbms\\*.*" 的字符串,那么應用程序將會在執行其他程序指定的命令時執行這些命令。由于該應用程序的特性,運行該應用程序需要具備與數據庫進行交互所需的權限,這就意味著攻擊者注入的任何命令都將通過這些權限得以運行。 /var/yp 目錄中運行 make 命令,下面顯示了此步驟的代碼。
...
$result = shell_exec("make");
...
Runtime.exec() 調用前清除它的環境變量。如果攻擊者能夠修改 $PATH 變量,把它指向名為 make 惡意二進制代碼,程序就會在其指定的環境下執行,然后加載該惡意二進制代碼,而非原本期望的代碼。由于應用程序自身的特性,運行該應用程序需要具備執行系統操作所需的權限,這意味著攻擊者會利用這些權限執行自己的 make,從而可能導致攻擊者完全控制系統。
[1] Standards Mapping - OWASP Top 10 2010 - (OWASP 2010) A1 Injection
[2] Standards Mapping - OWASP Top 10 2007 - (OWASP 2007) A2 Injection Flaws
[3] Standards Mapping - OWASP Top 10 2004 - (OWASP 2004) A6 Injection Flaws
[4] Standards Mapping - Security Technical Implementation Guide Version 3 - (STIG 3) APP3510 CAT I, APP3570 CAT I
[5] Standards Mapping - Security Technical Implementation Guide Version 3.4 - (STIG 3.4) APP3510 CAT I, APP3570 CAT I
[6] Standards Mapping - Common Weakness Enumeration - (CWE) CWE ID 77, CWE ID 78
[7] Standards Mapping - SANS Top 25 2010 - (SANS 2010) Insecure Interaction - CWE ID 078
[8] Standards Mapping - SANS Top 25 2011 - (SANS Top 25 2011) Insecure Interaction - CWE ID 078
[9] Standards Mapping - SANS Top 25 2009 - (SANS 2009) Insecure Interaction - CWE ID 116
[10] Standards Mapping - Web Application Security Consortium 24 + 2 - (WASC 24 + 2) OS Commanding
[11] Standards Mapping - Payment Card Industry Data Security Standard Version 1.2 - (PCI 1.2) Requirement 6.3.1.1, Requirement 6.5.2
[12] Standards Mapping - Payment Card Industry Data Security Standard Version 2.0 - (PCI 2.0) Requirement 6.5.1
[13] Standards Mapping - Payment Card Industry Data Security Standard Version 1.1 - (PCI 1.1) Requirement 6.5.6