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 では、すべてのプログラムのすべての操作 (すべての操作ではありません。ほとんどの操作) は、実際にはシステム コール (略して syscall) と呼ばれるものを通じて行われます。 Python のopen
コマンドは、実際にはその下の層で C で書かれたfopen
コマンドであり、実際にはopen
と呼ばれるシステムコールです (これはglibc
によってラップされています)。
FSSB は、これらのシステムコールが実際に実行される前にインターセプトします。たとえば、 open
syscall が実行される直前に、プログラムが停止されます。さて、これらの各システムコールには引数があります。たとえば、C のfopen("new_file", "w")
実際には次のようになります。
open("new_file", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
最初の引数はファイル名、2 番目はフラグ、3 番目はモードです。これらについて詳しくは、 man -s 2 open
を実行してください。
各 syscall には最大 6 つの引数を指定できます。これらは 6 つの CPU レジスタにマップされ、それぞれが値を保持します。上記の例では、 open
syscall が実行される直前に、最初のレジスタは文字列"new_file"
を指すメモリ アドレスを保持します。
とにかく、syscall が実行される直前に、FSSB は文字列を別のもの、つまりサンドボックス内のファイル名に切り替えます。そして、システムコールを続行します。 CPU に対して、基本的にはサンドボックスにファイルを作成するように要求しました。その通りです。
その後、syscall の終了直後 (ファイルの作成後)、FSSB は値を元の値に切り替えます。さて、syscall はかなり低レベルです。そして、システムコールの実行の直前と直後に、システムコールの両側で操作を行っています。したがって、プログラムはファイルが実際にサンドボックスで作成されたかどうかを知る方法がありません。後続のすべての操作は、実際にはサンドボックス ファイルに対して実行されます。
これはまだアルファ段階です。非常に多くのシステムコールがあります。現時点では、以下のサンドボックス化がサポートされています。
やるべきことはまだたくさんあります。ここで助けていただければ幸いです。それぞれの動作についての大量のコメントとドキュメントを使用して、コードを非常に読みやすくするように努めました。
そしてもちろん、私はこれを 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 .
詳細については、LICENSE ファイルを参照してください。