Защита на Perl, Perl

Уязвимите CGI скриптове са чудесна вратичка в компютърните системи. Можем ли да го "блокираме" със 100% надеждност, веднъж завинаги? Статията анализира предимствата и недостатъците на съществуващите подходи за защита на Perl и предлага метод за защита, базиран на "хакерска" (нокаут!) подмяна на функциите на процесната система.

Ако програмирате (или планирате да програмирате) Интернет приложения на Perl, вероятно сте попадали на информация, описваща уязвимостите на този език към хакерски атаки. Най-простият скрипт, открит във всеки учебник по Perl, се оказва „широко отворена врата“ за хакери, както опитни, така и начинаещи. Например кодов фрагмент, който просто извежда съдържанието на определен файл

всъщност може да прави и други неща. Дайте му низа "calc.exe" като негов вход и ще стартирате стандартен калкулатор за изпълнение. Няма смисъл да изпълнявате стандартни програми (като calc.exe или notepad.exe) на отдалечен сървър, ако не знаете за идеалния главен ключ на хакера - помощната програма mshta.exe. Той е включен в стандартната дистрибуция на Windows и ви позволява лесно и естествено да качите произволен код в атакуваната система и да го изпълните.

Например изпълнение на командата в системата:

ще накара foobar.hta да бъде изтеглен на вашия компютър и изпълнен като VBS скрипт. Този пример изгражда и изпълнява (твърди malware.com) безвредно MS-DOS приложение, показващо стандартен алгоритъм за генериране на пламък. Естествено, по същия начин можете да изтеглите и изпълните произволен изпълним файл в системата, дори ако той все още не е там.

Кому е нужно?

По този начин уязвимите сървъри, без значение колко са важни, са опаснине по-малко от тези хора, които знаят как да използват тези сървъри по предназначение. 🙂

Защо Perl е уязвим?

Трудно е да се даде рационално обяснение защо отворената функция в Perl обработва символа на тръбопровода като команда за стартиране на програмата за изпълнение: Perl като цяло е доста ирационален (но гъвкав и компактен) език. 🙂 Авторът на Perl Лари Уол шеговито се застъпва за името Patalogically Eclectic Rubbish Lister - можем само да пожелаем бъдещите версии на Perl да се развият към по-сигурен, недвусмислен и без грешки код - много необходими качества за публични интернет приложения. Разбира се, „патологичен“, „еклектичен“ и „боклук“ са негативни черти, срещу които Лари Уол трябва да се бори. 🙂

Филтриране на въведеното от потребителя

Оценете колко специални икони - "крокодил" трябва да бъдат филтрирани за проста функция за отваряне на файл. Очевидно трябва да сте задълбочен експерт по Perl и много внимателен човек, за да поставите всички филтри правилно. Тъй като е трудно да се изисква 100% надеждност от човек, за разлика от скрап, програмите за „крокодилски капани“, поставени на различни места, може да не работят на практика.

Ограничаване на правата на уеб сървъра

Интернет сървърът и всички стартирани от него приложения, по един или друг начин, в контакт с целия външен свят, не трябва да имат администраторски или привилегировани потребителски права. Присвояването на ограничени права на услугата Web Server е много надежден (и вероятно единственият правилен) начин да защитите вашия сървър от атаки отвън.

Когато проектирате интернет сайт, трябва да го разбиете още от самото начало.информационното съдържание в отделни папки, където са:

  • а) изпълними скриптове и програми
  • б) данни само за четене (HTML страници)
  • в) данни, предназначени за промяна от посетителите.

Потребителят, под чието име ще бъде стартиран интернет сървърът, трябва да има достъп само до тези папки и трябва да бъде наложена забрана за писане на скриптове и данни (в противен случай хакер може леко да промени външния вид и функционирането на вашия сайт), както и забрана за изпълнение трябва да бъде наложена на данни, предназначени за модифициране от външни потребители (в противен случай той ще може да създава и незабавно да изпълнява всичко в тази папка). Тази опция за защита е теоретично „нечуплива“ - но на практика начинаещият администратор ще има редица трудности.

И така, в система Windows уеб сървърът няма да стартира, освен ако не отворите системните dll файлове в папката c: winntsystem32 за достъп. И ако ги отворите, прекрасни програми като regedt32.exe, mshta.exe и т.н. ще бъдат достъпни за целия свят. Можете, разбира се, да пренапишете списъка със системни dll, необходими на програмата, на лист хартия и да отворите само тях за достъп до интернет сървъра. Но колко администратори правят това (и трябва ли?).

