-
메모리 안전성과 샌드박싱은 서로 독립적인 보안 개념으로, 두 가지를 모두 갖춰야 강력한 방어 체계를 형성함
- Fil-C는 C/C++의 메모리 안전 구현체로, Linux 시스템 호출 수준까지 안전성을 보장하며 OpenSSH 같은 시스템 구성요소에서도 사용 가능함
- OpenSSH의 seccomp-BPF 기반 샌드박스를 Fil-C로 이식하는 과정에서, 스레드 생성 제한과 seccomp 필터 조정이 핵심 과제였음
- Fil-C 런타임의 백그라운드 스레드 관리를 위해 zlock_runtime_threads() API가 추가되어, 샌드박스 내에서 스레드 동작을 제어함
- Fil-C는 prctl 호출을 모든 런타임 스레드에 동기화 적용해, no_new_privs 및 seccomp 필터가 전체 프로세스에 일관되게 적용되도록 구현함
메모리 안전성과 샌드박싱의 관계
- 메모리 안전성과 샌드박싱은 서로 다른 보안 계층으로, 한쪽만으로는 완전한 보호를 제공하지 않음
- 메모리 안전하지만 샌드박스되지 않은 예: Java 프로그램이 사용자 입력을 통해 파일을 덮어쓸 수 있는 경우
- 샌드박스되었지만 메모리 안전하지 않은 예: 어셈블리로 작성되어 권한이 제한된 프로그램
- 실제 샌드박스는 브로커 프로세스와의 통신 허용 등 구조적 허점이 존재
- 따라서 메모리 안전성과 샌드박싱을 병행하는 것이 최선의 방어 방식임
Fil-C와 OpenSSH 샌드박스의 결합
- Fil-C는 C/C++의 메모리 안전 구현체로, Linux 시스템 호출 수준에서 안전성을 유지
- Fil-C 런타임은 init, udevd 같은 저수준 시스템 구성요소에서도 동작 가능
- OpenSSH는 Fil-C에서 정상적으로 작동하며, seccomp-BPF 샌드박스를 활용함
- OpenSSH는 Linux에서 다음 도구로 샌드박스를 구성함
-
chroot로 파일시스템 접근 제한
-
sshd 사용자/그룹으로 실행
-
setrlimit으로 파일 열기·프로세스 생성 제한
-
seccomp-BPF 필터로 허용된 시스템 호출만 허용
- Fil-C는 chroot와 사용자 전환은 기본적으로 지원하지만, setrlimit과 seccomp-BPF는 런타임 동작과 충돌 가능성이 있어 추가 조정 필요
Fil-C 런타임의 스레드 제어
- Fil-C 런타임은 가비지 컬렉션용 백그라운드 스레드를 사용하며, 필요 시 자동으로 중단·재시작함
- OpenSSH의 setrlimit 샌드박스는 새 프로세스 생성 금지를 목표로 하므로, 런타임의 스레드 생성이 이를 위반할 수 있음
- 이를 해결하기 위해 <stdfil.h>에 zlock_runtime_threads() API를 추가
- 런타임이 필요한 스레드를 즉시 생성하고, 이후 자동 종료를 비활성화
- OpenSSH의 ssh_sandbox_child 함수에서 setrlimit 또는 seccomp-BPF 호출 전에 실행
OpenSSH seccomp 필터 조정
-
zlock_runtime_threads() 적용 후 대부분의 샌드박스 기능은 그대로 작동
- seccomp 필터에서 다음 변경이 이루어짐
- 위반 시 SECCOMP_RET_KILL_PROCESS로 설정해 Fil-C 백그라운드 스레드도 함께 종료
-
MAP_NORESERVE를 허용 목록에 추가, Fil-C 메모리 할당기 사용 지원
-
sched_yield 호출 허용, Fil-C의 락 구현에서 사용됨
- Fil-C의 동기화용 futex 호출은 이미 허용되어 추가 변경 불필요
Fil-C의 prctl 구현 방식
- OpenSSH는 seccomp 필터 설치 시 두 가지 prctl 호출을 사용
-
PR_SET_NO_NEW_PRIVS로 추가 권한 획득 차단
-
PR_SET_SECCOMP, SECCOMP_MODE_FILTER로 필터 활성화
- 문제는 prctl이 호출 스레드에만 적용된다는 점으로, Fil-C의 다른 런타임 스레드가 필터 없이 남을 위험 존재
- Fil-C는 이를 방지하기 위해 filc_runtime_threads_handshake() API로 모든 런타임 스레드에 동기화 적용
- 각 스레드가 동일한 prctl 호출을 수행하도록 보장
- 여러 사용자 스레드가 존재할 경우 Fil-C 안전성 오류를 발생시켜 보호 강화
결론
-
메모리 안전성과 샌드박싱의 결합이 가장 강력한 보안 조합
- Fil-C는 OpenSSH의 seccomp 기반 샌드박스를 완전하게 통합하면서도 보호 수준 저하 없이 메모리 안전성 유지
- Linux 환경에서 Fil-C를 활용하면, 시스템 수준 보안과 언어 수준 안전성을 동시에 확보 가능