от Nick Angelow(7-01-2005)

рейтинг (-71)   [ добре ]  [ зле ]

Printer Friendly Вариант за отпечатване

ФИЛОСОФИЯТА И АРХИТЕКТУРАТА НА NT СРЕЩУ UNIX ОТ ГЛЕДНА ТОЧКА НА СИГУРНОСТТА

Крис Касперски

23/09/2004 || Библиотека към ЛинуксЦентър

Източник: WASM.RU

За избягване на недоразумения, под термина „NT“, ако изрично не е уговорено друго, ще се разбират всички операционни системи от семейството NT – самият Windows NT, Windows 2000 и Windows XP.

Съществува мнение, че разпространението на електронно-изчислителните машини донесе повече проблеми, отколкото разреши. Човечеството в по-голямата си част нито морално, нито етично, нито психологически е готово за всичко това и компютърната техника попадна в ръцете на хора, чийто интелект е насочен само към разрушение. И, ако до появата на Internet, вирусната заплаха се свеждаше основно до проблема за „мръсните ръце“ и безконтролното копиране на софтуер, то днес ситуацията е коренно променена.

УВОД

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

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

  • подобно изследване все още не е провеждано, във всеки случай, материалите намерени по тази тема в мрежата имат субективен и повърхностен характер, обвързани са силно с недостатъците на конкретните операционни системи, по-голямата част от които отдавна са отстранени с поредната кръпка;

  • ако семейството на NT се състои само от три операционни системи – самият NT, Windows 2000 и Windows XP, които практически имат идентични архитектури, то пъстротата на UNIX подобните системи не подлежи на описание;

  • много е трудно да се изберат адекватни критерии за сигурност – количеството отбелязани пробиви в дадена операционна система не е показателя, който ни е необходим, първо защото точна статистика по принцип няма и не може да бъде направена (в момента, като правило успешните пробиви не се регистрират1) и второ, подобна статистика отразява не сигурността, а разпространението на една или друга система и в значителна степен е изкривена от моментния интерес на хакерите (или казано по-просто – от модата); а количеството намерени уязвимости само по себе си не показва нищо (даже и по споменатите по-горе причини).

    Затова решихме да се абстрахираме от особеностите на конкретните реализации и да сравняваме потенциалната концептуална уязвимост на операционните системи от NT и UNIX семействата. Какво е това „потенциална уязвимост“? Това е свойство на архитектурата на операционната система, което при определени обстоятелства, с определена вероятност може да доведе до намаляване на нейната сигурност. В частност, сложността се смята за една от потенциалните концептуални уязвимости и при равни други условия, по-малко сложната система се обявява за по-сигурна2 и обратно. Разбира се, освен сложността3, голяма роля играе и професионализма на разработчиците, качествения контрол и така нататък. Но тъй като тези фактори практически не се поддават на обективно отчитане (само не казвайте, че LINUX се тества от милиони хора по земното кълбо – знаем как я тестват), по-добре да не ги отчитаме изобщо, отколкото да ги отчитаме неправилно.

    По този начин, ние ще разглеждаме само концептуални уязвимости, тоест такива уязвимости, които са заровени толкова дълбоко в системата, че не могат бъдат отстранени без сериозна хирургическа намеса в архитектурата на ядрото4

    ФИЛОСОФСКИ КОНЦЕПЦИИ

    OPEN SOURCE VS ДИЗАСЕМБЛЕР

    Според определението на Иля Медведовски, атаката върху компютърна система е действие, предприемано от злосторник, което се състои в търсене и използване на една или друга уязвимост. Съществуват много и разнообразни методики за търсене и намиране на уязвимости, но нали се разбрахме да не се спираме на конкретни реализации. Затова ще разделим всички методики на две противоположни категории – на сляпо и на целенасочено търсене.

    Слепите методики разглеждат защитният механизъм като черна кутия с вход и изход. Методично избирайки всевъзможни входни стойности, злосторникът се опитва да отдели тези от тях, които ще нарушат нормалната работа на защитния механизъм или в една или друга степен ще намалят сигурността на машината. Тази извънредно проста и интелектуално непривлекателна стратегия за пробив е много популярна сред начинаещите хакери, прочели достатъчно много евтина фантастика и свято вярващи в своята изключителност. Между другото, след n-ят опит за пробив, търпението на „хакера“ свършва и цялата еуфория внезапно изчезва. Разбира се, от време на време, някои особено големи късметлии успяват все пак да проникнат в една или в друга защитена система, но тези атаки не представляват особена опасност именно поради своята малобройност.

    Действително, защитен механизъм с неизвестен принцип на действие може да бъде пробит само с метода на грубата сила – тоест имаме напълно предсказуема степен на сигурност. Поради това, всяка поне малко по-сериозна акция започва с изучаване на атакувания обект (целенасочен пробив), откъдето следва, че при равни други условия степента на защитеност на системата е обратнопропорционална на лекотата на анализ на нейния код. А лекотата на анализ се определя най-вече от достъпността на изходния код на защитния механизъм!

    Повечето операционни системи от UNIX семейството се доставят заедно с изходния си код, докато в същото време, изходния код на NT операционните системи е недостъпен, а анализа на дизасемблиран код не само е извънредно трудоемък и изморителен сам по себе си, но и изисква сериозна професионална подготовка, която се притежава далеч не от всички. Освен това, защитната подсистема на NT е много по-сложна от аналогичната подсистема на повечето UNIX системи, като при това е документирана доста повърхностно, което и отблъсква по-голямата част от потенциалните злосторници.

    Като следствие идва факта, че уязвимостите, открити в NT за цялото време на нейното съществуване може да се съберат на пръстите на едната ръка5. При UNIX положението е точно обратното – уязвимости се откриват постоянно. Но от друга страна ...

    НА ВСЕКИ ХАКЕР – ПО СИСТЕМА!

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

    В резултат на всичко това, могъществото на хакера, открил уязвимост в UNIX, се оказва много по-ниска, отколкото ако беше открита дупка с подобни размери в NT (поради малкото си разновидности, всяка, отделно взета версия на NT, е инсталирана на значително повече машини, отколкото е инсталиран UNIX). Именно затова NT се пробива или се опитват да пробият. Съблазънта в тази работа е толкова голяма, че хакерите не се спират нито от липсата на изходния код, нито трудността на анализа. Освен това, ядрото на NT не се обновява всеки ден и на практика, всички уязвимости, намерени в Windows NT 4.0 остават актуални и в Windows 2000, а даже и в Windows XP6.

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

    Въпреки това, инсталацията на слабо разпространена операционна система автоматически отрязва голямата част от хакерите, които използват чужди експлойти за атака. А за да не ни атакува професионалист, е необходимо да създадем второ ниво на защита – възел с проверена от времето и сериозно анализирана от специалисти операционна система.

    Не е лоша идеята на преден план в отбраната да се постави някакъв „редкоземен“ клон на UNIX, а на втори – NT система. Повечето хакери, както показва практиката, основно се специализират на една операционна система, и само в изключителни случаи – едновременно на две.

    UNIX – ТОВА Е ЛЕСНО!

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

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

    Между другото, грешките са силно нееднородни по своята природа – едни лежат, както се казва, на повърхността и се откриват даже от автоматичните средства за контрол на качеството на програмния код, други са заровени толкова дълбоко, че могат да бъдат открити само случайно. Основен проблем на оправянето на грешки е, че всяка, даже и най-незначителната модификация на програмния код предизвиква появата на каскада от грешки, появяващи се на най-неочаквани места. И затова, внасянето на каквито и да са изменения във вътрешността на операционната система или в приложенията към нея, трябва да бъде съпроводено с пълен цикъл от повторни проверки. Но такава проверка, както беше посочено по-горе, да се изпълни е просто невъзможно.

    Прекомерната сложност на NT, заедно с огромното количество изменения, които се извършват в кода на всяка нова версия, обяснява лошото качество на нейният качествен контрол. Независимо от всички усилия, предприемани от Microsoft, уязвимостта на NT е заложена още в самата политика на нейното развитие, поради което е принципно неотстранима тоест тя е фундаментална.

    Обратно, повечето операционни системи от UNIX семейството са достатъчно компактни и съдържат минималното количество необходими за функционирането на системата компоненти7 (или поне позволяват да бъдат ограничени до подобно състояние). Освен това, тяхното бавно, еволюционно (а не революционно, както е при NT) развитие по никакъв начин не спомага за появата на грубите, лесно откриваеми грешки, с които е известен NT.

    ОТДАЛЕЧЕНИЯТ ДОСТЪП – ОРЪЖИЕ НА ПРОЛЕТАРИАТА

    Една от концептуалните разлики във философиите на NT и UNIX се състои в това, че UNIX не прави никаква практическа разлика между локалния и отдалечен достъп до машината. При NT е точно обратното – само някои действия могат да бъдат изпълнявани отдалечено, а за пълноценно управление на сървъра, администратора е принуден да използва физически достъп.

    Никой не иска да спори – отдалеченото управление на сървър е много удобно, но нека се замислим – доколко е безопасно? За съжаление, няма удобство, за което да не трябва да се плати някаква цена8. Колкото е удобно да администрираме, толкова удобно е и да атакуваме. Затова спомагат и развитите командни интерпретатори, поддържащи пълноценни езици за програмиране, ярко отличаващи се от изродите, които предлага примитивната обвивка на NT. Изобщо, в NT с отдалечен достъп може да се правят много малко неща (трябва да се спомене, че от Windows 2000 в нея се появи повече или по-малко усъвършенстван механизъм за отдалечено управление).

    Още повече, че не е необходимо да изпадаме в крайности и напълно да се отказваме от възможностите, които предлага отдалеченото администриране. Разбира се, с пълната забрана за отдалечен достъп, вие в значителна степен ще увеличите сигурността на вашия сървър, но ... ще бъдете принудени постоянно да се намирате непосредствено до него. Ще попитате – защо? А кой ще гони хакерите?! Нали е възможно да се проникне на атакуваната машина през всяка инсталирана на нея услуга (например WEB) за затова е крайно нежелателно да се лишите от всички средства да дистанционно наблюдение и управление на сървъра.

    С една дума, отдалеченият достъп е като тояга – има два края, едновременно намалява сигурността на възела, но усилвайки оперативността при откриване и неутрализация на злосторниците. От друга страна, в отговорни случаи е по-добре да се откажем напълно от отдалечения достъп, заменяйки го със закован към сървъра оператор.

    КОМПЛЕКТАЦИЯ НА СТАНДАРТНАТА ИНСТАЛАЦИЯ

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

    Операционните системи от семейството на NT са комплектовани с много по-скромен набор от приложни програми и в това отношение изглеждат по-сигурни. Между другото, това не е принципна разлика – грамотният администратор ще махне от UNIX всичко излишно.

    АРХИТЕКТУРНИ КОНЦЕПЦИИ

    МЕХАНИЗМИ ЗА УДОСТОВЕРЯВАНЕ

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

    От друга страна, NT се отнася крайно небрежно към охраната на базата с пароли от посегателства на хакери. На пръв поглед, изглежда че няма никакъв проблем, тъй като достъп до тази база имат само системата, администраторите и ограничен брой, специално посочени от администратора потребители (например операторите за архивиране10, които съхраняват периодично базата на архивни носители). А в някои, вярно много малко, UNIX системи, файла с паролите е свободно достъпен за всички потребители на системата и много често даже е „видим“ по мрежата! Е и, какво от това? - ще попитате вие – Нали пароли в този файл няма, а „обръщането“ на хеша по метода на грубата сила отнема твърде много време, нека хакера да пробва, щом това му харесва... Добре, но тогава възниква следния въпрос: възможно ли е с едно единствено използване на всички възможни комбинации да пробием всички системи в мрежата? Не бързайте да отговаряте с „не“, тъй като правилния отговор е „да“! Обемът на твърдите дискове вече е толкова голям, че хакерът може да съхрани на него хешовете на всички изпробвани пароли, като е без значение времето, което ще отнеме този процес – месеци или години – нали след това злосторника ще получи възможност практически мигновено да възстанови паролата по нейния хеш, стига само да притежава базата с пароли. Не стига, че при NT резервните копия на базата с пароли по подразбиране се съхраняват в общодостъпни директории, но алгоритъма за удостоверяване не използва привързване (salt), в резултат на което, хешовете на еднаквите пароли в NT винаги ще съвпадат, значително улеснявайки самият пробив! Между другото, привързването не помага при подобни атаки, само удължава малко „агонията“ на системата.

    ПОВИШАВАНЕ НА СОБСТВЕНИТЕ ПРАВА

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

  • моделът на потребителите трябва да бъде достатъчно гъвкав, удобен и интуитивно разбираем, в противен случай грешките при администрирането на системата са неизбежни;

  • механизмът за контрол на правата за достъп трябва не само да гарантира невъзможността за несанкционирано повишаване на собствените права, но и да бъде максимално устойчив към грешки на програмистите;

  • и самата операционна система, и работещите на нея потребители трябва да ползват минимално необходимите за нивото права.

    Анализът показва, че гореизброените изисквания не са изпълнени в нито една операционна система с масово предназначение, поради което всички те в една или друга степен са уязвими. Между другото, степента на сигурност на UNIX и NT е различна.

    Моделът на правата на потребителите, използван в повечето UNIX операционни системи е на едно ниво и позволява съществуването само на два типа потребители – обикновени потребители и суперпотребител11. В NT обратно – се използва йерархичен модел, при който освен администратора има още един суперпотребител – самата система. Какво означава това? Означава, че в NT операционните системи, за разлика от UNIX, всеки потребител получава минимално необходимите му права и никога не ги повишава без особена необходимост. Широко разпространена заблуда гласи, че правилното администриране на UNIX позволява да се постигне точно разпределение на правата за достъп, каквото е в NT, макар и с цената на повече време и положени усилия. В действителност това не е точно така.

    Липсата на системен потребител в UNIX води до невъзможност на изпълнение на цял ред действия, освен с временно повишаване на правата на стартираната програма до root. Нека вземем класическата задача за смяна на паролата. Потребителите могат (и трябва!) периодично да сменят своите пароли. Но в UNIX (както и в NT), паролите на всички потребители се съхраняват в един файл, като използваният модел на правата за достъп, не ни позволява да дадем на различните части от файла различни права за достъп. Но нали потребителя трябва да може да променя своята парола? В UNIX тази задача се решава по следният начин: приложната програма, отговорна за промяна на паролата на потребителя, присвоява на потребителя специален атрибут, позволяващ му при необходимост да получи права на администратор, което тя и прави. Ако този механизъм се използваше само за промяна на паролите, нямаше да бъде голям проблем. Но в действителност, този атрибут е необходим на много голямо количество приложни програми, в частност на WEB и mail сървърите. Замислете се за малко, какво би станало, ако в някоя от програмите, изпълняващи се с най-високи права, се открие грешка, позволяваща предаването на управлението на хакерския код? А такива грешки се сипят от UNIX програмите като от рог на изобилието.

    Съвсем друга е ситуацията при NT операционните системи. Непривилегированите потребители са принудени да повишават своите права до администраторските само в изключителни случаи, като в останалото време те използват API-функциите на операционната система, изпълняващи потенциално опасни действия с „ръцете“ на самата операционна система. Даже да има допусната грешка в някое от тези приложения и управлението се поеме от хакер, той ще наследи минимални права и ще причини на системата минимална вреда.

    По този начин, NT операционната система е устойчива към грешки на програмистите, докато UNIX операционните системи са изключително чувствителни към такива грешки.

    ПРЕПЪЛВАНЕ НА БУФЕРА

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

    1. други буфери и променливи на програмата;

    2. служебни данни – в частност, адрес на връщане от функции;

    3. изпълним код;

    4. незаета или липсваща страница от паметта.

    Най-голяма опасност представляват точки b. и c., тъй като те дават възможност за получаване на пълен контрол над уязвимата програма. Точка d. е по-малко коварна и в най-лошия случай може да доведе до реализиране на атака за отказ от услуга12. Заплахата при ситуация от точка a. в значителна степен зависи от вида и предназначението на променливите, намиращи се след края на препълнения буфер и макар че на теория, уязвимото приложение е способно на всичко, на практика заплахата се оказва не толкова голяма.

    Има и още едно обстоятелство – за пълноценно прехващане на управлението, хакерът трябва да има възможност да изпълнява на отдалечената машина собствен код, обикновено предаван през самият препълван буфер. В зависимост от разположението на уязвимия буфер и „характера“ на операционната система, изпълнението на предадения от хакера код може да бъде или разрешено или не.

    Всички операционни системи, и UNIX, и NT потенциално допускат съществуването на точки a., b. и d., изключвайки точка c. Следователно, те в еднаква степен да подложени на заплаха от препълване на буфера. Освен това, и UNIX, и NT имат изпълним стек13 и забраняват изпълнението на код в сегмента за данни. А това означава, че препълването на буферите, съдържащи се в автоматичните (тоест стекови) променливи носи в себе си заплахата от установяване на пълен контрол над уязвимата програма. В интерес на истината, за някои UNIX операционни системи съществуват кръпки, премахващи възможността за изпълнение на код в стека, но областта на тяхното приложение е твърде ограничена14.

    Най-забавното е, че и UNIX, и NT са написани на C – програмен език, неподдържащ автоматичен контрол на границите на масивите и поради което са подложени на грешки при препълване. Ветерани твърдят, че в някои версии на UNIX, грешката при препълване е присъствала даже при въвеждането на името на потребителя при регистрация в системата.

    ДОСТЪП ДО ЧУЖДО АДРЕСНО ПРОСТРАНСТВО

    За защитата на адресното пространство на процесора се носи огромно количество слухове, интриги, легенди, както и обикновено неразбиране на самата философия на защита. Популярните ръководства постоянно изпускат от внимание, че тази защита е предназначена единствено за непредумишлен достъп, тоест че има за цел единствено процесът, минал в „разход“ да не отнесе със себе си и всички останали процеси, изпълняващи се паралелно с него.

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

    1. в NT достъпът до чуждо адресно пространство по подразбиране е разрешен за всички, даже и за гости и ако някой процес (по-скоро неговият собственик) не иска да му се бъркат в неговото адресно пространство, е длъжен да го заяви явно;

    2. в UNIX, за настройване на процесите е необходимо процесът, който се настройва не само да е дал съгласие за това, но и да е изпълнил някои действия, като при това настройването на вече стартирани процеси е забранено! NT позволява безпроблемно да се пипа по активните процеси и да се започва и да се започва настройване на нови, естествено с наследяване на всички клонове на настройвания процес (в общия случай, настройването на по-привилегировани процеси от по-малко привилегировани е невъзможна).

    Казано накратко, NT предоставя доста изгодни условия за съществуване на stealth вируси, клавиатурни и паролни шпиони, както и на всякакви други гадини, нарушаващи спокойствието на системата.

    КОМУНИКАЦИИ МЕЖДУ ПРОЦЕСИТЕ

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

    1. самостоятелно да решава кой процес може да взаимодейства с него и кой не може;

    2. да умее да определя автентичността на процесите изпращачи и на процесите получатели;

    3. да може да контролира цялостта на предаваните или приеманите данни;

    4. да може да създава защитени канали за връзка, устойчиви към прехващане на трафика.

    Многообразието на средствата за взаимодействие между процесите, поддържани от съвременните операционни системи, извънредно много затруднява отговора на въпроса: „изпълняват ли се на практика гореизброените изисквания?“ Поради ограничения размер на статията, ние ще разгледаме само две от най-популярните средства за взаимодействие между процесите – канали, сокети и съобщения.

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

    За наименованите канали са достъпни всички процеси в системата, а при NT – и процеси, изпълняващи се върху останалите възли от мрежата. Естествено, за отварянето на именован канал трябва да притежаваме съответните привилегии, но за създаване на нов такъв канал, такива привилегии не са задължителни, като при NT операционните системи даже не съществуват легални методи за определяне „самоличността“ на създателя на един или друг канал. Отчитайки, че именованите канали активно се използват от системата за криптирано предаване на пароли и отдалечено управление на регистъра, заплахата от внедряване на фалшиви канали вече не е незначителна. Този проблем се решава частично с инсталация на съответната кръпка15, която предотвратява създаването на фалшификат на вече създаден наименован канал, като възможността за създаване на такъв канал „от нулата“ остава, както и продължаващото отсъствие на механизми за идентификация на създателите на канали във WIN32 API. Локалността на именованите канали в UNIX е едновременно и силна, и слаба страна. Но отсъствието на отдалечен достъп до каналите не е повод за отпускане – възможност за създаване на фалшив канал има даже и госта в системата, което в редица случаи му позволява успешно да атакува и по-привилегировани процеси.

    Именованите канали имат още един сериозен недостатък – обработката на всяко ново включване изисква някакво количество системни ресурси, а максималното количество екземпляри на канала, които могат да бъдат създадени, обикновено не е ограничено. Създавайки все повече и повече нови екземпляри, злосторникът ще изконсумира всички ресурси, което рано или късно ще доведе до спиране на системата. Даже и да има ограничение за максималното количество екземпляри, резултатът пак ще бъде същият – заемайки всички свободни канали, злосторникът ще наруши нормалната работа на всички останали легални процеси. Наистина, системата няма да спре, но ползата от това ще бъде малка ... Решението на проблема е във въвеждането на квоти от клиентската страна (а не от страната на сървъра), но първо не е много ясно как да се реализира в мрежова среда, и второ – клиентската защита винаги може да бъде лесно преодоляна.

    Сокетите, основно използвани при взаимодействия на процеси между различни възли (макар, че в UNIX те се използват широко и за локален обмен на данни) също са катастрофално незащитени пред опитите за заемане на всички свободни ресурси и огромното количество постоянно провеждани flooding attack са най-доброто доказателство за това. Между другото, съществуването на „сурови“ (RAW) сокети в UNIX, ги превръща в платформа номер едно за всяка поне малко по-сериозна TCP/IP атака. Операционните системи от семейството на NT дълго време не позволяваха „ръчното“ създаване на мрежови пакети, поради което не беше възможно осъществяване на атаки от вида Land, Teardrop и Bonk (което не означава, че NT е устойчива на такива атаки). Не е ли това причина за патологичната любов на повечето хакери към UNIX? Наистина, днес само мързеливият няма да намери NDIS-драйвер за NT, позволяващ да се работи с TCP/IP пакети на ниско ниво, така че репутацията на UNIX като чисто хакерска платформа обещава да се промени.

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

    Добилата широка известност дупка в сигурността, свързана с предаване на shell-код в реда за редактиране на привилегирован процес, с последващо инициализиране на таймер, изпълняващ този код в адресното пространство и с правата на атакувания процес, в момента според твърденията на Microsoft е вече отстранена. Подробности за „лечението“ към момента на написването на тези редове все още не са известни, но както изглежда те се свеждат до проверка на адреса на таймерната процедура – тя не трябва да се намира в буфера на какъвто и да е прозорец. Може би са забранили и предаването на съобщение WM_TIMER към по-привилегировани процеси. Напълно да се забрани (или защити) разпращането на съобщения между процесите е невъзможно, тъй като тя е част от философията на прозоречната система нa Windows и всички опити да се въведат каквито и да е ограничения, незабавно ще се сблъскат с проблеми за съвместимостта и ще доведат до неработещо състояние голямо количество приложни програми.

    Прозоречната система на UNIX е добра с това, че не е неразделна част от системата и при желание може да се откажете от нея, ограничавайки се с надеждния и безопасен текстов режим. Освен това, съобщенията в графичните среди на UNIX обикновено се осъществяват по TCP/IP протоколи, които защитават прозорците и елементите на управление на процеса от посегателства от страна на всички останали (ако, разбира се, самият процес-собственик не пожелае това).

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

    СБОРНА ТАБЛИЦА

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

    Не трябва да забравяме, че оценката на безопасността на система е много чувствителна към количеството и вида на сравняваните характеристики. Изключвайки едни или добавяйки други, ние можем да влияем значително върху крайния резултат. Така че това изследване не трябва да се приема като истина от последна инстанция...

    Таблица 1. Сравнение на основните характеристики на операционните системи от UNIX и NT семействата, имащи пряко или косвено отношение към сигурността.
    Неудачните характеристики са отбелязани със сив цвят.

    ХАРАКТЕРИСТИКА

    NT

    UNIX

    качество и пълнота на документацията

    документирана е повърхностно

    документирана е много подробно

    достъпност на изходният текст

    изходният текст е недостъпен

    изходният текст е достъпен

    трудност на анализа

    висока

    умерена

    разпространеност

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

    съществува огромно количество разнообразни клонове, като при това грешките в една версия на системата често отсъстват в останалите.

    сложност на кода

    кодът е излишно сложен

    кодът е изключително прост

    поддръжка на отдалечено администриране

    частично се поддържа

    поддържа

    комплектност на стандартната доставка

    съдържа минимално количество от необходимите приложения

    съдържа огромно количество приложения, в това число и непроверени

    механизми за удостоверяване

    устойчив към прехващане на паролите

    предава се открита парола

    използване на връзки

    не използва

    използва

    изпълнение на привилегировани операции

    изпълняват се от операционната система

    изпълняват се от самите приложения с временно повишени права

    модел на потребителите

    йерархична

    едностепенна

    защита от препълване на буфера

    няма, като самата операционна система е написана на език, провокиращ такива грешки

    няма, като самата операционна система е написана на език, провокиращ такива грешки

    възможност за достъп в адресното пространство на чужд процес

    има, разрешена по подразбиране

    няма

    възможност за настройване на процеси

    има, разрешена по подразбиране

    има, но е свързана с редица ограничения

    възможност за настройване на активни процеси

    има, но е необходимо да се притежават съответните права

    няма

    отдалечен достъп до именовани канали

    има

    не

    създаване на фалшиви именовани канали

    има, възможно е да се създаде и канал, и даже фалшив екземпляр на вече отворен канал

    има, но е възможно само създаването на фалшив канал

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

    няма

    няма

    защита на сокети от несанкциониран достъп

    няма

    няма

    възможност за емулиране на вход в по-привилегирован процес

    има

    няма

    ЗАКЛЮЧЕНИЕ

    Не е ли наистина забавно – NT е защитена много по-слабо (приведената по-горе таблица доказва неопровержимо това), но все пак по-често се разбиват UNIX системи, а не NT. Парадокс? Или все пак липсата на изходният код оказва влияние? Във всеки случай, ние други причини просто не виждаме ... Единственото, което може да предположим е, че NT се пробива, но поради успешният пробив (и поради уязвимостта на самата операционна система) тези пробиви просто не могат да се регистрират. Най-общо казано, тук има върху какво да се помисли.

    превод: Николай Ангелов



    1 освен на сайтове като http://www.zone-h.org/.

    2 не случайно, в open source движението, на особена почит е принципът KISS, придържането към който би донесло полза не само в областта на информационните технологии (това от личен опит).

    3 между другото, сложността се измерва не с обема на написания програмен код, а с количеството взаимни връзки между отделните компоненти на програмата – (К.К)

    4 и няма ли да получим след такава намеса коренно различна операционна система? – (К.К)

    5 като при това, по-голямата част от тях са открити съвсем случайно – (К.К)

    6 подробно за това се разказва в книгата на Крис Касперски, „Техника на мрежовите атаки“ – (К.К)

    7 не трябва да се бъркат с различните пакети, включвани в различните дистрибуции.

    8 тук е момента да споменем и съкращението TANSTAAFL.

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

    10 в терминологията на NT – backup operators или backup administrators

    11 той е root или администратор – (К.К)

    12 при обръщане към отсъстваща страница от паметта, процесора ще генерира изключение (exception), водещо до аварийно завършване на уязвимото приложение – (К.К)

    13 тоест позволяват изпълняването на код в стека – (К.К)

    14 изпълнимият стек е необходим на много напълно легални програми, в частност – на компилаторите – (К.К)

    15 в частност, за Windows 2000 това е Service Pack 2 – (К.К)



    << Въведение към защитните стени | The best things in life are free: Mozilla Firefox >>