價(jià)錢網(wǎng)站建設(shè)百度官方網(wǎng)首頁
漏洞描述:程序使用關(guān)鍵資源時(shí)(如動態(tài)鏈接庫、執(zhí)行文件、配置文件等)沒有明確的指定資源的路徑,而是依賴操作系統(tǒng)去搜索資源,這種行為可能被攻擊者利用,通過在搜索優(yōu)先級較高的目錄放置不良資源,進(jìn)而劫持程序的執(zhí)行流程。
漏洞風(fēng)險(xiǎn):攻擊者可以在搜索優(yōu)先級更高的文件夾中放入相同名稱的資源,程序會使用攻擊者控制的資源。包括:
- 資源劫持:攻擊者可在高優(yōu)先級目錄中放置同名的惡意文件,程序執(zhí)行時(shí)會優(yōu)先加載攻擊者提供的文件,而非預(yù)期的系統(tǒng)或可信文件。
- 權(quán)限提升:如果程序以高權(quán)限運(yùn)行,而惡意文件存放在可寫目錄中,攻擊者可能借助該漏洞執(zhí)行惡意代碼,以更高權(quán)限控制系統(tǒng)。
- 系統(tǒng)穩(wěn)定性影響:程序加載了非預(yù)期的文件,可能導(dǎo)致崩潰、數(shù)據(jù)損壞或異常行為。
修復(fù)或規(guī)避建議:使用關(guān)鍵資源時(shí)指定資源所在的路徑。包括:
- 顯式指定資源路徑:在加載關(guān)鍵資源(如 DLL、可執(zhí)行文件、配置文件)時(shí),使用絕對路徑或受控路徑,避免依賴默認(rèn)搜索路徑。
- 限制可執(zhí)行文件搜索路徑:使用環(huán)境變量 PATH 控制搜索順序,并確保程序不會在不受信任的目錄中查找關(guān)鍵資源。
- 最小化可寫目錄權(quán)限:確保應(yīng)用程序的可執(zhí)行目錄不可由普通用戶或低權(quán)限進(jìn)程修改,防止攻擊者放置惡意文件。
- 代碼審計(jì)與檢測:使用靜態(tài)分析工具或代碼審查機(jī)制,檢測程序是否存在不可信的搜索路徑問題。
- 使用庫加載安全機(jī)制(適用于 Windows):
- 使用 SetDllDirectory(NULL) 禁用當(dāng)前工作目錄的搜索。
- 使用 LoadLibraryEx 并指定 LOAD_LIBRARY_SEARCH_SYSTEM32 以確保僅從系統(tǒng)目錄加載 DLL。
- 在 Linux 上,可使用 LD_LIBRARY_PATH 進(jìn)行控制,并避免在 .(當(dāng)前目錄)等不安全路徑中查找?guī)煳募?/li>
1:不規(guī)范用法
public class Example{ ?????? private String command;? //本例中command = "dir.exe E:\\data" ?????? public void exampleFun(void) {?? ????????????? //攻擊者可在搜索優(yōu)先級更高的文件夾中放入和dir.exe網(wǎng)名的惡意程序?qū)е耤ommand的內(nèi)容無法正確執(zhí)行 ????????????? ????????????? Runtime.getRuntime().exec(command); ????????????? //其它語句 ??? } } |
該漏洞類型與C/C++中的不可信的搜索路徑相同,都是攻擊者在搜索優(yōu)先級更高的文件夾下放置名稱為dir.exe的文件,則程序執(zhí)行中,則替換了系統(tǒng)中的dir命令。通過閱讀字節(jié)碼了解到?jīng)]有設(shè)定路徑,則攻擊者就可以構(gòu)造同名的可執(zhí)行程序,讓程序去執(zhí)行,控制程序的執(zhí)行行為,存在風(fēng)險(xiǎn)。
示例2:不規(guī)范用法(Windows下不安全加載)
#include <stdlib.h> int main() { ??? system("dir"); ??? return 0; } |
題分析:
- system("dir") 依賴操作系統(tǒng)的 PATH 變量進(jìn)行可執(zhí)行文件搜索。
- 攻擊者可以在 PATH 變量優(yōu)先搜索的目錄(如當(dāng)前目錄)放置一個(gè)惡意的 dir.exe,使程序執(zhí)行惡意代碼。
示例3:不規(guī)范用法(Linux下不安全的加載)
#include <dlfcn.h> int main() { ??? void* handle = dlopen("libexample.so", RTLD_LAZY); ??? if (!handle) { ??????? return -1; ??? } ??? return 0; } |
dlopen("libexample.so", RTLD_LAZY) 可能會在 LD_LIBRARY_PATH 指定的路徑或當(dāng)前目錄中查找 libexample.so,存在被攻擊者劫持的風(fēng)險(xiǎn)。
示例4:規(guī)范用法之一(Windows下用法之1)
public class Example{ ?????? private String command;? //本例中command = "dir.exe E:\\data" ?????? public void exampleFun(void) {?? ????????????? //PATH是存放操作系統(tǒng)中dir.exe命令所在完整路徑的常量,本例中PATH="C:\\WINDOWS\\system32"; ????????????? String cmd = PATH +command;? //使用完整路徑確保command的內(nèi)容能正確執(zhí)行 ????????????? Runtime.getRuntime().exec(cmd); ????????????? //其它語句 ??? } } |
限定了路徑,使攻擊者不會輕易能夠進(jìn)入到服務(wù)器的系統(tǒng)路徑去放置同名的可執(zhí)行程序。攻擊難度加大。
示例5:規(guī)范用法(Windows下用法之2)
#include <stdlib.h> int main() { ??? system("C:\\Windows\\System32\\dir.exe"); ??? return 0; } |
顯式指定 dir.exe 所在的絕對路徑,確保程序只執(zhí)行系統(tǒng)提供的命令。
示例6:規(guī)范用法(Windows下用法之3)
#include <windows.h> int main() { ??? STARTUPINFO si = { sizeof(si) }; ??? PROCESS_INFORMATION pi; ??? if (CreateProcess("C:\\Windows\\System32\\cmd.exe", "/c dir", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { ??????? WaitForSingleObject(pi.hProcess, INFINITE); ??????? CloseHandle(pi.hProcess); ??????? CloseHandle(pi.hThread); ??? } ??? return 0; } |
使用 CreateProcess 直接指定 cmd.exe 的路徑,防止執(zhí)行路徑被劫持。
示例7:規(guī)范用法(Linux下)
#include <dlfcn.h> int main() { ??? void* handle = dlopen("/usr/lib/libexample.so", RTLD_LAZY); ??? if (!handle) { ??????? return -1; ??? } ??? return 0; } |
通過絕對路徑加載動態(tài)庫,防止從不受信任的目錄加載惡意庫文件
總結(jié)
- 不要依賴默認(rèn)的搜索路徑,始終指定絕對路徑或受控路徑。
- 最小化可寫權(quán)限,確保攻擊者無法修改或放置惡意文件。
- 使用安全 API(如 CreateProcess 替代 system,LoadLibraryEx 指定安全路徑)。
- 代碼審計(jì)和檢測,定期掃描代碼中的不可信搜索路徑風(fēng)險(xiǎn)。
這樣可以有效防止不可信搜索路徑漏洞,提高系統(tǒng)安全性。