Unix-подобните системи имат своите трудности (един от възможните проблеми е затвореният порт 80 за процеси, които нямат административни привилегии в системата).

Във всеки случай този метод на защита изисква добро обучение и висока мотивация на системния администратор, което показва основен недостатък на такава защита: тя не може да бъде принудена да бъде инсталирана заедно с инсталирането на защитената програма, а надеждността на компютърната система зависи изцяло от надеждността на нейното най-слабо звено - човешкия мозък.

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

Лоботомията еоперация за промяна на личността чрез увреждане на предните дялове на мозъка, отговорни за агресията. По едно време тази операция беше използвана по отношение на престъпниците, за да се намали опасността им за обществото. С помощта на специален инструмент хирургът достига до тази област на мозъка през очните кухини и леко почуква дръжката на инструмента с дървен чук, за да нанесе необходимото увреждане (излишната кръв и клетъчна маса се отстраняват с помощта на гъвкава сонда).

Ние ще приложим такава операция не към хакери (по едно време тя беше призната за нечовешка и нехуманна), а към двоичното разпространение на Perl, за да „прекъснем“ неговата „агресивна“ реакция към символа („тръбопровод“).

Програмата sex.exe трябва да изведе към стандартния изход (stdout) някакъв вид и трогателен поздрав за хакера. Надявам се, че можете лесно да се справите сами със създаването му. :-).

Прихващане на системни повиквания

Не сме предупредили за всички опасности, които дебнат програмиста на Perl.

Да приемем, че искаме да деактивираме интерпретатора на Perl:

  • стартиране на външни програми (мъдро решение; същото изпращане на поща със сигурност е по-добре да се направи със стандартни функции на Perl - в противен случай ще трябва да „лоботомизираме“, в една или друга степен, всички програми, които изпълняваме)
  • четене на файлове, ако разширението не е ".html"
  • писане на файлове, ако разширението не е ".user".

След като получи такъв комплект за разпространение на Perl, дори ... да речем, не съвсем компетентен уеб програмист (ние не само нямаме право, но не можем да изискваме друго от живите хора) ще се чувства комфортно и, най-важното, сухо.

Ролята на "защитната подложка" в този случай ще бъде изпълнявана от специална dll, която ще прихване посочените от нас системни повиквания и, ако е необходимо, технитеще блокира.

в случай на Perl трябва да прихванем системната функция CreateProcessA (стартиране на приложение) от библиотеката KERNEL32.dll, както и функцията fopen (отваряне на файл за четене или запис) от библиотеката MSVCRT.dll.

Въз основа на тези ключови думи можете да намерите готово решение в Интернет или сами да напишете приложение за „прехващач“.

Инжектиране на защитната DLL

Опитвам се да стартирам Perl.exe. Разбира се, Perl пише, че необходимата библиотека romix1.dll не е намерена. Е, нека го създадем. За да направим това, ще компилираме триредова програма в Delphi, наричайки я romix1.dpr:

Това не е достатъчно: Perl сега извежда грешка, когато се стартира:

Perl импортира една RunPerl функция от тази библиотека и ние ще я създадем сега (нашият "фалшив" просто ще прехвърли контрола на "оригинала"):

Монтажната вложка прави прехода, където е необходимо. Сега злоупотребяващите съобщения са спрени и няма видима промяна в начина на работа на Perl. Но постигнахме важен резултат: нашият dll стана пълноправен член (ако не и мозъкът) на изпълнимия процес Perl.exe. Какво ще се случи след това става въпрос на техника (по-точно Windows API системни извиквания и няколко "точкови" замествания в таблицата за импортиране на Perl56.dll).

Може да попитате: как разбрах кои DLL файлове и функции импортира програмата? Отговорът е прост: dumpbin.exe от студиото за разработка на Microsoft.

Пример за извикване на тази помощна програма от командния ред:

Заключение

Опитахме се да защитим Perl - един от най-популярните (макар и донякъде еклектичен) 🙂 езици за работа с CGI - от атаки от Интернет. Направихме го на различни нива:

  • Филтриране на въведеното от потребителя
  • Ограничаване на правата за достъп
  • Замяна на поднизове в тялото на програмата
  • Прихващанесистемни повиквания

Възможни са още две нива на защита:

  • Прекомпилиране на Perl
  • Прекомпилиране на ядрото на операционната система.

Ефективността на защитата във всички разглеждани случаи е "нарастваща".

Разбира се, не само прекомпилирането е важно за нас, но и прекомпилирането с въвеждането на защитни проверки. Нашата цел е да реализираме тези проверки по един или друг начин, макар и нехуманен и „хакерски“. С дървено чукче.