Як я безпечно витягую недовірений файл смоли?


30

Я хотів би мати можливість витягувати файл tar, таким чином, щоб усі витягнуті файли розміщувалися під певним каталогом префіксів. Будь-яка спроба файлів tar записати у зовнішні каталоги повинна спричинити збій вилучення.

Як ви можете собі уявити, це так, що я можу надійно витягнути недовірений файл tar.

Як я можу це зробити з GNU tar?

Я придумав:

tar --exclude='/*' --exclude='*/../*' --exclude='../*' -xvf untrusted_file.tar

але я не впевнений, що це досить параноїчно.


2
Це недостатньо параноїчно. У минулому я сконструював кілька неприємних тарболів, які піднімалися за допомогою символічних посилань, які він створив. Я в кінцевому підсумку створив свій власний tar, який був setuid-root, щоб він міг виконувати chroot (".") Та скидати права.
Джошуа

8
@Joshua, тож ваше рішення зробити дуже широко перевірену утиліту більш безпечною було зробити власну версію та надати їй привілеї root?
Зупиніть шкодити Моніці

4
@OrangeDog: int main (int argc, char ** argv) {chroot (".") || вихід (1); setuid (getuid ()); легко піддається аудиту.
Джошуа

2
Ви також можете перевірити, що знаходиться у файлі tar, скориставшись -tопцією.
Томас

Відповіді:


40

Параноя вам зовсім не потрібна. GNU tar- і фактично будь - яка добре написана tarпрограма, створена протягом останніх 30 років або більше - ..за замовчуванням відмовиться витягувати файли в тарболі, які починаються з косої риски або містять елементи.

Вам доведеться вийти зі свого шляху, щоб змусити сучасні tarпрограми витягувати такі потенційно шкідливі тарболи: і GNU, і BSD tarпотребують -Pможливості вимкнути цей захист. Дивіться розділ Абсолютні назви файлів у посібнику з GNU tar.

-PПрапор не визначений POSIX, ¹ хоча, так що інші tarпрограми можуть мати різні способи боротьби з цим. Наприклад, інструменти Шили starпрограма використовує -/і -..відключити ці кошти захисту.

Єдине, що ви можете розглянути, як додати до наївної tarкоманди, - це -Cпрапор, щоб змусити його витягувати речі в безпечний тимчасовий каталог, тому спочатку вам не доведеться cdтам.


Убік :

  1. Технічно tarбільше POSIX більше не визначений. Вони намагалися сказати Unix обчислень світу , що ми повинні використовувати paxтепер замість tarі cpio, але обчислювальний світ в значній мірі ігнорували їх.

    Тут доречно зазначити, що специфікація POSIX paxне говорить про те, як слід обробляти провідні косої риси або вбудовані ..елементи. Існує нестандартний --insecureпрапор для BSDpax для придушення захисту від вбудованих ..елементів траєкторії, але, очевидно, немає захисту за замовчуванням від провідних косих; сторінка BSD paxнепрямо рекомендує писати -sправила заміни для вирішення абсолютного ризику шляху.

    Це те, що відбувається, коли фактичний стандарт залишається в активному використанні, тоді як стандарт де-юре в основному ігнорується.


7
pax - portable archive interchangeAwww, як мило, POSIX думає, що це замінить, можливо, найбільш широко використовуваний архівний формат: P
кіт

1
@cat Формат архіву за замовчуванням є досить широко підтримуваним варіантом tar (AIUI також повинен підтримувати формат cpio). Pax - це скоріше спроба замінити інтерфейс команд для роботи з такими архівами, оскільки обробка аргументами команд tar є ... химерною.
Випадково832

Випадкова бічна примітка: Я впевнений, що це "de jour", тобто французьке слово, на відміну від "de jure".
Позов по

7
@QPaysTaxes це не так. де-юре - це латинська мова і контрастує з поточною ситуацією, тобто тим, що є фактично. De jour також повинен бути du jour, щоб дотримуватися французьких граматичних правил.
Прем’єр

1
Це випадок нещасного фальшивого коньяка. Французьке "du jour" ("дня") виглядає / звучить дуже схоже на латинське "de jure" ("закон"), яке протиставляється "de facto" ("фактично"). Можна стверджувати, що pax - це «стандарт місяця» або «standard du jour», щоб висміяти, як нові стандарти пропонуються так часто, тоді як величезна кількість користувачів просто залишається з тим, що працює для них (фактично стандарт), знаючи, що завтра (метафорично) з’явиться новий стандарт, який вони ігнорують.
Monty Harder

19

З дьогтем GNU це просто

tar -xvf untrusted_file.tar

у порожньому каталозі. Гугл GNU автоматично знімає /імена провідних членів під час вилучення, якщо явно не вказано інше з --absolute-namesопцією . GNU tar також визначає, коли використання ../призведе до вилучення файлу за межами каталогу toplevel і замість цього помістить ці файли в каталог toplevel, наприклад, компонент foo/../../bar/quxбуде вилучений як bar/quxу каталозі toplevel, а не bar/quxв батьківському каталозі версії toplevel . Гугл GNU також піклується про символьні посилання, що вказують за межами каталогу верхнього рівня, наприклад, foo -> ../..і foo/barне спричинятимуть barйого витяг за межі каталогу верхнього рівня.

Зауважте, що це стосується лише (досить останніх версій) тарілки GNU (а також деяких інших реалізацій, наприклад * BSD tar та BusyBox tar). Деякі інші реалізації не мають такого захисту.

Через символічні посилання захистів, які ви використовуєте, буде недостатньо: архів може містити символічне посилання, що вказує на каталог за межами дерева та витягує файли з цього каталогу. Немає способу вирішити цю проблему виключно на іменах членів, вам потрібно вивчити ціль символічних посилань.

Зауважте, що якщо ви виймаєте каталог, який вже містить символічні посилання, гарантія більше не може діяти.


6

Щоб охопити кілька пунктів, інші відповіді не:

  1. Спочатку подивіться, що знаходиться у файлі, перш ніж витягти його:

    tar -tvf untrusted_tar_file.tar
    

    Якщо там є щось, чого ви не довіряєте або хочете видобути, не виймайте тарбол.

  2. По-друге, витягніть тарбол як некористувального користувача, який має доступ лише для запису до тієї директорії, в яку витягуєте тарбол. Наприклад, витягніть тарбол з домашнього каталогу некорінного користувача.

4
1. Це не практично для пакетних операцій. 2. Якщо ви не користуєтеся власною установкою, певні місця можуть бути записані всіма користувачами, зокрема / tmp /
труба

@pipe можна також створити каталог і нового користувача, і лише той користувач має доступ до цього каталогу, а потім запустіть команду. Мені дуже подобається домашній каталог, дякую.
кіт

2
@pipe Чому на Бога благо Землі ви коли - небудь передати ненадійні дані по пакетної операції? Якщо ви їй не довіряєте, ви НЕ запускаєте це без нагляду.
Ендрю Генле

6
@AndrewHenle Uhm, добре. Як ви думаєте, як працює кожен сервер в Інтернеті? Як ви думаєте, якийсь хлопець в stackexchange запускає цей коментар через свою базу даних та систему розмітки, одночасно контролюючи операцію? Тому що цей вхід - це недовірені дані через пакетну операцію.
труба

Я б не рекомендував витягувати ненадійний файл безпосередньо в домашній каталог. Ви не хочете, щоб він перезаписав вас .bashrc та інші .config / файли, правда?
Hugal31
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.