在将self放入chrooted沙盒后,如何(合法地)访问文件? 修改一个Linux C++程序,它允许用户有限的文件访问。因此,该程序本身将与用户可以获取的文件一起存储到沙箱中。一切都很顺利

在将self放入chrooted沙盒后,如何(合法地)访问文件? 修改一个Linux C++程序,它允许用户有限的文件访问。因此,该程序本身将与用户可以获取的文件一起存储到沙箱中。一切都很顺利,c++,c,linux,unix,chroot,C++,C,Linux,Unix,Chroot,然而,现在程序需要访问一些文件以满足自己的需要(而不是用户的),但它们位于沙箱之外。我知道chroot允许访问在chroot之前打开的文件,但在这种情况下,所需的文件可能是数百个文件中的几个,因此仅为可能需要的两个打开它们显然是不切实际的 有没有办法获取这些文件?将它们复制到沙箱中,或者在chrooting之前将它们全部打开。认真地如果有一种方法可以做到这一点,那么就有一种方法可以收买它以允许其他访问并使您的保护无效 沙盒的全部目的是防止您试图实现的目标。如果文件都在一个目录中,您可以使用mou

然而,现在程序需要访问一些文件以满足自己的需要(而不是用户的),但它们位于沙箱之外。我知道chroot允许访问在chroot之前打开的文件,但在这种情况下,所需的文件可能是数百个文件中的几个,因此仅为可能需要的两个打开它们显然是不切实际的


有没有办法获取这些文件?

将它们复制到沙箱中,或者在
chroot
ing之前将它们全部打开。认真地如果有一种方法可以做到这一点,那么就有一种方法可以收买它以允许其他访问并使您的保护无效


沙盒的全部目的是防止您试图实现的目标。

如果文件都在一个目录中,您可以使用mount将它们绑定到沙盒中的一个目录

mount --bind /path/to/files /sandbox/files

您可以通过
/sandbox/files/
访问这些文件。如果您不想让用户看到它们,请执行
mount--bind/path/to/files/sandbox/.files
,这样
.files
目录就隐藏了

我想您应该能够将程序分为两部分,一部分是chroot'ed,另一部分不是chroot'ed,并通过您选择的IPC机制从非chroot部分获取chroot部分请求文件的内容

这是一个黑客,可能很容易出错,否定了chroot的任何好处。正如paxdiablo所说,您正试图绕过chroot沙箱的整个用途,因此您的选择非常非常有限


如果你能多解释一点你想要实现的目标,我们也许能提供一些其他的想法。例如,SELinux和AppArmor比chroot更灵活,可以为您提供所需的安全性。

如果需要访问的文件位于几个目录中,您可以在chroot之前打开这些目录并保存文件描述符。然后,您可以使用所谓的*at函数(例如,等)获取各个文件。基本上,您是相对于已经打开的目录文件描述符而不是chrooted目录打开文件的

这是否是一个安全的做法是值得商榷的,但它应该在Linux中工作

编辑:这是丑陋的一面,但似乎有效。你应该比我更仔细地研究漏洞。我还没有测试删除特权等会如何影响事情

#include <iostream>
#include <string>

using namespace std;

#include <cstdio>
#include <cstdlib>
#include <cerrno>
#include <cstring>

#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>


int main(int argc, char *argv[])
{
    if (argc < 4)
    {
        cerr << "USAGE: " << argv[0] << " <jail directory> <freeworld directory> <filename>\n";
        exit(EXIT_FAILURE);
    }

    const string JAILDIR(argv[1]);
    const string FREEDIR(argv[2]);
    string freefilename(argv[3]);

    while (freefilename[0] == '/')
        freefilename.erase(0, 1);

    DIR *pDir;

    if ((pDir = opendir(FREEDIR.c_str())) == NULL)
    {
        perror("Could not open outside dir");
        exit(EXIT_FAILURE);
    } 

    int freeFD = dirfd(pDir);

    //cd to jail dir
    if (chdir(JAILDIR.c_str()) == -1)
    {
        perror("cd before chroot");
        exit(EXIT_FAILURE);
    }

    //lock in jail
    if (chroot(JAILDIR.c_str()) < 0)
    {
        cerr << "Failed to chroot to " << JAILDIR << " - " << strerror(errno) << endl;
        exit(EXIT_FAILURE);
    }

    //
    //in jail, won't work
    //

    string JailFile(FREEDIR);
    JailFile += "/";
    JailFile += freefilename;

    int jailFD;

    if ((jailFD = open(JailFile.c_str(), O_RDONLY)) == -1)
    {
        cout << "as expected, could not open " << JailFile << endl;
        perror("exected open fail");
    }
    else
    {
        cout << "defying all logic, opened " << JailFile << endl;
        exit(EXIT_FAILURE);
    }

    //
    //using this works
    //

    if ((jailFD = openat(freeFD, freefilename.c_str(), O_RDONLY)) == -1)
    {
        cout << "example did not work. Could not open " << freefilename << " Sorry!" << endl;
        exit(EXIT_FAILURE);
    }
    else
        cout << "opened " << freefilename << " from inside jail" << endl;

    char     buff[255];
    ssize_t  numread;

    while (1)
    {
        if ((numread = read(jailFD, buff, sizeof(buff) - 1)) == -1)
        {
            perror("read");
            exit(EXIT_FAILURE);
        }

        if (numread == 0)
            break;

        buff[numread] = '\0';
        cout << buff << endl;
    }

    return 0;
}
#包括
#包括
使用名称空间std;
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
如果(argc<4)
{

cerr您不能在chroot环境中也复制文件吗?不,太多了,用户不应该看到它们,它们会被其他程序更新。用户难道不也有权访问/sandbox/文件吗?如果该程序是他们与沙盒交互的唯一方式,那么你可以不允许通过程序的界面进行访问。这两个选项都是有效的,如果出现问题,我会使用它们,但我希望如此对于需要较少手术的东西。你可以希望,对吗?文件在3个目录中。这在原则上似乎是可行的。我会更多地测试它,并由一些人运行它,但这可能是一个很好的短期解决方案。谢谢!除非有什么东西阻止openat()接受包含“./”的相对路径名,我在我的手册页中没有看到任何这样的效果,这完全打破了你的牢狱之灾。@pra我不确定我是否理解你的观点。这就是目标。你同意吗?只要你在chroot之前打开了一个目录,你就应该几乎拥有整个文件系统,权限等等。我最初会阅读你的答案建议访问权限仅限于您保存了fd的目录下的文件。鉴于我们同意整个文件系统都可用,我们认为这种方法的安全性“有待商榷”这种方法没有安全性,而且无论一开始规定了什么样的监狱要求,都不再得到满足。