1.0.3
Fixed (#365)
- На Linux-сборках (с v0.33.0,
ccbf162) инструментыread_file/edit_file/grepне могли открыть ни один файл — «path escapes base directory» (#365):safeopen_linux.goвызывалopenat2(AT_FDCWD, абсолютный_путь, RESOLVE_BENEATH), а по openat2(2)RESOLVE_BENEATHотклоняет любой абсолютный path сEXDEV;FsGuard.resolve()всегда возвращает абсолютный путь, поэтому каждая попытка открытия была обречена (запись/листинг не используют safeopen, потому работали; на macOS/Windows другие реализации — локальная разработка на darwin баг не ловила).RESOLVE_BENEATHубран (контейнмент остаётся in-process:FsGuard.resolve+isUnder), сохраненыRESOLVE_NO_MAGICLINKS|RESOLVE_NO_SYMLINKSиO_NOFOLLOW; добавлен ENOSYS-fallback на plainopenдля ядер без openat2 (< 5.6); мёртвая EXDEV-ветка удалена. Регрессионный тестsafeopen_linux_test.go(//go:build linux); прогон в Dockergolang:1.25.5: со старым кодом тест падает ровно с продакшен-ошибкой, с фиксом весь suiteinternal/securityзелёный. Дочернее ужесточение:NewFsGuardканонизирует workspace черезfilepath.EvalSymlinks—resolve()/isUnder()сравнивают каноничные пути, workspace за симлинком больше не отсекает собственные файлы как «outside workspace».