2017-04-25 45 views
0

讓我說我的路徑/home/sn/stuff/。用戶現在輸入../secretStuff/secret.txt。現在用戶在/home/sn/secretStuff並且可以讀取它裏面的所有內容。我該如何監獄裏的用戶

如何阻止這種情況發生?用戶輸入的路徑中是否可以容忍任何..可以嗎?

+0

檢查用戶的輸入? – UnholySheep

+1

「模擬」是什麼意思?根據操作系統的不同,您可以執行不同的操作來限制用戶訪問。在Linux中,例如有文件權限和命名空間。 – kaylum

+0

不允許指向父項的條目? –

回答

2

有不同的方法,以「從越獄」:

  • 進入一個絕對路徑而不是監獄
  • 進入一個相對路徑引出監獄內
  • 不知怎的構造鏈接(軟鏈接,hardlink,mount,...)裏面監獄外面監獄(通過利用一些其他漏洞)
  • 無論我沒有想到(見comme nt)

由於您沒有真正指定該場景,因此很難說您正在查看哪種潛在的漏洞利用,以及想要避開它們的距離有多遠。

您應該至少理智地檢查用戶的輸入(例如使用realpath,它比字符串解析用戶輸入更加可靠,並且覆蓋絕對,相對和其中包含軟鏈接的路徑走)。

您可能想要禁止訪問硬鏈接(使用fstat並檢查nlink_t)。


根據所需的安全級別,您可能要檢查chroot爲好,這樣可以讓你摘櫻桃什麼用戶甚至可以看到系統的。但這需要一些額外的「管道」。

+0

@SvenNiehus:警告:系統安全並不是我的特長。如果您正在查看「潛在災難」類型的需求,則應該在[security.SE](https://security.stackexchange.com)上詢問以獲取所有可能的情況。但是你的問題讓我更像是業餘愛好者,對此''realpath' /'fstat'可能就足夠了。 – DevSolar

+1

這是一個大學項目,所以'realpath' /'fstat'應該能很好地工作。謝謝您的回答! –

0

如果我理解正確,您希望用戶被關進一個文件夾。您可能需要使用的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; 
} 

這種方法卻需要一點的情況下,用戶解析已經是一個文件夾中,並使用相對路徑。

相關問題