FSSB — это «песочница» для вашей файловой системы. С его помощью вы можете запустить любую программу и быть уверенным, что ни один из ваших файлов не будет каким-либо образом изменен. Однако программа об этом не узнает — каждое изменение, которое она попытается внести, будет безопасно выполнено в «песочнице», при этом ей будет разрешено читать существующие файлы. Сюда входит создание, изменение, переименование и удаление файлов.
Приложения бесконечны:
Обратите внимание, что FSSB все еще находится в стадии альфа-версии. Если вы хотите внести свой вклад, загляните в раздел 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 каждая операция каждой программы (ну, не каждая операция; большинство) на самом деле выполняется с помощью так называемого системного вызова — или для краткости системного вызова. Команда open
в Python на самом деле представляет собой команду fopen
, написанную на уровне C, который на самом деле является системным вызовом open
(обернутым glibc
).
FSSB перехватывает эти системные вызовы до их фактического выполнения. Например, непосредственно перед выполнением open
системного вызова программа останавливается. Теперь у каждого из этих системных вызовов есть аргументы. Например, fopen("new_file", "w")
в C на самом деле может выглядеть так:
open("new_file", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
Первый аргумент — имя файла, второй — флаги, третий — режим. Чтобы узнать больше об этом, запустите man -s 2 open
.
Каждый системный вызов может иметь не более 6 аргументов — они соответствуют шести регистрам ЦП, каждый из которых содержит значение. В приведенном выше примере, непосредственно перед выполнением open
системного вызова, первый регистр содержит адрес памяти, указывающий на строку "new_file"
.
В любом случае, непосредственно перед выполнением системного вызова FSSB переключает строку на что-то другое — на имя файла в песочнице. А затем продолжаем системный вызов. Для процессора вы по сути попросили создать файл в песочнице. Так и есть.
Затем, сразу после завершения системного вызова (после создания файла), FSSB переключает значение на исходное значение. Итак, системные вызовы довольно низкоуровневые. И мы работаем по обе стороны системного вызова – непосредственно до и после его выполнения. Таким образом, программа не имеет возможности узнать, что файл действительно был создан в песочнице. Каждая последующая операция фактически выполняется с файлом песочницы.
Это все еще находится на стадии альфа. Системных вызовов так много — на данный момент поддерживается песочница:
Нам еще многое предстоит сделать. И я бы очень признателен за помощь здесь. Я постарался сделать код легко читаемым, добавив множество комментариев и документации о том, что делает каждая вещь.
И, конечно же, я реализовал это только для своей Linux-системы x86_64. Я был бы очень признателен за любую помощь, если бы кто-нибудь мог сделать это переносимым на другие арки (пожалуйста, взгляните на файл 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 .
Более подробную информацию смотрите в файле ЛИЦЕНЗИИ.