FSSB é uma sandbox para seu sistema de arquivos. Com ele, você pode executar qualquer programa e ter certeza de que nenhum de seus arquivos será modificado de forma alguma. No entanto, o programa não saberá disso - cada alteração que ele tentar fazer será feita com segurança em uma sandbox, permitindo ainda a leitura dos arquivos existentes. Isso inclui criar, modificar, renomear e excluir arquivos.
As aplicações são infinitas:
Observe que o FSSB ainda está em alfa. Confira a seção Contributing
se você quiser contribuir.
FSSB é um aplicativo muito leve. Não requer muitas dependências. Na maioria dos sistemas, você só precisa instalar a biblioteca openssl
C. E então, você pode executar:
$ make
para gerar um binário fssb
.
O FSSB foi projetado com a simplicidade em mente. Basta fazer:
$ ./fssb -- < program > < args >
para executar o programa em um ambiente seguro, confiável e em área restrita.
Por exemplo, digamos que temos um programa 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
Normalmente, executar python program.py
resultaria em um arquivo:
$ python program.py
Hello world !
Isso, é claro, teria criado um arquivo:
$ cat new_file
Hello world!
No entanto, se você executá-lo no FSSB:
$ ./fssb -m -- python program.py
Hello world !
fssb: child exited with 0
fssb: sandbox directory: /tmp/fssb-1
+ 25fa8325e4e0eb8180445e42558e60bd = new_file
você verá que não há nenhum arquivo criado:
$ cat new_file
cat: new_file: No such file or directory
Em vez disso, o arquivo é criado em uma sandbox:
$ cat /tmp/fssb-1/25fa8325e4e0eb8180445e42558e60bd
Hello world !
E o melhor é que o programa infantil em execução nem sabe disso!
Você pode executar ./fssb -h
para ver mais opções.
No Linux, todas as operações de cada programa (bem, nem todas as operações; a maioria) são, na verdade, feitas por meio de algo chamado chamada de sistema - ou syscall, para abreviar. O comando open
em Python é na verdade um comando fopen
escrito em C uma camada abaixo, que na verdade é um syscall chamado open
(isso é encapsulado por glibc
).
O FSSB intercepta essas syscalls antes que elas sejam realmente executadas. Por exemplo, pouco antes de o syscall open
ser executado, o programa é interrompido. Agora, cada uma dessas syscalls possui argumentos. Por exemplo, um fopen("new_file", "w")
em C pode realmente parecer:
open("new_file", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
O primeiro argumento é o nome do arquivo, o segundo são os sinalizadores, o terceiro é o modo. Para saber mais sobre isso, execute man -s 2 open
.
Cada syscall pode ter no máximo 6 argumentos - estes são mapeados para seis registros de CPU, cada um dos quais contém um valor. No exemplo acima, pouco antes de o syscall open
ser executado, o primeiro registro contém um endereço de memória apontando para uma string "new_file"
.
De qualquer forma, pouco antes de o syscall ser executado, o FSSB muda a string para outra coisa - para um nome de arquivo na sandbox. E então deixa o syscall continuar. Para a CPU, você basicamente pediu para criar um arquivo na sandbox. É verdade.
Então, logo após o syscall terminar (após a criação do arquivo), o FSSB muda o valor para o valor original. Agora, os syscalls são de nível bastante baixo. E estamos operando em ambos os lados de um syscall – pouco antes e depois de sua execução. Portanto, o programa não tem como saber se o arquivo foi realmente criado na sandbox. Cada operação subsequente é realmente executada no arquivo sandbox.
Isso ainda está em seu estágio alfa. Existem tantos syscalls - no momento, há suporte para sandbox de:
Ainda há muita coisa para fazer. E eu realmente aprecio a ajuda aqui. Tentei tornar o código muito legível com muitos comentários e documentação sobre o que cada coisa faz.
E, claro, eu só implementei isso para meu sistema Linux x86_64. Eu apreciaria muito qualquer ajuda se alguém pudesse tornar isso portátil para outros arcos (por favor, dê uma olhada no arquivo syscalls.h
para isso).
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 .
Consulte o arquivo LICENSE para obter mais detalhes.