Erhalten Sie Zugang zu diesem und mehr als 300000 Büchern ab EUR 5,99 monatlich.
Зная, что находится у операционной системы «под капотом», системные администраторы смогут быстро разобраться с поведением системы и решать задачи повышения производительности и диагностики сбоев. Специалистам по безопасности пригодится информация о борьбе с уязвимостями операционной системы. Седьмое издание было полностью переработано под Windows 10/11 и Windows Server (2022, 2019 и 2016). Кроме этого в книгу были добавлены сведения по Hyper-V, полностью переработаны главы о процессе загрузки, новых технологиях хранения данных и механизмах управления Windows. Вы найдете уникальную информацию, основанную на исходном коде Microsoft, и практические эксперименты с применением новейших средств отладки, направленные на демонстрацию особенностей поведения внутренних компонентов Windows. Новые элементы дизайна пользовательского интерфейса, появившиеся в Windows 11, основаны на знакомых по Windows 10 технологиях, поэтому читатели смогут сразу перейти на новый этап развития компьютерных технологий. Для опытных программистов, архитекторов, администраторов и других специалистов по качеству, производительности, безопасности и сопровождению программного обеспечения. Необходимо знание Windows на уровне опытного пользователя.
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 1537
Veröffentlichungsjahr: 2025
Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:
Переводчики Д. Лебедев, С. Черников
Марк Руссинович, Дэвид Соломон, Алекс Ионеску, Андреа Аллиеви
Внутреннее устройство Windows. Ключевые компоненты и возможности. 7-е изд.. — СПб.: Питер, 2024.
ISBN 978-5-4461-2015-4
© ООО Издательство "Питер", 2024
Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.
Моим родителям Габриэле и Данило, а также моему брату Луке, которые всегда в меня верили и поддерживали мое стремление к мечте.
Андреа Аллиеви
Моим жене и дочери, которые всегда верили в меня и были неисчерпаемым источником любви и тепла. Моим родителям, вдохновившим меня следовать своей мечте, и их жертвам ради моих возможностей.
Алекс Ионеску
Андреа Аллиеви (Andrea Allievi) совмещает должности системного программиста и специалиста по безопасности уже более 15 лет. В 2010 году он получил диплом бакалавра по информатике в Миланском университете «Бикокка». В рамках дипломного проекта разработал 64-разрядный диспетчер главной загрузочной записи (MBR), способный обходить любые меры защиты ядра Windows 7, в частности PatchGuard и принудительную проверку подписания драйверов. Кроме того, Андреа имеет большой опыт в обратной разработке и специализируется на внутренних механизмах операционных систем, от ядра до пользовательского режима. Именно он создал первый буткит, обошедший защиту UEFI (который был разработан в научных целях и опубликован в 2012 году), множество хаков PatchGuard, был автором массы научных работ и статей. Его мастерству обязан своим существованием ряд системных утилит, предназначенных для удаления вредоносного программного обеспечения и постоянных серьезных угроз. Свою карьеру он строил во множестве IT-компаний: итальянской TgSoft, SaferBytes (теперь MalwareBytes), а также подразделении Talos корпорации Cisco Systems. Впервые он присоединился к Microsoft в 2016 году в роли специалиста по безопасности Центра защиты информации Microsoft (MSTIC). С января 2018-го Андреа числился старшим инженером ядра ОС подразделения защиты ядра в Microsoft, где в основном занимался инновациями (в частности, Retpoline и Speculation Mitigations) для NT и безопасного ядра.
Андреа остается активным участником сообщества по защите информации, периодически публикуя технические статьи о новинках в ядре Windows, в частности в блоге Microsoft Windows Internals, и выступая на множестве технологических конференций, таких как Recon и Microsoft BlueHat. Подпишитесь на Андреа в Twitter: @aall86.
Алекс Ионеску (Alex Ionescu) — вице-президент направления Endpoint в компании CrowdStrike Inc., где он начинал как сооснователь и главный архитектор. Алекс является специалистом мирового уровня по архитектуре безопасности и консультирующим экспертом в области низкоуровневого программного обеспечения, в разработке ядра, теории безопасности и обратной разработке. Более 20 лет его исследования помогали устранять десятки критических уязвимостей в защите ядра Windows и смежных с ним компонентов, а также множества поведенческих багов.
Ранее Алекс возглавлял разработку ядра ReactOS, клона Windows с открытым исходным кодом, созданного с нуля, где его перу принадлежит большинство Windows NT-подобных подсистем. Во время учебы Алекс работал в Apple, занимаясь там ядром iOS, загрузчиком и драйверами в составе оригинального костяка команды, стоявшей за iPhone, iPad и AppleTV. Наконец, Алекс Ионеску является основателем компании Winsider Seminars & Solutions, Inc., которая специализируется на низкоуровневом системном ПО, обратной разработке и тренингах по безопасности для организаций.
Алекс остается активным участником сообщества и выступает на множестве мероприятий по всему миру. На базе материалов книги «Внутреннее устройство Windows» он предоставляет услуги по обучению и поддержке как организациям, так и частным лицам. Подпишитесь на него в Twitter: @aionescu, а также на его блоги: www.alex-ionescu.com и www.windows--internals.com/blog.
Когда в 1993 году Microsoft выпустила чрезвычайно успешную ОС Windows NT 3.1, я, как человек, применявший ее и обозревавший ее внутреннее устройство, сразу же увидел, как сильно их новый продукт изменит мир. Дэвид Катлер (David Cutler), архитектор и глава разработки Windows NT, создал решение, которое отличалось безопасностью, надежностью и масштабируемостью, но при этом сохранило пользовательский интерфейс и совместимость с ПО, созданным под его старшего, более примитивного собрата. Книга Хелен Кастер (Helen Custer) «Внутри Windows NT» была фантастическим учебником по дизайну и архитектуре системы, но мне казалось, что назрел спрос на книгу еще более детальную. Книга «Внутреннее устройство и структуры данных VAX/VMS», известная как исчерпывающий гид по предыдущему детищу Дэвида Катлера, была настолько близка к исходному коду, насколько это возможно в прозе. Я решил, что напишу аналогичный учебник для Windows NT.
Дело шло медленно. Я был занят написанием диссертации и налаживанием карьеры в небольшой компании. Чтобы изучить Windows NT, я прочел документацию, дизассемблировал ее код и создал такие инструменты мониторинга системы, как Regmon и Filemon. Разработка системных утилит и их использование помогали мне лучше понять устройство Windows NT, так как позволяли обозревать процессы, происходящие «под капотом». В ходе своих изысканий я делился новыми знаниями в ежемесячной колонке «Внутреннее устройство NT» в журнале Windows NT Magazine, предназначенном для системных администраторов. Эти статьи позже легли в основу книги «Внутреннее устройство Windows», для создания которой меня наняло издательство IDG Press.
Сроки сдачи рукописи много раз менялись, так как у меня была основная работа и приходилось заниматься Sysinternals (тогда NTInternals) — бесплатным и коммерческим программным обеспечением в рамках моего стартапа Winternals Software. А в 1996 году Дэйв Соломон поразил меня вторым изданием «Внутри Windows NT». Книга показалась мне одновременно впечатляющей и деморализующей. В ней работа Хелен была полностью пересмотрена, устройство Windows NT описывалось гораздо глубже и масштабнее, как я и сам собирался сделать. В издание вошли уникальные исследования, где применялись встроенные инструменты и диагностические утилиты из наборов Windows NT Resource Kit и Device Driver Development Kit (DDK) и демонстрировались ключевые понятия и процессы. Дэйв поднял планку очень высоко. Мне стало ясно, что написание книги, которая могла бы соперничать с его работой по качеству и глубине, оказалось куда более монументальной задачей.
Как говорится в пословице, если не можешь прекратить процесс, возглавь его. Я знал Дэйва по совместному участию в конференциях по Windows. Не прошло и двух недель с выхода его книги, как я отправил ему электронное письмо с предложением присоединиться к нему в качестве соавтора следующего издания, которое будет посвящено документированию системы, тогда называвшейся Windows NT 5, а позднее переименованной в Windows 2000. Моим вкладом стали бы новые главы, основанные на моей колонке NT Internals, на темы, которые Дэйв не упоминал, а также новые изыскания, для которых использовался пакет Sysinternals. Чтобы приукрасить предложение, я пообещал добавить последний на диск, прилагающийся к книге. Это вполне типичный способ распространения ПО.
Дэйв согласился. Правда, для начала ему нужно было получить разрешение от Microsoft. Я доставил им некоторые проблемы, раскрыв в публичном поле, что Windows NT Workstation и Windows NT Server — идентичные программы, меняющие свое поведение в зависимости от настроек в реестре. И если Дэйв имел полный доступ к исходному коду этих продуктов, я — нет и хотел, чтобы так и оставалось. Так не было бы риска вызвать проблемы с моей интеллектуальной собственностью, а именно с правами на ПО, созданное мною в рамках пакетов Sysinternals или Winternals, чей код опирался на недокументированный API. По удачному совпадению я уже давно восстанавливал отношения с ключевыми инженерами Windows, так что в Microsoft тактично согласились.
Писать вместе с Дэйвом «Внутри Windows 2000» было очень увлекательно. По невероятному совпадению он жил минутах в двадцати от меня (мы оба проживали в штате Коннектикут: я — в Данбери, а он — в Шермане). Мы ходили друг к другу в гости и проводили много времени вместе, копась в коде и исследуя глубины Windows. Было много профессиональных шуток, а попутно мы поднимали технические вопросы, при решении которых соперничали, кто разберется быстрее — он, читая исходный код, или я, вооружившийся отладчиком, дизассемблером и своим пакетом Sysinternals. (Если встретите его, не сыпьте соль на рану, но я всегда побеждал.)
Так я сделался соавтором самого исчерпывающего учебника по внутреннему устройству одной из самых коммерчески успешных операционных систем в истории. Для работы над пятым изданием, где шла речь о Windows XP и Windows Vista, мы пригласили в команду Алекса Ионеску. Алекс известен как один из сильнейших экспертов по операционным системам и обратной разработке в мире. Его участие обеспечило книге еще бо́льшие глубину и кругозор, что позволило ей догнать и превзойти наши и без того высокие стандарты полноты изложения и достоверности. Количество охватываемых тем росло, да и сама система Windows увеличивалась и обрастала новыми возможностями и подсистемами. Наш труд превысил пределы, допустимые для одной книги, как получилось в пятом издании, поэтому пришлось разделить ее на два тома.
Когда начиналась работа над шестым изданием, я уже ушел в Azure. Команда была готова приступить к седьмому изданию, но возможности поучаствовать в создании книги у меня больше не было. Дэйв Соломон завершил карьеру, а задача обновления книги стала еще сложнее в силу того, что Windows перестали выпускать раз в несколько лет с новым номером основной версии, вместо этого ее назвали Windows 10 и стали добавлять новые функции и возможности постоянно. На помощь Алексу для работы над первым томом пришел Павел Йосифович (Pavel Yosifivitch). Но позже и он оказался слишком загружен другими проектами, поэтому принять участие в написании второго тома не смог. Сам Алекс тоже был занят своим стартапом CrowdStrike, так что создание второго тома оказалось под угрозой.
К счастью, нам на помощь пришел Андреа. Вместе с Алексом они обновили немалую часть описания системы, включая процессы ее запуска и завершения работы, подсистему реестра и UWP. Не останавливаясь лишь на актуализации, они добавили три новые главы, где рассматривались Hyper-V, системы работы с файлами и кэшем, диагностика и журналирование. Наследие серии «Внутреннее устройство Windows» как самого технически детального и достоверного руководства о внутренних делах одного из самых важных программных продуктов в истории было спасено, и снова видеть свое имя среди участников — для меня предмет гордости.
Памятный момент в моей карьере наступил, когда мы попросили Дэвида Катлера написать предисловие для книги «Внутри Windows 2000». Я и Дэйв Соломон несколько раз приезжали в Microsoft, чтобы пообщаться с разработчиками Windows, среди которых был и Дэвид. Однако мы не могли сказать, согласится ли он, и были в восторге, когда это случилось. Очень необычно мне теперь ощущать себя с другой стороны, на месте Дэвида, и я почитаю за честь такую возможность. Я надеюсь, что похвалы, возданные мною в предисловии к этой книге, убедят вас в том, что она достоверна, ясна и понятна, как убедило предисловие Дэвида Катлера покупателей «Внутри Windows 2000».
Марк Руссинович (Mark Russinovich), технический директор и стипендиат проекта Azure, Microsoft
Март 2021 года, Белвью, Вашингтон
Книга «Внутреннее устройство Windows» (7-е изд., т. 2) предназначена для профессионалов в области информационных технологий — разработчиков, специалистов по защите информации и системных администраторов, которые желают понять, как устроены компоненты ядра операционных систем Windows 10 (вплоть до обновления, выпущенного в мае 2021 года и известного как 21H1) и Windows Server (с Server 2016 до Server 2022), включая множество тех, что присутствуют также в Windows 11X и операционной системе Xbox. Эти знания призваны помочь разработчикам лучше понимать обоснованность технических решений, принимаемых при построении приложений специально для платформы Windows, и лучше выбирать путь при создании мощных, масштабируемых и безопасных программных продуктов. Они помогут им отточить свои навыки отладки сложных проблем, корни которых тянутся глубоко в сердце системы. Попутно читатель освоит ряд утилит, которые будут очень полезны в дальнейшем.
Наконец, специалисты по защите информации смогут лучше понимать, когда приложения и операционная система могут вести себя ненормально, получилось это случайно или по чьему-то умыслу. Книга расскажет, какие функции безопасности, страхующие от подобных ситуаций, существуют в современных версиях Windows. Эксперты-криминалисты узнают, как пользоваться системными структурами данных и сервисами для поиска следов вторжения и как система сама их обнаруживает.
Кем бы ни был читатель этой книги, из нее он узнает очень многое о том, как работают системы семейства Windows и почему они ведут себя так, а не иначе.
Перед вами седьмое издание книги, которая изначально называлась «Внутри Windows NT» (Microsoft Press, 1992) и была написана Хелен Кастер (еще до первоначального релиза Microsoft Windows NT 3.1). Она стала самой первой книгой о Windows NT, где рассматривались ключевые вопросы архитектуры и дизайна данной системы.
Второе издание книги «Внутри Windows NT» (Microsoft Press, 1998) создано Дэвидом Соломоном. К материалу предшественника была добавлена информация о Windows NT 4.0, а заодно существенно детализирован разбор технической стороны.
Третье издание книги «Внутри Windows 2000» (Microsoft Press, 2000) было написано Дэвидом Соломоном и Марком Руссиновичем. Там затрагивалось много новых тем, таких как запуск и завершение работы системы, внутреннее устройство служб, реестр и драйверы файловой системы, а также взаимодействие с сетью. Рассматривались изменения функций ядра Windows 2000, таких как Windows Driver Model (WDM), Plug and Play, управление питанием, инструментарий управления Windows (WMI), криптография, объекты заданий и службы терминалов.
В четвертом издании, названном «Внутреннее устройство Windows» (Microsoft Press, 2004), были описаны Windows XP и Windows Server 2003, появилось больше информации о том, как эффективнее пользоваться своими знаниями, в частности, о применении ключевых инструментов из пакета Windows SysInternals и анализе аварийных дампов.
Пятое издание книги «Внутреннее устройство Windows» (Microsoft Press, 2009) получило обновление до Windows Vista и Windows Server 2008. В числе авторов появился Алекс Ионеску, сменивший Марка Руссиновича, поступившего на работу в Microsoft, где он теперь является техническим директором Azure. Среди новых тем — загрузчик образов, отладчик пользовательского режима, продвинутый локальный вызов процедур (ALPR) и Hyper-V.
В шестом издании «Внутреннего устройства Windows» (Microsoft Press, 2012) были исчерпывающе изложены изменения ядра в Windows 7 и Windows Server 2008 R2 и добавлены примеры для отражения изменений в наших инструментах.
Вышло так, что число страниц шестого издания оказалось больше, чем можно напечатать в современных условиях, поэтому оно стало первым, которое разделили на два тома. Заодно это позволило авторам опубликовать часть книги раньше (том 1 вышел в марте 2012-го, том 2 — в сентябре). Впрочем, в тот раз это решение было принято исключительно из-за количества страниц, так что порядок следования глав оставался таким же, как в предыдущих изданиях.
После выхода шестого издания Microsoft запустила процесс конвергенции ОС, в ходе которого сначала были объединены ядра Windows 8 и Windows Phone 8, а за этим последовали более современные среды выполнения приложений из Windows 8.1, Windows RT и Windows Phone 8.1. Венцом всему стала Windows 10, способная работать на настольных ПК, лэптопах, серверах, консолях XBox One, HoloLens и различных приборах, подключенных к Интернету вещей (IoT). Это великое воссоединение обозначало, что пришло время очередного издания, куда можно будет включить нововведения за без малого пять лет разработки.
В седьмом издании (Microsoft Press, 2017) авторы так и поступили, впервые пригласив Павла Йосифовича, заменившего Дэвида Соломона в роли «своего человека» в Microsoft и в целом ставшего менеджером проекта. Работая вместе с Алексом Ионеску, который, как и Марк, продолжил свой путь на новой основной работе в CrowdStrike (где он теперь вице-президент VP направления Endpoint), Павел принял решение переписать главы книги так, чтобы каждая часть была изложена последовательно и читателю не приходилось дожидаться второго тома, где завершалось бы разъяснение тем из первого. Это позволило тому 1 стать самостоятельным произведением, где читатель знакомится с ключевыми компонентами архитектуры системы Windows 10, управления процессами, планирования потоков, управления памятью, систем ввода/вывода, систем безопасности пользователей, данных и платформы. В этом томе рассматриваются аспекты Windows 10 вплоть до версии 1073, обновления, выпущенного в мае 2017 года, а также Windows Server 2016.
После того как Алекс Ионеску и Марк Руссинович полностью посвятили себя основной работе, а Павел ушел на другие проекты, для тома 2 много лет не могли найти основного автора. Команда была очень благодарна Андреа Аллиеви, который решился взвалить на себя труд завершить серию. С Алексом в роли советника и наставника он имел полный доступ к базе исходных кодов Microsoft, как все соавторы до него. Впервые за историю серии Андреа, являясь полноправным участником команды разработки ядра Windows, привнес новое ви́дение и существенно переработал книгу.
Рассудив, что главы о взаимодействии с сетью и анализе аварийных дампов неактуальны для современного читателя, вместо них он добавил совершенно новое описание Hyper-V, что теперь является одной из ключевых частей стратегии платформы Windows как для клиентских систем, так и в рамках Azure. Вдобавок в книге появились полностью переписанные главы о процессе загрузки системы, новых технологиях хранения данных, таких как ReFS и DAX, и масса обновлений, относящихся к системным и административным механизмам. Практические примеры были полностью переработаны, чтобы продемонстрировать новые возможности отладчика и инструментальных средств.
Длительное ожидание выхода тома 2 позволило обеспечить соответствие книги последней публичной сборке Windows 10, версии 2103 (май 2021-го, 21H1), включая редакции Windows Server 2019 и 2022. Так читатели не отстанут после столь долгой паузы. Поскольку Windows 11 строится на основе ядра той операционной системы, они будут готовы к работе и с этой новой версией.
Даже не имея доступа к исходным кодам, вы сможете «увидеть» немалую часть внутреннего устройства Windows благодаря отладчику ядра, пакету SysInternals и утилитам, созданным специально для этой книги. Когда какой-то инструмент может быть использован для демонстрации некоторой особенности внутреннего поведения Windows, пошаговое рассмотрение того, как это сделать, будет размещаться во врезках, озаглавленных «ЭКСПЕРИМЕНТ». Они разбросаны по всей книге, и мы настоятельно рекомендуем по ходу чтения попробовать выполнить описанное. Живое доказательство того, что происходит внутри Windows, даст вам больше впечатлений, чем если вы просто прочтете об этом.
Windows — это большая и сложная операционная система. Данная книга не рассматривает темы, смежные с вопросами внутреннего устройства Windows, а фокусируется исключительно на базовых компонентах системы. К примеру, здесь не рассказывается о COM+ — распространяемой в составе Windows инфраструктуре для объектно-ориентированного программирования, как и о .NET Framework — платформе для приложений с управляемым кодом. Эта книга не для пользователей, программистов или системных администраторов, она именно о внутреннем устройстве. Научить программировать, настраивать или использовать Windows в ее задачи не входит.
Описанное в книге поведение архитектуры и процессов операционной системы Windows, таких как внутренние функции и структуры ядра, публично не документировано. Это значит, что оно может произвольно изменяться между релизами продукта. Мы не утверждаем, что оно поменяется обязательно, но и на обратное рассчитывать нельзя. Любое программное обеспечение, опирающееся в своей работе на недокументированный внутренний функционал или конфиденциальные сведения об операционной системе, может перестать работать в следующей версии Windows. Хуже того, программы, работающие на уровне ядра (в частности, драйверы устройств) и применяющие недокументированные возможности, рискуют в новых версиях Windows вызвать отказ системы, ставя под серьезную угрозу данные тех, кто ими воспользуется.
Проще говоря, настоятельно не рекомендуется применять предназначенные для внутреннего использования Windows функции, разделы реестра, механики, API и другую недокументированную информацию из данной книги для разработки любого программного обеспечения для конечных пользователей. Да и с любой другой целью, кроме исследования и документирования. По всем вопросам следует обращаться к официальной документации в рамках MSDN (Microsoft Software Development Network).
Мы предполагаем, что читатель работает с Windows на уровне опытного пользователя, знаком с основными понятиями из области операционных систем и аппаратного обеспечения, такими как регистры процессора, память, процессы и потоки. При чтении некоторых глав окажется полезным базовое знакомство с функциями, указателями и прочими понятиями языка программирования C.
Как и предыдущее, шестое издание, данная книга разделена на два тома, второй из которых сейчас перед вами.
• Глава 8 «Системные механизмы» рассказывает о важнейших внутренних механизмах, используемых операционной системой для предоставления драйверам устройств и приложениям ключевых служб, в частности ALPC, диспетчера объектов и процедур синхронизации. Кроме того, раскрываются детали аппаратной архитектуры в основе Windows, в том числе обработка системных прерываний, сегментация, уязвимости сторонних каналов и предосторожности, принимаемые для того, чтобы их избежать.
• Глава 9 «Технологии виртуализации» описывает, как операционная система Windows применяет технологии виртуализации, реализованные в современных процессорах, чтобы дать пользователям возможность запускать по несколько виртуальных машин в одной системе. Кроме того, виртуализация позволяет Windows выводить безопасность на новый уровень. Поэтому в главе активно обсуждаются технологии безопасного ядра и изолированного пользовательского режима.
• Глава 10 «Управление, диагностика и трассировка» разъясняет фундаментальные механизмы операционной системы, предназначенные для управления ею, а также ее настройки и диагностики. В частности, рассматриваются реестр Windows, службы, WMI и планировщик задач. Представлены диагностические инструменты, такие как служба событий и DTrace.
• Глава 11 «Кэширование и файловые системы» описывает, как самые важные компоненты системы хранения данных, такие как диспетчер кэша и драйверы файловой системы, взаимодействуют, чтобы позволить Windows эффективно и безотказно работать с файлами, папками и дисковыми устройствами. В главе рассмотрены поддерживаемые Windows файловые системы, особенно подробно — NTFS и ReFS.
• Глава 12 «Запуск и завершение работы системы» описывает порядок операций, выполняющихся при запуске и завершении работы, и компоненты операционной системы, задействованные в процессе загрузки. В главе также приводится анализ таких новых технологий, как Secure Boot, Measured Boot и Secure Launch.
В книге применяются следующие шрифтовые выделения.
• Рубленымшрифтом выделены элементы управления, названия клавиш и электронные адреса.
• Курсивом обозначены ранее не упоминавшиеся термины.
• Фрагменты кода и текст, который вам следует где-то ввести, обозначены моношириннымшрифтом.
• Первые буквы названий диалоговых окон и элементов управления в них пишутся прописными буквами.
• Сочетания горячих клавиш указываются со знаком плюс между названиями. К примеру, Ctrl+Alt+Delete означает требование одновременно нажать клавиши Ctrl, Alt и Delete.
Приводимые в книге сложные технические сведения и стоящую за ними логику часто нелегко описать и понять неспециалисту. На протяжении своей истории серия давала двойное преимущество. С одной стороны, составляющие ее книги освещали сторонние исследования по обратной разработке (reverse-engineering), а с другой — сотрудники или подрядчики из Microsoft могли заполнить пробелы в них, имея доступ к огромной базе знаний, сокрытой в стенах Microsoft, и богатейшей истории разработки операционных систем Windows. В случае тома 2 седьмого издания это заслуга лично Андреа Аллиеви. Команда выражает ему благодарность за участие в роли основного автора и помощь в доведении до конца работы над большей частью книги и ее обновленным содержимым.
Вместе с тем эта книга не обладала бы технической глубиной и достоверностью без рецензирования, комментариев и поддержки от ключевых участников команды разработки Windows, других экспертов из Microsoft и иных коллег, друзей и экспертов в различных областях.
Отдельного упоминания заслуживает то, что переписанная глава 9 «Технологии виртуализации» не была бы столь полной и подробной без помощи Александра Греста (Alexander Grest) и Джона Ланге (Jon Lange), экспертов мирового класса, которые заслуживают особой благодарности за все те дни, когда они помогали Андреа разобраться в наиболее запутанных функциях гипервизора и безопасного ядра (Secure Kernel).
Алекс хотел бы выразить особую благодарность Аруну Кишану (Arun Kishan), Мехмету Игану (Mehmet Iyigun), Дэвиду Вестону (David Weston) и Энди Лурсу (Andy Luhrs), которые продолжают поддерживать книгу и обеспечивают ему возможность получать доступ к людям и информации внутри фирмы, чтобы сделать работу достоверной и законченной.
Мы хотим поблагодарить людей, которые предоставили технические рецензии и/или исходный материал для книги либо просто поддерживали авторов и помогали им: Саар Амар (Saar Amar), Крэйга Баркхауза (Craig Barkhouse), Мишель Бержерон (Michelle Bergeron), Джо Бялека (Joe Bialek), Кевина Броаса (Kevin Broas), Омара Кэри (Omar Carey), Нила Кристиансена (Neal Christiansen), Крис Ферналд (Chris Fernald), Стивена Финнигана (Stephen Finnigan), Элию Флорио (Elia Florio), Джеймса Форшоу (James Forshaw), Эндрю Харпера (Andrew Harper), Бена Хиллиса (Ben Hillis), Говарда Капустейна (Howard Kapustein), Сарухана Карадемира (Saruhan Karademir), Криса Клейнханса (Chris Kleynhans), Джона Ламберта (John Lambert), Аттилио Майнетти (Attilio Mainetti), Билла Мессмера (Bill Messmer), Мэта Миллера (Matt Miller), Джейка Ошинса (Jake Oshins), Саймона Поупа (Simon Pope), Джордана Рабета (Jordan Rabet), Лорен Робинсон (Loren Robinson), Арупа Роя (Arup Roy), Ярдена Шафира (Yarden Shafir), Андрея Шеделя (Andrey Shedel), Джейсона Ширка (Jason Shirk), Акселя Суше (Axel Souchet), Атула Талесару (Atul Talesara), Сатоси Танду (Satoshi Tanda), Педро Тейшейру (Pedro Teixeira), Габриэля Виалу (Gabrielle Viala), Нэйта Уорфилда (Nate Warfield), Мэтью Вулмана (Matthew Woolman) и Адама Заброцки (Adam Zabrocki).
Хочется еще раз поблагодарить Илфака Гуилфанова (Ilfak Guilfanov) из компании Hex-Rays (http://www.hex-rays.com) за предоставленные Алексу Ионеску лицензии на использование IDA Pro Advanced и Hex-Rays, в том числе за их недавнее пожизненное продление, что сыграло большую роль в ускорении обратной разработки ядра Windows. Команда Hex-Rays продолжает поддерживать Алекса, включая в каждый релиз полезные ему опции декомпилятора, что позволяет работать над такой книгой, как эта, не имея доступа к исходному коду системы.
Наконец, авторы выражают огромную признательность коллективу сотрудников Microsoft Press (Pearson), которые поспособствовали тому, что наша книга стала реальностью. Лоретта Ятес (Loretta Yates), Чарви Арора (Charvi Arora) и их коллеги — все заслуживают отдельного упоминания за их бесконечное терпение, начиная с подписания контракта в 2018-м и до выхода книги в свет через два с половиной года.
Мы не прощаемся! Посетите наш Twitter: @MicrosoftPress.
Уважаемые читатели! Не удивляйтесь, что эта книга начинается с восьмой главы. Авторы разделили свой труд на две части. Первая часть книги вышла в издательстве «Питер» в 2019 году. В ней рассмотрены следующие темы.
Глава 1. Концепции и средства.
Глава 2. Архитектура системы.
Глава 3. Процессы и задания.
Глава 4. Потоки.
Глава 5. Управление памятью.
Глава 6. Подсистема ввода/вывода.
Глава 7. Безопасность.
К этому изданию прилагается набор утилит, которые помогут вам в выполнении экспериментов. Их можно скачать по адресу https://storage.piter.com/support_insale/files_list.php?code=978544612015&partner=3401.
Ваши замечания, предложения, вопросы отправляйте по адресу [email protected] (издательство «Питер», компьютерная редакция).
Мы будем рады узнать ваше мнение!
На веб-сайте издательства www.piter.com вы найдете подробную информацию о наших книгах.
Операционная система Windows предоставляет ряд основных механизмов, используемых такими компонентами режима ядра, как исполнительная система, ядро и драйверы устройств. В данной главе рассматриваются следующие системные механизмы и описывается порядок их использования.
• Модель выполнения кода процессором, включая понятие уровней колец, сегментация, состояния задач, диспетчеризация системных прерываний, отложенный вызов процедур (deferred procedure call, DPC), асинхронный вызов процедур (asynchronous procedure call, APC), таймеры, рабочие потоки системы, диспетчеризация исключений и диспетчеризация системных служб.
• Барьеры спекулятивного выполнения и другие средства защиты от уязвимостей по линии приложений.
• Диспетчер объектов.
• Синхронизация, включая спин-блокировки, объекты диспетчера ядра, порядок реализации ожиданий, а также примитивы синхронизации, относящиеся к пользовательскому режиму, такие как адресованные ожидания, условные переменные, тонкие блокировки «чтение — запись» (slim reader-writer, SRW).
• Продвинутый локальный вызов процедур (Advanced Local Procedure Call, ALPC).
• Средство уведомлений Windows (Windows Notification Facility, WNF).
• WoW64.
• Фреймворк отладки для пользовательского режима.
Дополнительно в главе подробно описываются универсальная платформа Windows (Universal Windows Platform, UWP) и набор служб как пользовательского режима, так и режима ядра, на работу которых она опирается, в частности:
• пакетных приложений и службы развертывания AppX;
• приложений Centennial и Windows Desktop Bridge;
• диспетчера состояний процессов (Process State Management, PSM) и диспетчера жизненного цикла процессов (Process Lifetime Manager, PLM);
• модератора активности хоста (Host Activity Moderator, HAM) и модератора фоновой активности (Background Activity Moderator, BAM).
Современные микропроцессоры способны вычислять и перемещать данные между своими внутренними регистрами очень быстро (счет идет на пикосекунды). Но сами эти регистры — очень ограниченный ресурс. В связи с этим операционной системе и приложениям приходится постоянно требовать от процессора перемещать данные из регистров в память и обратно. Существуют различные типы памяти, к которым он может обратиться. Память, находящаяся на самом процессоре и доступная непосредственно из блока исполнения, называется «кэш» и известна своей скоростью и дороговизной. Память, доступная по внешней шине, обычно называется RAM (Random Access Memory) и характеризуется низкой скоростью, малой стоимостью и большим объемом. Близость памяти к процессору помещает ее в некоторую иерархию, положение в которой зависит от скорости и физических размеров (чем ближе память к процессору, тем она быстрее и миниатюрнее). Как показано на рис. 8.2, в современных компьютерах процессоры часто имеют три уровня быстрой кэш-памяти, доступной каждому физическому ядру: L1, L2 и L3. Первые два ближе всех, и у каждого ядра процессора они свои. Кэш L3 дальше всех и всегда общий для всех ядер (заметим, что у встраиваемых процессоров кэш L3, как правило, отсутствует).
Одной из важнейших характеристик кэша является время доступа к нему, сравнимое с временем обращения к регистрам процессора (однако еще медленнее). Тем не менее обращение к основной памяти длится в сотни раз дольше. Это значит, что, если процессор будет исполнять все инструкции по порядку, он столкнется с большими паузами, вызванными попытками достучаться туда. Для решения этой проблемы в современных архитектурах прибегают к различным стратегиям. Исторически они привели к изобретению атак по сторонним каналам (также известных как спекулятивные атаки), очень эффективных при преодолении средств защиты пользовательских систем.
Рис. 8.2. Кэши и память современных процессоров, их средние размеры и время отклика
Чтобы правильно описать природу аппаратных атак по сторонним каналам и способы, которыми Windows борется с ними, следует рассмотреть несколько основных принципов работы внутренних механизмов процессора.
Современный микропроцессор исполняет машинный код с помощью своего вычислительного конвейера. Тот включает в себя множество стадий, в числе которых — прочтение команды, декодирование, переименование и распределение регистров, переупорядочение, исполнение и фиксация результата выполнения. Когда процессору требуется обойти проблему медленной памяти, типичной стратегией является придание исполнительному устройству способности выполнять команды не по порядку, а в зависимости от готовности необходимых ресурсов. Таким образом, процессор обрабатывает код нелинейно, что позволяет максимально продуктивно задействовать все исполнительные устройства его ядра. Современный процессор способен исполнять сотни команд спекулятивно, пока однозначно не наступит момент, когда они потребуются, а их результат будет зафиксирован.
Одну из проблем описанного подхода создают команды условного перехода. Вычисление условия определяет два возможных пути дальнейшего продвижения по коду. Какой из них верен, зависит от команд, исполненных ранее. Когда этим командам требуется доступ к медленной памяти, могут возникать простои. В таком случае исполнитель ожидает, пока результат выполнения команд, определяющих условие, не будет зафиксирован (а именно, ожидание шины памяти, пока та обеспечивает доступ), чтобы потом продолжить внеочередное выполнение команд по корректному пути. Похожая проблема возникает при непрямом переходе. В этом случае исполнительное устройство не в курсе того, в какое место в коде произойдет переход (обычно это прыжок или вызов), поскольку целевой адрес еще нужно извлечь из основной памяти. В такой ситуации под спекулятивным выполнением подразумевается, что конвейер процессора декодирует и исполняет по нескольку команд параллельно, или, иными словами, вне очереди. Тем не менее результаты их исполнения не помещаются в регистры процессора, а запись данных в память откладывается по тех пор, пока условие перехода не будет окончательно вычислено.
Откуда процессор узнает, код с какой ветви (перехода) должен исполняться, до того, как условие перехода будет полностью вычислено? (Та же проблема и с непрямыми переходами, целевой адрес которых заранее не известен.) Решение реализуется двумя компонентами в составе процессора: блоком предсказания переходов и блоком предсказания целей переходов.
Блок предсказания переходов (branch prediction) — это сложная цифровая схема в составе процессора, которая старается предугадать, какой вариант перехода будет выбран, до того, как это станет однозначно известно. Подобно ему, блок предсказания цели переходов — это устройство, задачей которого является предсказание адреса перехода прежде, чем тот станет известен. Хотя аппаратная реализация этих компонентов может серьезно различаться в зависимости от производителя процессора, оба они имеют доступ к служебному кэшу, который называется буфером предсказания переходов (Branch Target Buffer, BTB). В нем сохраняются адреса переходов или информация о результатах исходных переходов, выполненных ранее, с использованием хеш-меток, получаемых с помощью индексирующего алгоритма, подобно тому как кэш формирует метки (речь об этом пойдет в следующем разделе). Адрес перехода помещается в буфер после первого его выполнения. Как правило, в таком случае вычислительный конвейер приостанавливается, пока процессор дожидается, когда условие или адрес перехода будут получены из основной памяти. При следующем выполнении того же перехода адрес из буфера будет использован для помещения предсказанной цели в конвейер. На рис. 8.3 показана простая схема типового блока предсказания переходов.
Рис. 8.3. Схема типового блока предсказания переходов процессора
В случае неправильного предсказания, когда неверный переход уже выполнен спекулятивно, вычислительный конвейер очищается, а результаты такого выполнения отменяются. В конвейер загружается код с альтернативного пути, а выполнение начинается с верного перехода. Такая ситуация называется ошибочным предсказанием ветви (branch misprediction). Общее число затраченных циклов процессора не превышает ожидания вычисления условия или получения адреса непрямого перехода при очередном выполнении. Однако спекулятивное выполнение все еще может страдать от различных побочных эффектов, таких как загрязнение строк кэша процессора.
К несчастью, некоторые побочные эффекты могут быть использованы со злым умыслом, что ставит под угрозу безопасность системы в целом.
Как говорилось ранее, кэшем процессора называется быстрая память, используемая для ускорения чтения/записи данных или кода. Информация перемещается между памятью и кэшем блоками фиксированной длины (обычно по 64 или 128 байт), которые называются строками (блоками) кэша (lines, cache blocks). Когда строка копируется из памяти в кэш, создается запись кэша. Она включает в себя скопированные данные и метку, идентифицирующую запрошенную область памяти. В отличие от буфера предсказания целей переходов кэш всегда индексируется по физическим адресам (в ином случае было бы сложно отслеживать множество типов отображения и изменения адресных пространств). С точки зрения кэша физический адрес делится на несколько частей. Старшие биты обычно служат меткой, а младшие идентифицируют саму строку и смещение до ее начала. Задачей метки является уникальная идентификация того, к какому блоку памяти принадлежит блок кэша, как показано на рис. 8.4.
Рис. 8.4. Типовой 48-битный одноканальный кэш процессора
Всякий раз, когда процессор выполняет чтение из какой-либо области памяти или запись в нее, в первую очередь проверяется соответствующая запись в кэше (в рамках всех строк кэша, где могут быть данные с целевого адреса; разные кэши действуют по-разному, о чем пойдет речь далее в этом разделе). Если процессор обнаружит содержимое запрошенной памяти в кэше, происходит попадание в кэш. В таком случае в найденной строке немедленно производится чтение/запись данных. Иначе же наблюдается промах кэша. В таком случае процессор создает в кэше новую запись и копирует туда данные из основной памяти, лишь затем давая к ним доступ.
На рис. 8.4 представлен одноканальный процессорный кэш, он предназначается максимум для 48 бит виртуального адресного пространства. В данном примере процессор считывает 48 байт по виртуальному адресу 0x19F566030. Содержимое памяти сначала копируется из основной памяти в блок кэша 0x60. Он заполнен под завязку, но запрошенные данные начинаются по смещению 0x30. Данный типовой кэш содержит всего 256 блоков по 256 байт, так что блок 0x60 может соответствовать сразу нескольким физическим адресам. Метка (0x19F56) обеспечивает уникальную идентификацию физического расположения данных в основной памяти.
Когда от процессора требуется записать в память по указанному адресу что-то новое, он поступает похожим образом. Сначала обновляется строка (-и) кэша, к которой целевой адрес имеет отношение. В какой-то момент процессор отразит новые данные в оперативной памяти. Конкретное время будет зависеть от способа кэширования (обратная/сквозная запись, без кэша и т.д.), используемого для искомой страницы памяти. (Следует отметить, что это важнейшая проблема в работе многопроцессорных систем: чтобы избежать ситуаций, когда другой процессор пытается работать с данными, устаревшими в результате обновления блока кэша основным процессором, необходимо иметь некий протокол согласованности кэша. Существует ряд алгоритмов обеспечения согласованности кэша, но в книге они не рассматриваются.)
Когда случается промах кэша и требуется место для новой записи, процессору иногда приходится освобождать одну из ранее занятых. Алгоритм, который кэш использует для определения того, что освобождать (и выбора, где записать новые данные), называется политикой размещения. Если согласно этой политике всегда происходит замена только одного блока для конкретного виртуального адреса, такой кэш называется кэшем прямого отображения (кэш на рис. 8.4 является одноканальным прямого отображения). Если же кэш вправе выбрать любую запись (с тем же номером блока кэша) для записи новых данных, он называется полностью ассоциативным. Зачастую политика размещения в кэше подразумевает компромисс, при котором каждая запись в основной памяти может отразиться в любом из N мест в кэше, и тогда кэш называется N-канальным секторно-ассоциативным. На рис. 8.5 представлен четырехканальный секторно-ассоциативный кэш. В нем можно разместить до четырех разных физических адресов, индексируемых в один блок (с разными метками) в четырех разных секторах кэша.
Рис. 8.5. Четырехканальный секторно-ассоциативный кэш
Как говорилось ранее, исполнительные устройства современных процессоров не фиксируют результаты вычислений до тех пор, пока команда не считается окончательно выполненной. Это приводит к тому, что, несмотря на возможность внеочередного выполнения сразу множества инструкций без заметных архитектурных эффектов с точки зрения регистров процессора и памяти, проявляются побочные микроархитектурные эффекты, особенно для процессорного кэша. В конце 2017 года были выявлены новые способы атак на процессоры через их механизмы внеочередного исполнения и блоки предсказания переходов. Дело в том, что микроархитектурные побочные эффекты можно отследить, даже не имея возможности напрямую влиять на них из любого программного кода.
Два наиболее разрушительных и эффективных способа таких атак известны как Meltdown и Spectre.
Meltdown (впоследствии ставшая известной как Rogue Data Cache Load (загрузка в кэш мошеннических данных), RDCL) позволяла злонамеренному процессу пользовательского режима получать доступ ко всей памяти, даже к памяти ядра, что в обычной ситуации не позволяется. При атаке были использованы механизмы внеочередного выполнения в процессоре и разница во времени между доступом к памяти и проверкой привилегий при выполнении команд этого доступа.
В рамках реализации Meltdown процесс злоумышленника сначала вызывает полное очищение кэша (команды для этого доступны из пользовательского режима). Затем он делает нелегальный запрос доступа к памяти ядра, за которым сразу идет набор команд, заполняющих кэш предопределенным образом, задействуя массив в роли зонда. Доступа к памяти ядра процесс не получает, а процессор, в свою очередь, выдает исключение, которое отлавливается приложением. В иной ситуации все закончилось бы завершением процесса. Однако в условиях внеочередного выполнения процессор уже параллельно выполнил команды, следовавшие за отклоненным запросом к памяти ядра (но не зафиксировал, из-за чего никаких архитектурных эффектов не проявится ни в оперативной памяти, ни в регистрах процессора). Те команды, в свою очередь, уже заполнили кэш содержимым памяти ядра, к которому их не должны были допустить.
Затем приложение злоумышленника зондирует весь кэш, замеряя время, необходимое для доступа к каждой странице массива, использованного для заполнения блока кэша. Если время доступа не превышает некоторого предела, то данные присутствуют в строке кэша. Это позволяет злоумышленнику в точности воспроизвести байт, прочитанный из памяти ядра. Рисунок 8.6, заимствованный из оригинальной публикации о Meltdown (доступна по адресу https://meltdownattack.com/), демонстрирует время доступа с помощью массива-зонда размером 1 Мбайт (256 страниц по 4 Кбайт).
На рис. 8.6 видно, что время доступа ко всем страницам, кроме одной, примерно одинаковое. Если предположить, что засекреченные данные могут быть прочитаны по 1 байт за раз, а 1 байт может представить лишь 256 значений, то, зная точно, какая страница в массиве вызвала попадание в кэш, злоумышленник может определить байт, находящийся в памяти ядра.
Рис. 8.6. Расход процессорного времени при доступе к массиву-зонду в 1 Мбайт
Принцип атаки Spectre похож на принцип Meltdown и опирается на уязвимости внеочередного выполнения, описанные ранее. Однако в этом случае злоумышленник атакует другие важные компоненты процессора, а именно блок предсказания переходов и буфер предсказания целей переходов. Изначально были изучены два варианта Spectre. Оба можно свести к трем шагам.
1. В подготовительной фазе от лица низкопривилегированного процесса, который контролирует злоумышленник, исполняется множество повторяющихся операций с целью навязать блоку предсказания переходов неправильное обучение. В результате процессор приучается исполнять заданную ветку условного перехода либо непрямой переход по хорошо известному адресу.
2. Во второй фазе злоумышленник принуждает атакуемое привилегированное приложение (или такой же процесс) спекулятивно выполнить команды, находящиеся по адресу неверно предсказанного перехода. Зачастую эти команды переносят конфиденциальную информацию из контекста жертвы в микроархитектурный канал (обычно это процессорный кэш).
3. В финальной фазе снова от лица низкопривилегированного процесса злоумышленник воспроизводит оказавшиеся в кэше (микроархитектурном канале) чужие данные путем зондирования его тем же способом, что и при атаке Meltdown. Так в его руки попадает секретная информация из закрытого привилегиями жертвы адресного пространства.
Первый вариант атаки Spectre позволяет воспроизвести секреты, сокрытые в адресном пространстве процесса жертвы (которое может быть как раздельным, так и общим с адресным пространством процесса злоумышленника), принудив блок предсказания переходов дать процессору спекулятивно выполнить код по неверной ветви условного перехода. Обычно это оказывается часть функции, которая проверяет границы перед тем, как получить доступ к несекретным данным в буфере памяти. Если этот буфер находится рядом с секретными данными, а злоумышленник может контролировать смещение, передаваемое в условие перехода, ею можно натренировать блок предсказания корректными значениями, которые проходят проверку и указывают процессору верный путь.
Затем злоумышленник подготавливает кэш процессора нужным образом (в частности, так, чтобы размер буфера памяти, используемый для проверки, отсутствовал в кэше) и передает в функцию, выполняющую проверку границ, неверное смещение. Блок предсказания переходов уже обучен всегда следовать одному верному выбору. Однако в этот раз путь будет неверен (нужно было идти по другому маршруту). Команды доступа к буферу будут выполнены спекулятивно, но результат прочитан за пределами допустимых границ, из секретных данных. Наконец, злоумышленник считывает их к себе путем полного зондирования кэша, как при атаке Meltdown.
Второй вариант Spectre злоупотребляет поведением буфера предсказания переходов процессора — злоумышленник может искажать непрямые переходы. Неверная цель непрямого перехода может быть использована для прочтения любой памяти процесса-жертвы (или ядра ОС) из зловредного контекста. Как показано на рис. 8.7, так злоумышленник провоцирует заполнение буфера целей переходов опасными адресами. В конечном счете процессор решается спекулятивно выполнить команды по переходу, нужному для атаки. В рамках адресного пространства жертвы адрес перехода будет указывать на гаджет. Гаджет — это группа команд, которая обращается к закрытым данным, отчего те предсказуемо попадают в кэш (злоумышленнику потребуется косвенно контролировать один или несколько регистров процессора в контексте жертвы, что зачастую возможно в тех случаях, когда API принимает непроверенные данные).
После того как блок предсказания переходов будет натренирован, злоумышленник очищает кэш процессора, а затем обращается к службе (интерфейсу), предоставляемой высокопривилегированной целью — процессом или ядром ОС. Код, в котором реализуется служба, должен иметь непрямые переходы, похожие на те, что показывал процесс злоумышленника. Буфер целей перехода провоцирует спекулятивное выполнение гаджета по подставному адресу. Тем самым, как и при первом способе или атаке Meltdown, появляются побочные микроархитектурные эффекты в кэше процессора, которые позволяют прочесть его из низкопривилегированного контекста.
Рис. 8.7. Схема атаки Spectre, вариант 2
После того как впервые были обнародованы методы атак Meltdown и Spectre, обнаружились еще несколько похожих техник. Пусть они были не настолько опасными и эффективными, важно как минимум понимать общую концепцию методов, используемых при подобных атаках.
Обход спекулятивного контекста (Speculative Store Bypass) возможен ввиду оптимизации со стороны процессора, позволяющей поместить команду, которую процессор признал независимой от прежнего контекста, на спекулятивное выполнение, пока тот контекст не обновился. Если предсказание перехода неверно, это может привести к загрузке устаревших данных, возможно секретных. Эти данные потом могут быть переданы другим спекулятивно выполняемым командам. Их действия могут обеспечивать доступ к памяти и создавать микроархитектурные побочные эффекты (обычно в кэше процессора). Злоумышленник может их оценить и завладеть данными.
Предзнаменование (Foreshadow, известно также как L1TF) — более серьезная атака, изначально проектировавшаяся для кражи данных из анклавов (изолированных областей данных, защищенных по технологии Intel SGX), но затем обобщенная для исполнения в рамках обычных программ без привилегий. Атакой Foreshadow использовались два аппаратных недостатка реализации спекулятивного исполнения в современных процессорах.
• Спекулятивное исполнение в отношении недоступной виртуальной памяти. В данной ситуации, когда процессор требует доступ к данным, находящимся по виртуальному адресу, указанному в записи таблицы страниц (Page Table Entry, PTE), но в котором сброшен бит присутствия (а значит, адрес невалиден), при корректной работе выдается исключение. Однако, если запись поддерживает преобразование действительного адреса, процессор может спекулятивно исполнить команды, зависящие от прочитанных данных. Как и в прочих подобных атаках, результат выполнения таких команд не зафиксирован процессором, но создает отслеживаемые побочные эффекты. В данном случае приложение пользовательского режима сможет прочесть защищенные данные из памяти ядра. Даже хуже, в особых случаях приложение сможет считать данные, принадлежащие другой виртуальной машине. Когда процессор выполняет преобразование гостевого физического адреса (Guest Physical Address, GPA) и встречает несуществующую запись в таблице преобразования адресов второго уровня (Second Level Adrress Translation Table, SLAT), могут возникать похожие побочные эффекты. (Больше информации о SLAT, GPA и механизмах преобразования сказано в главе 5 тома 1 и главе 9 данной книги).
•