Що таке Path Traversal і як захистити файли
Автор: Редакція Domeny.ForSale Опубліковано
Коротко: Path Traversal — це вразливість безпеки, через яку застосунок дозволяє отримати доступ до файлів поза каталогом, призначеним для обробки певного запиту. Найчастіше її пов’язують із читанням чужих файлів, але за наявності функцій запису або видалення вона може також дозволити змінити чи видалити їх. Проблема виникає, коли застосунок використовує дані користувача як частину шляху до файлу й належним чином не перевіряє, куди цей шлях веде.
Що означає вихід за межі каталогу
Шлях — це адреса файлу у файловій системі, наприклад /srv/zastosunok/dokumenty/instruktsiia.pdf. Застосунок, який надає доступ до документів, має дозволяти завантажувати файли лише з визначеного місця, а не будь-які файли, доступні на сервері.
Path Traversal, також відомий як directory traversal або dot-dot-slash, полягає в перетині цієї межі. Назва dot-dot-slash («крапка-крапка-скісна риска») стосується запису ../: дві крапки позначають батьківський каталог, а скісна риска розділяє складові шляху. Отже, відповідно використана послідовність може спрямувати операцію за межі дозволеної папки.
Це можна порівняти з віконцем видачі документів. Клієнт має назвати номер документа, а працівник — видати його з потрібної шафи. Помилка виникає, коли замість номера працівник приймає вказівку: «відійди від цієї шафи, перейди до сусідньої кімнати й візьми зазначений файл».
Приклад: завантаження документа за назвою
Припустімо, застосунок зберігає загальнодоступні документи в каталозі /srv/zastosunok/dokumenty/. Користувач вибирає файл, а браузер надсилає запит:
/zavantazhyty?fail=instruktsiia.pdf
Якщо програма без перевірки додає значення параметра fail до шляху каталогу документів, вона отримує шлях /srv/zastosunok/dokumenty/instruktsiia.pdf. Для звичайної назви все виглядає правильно. Проблема виявляється, коли передати значення з переходом до батьківського каталогу:
/zavantazhyty?fail=../konfiguracja.env
Сформований шлях /srv/zastosunok/dokumenty/../konfiguracja.env вказує на /srv/zastosunok/konfiguracja.env — файл поза каталогом документів. Якщо застосунок може прочитати його й повертає його вміст, відбувається розкриття даних.
Це приклад механізму, а не гарантія успішної атаки. Файл має існувати, процес застосунку повинен мати до нього доступ, а спосіб обробки запиту — дозволяти використання переданого шляху. Перевіряти таку поведінку слід лише у власному середовищі або за наявності явного дозволу на тестування.
Якої шкоди може завдати Path Traversal
Наслідки залежать передусім від того, яку операцію виконує вразлива функція та які права має застосунок в операційній системі.
- Читання файлів: функція завантаження може розкрити конфігурацію, дані користувачів, резервні копії або облікові дані для доступу.
- Запис і перезапис: вразливий механізм запису може розмістити файл поза цільовим каталогом або змінити наявний файл.
- Видалення: функція видалення файлів може видалити ресурси, які користувач не повинен мати змоги вказувати.
За певних умов перезапис конфігурації або розміщення файлу, який виконує сервер, може призвести до подальшого захоплення контролю над застосунком. Проте Path Traversal не означає автоматичної можливості виконання коду чи повного доступу до сервера. Можливості використання вразливості обмежують, зокрема, права процесу та доступні функції застосунку.
Вразливість стосується не лише адрес, видимих у браузері. Дані, що впливають на шлях, можуть також надходити з форми, запиту API, назви завантажуваного на сервер файлу або запису в архіві, який розпаковують.
Як дієво знизити ризик
Найбезпечніше рішення — уникати ситуацій, коли користувач указує шлях. Замість назви чи розташування файлу застосунок може приймати ідентифікатор документа, наприклад 482, і самостійно знаходити пов’язаний із ним файл. При цьому він має перевіряти, чи має цей користувач право завантажити файл: сам по собі ідентифікатор не забезпечує захисту.
Якщо приймати шляхи все ж потрібно, захист має охоплювати кілька складових:
- Чіткі обмеження вхідних даних. Якщо функції потрібна лише назва файлу, вона не повинна приймати повний шлях. Допустимі назви й розширення слід обмежити відповідно до реальних потреб.
- Перевірка кінцевого розташування. З урахуванням правил файлової системи застосунок має підтвердити, що ціль і далі перебуває в межах дозволеного каталогу. Для цього слід використовувати відповідні функції роботи зі шляхами, а не просте порівняння початку текстових рядків.
- Урахування символічних посилань. Символічне посилання вказує на інше місце у файловій системі. Через таке посилання файл, який на перший погляд розташований у дозволеній папці, може насправді вести за її межі.
- Мінімальні права доступу. Процес, що надає доступ до документів, не повинен мати доступу до непотрібних даних або права запису там, де достатньо читання.
Самого видалення послідовності ../ недостатньо для захисту. Відмінності в роздільниках, кодуванні та порядку обробки даних можуть призвести до того, що фільтр і файлова система по-різному витлумачать те саме значення. Перевірка має враховувати, як застосунок насправді відкриває файл.
Із чого почати перевірку застосунку
Перегляньте функції завантаження файлів із сервера й на сервер, їх видалення та розпакування. Для кожної визначте, чи впливає користувач на шлях, який каталог дозволено використовувати та чи перевіряє програма кінцеву ціль операції. Тестування має охоплювати як спроби вийти за межі каталогу, так і звичайні коректні запити.
Якщо ви підозрюєте, що вразливістю скористалися, самого виправлення коду може бути недостатньо. Потрібно оцінити, які файли були доступні, перевірити журнали та — якщо міг статися витік облікових даних для доступу — замінити відповідні паролі або ключі. Перший практичний крок — знайти конкретне місце, де дані користувача перетворюються на шлях до файлу.
Дивіться також: Що таке Apache?
