Path Traversal (Чтение окружения)
Атака на инфраструктуру через /proc/self/environ.
easygolangPro
Задача
# Path Traversal: чтение секретов через виртуальную файловую систему
## Сценарий
Вы аудируете внутренний сервис **SecureDocs**, в котором есть эндпоинт скачивания статических файлов. Просматривая исходный код, вы обнаруживаете, что обработчик принимает имя файла из параметра запроса и открывает его без какой-либо валидации пути — базовая директория и пользовательский ввод склеиваются напрямую. Команда не задумывается о том, что в Linux есть виртуальные файловые системы, через которые можно читать не только обычные файлы, но и runtime-состояние процесса.
## Цель
1. Подтвердите path traversal через эндпоинт скачивания и определите глубину базовой директории относительно корня.
2. Используйте знание архитектуры Linux, чтобы добраться до runtime-состояния процесса приложения через виртуальную файловую систему.
3. Извлеките значение переменной окружения `LAB_FLAG` и получите флаг.
## Теория
Path Traversal в его «чистом виде» — это конкатенация пользовательского ввода с базовым путём без проверки итоговой принадлежности файла к разрешённой директории. Атакующий использует восходящие сегменты `../` для выхода в корень и затем спускается к произвольному файлу. В Linux атака усиливается виртуальной файловой системой `/proc`: она экспортирует runtime-состояние каждого процесса (переменные окружения, аргументы запуска, открытые дескрипторы, карта памяти) как обычные файлы — и через любой path traversal они становятся доступны для чтения тем же кодом, что читает «обычный» файл с диска.
**Уязвимый паттерн:**
```go
// Базовый путь и пользовательский ввод склеиваются напрямую
fullPath := basePath + "/" + userInput
file, _ := os.Open(fullPath)
```
Содержимое `/proc/self/environ` хранит все переменные окружения процесса, разделённые нулевым байтом — включая секреты, API-ключи, пароли БД и значения, переданные через `docker run -e` / Kubernetes manifest. Файл существует только во время жизни процесса, но read-доступ к нему даёт мгновенный exfil-канал для любых in-process secrets.
## Точка входа атаки
`GET /download?file=<имя файла>` — параметр `file` принимает имя файла и возвращает его содержимое.
* **Цель:** добраться до runtime-состояния текущего процесса приложения и извлечь значение переменной `LAB_FLAG` из окружения.