讓我說我的路徑/home/sn/stuff/
。用戶現在輸入../secretStuff/secret.txt
。現在用戶在/home/sn/secretStuff
並且可以讀取它裏面的所有內容。我該如何監獄裏的用戶
如何阻止這種情況發生?用戶輸入的路徑中是否可以容忍任何..可以嗎?
讓我說我的路徑/home/sn/stuff/
。用戶現在輸入../secretStuff/secret.txt
。現在用戶在/home/sn/secretStuff
並且可以讀取它裏面的所有內容。我該如何監獄裏的用戶
如何阻止這種情況發生?用戶輸入的路徑中是否可以容忍任何..可以嗎?
有不同的方法,以「從越獄」:
由於您沒有真正指定該場景,因此很難說您正在查看哪種潛在的漏洞利用,以及想要避開它們的距離有多遠。
您應該至少理智地檢查用戶的輸入(例如使用realpath
,它比字符串解析用戶輸入更加可靠,並且覆蓋絕對,相對和其中包含軟鏈接的路徑走)。
您可能想要禁止訪問硬鏈接(使用fstat
並檢查nlink_t
)。
根據所需的安全級別,您可能要檢查chroot
爲好,這樣可以讓你摘櫻桃什麼用戶甚至可以看到系統的。但這需要一些額外的「管道」。
@SvenNiehus:警告:系統安全並不是我的特長。如果您正在查看「潛在災難」類型的需求,則應該在[security.SE](https://security.stackexchange.com)上詢問以獲取所有可能的情況。但是你的問題讓我更像是業餘愛好者,對此''realpath' /'fstat'可能就足夠了。 – DevSolar
這是一個大學項目,所以'realpath' /'fstat'應該能很好地工作。謝謝您的回答! –
如果我理解正確,您希望用戶被關進一個文件夾。您可能需要使用的strncmp檢查的基礎文件夾牢匹配這樣:
#include <stdio.h> /* printf, fprintf */
#include <stdlib.h> /* EXIT_SUCCESS, EXIT_FAILURE */
#include <string.h> /* strncmp */
#define JAIL_FOLDER "/home/user"
int main(int argc, char **argv)
{
if (argc < 2)
return EXIT_FAILURE;
if (strncmp(argv[1], JAIL_FOLDER, strlen(JAIL_FOLDER)) != 0)
{
fprintf(stderr, "Error, folder outside of jail\n");
return EXIT_FAILURE;
}
printf("Access Granted to Folder\n");
return EXIT_SUCCESS;
}
這種方法卻需要一點的情況下,用戶解析已經是一個文件夾中,並使用相對路徑。
檢查用戶的輸入? – UnholySheep
「模擬」是什麼意思?根據操作系統的不同,您可以執行不同的操作來限制用戶訪問。在Linux中,例如有文件權限和命名空間。 – kaylum
不允許指向父項的條目? –