
Высокое локальное чтение файлов: LiteBox v0.1.0 linux-userland seccomp SYS_open O_RDONLY не имеет проверки пути хоста
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · litebox-seccomp-open-rdonly
Класс: Чтение файлов (граница ФС песочницы) Достижимость: Локальная
LiteBox v0.1.0 (d8556e3) — Microsoft
Документированный раннер для Linux-userland (litebox-runner-linux-userland) устанавливает seccomp-фильтр с запретом по умолчанию, а затем загружает гостевой ELF в том же процессе. SYS_open находится в списке разрешённых, когда аргумент 1 (flags) — это dword, равный OFlags::RDONLY (0). Предиката по пути нет. Гость, выполняющий реальный syscall с флагами 0, открывает хост-VFS от имени UID раннера, а затем read / mmap этих байтов. Перезаписыватель ELF на этом пине не является границей безопасности. --rewrite-syscalls — это -Z и по умолчанию выключен.
Эта недоработка — чтение хост-ФС. Это не запись на хост, не exec, не ptrace, не LPE и не RCE.
| ID | CVE пока нет |
| Класс | Чтение файлов (граница ФС песочницы) |
| Достижимость | Локальная (недоверенный гостевой бинарник в процессе раннера) |
| CWE | CWE-284, CWE-862 |
| CVSS | High: 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. Вендор (CvvT в GitHub #1006) и документация крейта перезаписывателя говорят, что ELF-трамплины не являются границей безопасности. Безопасность Linux userland — это данный фильтр. enable_seccomp_filter работает с запретом по умолчанию (Errno(EINVAL) в release) с TSYNC и PR_SET_NO_NEW_PRIVS. Дыра — это SYS_open с флагами Eq 0 без проверки пути. Комментарий в page_mgmt.rs гласит, что CoW-маппинг повторно открывает файл хост-программы после включения фильтра, вместо удержания заранее открытого FD.
| Метод + точка сброса | Привилегия |
|---|---|
реальный SYS_open("/oracle/secret", 0), затем SYS_read | байты хост-файла, которые может прочитать UID раннера. Лаборатория: fd 3, 35 байт, свидетель LITEBOX-SECCOMP-OPEN-RDONLY-WITNESS. Путь — это хост-VFS initramfs, а не гостевой overlay. |
| Метод + точка сброса | Привилегия |
|---|---|
SYS_open("/etc/passwd", 0), затем read / mmap | доступные для чтения всем хост-файлы от имени UID раннера |
SYS_open путей, принадлежащих раннеру (ssh-ключи, .env, kubeconfig, облачные учётные данные, tar из --initial-files) | эти байты, если UID может их открыть |
SYS_open("/etc/shadow", 0) | хеши shadow только если раннер запущен от root |
SYS_open("/proc/self/maps", 0) | маппинги раннера, включая хост .text / libc (тот же процесс) |
SYS_open("/proc/self/mem", 0), затем mmap этого FD | адресное пространство раннера, которое UID может прочитать через procfs. pread — несовпадающий запрет; SYS_mmap разрешён. |
Отсутствует для этой недоработки. Все подтверждённые в лаборатории негативные результаты вернули errno=22 EINVAL и не создали файлов:
| Метод + точка сброса | Результат |
|---|---|
SYS_open O_RDWR | EINVAL |
SYS_open O_CREAT | EINVAL, файл не создан |
SYS_openat даже с O_RDONLY | 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_PROCESSclone3 наследует фильтр; запись uid_map требует заблокированного openin_mem + tar_ro) не изменена. Эта недоработка — хост-VFS через реальный syscallЯ зафиксировал microsoft/litebox v0.1.0 (d8556e3, 2026-10-07), а не main. Восемнадцать поисков по исходникам. Крейт перезаписывателя и GitHub #1006 уже говорят, что трамплины не являются границей. Границей является фильтр Linux userland. SYS_open с флагами 0 присутствует, чтобы CoW мог повторно открыть файл программы. Проверки пути нет.
Неверный поворот: Docker Desktop Rosetta и qemu-user-static оба отказываются от seccomp(SET_MODE_FILTER) на этом хосте (EINVAL / ENOSYS). Поэтому лаборатория загружает x86_64 Alpine virt-ядро под qemu-system-x86_64 TCG и запускает скопированный фильтр как PID 1, чтобы BPF попал на реальное x86_64-ядро. Скопированы правила seccompiler 0.5.0, а не вызов enable_seccomp_filter из дерева и не весь workspace.
cd lab
./run.sh
Loopback 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 из фильтра и заранее открыть CoW-FD до PR_SET_SECCOMP, либо добавить предикат по пути, который не может видеть хост-пути вне гостевой ФС. Несовпадающий запрет уже покрывает openat.
Приём сообщений вендором — MSRC (https://msrc.microsoft.com/create-report). Не открывайте публичный issue на GitHub в microsoft/litebox.
Abraxas Labs — abraxaslabs.tech — github.com/abraxas — @abraxas_null — [email protected]