在進(jìn)行文件操作時(shí),需要判斷外部傳入的文件名是否合法,如果文件名中包含 ../
等特殊字符,則會(huì)造成路徑穿越,導(dǎo)致任意文件的讀寫(xiě)。
錯(cuò)誤:
void Foo() {
char file_path[PATH_MAX] = "/home/user/code/";
// 如果傳入的文件名包含../可導(dǎo)致路徑穿越
// 例如"../file.txt",則可以讀取到上層目錄的file.txt文件
char name[20] = "../file.txt";
memcpy(file_path + strlen(file_path), name, sizeof(name));
int fd = open(file_path, O_RDONLY);
if (fd != -1) {
char data[100] = {0};
int num = 0;
memset(data, 0, sizeof(data));
num = read(fd, data, sizeof(data));
if (num > 0) {
write(STDOUT_FILENO, data, num);
}
close(fd);
}
}
正確:
void Foo() {
char file_path[PATH_MAX] = "/home/user/code/";
char name[20] = "../file.txt";
// 判斷傳入的文件名是否非法,例如"../file.txt"中包含非法字符../,直接返回
if (strstr(name, "..") != NULL){
// 包含非法字符
return;
}
memcpy(file_path + strlen(file_path), name, sizeof(name));
int fd = open(file_path, O_RDONLY);
if (fd != -1) {
char data[100] = {0};
int num = 0;
memset(data, 0, sizeof(data));
num = read(fd, data, sizeof(data));
if (num > 0) {
write(STDOUT_FILENO, data, num);
}
close(fd);
}
}
關(guān)聯(lián)漏洞:
高風(fēng)險(xiǎn)-邏輯漏洞
在程序中,使用相對(duì)路徑可能導(dǎo)致一些安全風(fēng)險(xiǎn),例如DLL、EXE劫持等問(wèn)題。
例如以下代碼,可能存在劫持問(wèn)題:
int Foo() {
// 傳入的是dll文件名,如果當(dāng)前目錄下被寫(xiě)入了惡意的同名dll,則可能導(dǎo)致dll劫持
HINSTANCE hinst = ::LoadLibrary("dll_nolib.dll");
if (hinst != NULL) {
cout<<"dll loaded!" << endl;
}
return 0;
}
針對(duì)DLL劫持的安全編碼的規(guī)范:
1)調(diào)用LoadLibrary,LoadLibraryEx,CreateProcess,ShellExecute等進(jìn)行模塊加載的函數(shù)時(shí),指明模塊的完整(全)路徑,禁止使用相對(duì)路徑,這樣就可避免從其它目錄加載DLL。 2)在應(yīng)用程序的開(kāi)頭調(diào)用SetDllDirectory(TEXT("")); 從而將當(dāng)前目錄從DLL的搜索列表中刪除。結(jié)合SetDefaultDllDirectories,AddDllDirectory,RemoveDllDirectory這幾個(gè)API配合使用,可以有效的規(guī)避DLL劫持問(wèn)題。這些API只能在打了KB2533623補(bǔ)丁的Windows7,2008上使用。
關(guān)聯(lián)漏洞:
中風(fēng)險(xiǎn)-邏輯漏洞
在創(chuàng)建文件時(shí),需要根據(jù)文件的敏感級(jí)別設(shè)置不同的訪(fǎng)問(wèn)權(quán)限,以防止敏感數(shù)據(jù)被其他惡意程序讀取或?qū)懭搿?/p>
錯(cuò)誤:
int Foo() {
// 不要設(shè)置為777權(quán)限,以防止被其他惡意程序操作
if (creat("file.txt", 0777) < 0) {
printf("文件創(chuàng)建失??!\n");
} else {
printf("文件創(chuàng)建成功!\n");
}
return 0;
}
關(guān)聯(lián)漏洞:
中風(fēng)險(xiǎn)-邏輯漏洞
更多建議: