
높은 로컬 파일 읽기: LiteBox v0.1.0 linux-userland seccomp SYS_open O_RDONLY에 호스트 경로 검사가 없음
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · litebox-seccomp-open-rdonly
분류: 파일 읽기 (샌드박스 FS 경계) 도달 범위: 로컬
LiteBox v0.1.0 (d8556e3) - Microsoft
문서화된 Linux-userland 러너(litebox-runner-linux-userland)는 기본 거부(deny-by-default) seccomp 필터를 설치한 뒤, 같은 프로세스에서 게스트 ELF를 로드한다. 인자 1(flags)이 OFlags::RDONLY(0)와 동일한 dword일 때 SYS_open이 허용 목록에 포함된다. 경로 조건자는 없다. flags 0으로 실제 syscall을 발생시키는 게스트는 러너 UID로 호스트 VFS를 열고, 그 바이트를 read / mmap한다. 이 핀에서 ELF 재작성기는 보안 경계가 아니다. --rewrite-syscalls는 -Z이며 기본적으로 꺼져 있다.
이 잔여 취약점은 호스트 FS 읽기다. 호스트 쓰기, exec, ptrace, LPE, RCE가 아니다.
| ID | 아직 CVE 없음 |
| 분류 | 파일 읽기 (샌드박스 FS 경계) |
| 도달 범위 | 로컬 (러너 프로세스 내의 신뢰할 수 없는 게스트 바이너리) |
| CWE | CWE-284, CWE-862 |
| CVSS | 높음: 7.1 CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N |
| 제품 | microsoft/litebox |
| 영향받는 버전 | v0.1.0 (d8556e33676e47244bfefa139c1e9ff95bd67d53) Linux userland 플랫폼 + 러너 |
| 인증 | 게스트가 이미 샌드박스 내부에서 실행 중 |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1 전용, linux/amd64 |
누가: litebox-runner-linux-userland 내의 신뢰할 수 없는 게스트 바이너리. 벤더(GitHub #1006의 CvvT)와 재작성기 크레이트 문서는 ELF 트램폴린이 보안 경계가 아니라고 명시한다. Linux userland 보안은 이 필터다. enable_seccomp_filter는 기본 거부(릴리스에서 Errno(EINVAL))이며 TSYNC와 PR_SET_NO_NEW_PRIVS를 사용한다. 구멍은 경로 검사가 없는 SYS_open flags Eq 0이다. page_mgmt.rs의 주석은 CoW 매핑이 미리 열어둔 FD를 유지하는 대신, 필터가 켜진 후 호스트 프로그램 파일을 다시 연다는 것이다.
| 방법 + 싱크 | 권한 |
|---|---|
실제 SYS_open("/oracle/secret", 0) 후 SYS_read | 러너 UID가 읽을 수 있는 호스트 파일 바이트. 랩: fd 3, 35바이트, 증거 LITEBOX-SECCOMP-OPEN-RDONLY-WITNESS. 경로는 게스트 오버레이가 아닌 initramfs 호스트 VFS. |
| 방법 + 싱크 | 권한 |
|---|---|
SYS_open("/etc/passwd", 0) 후 read / mmap | 러너 UID로 전 세계 읽기 가능한 호스트 파일 |
러너 소유 경로의 SYS_open (ssh 키, .env, kubeconfig, 클라우드 자격 증명, --initial-files tar) | UID가 열 수 있다면 해당 바이트 |
SYS_open("/etc/shadow", 0) | 러너가 root인 경우에만 shadow 해시 |
SYS_open("/proc/self/maps", 0) | 러너 맵, 호스트 .text / libc 포함 (동일 프로세스) |
SYS_open("/proc/self/mem", 0) 후 FD의 mmap | UID가 procfs를 통해 읽을 수 있는 러너 주소 공간. pread는 미매칭 거부, SYS_mmap은 허용. |
이 잔여 취약점에는 없음. 랩에서 입증된 부정 결과는 모두 errno=22 EINVAL을 반환했고 파일을 생성하지 않았다:
| 방법 + 싱크 | 결과 |
|---|---|
SYS_open O_RDWR | EINVAL |
SYS_open O_CREAT | EINVAL, 파일 생성 안 됨 |
O_RDONLY여도 SYS_openat | EINVAL |
SYS_execve | EINVAL |
socket, ptrace | EINVAL (추가 미매칭 거부) |
openat / openat2 / creat / unlink / chmod는 이 핀에서 미매칭 거부로 유지된다.
범위 밖.
process_vm_readv, io_uring_setup, bpf, mount, pivot_root, unshare, setns, connect, ioctl, getdentsAUDIT_ARCH_X86_64 또는 KILL_PROCESS를 접두한다clone3는 필터를 상속한다; uid_map 작성에는 차단된 open이 필요하다in_mem + tar_ro)는 변경되지 않는다. 이 잔여 취약점은 실제 syscall을 통한 호스트 VFS다main 대신 microsoft/litebox v0.1.0(d8556e3, 2026-10-07)을 핀했다. 18번의 소스 탐색. 재작성기 크레이트와 GitHub #1006은 이미 트램폴린이 경계가 아니라고 말한다. Linux userland 필터가 경계다. flags 0의 SYS_open은 CoW가 프로그램 파일을 다시 열 수 있도록 존재한다. 경로 검사가 없다.
잘못된 방향: Docker Desktop Rosetta와 qemu-user-static 모두 이 호스트에서 seccomp(SET_MODE_FILTER)를 거부한다(EINVAL / ENOSYS). 따라서 랩은 qemu-system-x86_64 TCG 아래에서 x86_64 Alpine virt 커널을 부팅하고 복사된 필터를 PID 1로 실행하여 BPF가 실제 x86_64 커널에 도달하도록 한다. 트리 내 enable_seccomp_filter 호출이 아닌 복사된 seccompiler 0.5.0 규칙을 사용하며, 전체 워크스페이스도 아니다.
cd lab
./run.sh
루프백 127.0.0.1:19110. Compose 프로젝트 litebox-seccomp-open-rdonly. 플랫폼 linux/amd64. 증거 LITEBOX-SECCOMP-OPEN-RDONLY-WITNESS. 마지막 줄:
SUCCESS litebox-seccomp-open-rdonly open-rdonly-ok rdwr-einval openat-einval execve-einval LITEBOX-SECCOMP-OPEN-RDONLY-WITNESS
필터에서 SYS_open을 제거하고 PR_SET_SECCOMP 전에 CoW FD를 미리 열거나, 게스트 FS 외부의 호스트 경로를 볼 수 없는 경로 조건자를 추가하라. 미매칭 거부가 이미 openat을 커버한다.
벤더 접수는 MSRC(https://msrc.microsoft.com/create-report)다. microsoft/litebox에 공개 GitHub 이슈를 열지 마라.
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]