Стэганаграфія міма файлаў: хаваем дадзеныя прама ў сектарах

Невялікая прадмова

Стеганаграфія, калі хто не памятае, - гэта ўтойванне інфармацыі ў якіх-небудзь кантэйнерах. Напрыклад, у малюнках (абмяркоўвалася тут и тут). Можна таксама схаваць дадзеныя ў службовых табліцах файлавай сістэмы (пра гэта пісалася тут), і нават у службовых пакетах пратаколу TCP. Нажаль, ва ўсіх гэтых метадаў ёсць адзін недахоп: каб неўзаметку «украпіць» інфармацыю ў кантэйнер, патрэбныя хітрыя алгарытмы, якія ўлічваюць асаблівасці ўнутранай прылады кантэйнера. Ды і з устойлівасцю кантэйнера да маніпуляцый узнікаюць праблемы: напрыклад, калі крышачку падрэдагаваць карцінку, прыхаваная інфармацыя губляецца.

Ці можна неяк абысціся без хітрых алгарытмаў і тонкіх маніпуляцый з дадзенымі, і пры гэтым усё ж забяспечыць працаздольнасць кантэйнера і прымальны ўзровень захаванасці схаваных дадзеных? Забягаючы наперад скажу - так, можна! І нават утылітку прапаную.

Крывавыя падрабязнасці метаду

Асноўная ідэя простая, як удар дубінай па ілбе: на дыску ёсць вобласці, у якія аперацыйная сістэма ніколі не піша (ці піша ў рэдкіх выпадках). Каб не трэба было шукаць гэтыя вобласці хітрымі алгарытмамі, скарыстаемся надмернасцю — гэта значыць шмат-шмат разоў прадубліруем нашу ўтоеную інфармацыю па ўсіх сектарах кружэлкі. Затым прама над усёй гэтай прыгажосці можна ствараць патрэбныя часткі, фарматаваць файлавыя сістэмы, пісаць файлы і ставіць Восі - усё роўна частка сакрэтных дадзеных захаваецца і яе можна будзе атрымаць, а шматразовае дубляванне дапаможа нам скласці з кавалачкаў зыходнае цэлае.

Вартасць такога метаду відавочная: мы не залежым ні ад фармату файлаў, ні нават ад тыпу выкарыстоўванай файлавай сістэмы.

Недахопы таксама, думаю, відавочныя:

  • Сакрэтныя дадзеныя можна будзе змяніць толькі поўным перазапісам усяго дыска, з наступным узнаўленнем бачнага карыстачу змесціва. Пры гэтым нельга карыстацца софтам, які ўзнаўляе дыск з выявы: ён адновіць і папярэднія сакрэтныя дадзеныя.
  • Чым большы аб'ём сакрэтных дадзеных, тым большая верагоднасць страты часткі інфармацыі.
  • Выманне дадзеных з дыска можа заняць шмат часу. Ад некалькіх хвілін да некалькіх дзён (сучасныя дыскі большыя).

Цяпер пяройдзем да прыватнасцяў.

Зразумела, што калі проста размазаць сакрэтныя дадзеныя па ўсім дыску, то ўтоеныя яны будуць толькі ад няўзброенага погляду. Калі ўзброіць погляд, скажам, рэдактарам дыска, то дадзеныя паўстануць ва ўсёй красе. Таму дадзеныя нядрэнна б зашыфраваць, каб не адсвечвалі. Шыфраваць будзем прасценька, але густоўна: па алгарытме aes256-cbc. Ключ шыфравання спытаем у карыстача, хай добры пароль прыдумляе.

Наступнае пытанне - у тым, як нам адрозніць "правільныя" дадзеныя ад сапсаваных. Тут нам дапаможа кантрольная сума, ды не простая, а SHA1. А што? Для git'а яна дастаткова добрая, значыць, і нам падыдзе. Вырашана: забяспечваем кожны захаваны фрагмент інфармацыі кантрольнай сумай, і калі пасля расшыфроўкі яна супала - значыць, расшыфроўка атрымалася.

