PDA

View Full Version : 4 подхода към защитата на операционните системи



WarBlaze51
01-09-2012, 13:32
Защо DVD и MP3-плейърите, мобилните телефони и други устройства с вграден софтуер са напълно надеждни и добре защитени, а компютрите не? Това е един неудобен въпрос за компютърната индустрия. Отговорите варират от – „това са гъвкави системи, потребителите имат право да избират, софтуера който да инсталират”, до „информационните технологии са все още млада индустрия”. За потребителите обаче, по-важно е не да получат обяснение, а компютър, който да включат и да ползват години на ред без проблеми, така както ползват своя телевизор и други устройства. Операционната система е има ключово значение от гледна точка на защитата и надеждността. Въпреки че в софтуерните приложения има не малко дефекти, ако операционната система е безгрешна, некоректността на програмите, изпълнявани под нейното управление не би имала толкова голямо значение. Ето защо в тази статия се спираме именно на операционните системи. Преди това обаче ще направим едно терминологично уточнение – какво имаме предвид, когато говорим за надеждност и за защитеност. Например грешка, водеща до препълване на буфера може да предизвика срив в системата – това е проблем свързан с надеждността. Но същата грешка може да дава възможност на хитроумно написан вирус да проникне в компютъра – това вече е проблем свързан със защитеността. Тук се спираме предимно на надеждността, като е очевидно, че нейното подобряване води до подобряване и на защитеността. Защо системите не са надеждни? Съвременните ОС имат 2 особености, които се отразяват отрицателно на тяхната надеждност и защитеност. Първо те са с огромни размери, второ – в тях не са взети достатъчно мерки за изолиране на грешките. Ядрото на Linux има над 2,5 млн. реда код, а на Windows XP – поне 2 пъти повече. В същото време, проучване сочи, че програмите съдържат от 6 до 16 грешки на всеки 1000 реда от изпълнявания код. Друго изследване пък констатира, че грешките на 1000 реда са между 2 и 75, в зависимост от големината на модула. Даже ако приемем долните граници на тези оценки, пак ще се окаже, че броят на грешките в съвременните ОС е огромен. А ситуацията е още по-тревожна, защото около 70% от операционната система представлява драйвери за устройства, при които грешките са 3 до 7 пъти повече, отколкото в друг програмен код. И така, ясно е, че да се намерят и отстранят толкова много грешки не е възможно, да не говорим, че при поправката на една грешка, често се допускат други. Огромният размер на съвременните ОС води и до друг проблем – никой не може да ги изучи в пълни детайли. Много трудно е, но не е невъзможно да се създаде перфектна система, която никой не познава напълно. Необходимо е обаче да се осигури изолация на грешките. Например, едва ли някой познава всички технологии, с които е оборудван едни самолетоносач, но повреда в кухнята му, няма да се отрази на подсистемите за изстрелване на ракети. Операционните системи не разполагат с такава изолация между своите компоненти. Те съдържат стотици процедури, обединени в една програма, работеща като ядро. Ако вирус се добере до една процедура от ядрото, неговото разпространение по всички други процедури не може да бъде спряно. Да се върнем отново на аналогията с кораба-самолетоносач. Неговият корпус е разделен на множество отделения. Ако в едно от тях възникне теч, само то ще бъде наводнено, а не целия трюм. Докато за да бъде „потопена” операционната система е достатъчна една пробойна. За щастие ситуацията не е чак толкова безперспективна. Разработчиците вземат мерки, за създаването на надеждни ОС. Открояват се поне 4 подхода към решаването на тази задача. Тук ще се спрем накратко на тях. Укрепени операционни системи Най-консервативния подход, Nooks [4], е разработен с цел да повиши надеждността на съществуващите ОС – Windows, Linux и др. Технологията поддържа монолитна структура на ядрото, в която стотици или хиляди процедури са обединени в едно адресно пространство и работят като ядро. Подходът се фокусира върху задачата да направи драйверите за устройства (основната причина за проблеми) по-малко опасни. Както се вижда на фиг. 1, Nooks защитава ядрото от некоректни действия на драйвера. Обвивката около всеки драйвер има функцията да следи взаимосействието между драйвера и ядрото. За първи път технологията Nooks е реализирана за Linux, но идеите и са приложими и за други ядра. Проведени тестове сочат, че с този подход се откриват 99% от фаталните грешки на драйверите и 55% от нефаталните. Но както се казва „никой [метод] не е съвършен”. Например драйверите могат да изпълняват привилегировани команди (каквито не се предполага, че им се възлагат), те могат да подават данните към некоректни портове, да изпълняват безкрайни цикли и т.н. Независимо от всичко обаче, Nooks се оценява като една полезна стъпка към повишаването на надеждността на наследените ядра. Паравиртуални машини Вторият подход се базира на концепцията за виртуалната машина, разработена в края на 60-те. Идеята е да се ползва специална управляваща програма, наречена монитор на виртуалната машина, която работи непосредтсвено с хардуера, а не с операционната система. Виртуалната машина създава няколко екземпляра на реалната. Всеки екземпляр може да поддържа работата на всяка програма, която може да се изпълнява на даденото хардуерно оборудване. Този метод често се прилага, например за да се осигури възможността 2 или повече операционни системи да работят на една машина. Използването на виртуални машини има заслужена репутация на метод, който осигурява добре изолацията на грешките. Понеже нито една от виртуалните машини не подозира за съществуването на другите, проблемите, които възникват на едната не могат да се разпространят на другите. Така че някои разработчици предприеха опити да адаптират концепцията за защитата на една операционна система (а не на няколко). В частност, през 90-те група от университета в Карлсруе създаде микроядрото L4 и модифицирана версия на Linux (L4Linux), която да работи върху L4 в режим на виртуална машина. Идеята на групата е да се стартират няколко копия Linux на L4, като една от виртуалните машини да се ползва за работата на приложните програми, друга за работата на драйверите и устройствата. След като драйверите работят на една или няколко виртуални машини, изолирани от основната, където работи останалата час от операционната система и приложните програми, при грешка в драйвера от строя ще излезе само неговата виртуална машина. Предимство на този подход е и че не е нужно да се модифицират драйверите. Мултисървърни ОС Двата подхода, на които се спряхме до тук, са ориентирани към модификация на наследени системи, а следващите 2 - към системите на бъдещето. Първият от тях се базира на идеята, вместо цялата ОС да работи като една гигантска програма в режим на ядро да има няколко неголеми микроядра, а останалата част от операционната система да представлява набор от изолирани сървъри и драйвери, работещи в потребителски режим. Тази концепция е предложена преди 20 години, но през 80-те производителността се считаше за най-важния показател, а недеждността не беше във фокус. Но времената се менят. Идеята за мултисървърна ОС е реализирана в операционната система с отворен код Minix 3. В нея микроядро обработва прекъсванията, предоставя базовите механизми за управление на процесите, реализира взаимодействието между процесите и се грижи за тяхното планиране. Над микроядрото се намира нивото на драйвери на устройства, работeщи в потребителски режим. Кодът на ядрото на Minix 3 е не повече от 4000 реда. Ако приемем оптимистичните оценки за 6 грешки на 1000 реда код, грешките се свеждат до 24.При това загубата на производителност, заради това че драйверите работят в потребителски режим е под 10% и Minix 3 работи достатъчно бързо. Защита на базата на езика Най-радикалният подход към момента е на Microsoft Research. Става дума за система, написана на нов език, гарантиращ сигурен и освободен от проблемите, свързани с указатели и други традиционни грешки, свързани със С и C++. Системата предлагана от Microsoft Research се нарича Singularity и е написана на Sing# - нов език, карантиращ безопасност на типовете. Sing# се базира на C#, но е допълнен с примитиви за предаване на съобщения, семантиката на които се определя от формални, описани със средствата на езика „договори”. Езикът налага строги ограничения на системните и на потребителските процеси, така че всички те могат да работят в единно виртуално адресно пространство. Микроядрото на Singularity контролира достъпа до хардуерните ресурси, резервира и освобождава памет, създава, поддържа синхронизация между процесите с помощта на канали, контролира входно изходните операции. Всеки драйвер работи, като отделен процес. Три от четирите разгледани изследователски проекта паравиртуализация на базата на L4, Minix 3 и Singularity – използват микроядра. И макар че за сега не може да се каже, кой от споменатите подходи ще се наложи, явно микроядрата се върщат в операционните системи в името на надеждността. Колелото на историята се върти. Статията систематизира някои основни моменти от доста по-обширна публикация озаглавена „Как да направим операционните системи надеждни и сигурни?” (Andrew Tanenbaum, Jorrit Herder, Herbert Bos, Can We Make Operating Systems Reliable and Secure?)
----
Извадено от CIO.BG