Приховування та відновлення даних у Linux


Деніс Колісниченко

Ця стаття є перекладом статті Антона Чувакіна (Anton Chuvakin). Оригінал статті доступний за адресою: https://www.linuxsecurity.com/feature_stories/data-hiding-forensics.html< /a>. Я не став перекладати статтю дослівно і додавав свої коментарі відразу за текстом, тому, можливо, ви знайдете невеликі розбіжності з оригіналом.

Усім відомо, що якщо файл видалено з комп'ютера, його можна відновити. Недавній аналіз засобів захисту Windows NT, проведений Куртом Шейфредом (Kurt Seifried), показав, що файлова система NTFS дозволяє приховувати файли в альтернативних потоках. даних" (alternative datastreams), які приєднані до файлів. Ці потоки даних не руйнуються багатьма утилітами стирання інформації (wipe utilities), які обіцяють безповоротне видалення інформації. Стирання файлу означає його надійне видалення (на відміну від звичайного видалення записів файлу з таблиці розташування файлів – FAT) так, щоб відновлення файлу було надзвичайно дорогим або неможливим.

У своєму огляді "Secure Deletion of Data from Magnetic and Solid-State Memory Пітер Гутманн (Peter Gutmann) показує, що залишається після видалення файлу і як можна уникнути відновлення інформації. Для повного видалення файлу автор рекомендує багаторазове перезаписування файлу спеціальними шаблонами, хоча тут може допомогти одноразовий запис файлу, що містить одні нулі.

В операційній системі Linux не передбачені альтернативні потоки даних, але видалені командою /bin/rm файли все ж таки залишаються на диску. Більшість дистрибутивів Linux використовують файлову систему ext2 (або її журнальну версію - ext3). Якщо розглянути структуру файлової системи ext2, то відразу стає ясно, де можуть бути приховані дані.