Яшчэ абавязкова спатрэбіцца нумар фрагмента і агульная даўжыня сакрэтных звестак. Нумар фрагмента - каб адсочваць, якія кавалачкі мы ўжо расшыфравалі, а якія засталіся. Агульная даўжыня нам спатрэбіцца пры апрацоўцы апошняга фрагмента, каб не пісаць лішнія дадзеныя (або паддынг). Ну і раз ужо ў нас усё роўна наклёўваецца загаловак, то дадамо туды імя сакрэтнага файла. Яно спатрэбіцца ўжо пасля расшыфроўкі, каб не варажыць, чым яго адчыняць.

Правяраем метад на практыцы

Для праверкі возьмем самы распаўсюджаны носьбіт - флэшку. У мяне знайшлася старэнькая на 1 Гб, што суцэль падыдзе для эксперыментаў. Калі вам, як і мне, прыйшла ў галаву думка не парыцца з фізічнымі носьбітамі, а патэставаць на файліку - выяве дыска, то адразу скажу: не выйдзе. Пры фарматаванні такога "дыска" лінукс стварае файл зноўку, і ўсе невыкарыстоўваныя сектары будуць запоўненыя нулямі.

У якасці машыны з лінуксам, нажаль, прыйшлося скарыстацца якая валяецца на гаўбцы метэастанцыяй на Raspberry Pi 3. Памяці тамака нягуста, таму вялікія файлы хаваць не будзем. Абмяжуемся максімальным памерам у 10 мегабайт. Занадта маленькія файлы таксама хаваць сэнсу няма: утылітка піша дадзеныя на дыск кластарамі па 4 Кб. Таму знізу абмяжуемся файлам у 3 кб - ён залазіць у адзін такі кластар.

Здзекавацца над флэшкай будзем паэтапна, правяраючы пасля кожнага этапу, ці чытаецца прыхаваная інфармацыя:

  1. Хуткае фарматаванне ў фармаце FAT16 з памерам кластара 16 кб. Гэта тое, што прапануе зрабіць Windows 7 з флэшкай, на якой адсутнічае файлавая сістэма.
  2. Запаўненне флэшкі усякім смеццем на 50%.
  3. Запаўненне флэшкі усякім смеццем на 100%.
  4. "Доўгае" фарматаванне ў фармаце FAT16 (з перазапісам за ўсё).

Першыя два выпрабаванні цалкам чакана скончыліся поўнай перамогай: утыліта змагла паспяхова атрымаць 10 мегабайт сакрэтных дадзеных з флэшкі. А вось пасля таго, як флэшку забілі файламі пад завязку, адбыўся збой:

Total clusters read: 250752, decrypted: 158
ERROR: cannot write incomplete secretFile

Як бачым, атрымалася паспяхова расшыфраваць толькі 158 кластараў (632 кілабайта волкіх дадзеных, што дае 636424 байта карыснай нагрузкі). Зразумела, што 10 мегабайт тут ніяк не набярэцца, хоць сярод гэтых кластараў відавочна ёсць дублікаты. Нават 1 мегабайт такім чынам ужо не адновіш. Але затое можна гарантаваць, што 3 кілабайты сакрэтных дадзеных мы адновім з флэшкі нават пасля таго, як яе адфарматуюць і запішуць пад завязку. Зрэшты, досведы паказваюць, што з такой флэшкі суцэль магчыма выняць файл даўжынёй 120 кілабайт.

Апошняе выпрабаванне, нажаль, паказала, што флэшка перазапісалася ўся:

$ sudo ./steganodisk -p password /dev/sda
Device size: 250752 clusters
250700 99%
Total clusters read: 250752, decrypted: 0
ERROR: cannot write incomplete secretFile

Ніводнага кластара не захавалася… Сумна, але не трагічна! Паспрабуем перад фарматаваннем стварыць на флэшцы падзел, а ўжо ў ім - файлавую сістэму. Дарэчы, з завода яна прыйшла менавіта з такім фарматаваннем, таму нічога падазронага мы не робім.
Цалкам чакана, што даступная прастора на флэшцы крыху паменшылася.

Таксама цалкам чакана, што 10 мегабайт усёткі не атрымалася схаваць на поўнасцю забіты дыск. Але затое зараз колькасць паспяхова расшыфраваных кластараў павялічылася больш за ў два разу!

