如何在目录中监禁用户

时间:2017-04-25 07:54:06

标签: c file io

让我说我的路径/home/sn/stuff/。用户现在输入../secretStuff/secret.txt。现在用户在/home/sn/secretStuff并且可以读取其中的所有内容。

如何阻止这种情况发生?是否可以在用户输入的路径中容忍任何..

2 个答案:

答案 0 :(得分:2)

有多种方法可以打破监狱":

  • 输入不在监狱内的绝对路径
  • 输入通向监狱的相对路径
  • 以某种方式构建一个链接(softlink,hardlink,mount,...)里面的 jail到外面 jail(通过利用其他一些漏洞)
  • 无论我怎么想都没有(见评论)

由于您没有真正指定方案,因此很难说您正在考虑哪种类型的潜在攻击,以及您希望避免它们走多远。

你至少应该理智地检查用户的输入(例如使用realpath,这比用户输入自己的字符串解析更可靠,并涵盖绝对,相对和其中包含软链接的路径。)

您可能希望禁止访问硬链接(使用fstat并检查nlink_t)。

根据所需的安全级别,您可能还需要检查chroot,这样您就可以选择用户甚至可以查看系统。但这需要一些额外的"管道"。

答案 1 :(得分:0)

如果我理解正确,您希望将用户绑定到文件夹中。您可能希望使用strncmp检查基本文件夹是否与您的jail匹配:

#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;
}

但是,如果用户已经在文件夹中并使用相对路径,则此方法需要进行一些解析。