Давайте почнемо з класичного методу приховати дані в UNIX (навіть не використовуючи ext2). Запустіть процес, який спочатку відкривається файл і видаляє його, не закриваючи. Вміст файлу все ще залишається на диску і цей простір не буде запитуватись іншими програмами. Якщо запустити процес, що стирає самого себе, його вміст може бути знайдено у файловій системі /proc (в образі пам'яті). Команда

cp /proc/$PID/exe /tmp/file

відновить цей файл у каталозі /tmp.

Якщо файл був видалений програмою /bin/rm, його вміст все ще залишається на диску, доки він не буде перезаписаний (поверх) іншими файлами. Існують утиліти, наприклад e2undel, які автоматично відновлюють файли. Всі вони базуються на Linux Ext2fs Undeletion mini-HOWTO, який є гарним посібником з відновлення файлів з розділів Linux. Відновлення може бути виконано і вручну за допомогою утиліти debugfs (як описано у вищезгаданому посібнику).

Загалом, якщо спробу відновлення файлу було зроблено відразу після його видалення і розділ швидко відмонтовано, шанси повністю відновити файл дуже високі. Якщо файлова система інтенсивно використовувалася, можливість успішного відновлення даних значно зменшується. Однак якщо ми будемо дивитися на проблему з оптимістичної точки зору, можливість відновлення чогось (особливо чогось невеликого) - все ще дуже висока. Повідомлялося про відновлення частин файлів, видалених кілька років тому.

Таким чином, файли можуть бути приховані у вільному просторі. Якщо було видалено багато копій того самого файлу, шанси відновлення вищезазначеним методом дуже високі. Однак, через заплутаність файлової системи ext2, процес відновлення може бути надійний тільки для маленьких файлів.

Детальніший погляд на структуру файлової системи ext2 показує існування "слабких місць". Файлова система адресує частини дискового простору, які називаються блоками. Зазвичай розмір блоку для файлової системи ext2 дорівнює 1, 2 чи 4 Кб. Якщо розмір файлу менший, ніж розмір блоку, простір, що залишився, витрачено марно. Це і називається "слабким місцем". Ця проблема довго мучила користувачів Windows 9x з файловою системою FAT16, яка використовувала розміри блоку до 32КБ, витрачаючи даремно величезний дисковий простір при збереженні маленьких файлів.

При використанні розділу об'ємом 4Гб розмір блоку становить 4К (розмір блоку вибирається автоматично під час створення файлової системи утилітою mke2fs). Таким чином, можна надійно приховувати до 4КБ даних на файл привикористання маленького файлів. Дані будуть недоступними для дискового використання, невидимими для файлової системи та не виявленими перевірочними пристроями цілісності файлу, що використовують алгоритми обчислення контрольної суми файлу (CRC) та MAC-часу. Ext2-дискета (з розміром блоку 1КБ) теж дозволяє приховувати дані, хоч і менші розміри.

Існуюча утиліта bmap дозволяє записувати дані в "слабкі місця", використовувати ці дані та затирати їх, якщо це необхідно. Наприклад, ця команда записує дані в "слабке місце", створене файлом /etc/passwd

# echo "evil data is here" | bmap --mode putslack /etc/passwd

А команда


# bmap --mode slack /etc/passwd
getting from block 887048
file size was: 9428
slack size: 2860
block size: 4096
evil data is here

показує дані.
Для затирання (видалення інформації) "слабкого місця" використовується команда:

# bmap --mode wipeslack /etc/passwd

Приховування даних у "слабких місцях" може використовуватися для зберігання секретів та приховувати інформацію від перевірочних пристроїв цілісності (integrity checkers).

Тепер давайте замислимося, що ж ховається на великих просторах нашого диска? Якщо ми шукаємо рядки тексту, команда strings /dev/hdaX | grep 'string we need' підтвердить присутність рядка на розділі (цей процес займе багато часу). Використання шістнадцяткового редактора іноді може пролити світло на вміст нашого диска, але цей процес надзвичайно складний.

Кращий пакет для пошуку даних на диску - "The Coroner's Toolkit" Дена Фармера (Dan Farmer) та набір tctutils утиліт для нього. Програмне забезпечення забезпечує функціональні можливості для збирання прихованих даних, аналіз змін вмісту жорсткого диска (використання файлу timestamps), розташування даних на диску (використання вузла (inode) та номера блоку). Детальний опис пакету виходить за межі цієї статті.

Зараз розглянемо, як можна запобігти виявлення особистих даних. Для цього існує кілька Linux-утиліт. Усі, крім однієї, можуть використовуватись для затирання файлів, рідше – для порожнього простору.

  1. GNU shred (Colin Plumb)
  2. srm (Todd Burgess)
  3. wipe (Tom Vier)
  4. srm from thc kit (THC group, https://packetstorm.linuxsecurity.com/groups/thc/)

Деякі з них використовують випадкові проходи, як рекомендується вище, а деякі один раз записують нульовий файл (файл, що містить нулі).

Деякі з них не працюють за певних обставин або для певної файлової системи. Як повідомлено у сторінці shred: "shred покладається на дуже важливе припущення: те, що файлова система записує поверх даних у місці". Якщо ця умова не виконана, ніяке безпечне стирання не буде (без повідомлення про помилки!).

Щоб усувати сліди старих видалених файлів, можна витерти пусте місце. Найпростіший метод полягає у використанні стандартної Linux-утиліти "dd". Витерти порожнє місце розділі /home можна так:


dd if=/dev/zero of=/home/bigfile
sync
rm /home/bigfile
sync

Ці команди записують нулі в спільне місце. Виконання цих команд для каталогу /tmp може зруйнувати деякі програми, тому потрібно бути обережним. Утиліта "sfill", що входить до складу пакету THC secure_delete (пакет доступний за адресою https://packetstorm.linuxsecurity.com/groups/thc/) , використовує більш суворий алгоритм.

Слід зазначити, що swap-простір також може містити частини особистих даних і також має бути затерто з метою додаткової безпеки. Інша утиліта (sswap) з пакету THC може бути використана саме для цієї мети.

Зверніть увагу, що навіть якщо затерто порожнє місце, "слабкі місця" залишаються непошкодженими. Якщо файл витертий (принаймні за допомогою поточної версії GNU shred), пов'язане "слабке місце" затерто не буде!