Total clusters read: 250752, decrypted: 405

Мегабайт, нажаль, сабраць з кавалачкаў не атрымаецца, а вось кілабайт дзвесце – папросту.

Ну і вестка аб апошняй, 4-й праверцы, гэтым разам радасная: поўнае фарматаванне такой флэшкі не прывяло да знішчэння ўсёй інфармацыі! 120 кілабайт сакрэтных дадзеных выдатна ўлезла ў прастору, якая не выкарыстоўваецца.

Зводная табліца па тэставанні:

Стэганаграфія міма файлаў: хаваем дадзеныя прама ў сектарах

Трохі тэарэтызавання: аб вольным месцы і невыкарыстоўваных сектарах

Калі вы калісьці разбівалі цвёрдую кружэлку на часткі, то маглі звярнуць увагу, што далёка не заўсёды атрымліваецца адвесці ўсю вольную прастору на кружэлцы. Першы раздзел заўсёды пачынаецца з некаторым водступам (звычайна гэта 1 мегабайт, або 2048 сектараў). За апошнім падзелам таксама, бывае, застаецца невялікі "хвост" з невыкарыстоўваных сектараў. Ды і паміж часткамі часам застаюцца прамежкі, хоць і рэдка.

Іншымі словамі, на дыску ёсць сектары, да якіх няма доступу пры звычайнай працы з дыскам, але дадзеныя вось у гэтыя сектары запісаць можна! А значыць, і прачытаць таксама. З папраўкай на тое, што ёсць яшчэ табліца раздзелаў і код загрузніка, якія як раз і размешчаны ў пустой вобласці ў пачатку дыска.

Адцягнемся на час ад раздзелаў і паглядзім на дыск з вышыні, так бы мовіць, птушынага палёту. Вось ёсць у нас на дыску пусты раздзел. Створым у ім файлавую сістэму. Ці можна сказаць, што нейкія сектары на дыску засталіся незацёртымі?

І-і-і - барабанны дроб! Адказ практычна заўсёды будзе - так! Бо ў большасці выпадкаў стварэнне файлавай сістэмы зводзіцца да таго, што на дыск запісваецца толькі некалькі блокаў службовай інфармацыі, а ў астатнім змесціва часткі не змяняецца.

А яшчэ – чыста па-эмпірычнаму – можна выказаць здагадку, што файлавая сістэма не заўсёды можа заняць усю адведзеную ёй прастору да апошняга сектара. Напрыклад, файлавая сістэма FAT16 з памерам кластара ў 64 кілабайта відавочна, не зможа цалкам заняць частку з памерам, не кратным 64 кілабайтам. У канцы такой часткі павінен будзе застацца "хвост" у некалькі сектараў, недаступны для захоўвання карыстацкіх дадзеных. Зрэшты, эксперыментальна гэтую здагадку пацвердзіць не ўдалося.

Такім чынам, каб максымізаваць месца, даступнае пад стэганаграму, трэба выкарыстоўваць файлавую сістэму з памерам кластара пабольш. Можна яшчэ стварыць частку, нават калі гэта неабавязкова (на флэшцы, напрыклад). Ствараць пустыя раздзелы або пакідаць неразмеркаваныя вобласці не трэба - гэта прыцягне ўвагу грамадзян, якія цікавяцца.

Утыліта для эксперыментаў

Зыходнікі ўтыліты можна памацаць тут

Для зборкі запатрабуецца Qt версіі 5.0 і вышэй і OpenSSL. Калі нешта не збіраецца – магчыма, давядзецца падправіць файл steganodisk.pro.

Можна памяняць памер кластара з 4 Кб на, скажам, 512 байт (у secretfile.h). Пры гэтым вырастуць выдаткі на службовую інфармацыю: загаловак і кантрольная сума займаюць фіксаваныя 68 байт.

Запускаць утыліту трэба, натуральна, з правамі карыстача root, прычым з асцярожнасцю. Ніякіх пытанняў перад перазапісам паказанага файла ці прылады не будзе!

Атрымлівайце асалоду.

Крыніца: habr.com

Дадаць каментар