Архитектура и уязвимость Windows. Решение проблем
Windows NT 3.1, Windows NT 3.5, Windows NT 3.51, Windows NT 4.0, Windows 2000, Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008, Windows 7 и Windows 8, Windows 10 являются частью семейства операционных систем на ядре NT. Все они являются операционными системами с вытесняющей многозадачностью. Они разработаны для работы как с однопроцессорными, так и с симметричными мультипроцессорными компьютерами.
Архитектура Windows NT имеет модульную структуру и состоит из двух основных уровней — компоненты, работающие в режиме пользователя, и компоненты режима ядра. Программы и подсистемы, работающие в режиме пользователя, имеют ограничения на доступ к системным ресурсам. Режим ядра имеет неограниченный доступ к системной памяти и внешним устройствам. Ядро системы NT называют гибридным ядром или макроядром. Архитектура включает в себя само ядро, уровень аппаратных абстракций (HAL), драйверы и ряд служб (Executives), которые работают в режиме ядра (Kernel-mode drivers) или в пользовательском режиме (User-mode drivers).
Пользовательский режим Windows NT состоит из подсистем, передающих запросы ввода-вывода соответствующему драйверу режима ядра посредством менеджера ввода-вывода. Есть две подсистемы на уровне пользователя: подсистема окружения (запускает приложения, написанные для разных операционных систем) и интегрированная подсистема (управляет особыми системными функциями от имени подсистемы окружения). Режим ядра имеет полный доступ к аппаратной части и системным ресурсам компьютера. И также предотвращает доступ к критическим зонам системы со стороны пользовательских служб и приложений.
Так почему система является уязвимой? По информации MS в ОС Windows 2000 содержится 35 – 60 миллионов строк кода, а в Windows XP более 45 миллионов строк кода, который постоянно дорабатывается и модернизируется. Исходный код написан на языках программирования ассемблер, С и С++. Даже в самой Microsoft не совсем точно понимают, что же они разработали. Разбираться в коде очень и очень сложно. Скорее всего Microsoft Windows во всех своих версиях содержит уязвимость, которую исправить невозможно (по мнению некоторых сторонних исследователей в разных версиях подобные Абсолютные Ошибки разные). Лечить её примерно то же самое, как заделывать дыру в середине фундамента, на котором уже стоит многоэтажный дом. Безусловно Microsoft прекрасно осведомлены насчёт наличия Абсолютной ошибки, но не считают её уязвимостью.
Выходом из сложившегося тупика являются Микроядерные ОС, которые могут обрести новую жизнь благодаря потенциальной возможности обеспечивать более высокую надежность:
Надежность Микроядрных ОС происходит из разных источников. Во-первых, размер кода, выполняемого в ядре, составляет около 4000 строк, и общее число ошибок — всего около 24 (на примере микроядра ОС Minix 3). Небольшой размер ядра позволяет верифицировать его код вручную или на основе формальных методов. Особенности IPC позволяют избежать потребности управления буферами в ядре. Кроме того, для каждого процесса ограничены доступные примитивы IPC, включая адреса назначения и события, о которых происходит уведомление. Например, пользовательские процессы могут использовать только принцип рандеву и посылать сообщения только Posix-серверам. В дополнение к этому, все структуры ядра являются статическими. Все эти свойства значительно упрощают код и устраняют ошибки в ядре, связанные с переполнением буферов, «утечку памяти» (memory leak), несвоевременные прерывания и т.д. Конечно, перемещение большей части операционной системы в процессы, выполняемые в режиме пользователя, не устраняют неизбежные ошибки в драйверах и серверах, но это ограничивает их воздействие на систему в целом. Ошибочный код в ядре может испортить критичные структуры данных, записать на диск ненужные данные и т.д.; ошибочный же код в большинстве драйверов и серверов не может принести такого вреда, поскольку эти процессы строго разделены и очень ограничены в своих возможностях.
Еще одной особенностью, повышающей надежность, является использование раздельных пространств команд и данных. Даже если ошибочный код или вирус вызовут переполнение буфера и поместят чужой код в пространство данных, этот код будет невозможно выполнить путем перехода на него, поскольку ядро не запустит код, не находящийся в пространстве команд процесса (доступном только по чтению).
Среди других особенностей, способствующих повышению надежности, наиболее важным является свойство самовосстановления. Если драйвер производит запись по неверному указателю, впадает в бесконечный цикл или дурно ведет себя каким-либо другим образом, то сервер реинкарнации автоматически заменит его, часто без влияния на другие процессы.
Проект Singularity. Наиболее радикальный подход предложен в Microsoft Research. По существу, этот подход отвергает понятие операционной системы как единой программы, выполняемой в режиме ядра, плюс некоторый набор пользовательских процессов, выполняемых в режиме пользователя, и заменяет его системой, написанной на новом типизированном языке, в котором отсутствуют проблемы с указателями и пр., свойственные C и C++. Подобно двум предыдущим, этот подход существует десятилетия. Он использовался в компьютере Burroughs B5000. Тогда единственным доступным языком был Algol, и защита поддерживалась не устройством управления памятью, а за счет невозможности генерации "опасного" кода компилятором языка Algol.
Проект Singularity разработанный в в Microsoft Research предлагает наиболее радикальный подход к разработке надежной ОС построенной на микроядре. Но к Singularity никак не возможно прикрутить Windows API и не возможно перенести Soft написанный под Windows API на эту систему, так что этот теоретический по своему уникальный проект никак не сможет помочь рядовым пользователям MS Windows.
Дата добавления: 2016-12-27; просмотров: 1976;