Когда загрузка файлов превращается в доступ к файлам
Один небезопасный обработчик загрузки может открыть путь для атаки с полным обходом пути и уязвимости загрузки файлов. Когда разработчики объединяют имена файлов напрямую с путями загрузки, злоумышленники могут отправлять вредоносные имена файлов , такие как ../../etc/passwd для выхода из каталогов и доступа к конфиденциальным файлам. Такой тип обхода пути превращает простой API загрузки в мощный способ доступа к файлам, особенно когда приложение работает с повышенными разрешениями.
⚠️Небезопасный пример, только для образовательных целей. Не использовать в продакшене.
// Vulnerable upload handler, file upload vulnerability [HttpPost("/upload")] public async Task<IActionResult> Upload(IFormFile file) { var path = Path.Combine("uploads/", file.FileName); // No validation using var stream = new FileStream(path, FileMode.Create); await file.CopyToAsync(stream); return Ok("File uploaded!"); } Злоумышленник может загрузить файл с именем ../../web.config для перезаписи или чтения запрещенных файлов — классическая атака обхода пути.
Защищенная версия:
// Safe upload with validation and canonicalization [HttpPost("/upload")] public async Task<IActionResult> Upload(IFormFile file) { var fileName = Path.GetFileName(file.FileName); // strip directories var targetDir = Path.GetFullPath("uploads/"); var safePath = Path.Combine(targetDir, fileName); if (!safePath.StartsWith(targetDir)) return BadRequest("Invalid file path"); using var stream = new FileStream(safePath, FileMode.Create); await file.CopyToAsync(stream); return Ok("File securely uploaded!"); } Образовательная заметка: Всегда канонизируйте пути с помощью Path.GetFullPath() и убедитесь, что результат находится в каталоге загрузки. Никогда не доверяйте file.ИмяФайла Его можно использовать без дополнительной настройки.
Ошибки разработчиков, которые позволяют обходить путь
Большинство уязвимостей загрузки файлов, приводящих к обходу пути, возникают из-за спешки с кодом и отсутствия проверки. Распространенные ошибки разработчиков включают:
- Объединение пользовательского ввода непосредственно в пути файловой системы
- Доверяя Content-Type или только проверка расширения
- Пропуск нормализации путей перед сохранением
Повторное использование временных папок в запросах или микросервисах
⚠️Небезопасный пример, только для образовательных целей. Не использовать в продакшене.
# Flask example vulnerable to path traversal attack @app.route('/upload', methods=['POST']) def upload(): file = request.files['file'] file.save('uploads/' + file.filename) return 'Uploaded' Злоумышленники могут обойти эту простую конкатенацию для обхода каталогов (../../app.py) и записывать или перезаписывать произвольные файлы. Защищенная версия:
# Safe file upload validation from werkzeug.utils import secure_filename @app.route('/upload', methods=['POST']) def upload(): file = request.files['file'] name = secure_filename(file.filename) path = os.path.join('uploads', name) file.save(path) return 'Securely uploaded' Образовательная заметка: Используйте помощников, предоставляемых фреймворком, таких как защищенное_имя_файла и обеспечить использование расширений из списка разрешенных. Никогда не объединяйте входные данные в пути к файлам вручную.
Эксплуатация в реальности Pipelines и микросервисы
Атаки с обходом пути происходят не только в публичных конечных точках. Они часто происходят внутри CI/CD системы, хранилища артефактов или микросервисы, управляющие загруженными файлами. Например, уязвимость загрузки файлов в менеджере артефактов сборки может позволить злоумышленнику перезаписать скрипты сборки или внедрять вредоносные файлы в общие среды выполнения.
⚠️Небезопасный пример, только для образовательных целей. Не использовать в продакшене.
# Never expose real tokens, credentials, or internal URLs in pipelines - name: Store build artifact run: cp $UPLOAD_PATH/$FILENAME /var/artifacts/$FILENAME If $ FILENAME не проверен, созданный ../../../etc/passwd значение может перезаписать критические системные файлы во время развертывания, что является реальной атакой обхода пути. Защищенная версия:
# Safer artifact storage guardrail - name: Store build artifact securely run: | SAFE_NAME=$(basename "$FILENAME") cp "$UPLOAD_PATH/$SAFE_NAME" /var/artifacts/"$SAFE_NAME" Образовательная заметка: In pipelines, очистите все динамические переменные пути. Ограничьте операции записи контролируемыми каталогами, чтобы предотвратить выход файловой системы из строя во время сборки или развертывания.
Предотвращение обхода пути в логике загрузки
Предотвращение обхода пути начинается со строгой проверки и изоляции входных данных. С самого начала относитесь к именам файлов и путям как к ненадёжным входным данным, особенно при работе с загруженными файлами.
Лучшие практики
- Нормализовать и канонизировать все пути перед их использованием.
- Ограничить загрузки в выделенный каталог за пределами корневого каталога веб-сайта.
- Обеспечить соблюдение белых списков для расширений файлов и типов MIME.
- Никогда не используйте временные папки повторно между сеансами или пользователями.
- Используйте контейнерное хранение для загруженных файлов, когда это возможно.
Мини-профилактический контрольный список
- Проверьте каждое имя файла с помощью Path.GetFileName() или эквивалент.
- Разрешите полные пути и проверьте границы каталогов.
- Примените списки разрешенных расширений и MIME.
- Используйте отдельные папки для загрузки для каждого пользователя или сеанса.
- Включить сканирование и проверку загрузки в CI/CD тесты.
Образовательная заметка: Каждый обработчик загрузки файлов представляет собой потенциальный вектор атаки с обходом пути. Создайте эшелонированную защиту, проверяя, изолируя и сканируя весь код обработки файлов.
Как Xygeni обнаруживает и блокирует небезопасные потоки загрузки
Ксигени Code Security сканирует кодовые базы и pipelineдля обнаружения шаблонов обхода пути до того, как они попадут в производство. Он отмечает небезопасную конкатенацию путей, отсутствие канонизации и опасные файловые операции как в коде, так и в CI/CD скриптов.
Функциональный фрагмент с ограждением управления:
# Secure enforcement with Xygeni - name: Enforce secure upload and path handling run: dotnet xygeni enforce --rules uploads,path,security --fail-on-risk Образовательная заметка: Интегрируя Ксигени в свой pipeline обеспечивает автоматическое выявление уязвимостей загрузки файлов и атак обхода пути во время проверки сборки.
Закрытие разрыва: предотвращение следующей атаки с обходом пути
Ошибка обхода одного пути в конечной точке загрузки файла может предоставить злоумышленникам доступ к файловой системе вашего сервера. Проверьте обработчики загрузки на предмет небезопасных конкатенаций, нормализуйте все пути и никогда не доверяйте именам файлов, контролируемым пользователем. Добавить инструменты сканирования уязвимостей , такие как Xygeni Code Security . DevSecOps pipeline для обнаружения атак обхода пути и уязвимостей загрузки файлов до их отправки. С точки зрения безопасности каждый сохраненный файл должен рассматриваться как исполняемый код!






