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 .
有關更多詳細信息,請參閱許可證文件。