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
이라는 syscall입니다(이것은 glibc
로 래핑됩니다).
FSSB는 이러한 syscall이 실제로 수행되기 전에 차단합니다 . 예를 들어 open
syscall이 수행되기 직전에 프로그램이 중지됩니다. 이제 이러한 각 syscall에는 인수가 있습니다. 예를 들어 C의 fopen("new_file", "w")
실제로 다음과 같습니다.
open("new_file", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
첫 번째 인수는 파일 이름, 두 번째 인수는 플래그, 세 번째 인수는 모드입니다. 이에 대해 자세히 알아보려면 man -s 2 open
실행하세요.
각 syscall은 최대 6개의 인수를 가질 수 있습니다. 이는 각각 값을 보유하는 6개의 CPU 레지스터에 매핑됩니다. 위의 예에서 open
syscall이 실행되기 직전에 첫 번째 레지스터는 "new_file"
문자열을 가리키는 메모리 주소를 보유합니다.
어쨌든, syscall이 실행되기 직전에 FSSB는 문자열을 다른 것, 즉 샌드박스의 파일 이름으로 전환합니다 . 그런 다음 syscall을 계속 진행합니다. CPU에는 기본적으로 샌드박스에 파일을 생성해 달라고 요청했습니다. 그렇습니다.
그런 다음 syscall이 완료된 직후(파일이 생성된 후) FSSB는 값을 원래 값으로 전환합니다. 이제 syscall은 매우 낮은 수준입니다. 그리고 우리는 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 파일을 참조하세요.