FSSB是文件系统的沙箱。有了它,您可以运行任何程序,并确保您的文件不会被以任何方式修改。但是,程序不会知道这一点 - 它尝试进行的每个更改都将在沙箱中安全地进行,同时仍然允许它读取现有文件。这包括创建、修改、重命名和删除文件。
应用是无穷无尽的:
请注意,FSSB 仍处于 alpha 阶段。如果您想做出贡献,请查看Contributing
部分。
FSSB 是一个非常轻量级的应用程序。它不需要太多的依赖关系。在大多数系统上,您只需要安装openssl
C 库。然后,您可以运行:
$ make
生成二进制fssb
。
FSSB 的设计考虑到了简单性。只要这样做:
$ ./fssb -- < program > < args >
在安全、可靠的沙盒环境中运行程序。
例如,假设我们有一个Python程序program.py
:
with open ( "new_file" , "w" ) as f : # create a new file in the current directory
f . write ( "Hello world!" ) # write something
with open ( "new_file" , "r" ) as f : # read the same file later on
print ( f . read ()) # print the contents to console
通常,运行python program.py
会生成一个文件:
$ python program.py
Hello world !
当然,这会创建一个文件:
$ cat new_file
Hello world!
但是,如果您围绕 FSSB 运行它:
$ ./fssb -m -- python program.py
Hello world !
fssb: child exited with 0
fssb: sandbox directory: /tmp/fssb-1
+ 25fa8325e4e0eb8180445e42558e60bd = new_file
你会看到没有创建文件:
$ cat new_file
cat: new_file: No such file or directory
相反,该文件实际上是在沙箱中创建的:
$ cat /tmp/fssb-1/25fa8325e4e0eb8180445e42558e60bd
Hello world !
最好的部分是,正在运行的子程序甚至不知道它!
您可以运行./fssb -h
查看更多选项。
在 Linux 中,每个程序的每个操作(好吧,不是每个操作;大多数)实际上都是通过称为系统调用(简称为 syscall)的东西来完成的。 Python 中的open
命令实际上是下面一层用 C 编写的fopen
命令,它实际上是一个名为open
系统调用(这是由glibc
包装的)。
FSSB 在这些系统调用实际执行之前拦截它们。例如,在执行open
系统调用之前,程序会停止。现在,每个系统调用都有参数。例如,C 中的fopen("new_file", "w")
实际上可能如下所示:
open("new_file", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
第一个参数是文件名,第二个参数是标志,第三个参数是模式。要了解有关这些的更多信息,请运行man -s 2 open
。
每个系统调用最多可以有 6 个参数 - 这些参数映射到 6 个 CPU 寄存器,每个寄存器都保存一个值。在上面的示例中,就在执行open
系统调用之前,第一个寄存器保存指向字符串"new_file"
内存地址。
无论如何,在执行系统调用之前,FSSB 会将字符串切换为其他内容 - 沙箱中的文件名。然后让系统调用继续。对于CPU来说,你基本上要求在沙箱中创建一个文件。确实如此。
然后,在系统调用完成后(创建文件后),FSSB 将值切换为其原始值。现在,系统调用是相当低级的。我们在系统调用的两侧进行操作 - 就在其执行之前和之后。因此程序无法知道该文件实际上是在沙箱中创建的。后续的每个操作实际上都是在沙箱文件上执行的。
这仍处于 alpha 阶段。有很多系统调用 - 目前,支持沙箱:
还有很多事情要做。我非常感谢这里的帮助。我试图通过大量注释和文档来说明每件事的作用,从而使代码变得非常可读。
当然,我只在我的 x86_64 Linux 系统上实现了这个。如果有人可以将其移植到其他拱门,我将非常感谢任何帮助(请查看syscalls.h
文件)。
FSSB - Filesystem Sandbox for Linux
Copyright (C) 2016 Adhityaa Chandrasekar
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
有关更多详细信息,请参阅许可证文件。