C/C++ 文件操作

2021-05-28 10:13 更新

5.1 【必須】避免路徑穿越問題

在進行文件操作時,需要判斷外部傳入的文件名是否合法,如果文件名中包含 ../ 等特殊字符,則會造成路徑穿越,導致任意文件的讀寫。

錯誤:

void Foo() {
  char file_path[PATH_MAX] = "/home/user/code/";
  // 如果傳入的文件名包含../可導致路徑穿越
  // 例如"../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);
   }
}

關聯(lián)漏洞:

  • 高風險-邏輯漏洞

5.2 【必須】避免相對路徑導致的安全問題(DLL、EXE劫持等問題)

在程序中,使用相對路徑可能導致一些安全風險,例如DLL、EXE劫持等問題。

例如以下代碼,可能存在劫持問題:

int Foo() {
  // 傳入的是dll文件名,如果當前目錄下被寫入了惡意的同名dll,則可能導致dll劫持
  HINSTANCE hinst = ::LoadLibrary("dll_nolib.dll");
  if (hinst != NULL) {
    cout<<"dll loaded!" << endl;
  }
  return 0;
}

針對DLL劫持的安全編碼的規(guī)范:

1)調用LoadLibrary,LoadLibraryEx,CreateProcess,ShellExecute等進行模塊加載的函數(shù)時,指明模塊的完整(全)路徑,禁止使用相對路徑,這樣就可避免從其它目錄加載DLL。 2)在應用程序的開頭調用SetDllDirectory(TEXT("")); 從而將當前目錄從DLL的搜索列表中刪除。結合SetDefaultDllDirectories,AddDllDirectory,RemoveDllDirectory這幾個API配合使用,可以有效的規(guī)避DLL劫持問題。這些API只能在打了KB2533623補丁的Windows7,2008上使用。

關聯(lián)漏洞:

  • 中風險-邏輯漏洞

5.3 【必須】文件權限控制

在創(chuàng)建文件時,需要根據(jù)文件的敏感級別設置不同的訪問權限,以防止敏感數(shù)據(jù)被其他惡意程序讀取或寫入。

錯誤:

int Foo() {
  // 不要設置為777權限,以防止被其他惡意程序操作
  if (creat("file.txt", 0777) < 0) {
    printf("文件創(chuàng)建失敗!\n");
  } else {
    printf("文件創(chuàng)建成功!\n");
  }
  return 0;
}

關聯(lián)漏洞:

  • 中風險-邏輯漏洞
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號