Компонент windows ntvdm что это

Get rid of the process with out expert solutions!

by Kazim Ali Alvi

Kazim has always been fond of technology, be it scrolling through the settings on his iPhone, Android device, or Windows. And at times, unscrewing the device to take… read more


Updated on

  • The NTVDM.exe process relates to the vital component used to run 16-bit applications in 32-bit editions of Windows.
  • The component is not available in 64-bit Windows OS.
  • To fix the error, download NTVDM, delete relevant files, or uninstall recent Windows updates, amongst other solutions. 

fix NTVDM.exe error

XINSTALL BY CLICKING THE DOWNLOAD
FILE

Windows, though it offers a user-friendly interface, is a rather complex operating system if we look at what happens at the backend. There are several processes to support applications and enhance device security. One such that’s related to the former is NTVDM.exe.

But several users have been running into issues with NTVDM. While some get an error message at startup, others face problems while running an application. Fret not! It’s easily fixable, and we will show you how to get things running when NTVDM.exe is not working.

What is the NTVDM exe process?

NTVDM (NT Virtual DOS Machine) is a system component used to run 16-bit programs and DOS applications (both 16-bit and 32-bit) on the 32-bit architecture of Windows. Remember, it’s not available on 64-bit editions of the OS.

So, if you have installed Windows 11, which doesn’t offer a 32-bit edition or another 64-bit iteration of Windows, the component would be missing, and the NTVDM.exe error will be frequently encountered.

Also, Microsoft has confirmed that NTVDM, an older technology, does not receive the same support anymore and encourages users to switch to 32-bit or 62-bit versions of the application relying on it. Besides, given the security risk, Microsoft recommends against using NTVDM in enterprise environments.

But, since some users continue to utilize the feature to run apps, particularly older games, the NTVDM.exe error appears. And if that particular program is added to the startup folder, the error will appear as soon as you boot Windows.

How we test, review and rate?

We have worked for the past 6 months on building a new review system on how we produce content. Using it, we have subsequently redone most of our articles to provide actual hands-on expertise on the guides we made.

For more details you can read how we test, review, and rate at WindowsReport.

How do I fix NTVDM.exe errors?

Before we head to the slightly complex fixes, here are a few quick ones:

  • Restart the computer
  • Install any available Windows updates and download the latest app version.
  • Use other ways to run 16-bit applications.

If none work, move to the solutions listed next.

1. Enable NTVDM

  1. Press Windows + R to open Run, type cmd, and hit Ctrl + Shift + Enter.cmd
  2. Click Yes in the UAC prompt.
  3. Now, paste the following command and hit Enter:DISM /online /enable-feature /all /featurename:NTVDMenable to fix NTVDM.exe error
  4. Once done, restart the computer and check whether the error has disappeared.

Often, all that’s required is for you to enable the feature to get rid of NTVDM errors.

2. Install NTVDM

  1. Open Control Panel, and click on Programs.programs
  2. Now, click on Turn Windows features on or off.windows features
  3. Expand Legacy Components, tick the checkbox for NTVDM, and click OK to install the component.install NTVDM.exe
  4. Restart the computer for the changes to come into effect.

If you just installed Windows and are facing the error, a quick solution is to download NTVDM.exe via the built-in Windows Features option.

3. Delete the relevant files

  1. Boot your PC into Safe Mode.
  2. Press Windows + E to open File Explorer, and navigate the following path:C:\Windows
  3. Locate winhlp.exe and winhlp32.exe files, select them, and then hit Delete. delete files to fix NTVDM.exe error
  4. Choose the appropriate response in case a confirmation prompt appears.

For some users facing NTVDM.exe high CPU consumption and not using any application that relied on the component, deleting the relevant files did the trick. So try doing that as well.

4. Run the app in compatibility mode

  1. Right-click on the app throwing the error, and select Properties from the context menu.
  2. Navigate to the Compatibility tab, tick the Run this program in compatibility mode for checkbox, and select an older iteration of Windows from the dropdown menu.compatibility mode to fix NTVDM.exe
  3. Once done, click on Apply and OK to save the changes.
  4. If the error persists, choose another iteration in compatibility mode. This basically is a hit-and-trial thing.

In the case of some apps, running in compatibility mode fixed things when users kept getting the NTVDM.exe has stopped working error. Here, the app is run in an environment similar to what it was developed for, thus eliminating any errors.

Read more about this topic

  • Microsoft Paint Cocreator: A complete guide on the new AI tool
  • Windows 11 adds more apps to the share links feature
  • How to Make a Program Available to All Users on Windows 11
  • How to Quickly Turn Off Accents on Keyboard in Windows 11
  • The latest Windows 11 Dev build made Microsoft Store faster

5. Remove the problematic app

  1. Press Windows + R to open Run, type appwiz.cpl in the text field, and hit Enter.appwiz.cpl
  2. Select the program throwing the error, and click Uninstall.uninstall to fix NTVDM.exe
  3. Follow the on-screen instructions to complete the uninstallation process.

In case only a specific program requires NTVDM.exe, you should uninstall it since the component is now under maintenance mode and not development mode in recent iterations of Windows.

Also, for a few users, simply uninstalling the program didn’t work, and they had to clear the leftover files and registry entries. For that, we recommend you use a reliable uninstaller tool.

6. Uninstall recent Windows updates

  1. Press Windows + I to open Settings, and click on Update & Security.update & security
  2. Click on View update history on the right.view update history
  3. Click on Uninstall updates.uninstall updates to fix NTVDM.exe
  4. Select the update after installing which the error first appeared, and click on Uninstall.uninstall to fix NTVDM.exe
  5. Click Yes in the confirmation prompt.uninstall

If reports are to be believed, recent Windows Updates can also trigger the NTVDM.exe is not responding error for many users. And users managed to fix things by uninstalling Windows updates.

7. Perform a system restore

  1. Press Windows + R to open Run, type rstrui.exe in the text field, and click OK.rstrui.exe
  2. Select Choose a different restore point, if the option is available, and click Next.restore point
  3. Now, pick a restore point, one created before the error first apeared, and click on Next.restore to fix NTVDM.exe
  4. Verify the restore details and click Finish to start the process.
  5. Wait for the restore to complete.

When nothing else works, often, a system restore does the job. It reverts your PC in time to a point where the error didn’t exist in the first place. That’s why we recommend creating restore points or configuring Windows to create some automatically before any major changes.

By now, you should have gotten rid of NTVDM.exe errors in Windows and should have the affected program either up and running or removed altogether.

Before you leave, do check some quick tips to optimize your PC for gaming and ways to make Windows run faster than ever.

For any queries or to share the solution that worked for you, drop a comment below.

newsletter icon

  • Разбираемся
  • Почему ntvdm.exe грузит процессор?
  • На самом деле все сложнее, чем я думал
  • Что делать?
  • Принудительное отключение процесса
  • Вывод

Приветствую друзья! Вы знаете, я иногда пишу о неизвестных процессах. И часто у меня получается узнать что к чему.. Но вот сегодня столкнулся с процессом ntvdm.exe, о котором люди писали в интернете как год назад, так и десять.. Причины, почему он грузит проц — также много, нет одной единственной, поэтому ситуация сложная…((

Разбираемся

ntvdm.exe — процесс виртуальной дос-машины NT Virtual DOS Machine. Он запускается тогда, когда используются дос-программы. Что самое интересное, процесс может остаться висеть в памяти, даже если уже не работает дос-программа на тот случай, если виртуальная дос-машина снова потребуется.

На вики написано что компонент содержится только в 32-битных версиях виндовса:

Также из информации выше мы видим что.. один процесс ntvdm.exe отвечает за выполнение одной дос-программы.

В общем все понятно — ntvdm.exe это процесс/компонент, который нужен чтобы запустить старую дос-программу, другими словами эмулятор.

Почему ntvdm.exe грузит процессор? Прерывание INT 16H

Старые досовские программы постоянно обрабатывают прерывание INT 16H, которое ожидает нажатие клавиш даже если пользователь ничего не делает. Это как одна из причин, почему ntvdm.exe грузит ПК.

Но тут проблема в другом.. некоторые пользователи жалуются — у них без причины стал появляться ntvdm.exe, иногда после включения компа, при этом грузит процессор нереально. Если процесс завершить — то тормоза исчезают.

Вот примерно такая картина может наблюдаться. Оч важно понимать — если при этом вы завершаете процесс и после этого нет проблем, то.. я для вас написал способ внизу как отключить процесс навсегда))

Часто нахожу упоминание ntvdm.exe на антивирусных форумах, поэтому можно сделать вывод.. что иногда под процессом скрывается вирус. Другими словами — маскируется, чтобы вы подумали что это виртуальная машина для досовских прог..

Единственное что мне еще пришло в голову — может написана специальная вирусная прога в формате досовской и она запускается в виртуальной машине. Смысл в том, что таким образом антивирус может не понять что это вирус..

В общем ребят, я понял одно — четкого ответа как решить проблему с загрузкой в интернете нет. Кроме как завершить процесс. Это может быть как вирус, так и системный глюк.

У одного чела процесс начал грузить после того как он в проге Frigate запускал консоль — она тупо потом падала, а процесс ntvdm.exe грузил ПК на 99%.

На самом деле все сложнее, чем я думал

Все дело в том, что:

  1. Проблема встречается как на Windows XP, так и на семерке, а может даже и на десятке.
  2. Причины — оч разные. У одних проблема при использовании досовских приложений, то есть юзеры сами запускают такие приложения, в следствии чего — процесс грузит. В таком случае сори ребята — но я не шарю вообще в досе, поэтому тут советов не дам((
  3. Другие просто жалуются что начал грузить ntvdm.exe процессор оч сильно. Причиной может быть какая-то прога, которая использует досовский компонент. Но вообще причин — оч много, поэтому единственного рецепта, как взять и решить проблему — нет.
  4. Да и вообще — это может быть вирус, сколько только упоминаний ntvdm.exe на антивирусных форумах..
  5. Проблема с ntvdm.exe встречалась у юзеров как год назад так и десять, а то и больше, поэтому повторюсь — причины могут быть ну оч разные.

РЕКЛАМА

И что же делать?

Я напишу то, чтобы сделал я в таком случае:

  1. Проверка ПК антивирусными утилитами — как против опасных вирусов, так и против рекламных. Есть шанс что исправит ситуацию.
  2. Переустановка Windows. Вариант крайний, неприятный и малоинтересен — нужно все заново настраивать, короче попадос.
  3. Отключить ntvdm.exe в корне. Сделать так, чтобы он вообще не смог запуститься. При возникновении проблем — обратно включить его. Перед отключением — сделать точку восстановления.

Какими утилитами я советую проверить ПК (название утилиты это ссылка на офф сайт):

  1. Dr.Web CureIt!. Лучшая утилита против опасных вирусов, троянов, червей и прочей ерунды. Скачивается уже с антивирусными базами, поэтому размер может быть немного больше сто мегов. Оч советую проверить, если найдет, то удалит, но для этого может потребоваться перезагрузка.
  2. AdwCleaner и HitmanPro. Две утилиты, также лучшие в своем роде против рекламных вирусов. Проверяют ярлыки, планировщик задач, службы, профили браузеров, автозагрузку.. в общем все места, где могут быть рекламные вирусы. Чистит реально качественно, оч советую использовать обе, эффект будет лучше. Дело в том, что иногда то.. что не находит одна утилита — находит другая.

Хм, интересную картинку нашел:

Возможно компонент NTVDM можно вполне легально отключить в компонентах. Чтобы открыть: зажимаете Win + R, пишите команду appwiz.cpl, нажимаете ОК > откроется окно, там будет кнопка Включение или отключение компонентов Windows > попробуйте там поискать NTVDM.

Переустановка Windows. Тут особо нечего говорить — дело нудное, собственно не так переустановка, как потом устанавливать повторно все проги, настраивать их.. Дам только такой совет — по возможности ставьте проги, скачанные с офф сайтов либо из безопасных источников. И после установки винды поставьте сразу антивирус хороший, не реклама, но лично я советую Каспера, тем более что есть полностью бесплатная версия его. Или на крайняк Аваст.

Принудительное отключение процесса

Отключение ntvdm.exe в корне. Да, можно отключить в корне этот процесс. Нужно просто его переименовать. Но так, как он системный — у вас это сделать не получится. Нужна спец прога — Unlocker, она бесплатная, ходовая версия — 1.9.2, в интернете есть на каждом углу, но советую качать с проверенного софт-портала. Теоритически способ подойдет и для Windows XP, ибо утилита поддерживает эту операционку.

Очень важно создать точку восстановления. Да, небольшой риск есть что начнутся глюки несовместимые с комфортной работой за ПК)) Поэтому создаем точку — зажимаем Win + R, пишем команду:

sysdm.cpl

Нажали ОК. Далее появится окошко — активируете вкладку Защита системы и выбираете системный диск:

Если в колонке Защита у вас будет отключено — нажмите настроить и включите защиту.

Теперь нажимаем кнопку Создать:

И пишем название точки. Советую писать на понятном языке, например:

До отключения ntvdm.exe через Unlocker

На самом деле точка восстановления — оч полезный инструмент, которые многие почему-то игнорируют..((

Нажали Создать и точка быстренько создалась:

Вернемся к нашему делу. Устанавливая Unlocker будьте внимательны — лично у меня еще хотел установиться какой-то Дельта тулбар:

Поэтому снимаем галочки чтобы эта ерундовина не ставилась))

Утилита установится за секунду. Теперь самое главное — будем успокаивать процесс ntvdm.exe. Но у меня этого процесса нет. Поэтому для примера я возьму.. процесс SearchIndexer.exe:

Процесс относится к индексированию, запущен от имени система, вам лично не советую его отключать. Это только в целях эксперимента))

Итак, утилита у нас установлена. Процесс в диспетчере — нашли. Теперь нажимаем по нему правой кнопкой и выбираем пункт Открыть место хранения файла:

Откроется папка, в ней будет выделен файл:

Если у вас вдруг проблема с ntvdm.exe будет на Windows 10 — то действия аналогичны.

Нажимаем правой кнопкой по файлу и выбираем пункт Unlocker:

Теперь выбираем Переименовать:

Далее нужно указать имя. Советую указывать так, чтобы сохранилось оригинальное, назовите например так:

ntvdm.exe_off

В моем случае это будет:

SearchIndexer.exe_off

Нажали ОК. Потом еще раз нажали ОК. Результат:

Файл переименован. Теперь он никак не сможет запуститься. Вообще. Тоже самое вам нужно сделать с ntvdm.exe.

Внимание! У вас файл может быть не ntvdm.exe, а просто ntvdm — означает что скрыт показ расширений файлов. Тогда просто переименуйте в ntvdm_off и все.

У вас при переименовании может потребоваться перезагрузка. Это нормальное явление.

Таким образом вы можете полностью отключить ntvdm.exe, но.. могут ли быть проблемы? В принципе да:

  1. Некоторые проги могут использовать модули в виде досовских программ. Или компоненты, но.. таких программ немного. Соответственно без ntvdm.exe могут быть траблы в этих прогах.
  2. Теоритически.. возможно могут быть проблемы когда вы захотите запустить прогу в режиме совместимости, но это только теоритически.

А так в принципе проблемы могут отсутствовать. Но увы, это все зависит от установленного софта на вашем ПК. Именно поэтому сделать точку восстановления — просто обязательно!!!

Вывод

Выяснили:

  1. ntvdm.exe — виртуальная машина, которая запускает досовские проги, чтобы они могли работать на современном виндовсе.
  2. ntvdm.exe — вирус, который маскируется под виртуальную машину. Сложность еще в том, что и вирус и виртуальная машина — грузит процессор. Поэтому.. проверить на вирусы я бы все таки рекомендовал в любом случае.

Надеюсь информация помогла. Удачи и добра!

Ntvdm.exe — это исполняемый файл, который относится к компонентам Windows, отвечающим за поддержку 16-битных приложений на 32- и 64-битных операционных системах.

Важно понимать, что ntvdm.exe является неотъемлемой частью операционной системы Windows и отключение или удаление файла может привести к некорректной работе некоторых приложений или даже к полной неработоспособности системы.

Встречаются случаи, когда в работе ntvdm.exe возникают ошибки, которые могут привести к сбоям в работе системы. Обычно причиной этих ошибок являются вирусные атаки, проблемы, связанные с обновлением или установкой драйверов, повреждение системных файлов. Также известно, что некоторые приложения могут влиять на работу ntvdm.exe и вызывать ошибки.

В этой статье мы рассмотрим, какие ошибки могут возникнуть при работе с файлом ntvdm.exe и как их исправить, а также какие методы существуют для предотвращения этих ошибок.

Ntvdm exe – это программа-эмулятор виртуальной машины MS-DOS, которая позволяет запускать приложения, созданные для MS-DOS, в среде Windows. Этот файл является важной частью операционных систем Windows 32-битных версий, начиная с Windows NT 3.1 и заканчивая Windows 7.

Имя Ntvdm exe расшифровывается как «NT Virtual Dos Machine». Эта программа была разработана Microsoft для поддержки совместимости с приложениями, специфичными для MS-DOS, которые были разработаны до появления Windows.

В основном, Ntvdm exe используется для запуска старых приложений и игр, которые не могут работать в современных версиях Windows. Благодаря ему пользователи могут получить доступ к старым программам, необходимым для работы или развлечения.

Однако, Ntvdm exe также может вызывать ошибки и проблемы. В случае, если файл дает ошибку, рекомендуется пройти диагностику ошибок Windows и обновить драйверы системы, что может помочь устранить большинство ошибок.

В целом, Ntvdm exe – это важный компонент Windows, который позволяет запускать приложения, разработанные для MS-DOS, в современной среде Windows. Эта программа может вызывать ошибки, но в целом она является полезным инструментом для тех, кто работает со старыми программами.

Как исправить ошибки Ntvdm exe

Ошибка Ntvdm.exe может возникать по разным причинам, таким как повреждение реестра, заражение вирусом, конфликт с другими программами и т.д. Поэтому для ее устранения важно пройти несколько этапов.

Шаг 1: проверить наличие вирусов. Для этого следует запустить антивирусное ПО и произвести полное сканирование системы. Если вирусы найдены, удалить их.

Шаг 2: проверить целостность реестра. Для этого можно воспользоваться утилитой CHKDSK, которая проверяет целостность разделов жесткого диска и исправляет ошибки. Кроме того, можно воспользоваться утилитой SFC (System File Checker), которая проверяет целостность системных файлов и восстанавливает их при необходимости.

Шаг 3: проверить наличие конфликтов с другими программами. В некоторых случаях Ntvdm.exe может конфликтовать с другими программами, особенно если они требуют доступа к hardware. Для решения этой проблемы необходимо проверить конфликты в управлении устройствами и драйверах.

Шаг 4: обновить операционную систему. Последняя версия ОС содержит исправления и обновления, которые могут исправить ошибки Ntvdm.exe. Проверьте наличие обновлений и установите их, если это необходимо.

Шаг 5: удалить и переустановить приложение. Если Ntvdm.exe относится к какому-то приложению, то его можно удалить и переустановить. Это может решить проблему с ошибками.

Если проблема с Ntvdm.exe не ушла после выполнения всех этапов, следует обратиться к специалисту, который проведет более подробную диагностику и поможет решить сложную проблему.

Если вы являетесь пользователем операционной системы Windows 7, то вы, возможно, сталкивались с процессом ntvdm.exe. Но что это такое и зачем оно нужно?

Ntvdm.exe — это сокращение от «NT Virtual DOS Machine». Это виртуальная машина, которая позволяет запускать 16-битные приложения на 32-битной версии Windows 7. В прошлом, когда операционная система Windows была только 16-битной, ее пользователи могли запускать DOS-приложения непосредственно. Однако, с выпуском 32-битных версий Windows, эту возможность потеряли.

Виртуальная машина ntvdm.exe обеспечивает совместимость с 16-битными приложениями, запуская их в отдельной среде. Она эмулирует окружение операционной системы MS-DOS, благодаря чему старые программы могут быть запущены на современных компьютерах под управлением Windows 7.

Несмотря на то, что большинство пользователей Windows 7 уже не нуждаются в запуске 16-битных приложений, ntvdm.exe все еще может быть полезным для таких случаев, как совместимость с устаревшими программами, выполнение некоторых настроек или отладка приложений. Однако, следует помнить, что процесс ntvdm.exe является устаревшим и может потреблять ресурсы системы, поэтому его использование стоит контролировать и использовать только при необходимости.

Содержание

  1. Ntvdm exe Windows 7: описание и функции
  2. Что такое Ntvdm exe Windows 7?
  3. Как работает Ntvdm exe Windows 7?
  4. Зачем нужен Ntvdm exe Windows 7?
  5. Преимущества Ntvdm exe Windows 7

Ntvdm exe Windows 7: описание и функции

Функции Ntvdm.exe включают в себя предоставление среды MS-DOS для выполнения старых программ, созданных для операционных систем, предшествующих Windows 7. Благодаря Виртуальной машине MS-DOS, пользователи могут запускать приложения, основанные на 16-битных технологиях, таких как программы на языке Turbo C или старые игры, которые были разработаны для MS-DOS.

Кроме того, Ntvdm.exe также работает во время запуска 16-битных процессов, чтобы обслуживать их и предоставлять им необходимые ресурсы, такие как память и процессорное время.

Необходимо отметить, что Ntvdm.exe может потреблять определенное количество ресурсов системы, особенно при запуске большого числа 16-битных приложений. Если вы не планируете использовать старые программы, рекомендуется отключить Ntvdm.exe через специальные настройки операционной системы или антивирусного программного обеспечения, чтобы освободить некоторые ресурсы системы.

В целом, Ntvdm.exe в Windows 7 выполняет важную функцию, предоставляя поддержку для старых 16-битных приложений, позволяя пользователям продолжать использовать их на современной операционной системе Windows.

Что такое Ntvdm exe Windows 7?

Операционная система Windows 7 является 32-битной системой, однако она все еще поддерживает 16-битные приложения. Ntvdm.exe представляет собой виртуальную машину, которая эмулирует среду MS-DOS и позволяет запускать такие приложения.

Процесс Ntvdm.exe запускается автоматически при необходимости и работает в фоновом режиме. Он позволяет пользователям использовать старые программы, которые не были адаптированы для работы в 32-битной среде Windows 7. Благодаря этой функции пользователи могут запускать устаревшие программы, например, игры или приложения, и продолжать пользоваться ими даже на новой операционной системе Windows 7.

Обратите внимание, что с появлением более новых версий Windows, таких как Windows 8, Ntvdm.exe перестал быть предустановленным компонентом и может потребоваться дополнительная установка или настройка для запуска 16-битных приложений.

Как работает Ntvdm exe Windows 7?

Когда пользователь пытается запустить 16-разрядное приложение в Windows 7, Ntvdm.exe исполняет его, эмулируя окружение MS-DOS. Он обеспечивает совместимость с программами, написанными для более старых версий операционной системы, таких как Windows 95, Windows 98 и Windows ME. Основная цель Ntvdm.exe — обеспечить безопасный и надежный запуск старых приложений на более новых системах Windows.

Как работает Ntvdm.exe:

  1. Когда пользователь пытается запустить 16-разрядное приложение, операционная система Windows 7 вызывает Ntvdm.exe.
  2. Ntvdm.exe создает виртуальную машину, эмулирующую окружение MS-DOS и 16-разрядных версий Windows.
  3. Приложение запускается в созданной виртуальной машине, а Ntvdm.exe отвечает за его исполнение.
  4. Если приложение работает с файлами, Ntvdm.exe координирует доступ к файлам и обеспечивает согласованность данных.
  5. По завершении выполнения приложения, Ntvdm.exe завершает виртуальную машину.

Благодаря Ntvdm.exe пользователи Windows 7 могут запускать старые приложения, которые не совместимы с 64-разрядной версией операционной системы. Однако следует отметить, что Ntvdm.exe является устаревшим компонентом и может быть уязвимым для атак со стороны злонамеренных программ.

Важно помнить, что Ntvdm.exe является 32-разрядным процессом и не может выполнять 64-разрядные приложения. Если у вас есть необходимость запустить 16-разрядные приложения на более новых версиях Windows, вы также можете использовать специализированные эмуляторы, такие как DOSBox.

Зачем нужен Ntvdm exe Windows 7?

Существует множество программ и игр, разработанных для более старых версий операционной системы Windows, таких как Windows 95, Windows 98 или Windows XP. Однако эти программы и игры несовместимы с более новыми версиями операционной системы, включая Windows 7.

Ntvdm exe, или NTVDM (NT Virtual DOS Machine), является виртуальной машиной, способной запускать программы, написанные для 16-битных операционных систем, таких как MS-DOS. В Windows 7, Ntvdm exe позволяет воспроизводить старые программы и игры, которые требуют среды выполнения MS-DOS.

Основная цель Ntvdm exe Windows 7 — обеспечить совместимость с устаревшими приложениями и предоставить пользователям доступ к программам и играм, которые они могут быть использовали ранее на более старых версиях Windows.

Ntvdm exe Windows 7 обеспечивает следующие преимущества:

  1. Запуск старых программ и игр. Благодаря Ntvdm exe, пользователи Windows 7 могут запускать устаревшие программы и игры, которые требуют среды выполнения MS-DOS. Это позволяет им наслаждаться старыми играми и использовать программы, которые иначе не были бы доступны на более новых версиях Windows.
  2. Сохранение исторического контекста. Многие старые программы имеют историческую ценность и используются для анализа и изучения прошлых технологий и тенденций. Ntvdm exe Windows 7 сохраняет возможность запускать эти программы, обеспечивая сохранение исторического контекста.
  3. Совместимость с принтерами и другими устройствами. Некоторые старые программы могут быть связаны с устаревшими принтерами и другими устройствами. Ntvdm exe помогает сохранить совместимость с такими устройствами, давая возможность пользоваться ими даже на более новых версиях Windows.

В целом, Ntvdm exe Windows 7 является неотъемлемой частью операционной системы, предоставляя поддержку старых программ и игр, сохранение исторического контекста и совместимость с устаревшими устройствами. Благодаря ему пользователи Windows 7 имеют возможность продолжать использовать и наслаждаться устаревшими приложениями и играми.

Преимущества Ntvdm exe Windows 7

Одним из главных преимуществ Ntvdm exe в Windows 7 является его способность работать со старыми 16-битными приложениями. Такие приложения часто несовместимы с более новыми операционными системами и требуют виртуальной среды для запуска. Ntvdm exe позволяет пользователям запускать эти приложения на Windows 7 без необходимости установки старых операционных систем.

Другое преимущество Ntvdm exe Windows 7 заключается в его производительности и эффективности. Программа работает в фоновом режиме, используя только необходимые системные ресурсы. Она не влияет на общую производительность компьютера и не вызывает задержек при запуске или выполнении других задач.

Кроме того, Ntvdm exe обеспечивает стабильную работу 16-битных приложений на Windows 7. Он поддерживает их функциональность и обеспечивает надежное выполнение задач. Это особенно важно для организаций и предприятий, которые до сих пор используют старые программы, но хотят перейти на новую операционную систему.

Наконец, Ntvdm exe в Windows 7 обеспечивает безопасность данных. Он изолирует 16-битные приложения от основной системы, предотвращая возможность воздействия вредоносных программ на основную систему. Это позволяет пользователям полноценно использовать старые программы, не рискуя заражением компьютера вирусами или другими угрозами.

Таким образом, Ntvdm exe в Windows 7 представляет собой полезный инструмент для запуска старых 16-битных приложений. Он обеспечивает совместимость, производительность, стабильность и безопасность, что делает его необходимым компонентом для многих пользователей операционной системы Windows 7.

Время на прочтение
15 мин

Количество просмотров 30K

Обратная совместимость — вещь хорошая, но использовать ее надо в разумных пределах. Ведь до сих пор в ядре Windows можно найти код, разработанный еще в прошлом веке. Говорить о его высокой безопасности было бы глупо. И мы докажем это на примере трех privilage escalation уязвимостей, прижившихся в подсистеме виртуальной машины DOS

В 1978 году компания Intel выпустила первый процессор семейства х86, модели 8086, который предоставлял довольно ограниченную среду для исполнения 16-битного кода, известную под названием «режим реального времени» (Real mode). Вскоре после этого началась активная разработка программных решений для новой аппаратной платформы, причем как операционных систем, так и работающих в них обычных программ. Система Disk Operating System (DOS) от Microsoft быстро утвердилась в качестве ведущей рабочей среды для десктопных ПК, а приложения под эту ОС создавались и выходили на рынок в течение более десяти лет. В качестве самых известных примеров можно привести Norton Commander, ChiWriter или Quattro Pro. При разработке в 1992 году архитектуры NT для операционной системы Windows, которая использовала преимущества уже более мощного и безопасного защищенного режима (Protected Mode), одним из ключевых решений стало сохранение обратной совместимости с DOS, то есть обеспечение возможности безопасного запуска старых программ в новом графическом окружении.

WARNING

Вся информация предоставлена исключительно в ознакомительных целях. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный материалами данной статьи.

NTVDM

Созданный в Windows специальный режим совместимости получился очень функциональным. Из-за того, что он был довольно сложным компонентом как с технической стороны, так и со стороны логики работы, его появление открыло локальным пользователям много новых возможностей проведения атак, направленных на повышение своих прав в операционной системе. В NTVDM уже не раз находили и исправляли проблемы безопасности, но до сих пор в ядре остается много интересных и неисследованных возможностей. В следующем разделе мы детально рассмотрим одну из них — специфичную обработку исключений, возникающих в хост-процессе NTVDM.EXE. Тут, правда, стоит отметить, что любой потенциальный баг, который может обнаружиться в подсистеме совместимости DOS, затронет только 32-битные платформы Windows, так как 64-битные версии системы не поддерживают VDM из-за особенностей реализации режима Long Mode, в котором исполняется 64-битный код на процессорах Intel. В новых операционных системах Windows 8 и 8.1 воздействие потенциальных уязвимостей ядра нивелируется за счет того, что там эта подсистема отключена по умолчанию, а для ее запуска необходимы административные права. Тем не менее эти уязвимости можно успешно задействовать без участия пользователя на системах от Windows XP до Windows 7 32-бит (а на данный момент такие системы предположительно составляют около 50% парка всех десктопных ОС).

Режим реального времени

Поддерживать обратную совместимость с 16-битными приложениями для современного 32-битного окружения очень сложно с технической точки зрения из-за фундаментальных различий в функционировании между реальным и защищенным режимом. Сюда входят и режимы работы процессора, и ширина слов и адресов, и кодирование инструкций, и много других моментов. Иначе говоря, стандартными средствами современных операционных систем запустить устаревшие программы из 80-х не получится. С другой стороны, переключение процессора в реальный режим каждый раз при запуске 16-битной программы тоже не выход, поскольку это лишает смысла базовые установки защищенного режима, такие как разделение прав. Передача управления потенциально недоверенному коду, который работает в практически неограниченной среде исполнения и имеет прямой доступ ко всей периферии компьютера, не только создает потенциальную угрозу безопасности системы, но и лишает операционную систему контроля над компьютером, так как решение о возврате в предыдущий рабочий контекст будет приниматься именно этим старым приложением.

Режим Virtual 8086

Инженеры Intel, которые прекрасно понимали эти и многие другие связанные с обратной совместимостью проблемы, разработали еще один совершенно новый режим исполнения, назвав его Virtual 8086 (V8086), который стал важной составляющей защищенного режима. Основная особенность режима V8086 состоит в том, что для работающего в нем кода он совершенно неотличим от реального режима, но при этом полностью управляется основной операционной системой. Это позволяет запускать старые приложения в 32-битном окружении с сохранением безопасности и без негативных побочных эффектов. Эту технологию можно рассматривать в качестве механизма виртуализации для ПО DOS, в котором операционная система выполняет роль монитора виртуальной машины (Virtual Machine Monitor — VMM). VMM отвечает за создание рабочей среды и обработку критичных и привилегированных инструкций, которые использует гостевое приложение, при этом 16-битный код выполняется в специальном режиме и с нативной скоростью. Типичный, разработанный Intel порядок исполнения для операционной системы, использующей V8086, показан на рис. 1.


Рис. 1. Передача управления операционной системой при выполнении устаревших 16-битных приложений

В случае Microsoft Windows сущность «операционная система» далее распадается на два компонента: ядро и процесс NTVDM.EXE, работающий на уровне пользователя. Поддержка описанной подсистемы имеется на обоих уровнях — некоторые события, происходящие внутри устаревшего ПО, обрабатываются напрямую ядром, в то время как другим требуется некоторая помощь на уровне ring 3 (см. рис. 2). Благодаря тому что исполнение кода старого ПО изолировано в специальный процесс, ядро может легко определить, нуждается ли конкретное событие процессора в отдельной обработке, в зависимости от того, исходит оно от VDM-хоста или нет. В результате большинство процедур уровня ring 0 предоставляют дополнительные функциональные возможности при вызове их из особых процессов; в качестве одного из ярких примеров можно отметить обработчики системных прерываний (trap handlers) для x86 (такие как nt!KiTrap0c, nt!KiTrap0d, nt!KiTrap0e), системные вызовы NT (например, nt!NtVdmControl) и системные вызовы win32k.sys (например,nt!NtUserInitTask). Важно отметить, что, хотя процесс NTVDM.EXE и обрабатывается системой особым образом, он все равно наследует токен безопасности локального пользователя; это, в свою очередь, позволяет атакующему исполнять произвольный код в рамках процесса, используя всего лишь две документированные функции API — OpenProcess и CreateRemoteThread — для того, чтобы воспользоваться гипотетической уязвимостью в тех частях ядра, которые отвечают за поддержку VDM.

Рис. 2. Пример управления выполнением время исполнения устаревших 16-битных приложений в Microsoft Windows

DPMI

Наконец, нельзя забывать, что NTVDM поддерживает основную часть спецификаций интерфейса защищенного режима DOS (DOS Protected Mode Interface — DPMI), то есть в дополнение к реализации режима Virtual 8086, он также может предоставлять среду исполнения (например, создавать сегменты памяти) и выполнять код защищенного режима. Следовательно, вполне может появиться код с поддержкой обработки 32-битных инструкций в ядре в дополнение к простой 16-битной эмуляции.

CVE-2013-3196 (write-what-where в nt!PushInt)

General Protection Fault

Одной из самых важных особенностей режима Virtual 8086, а также рабочей среды, созданной NTVDM.EXE для исполнения устаревшего 32-битного кода с поддержкой DPMI, состоит в том, что любая попытка выполнить критичную или требующую повышенных прав инструкцию (такую как INT, OUT или STI) сразу же приведет к исключению General Protection Fault в ядре. Как уже отмечалось выше, после этого операционная система должна безопасно эмулировать работу инструкции и вернуться к исполнению прерванного гостевого кода, обеспечивая продолжение исполнения. Как выяснилось, код эмулирования инструкций для 16- и 32-битных режимов эмуляции находится полностью в пространстве ядра, что открывает перед нами интересные возможности для атаки: программным путем воспроизвести поведение особых инструкций х86. Для того чтобы попасть в эмулятор, нужно выполнение следующих условий:

  1. Исключение #GP происходит внутри режима Virtual 8086 (флаг EFlags.VM установлен) ИЛИ Исключение #GP происходит в режиме пользователя (ring 3) и
  2. Селектор cs: segment не равен KGDT_R3_CODE (0x1b) в момент исключения и
  3. Исключение #GP происходит в хост-процессе VDM.

Рис. 3. Таблица диспетчеризации инструкций режима Virtual 8086, используемая обработчиком #GP

Если любой из вариантов полностью выполнен, то обработчик #GP передает управление внутренней процедуре nt!VdmDispatchOpcode_try, которая производит базовое декодирование вызвавшей сбой инструкции и вызывает одну или несколько функций-обработчиков, применимых к этой инструкции. Списки обработчиков для режимов эмуляции 16 и 32 бит показаны на рис. 3 и 4; как можно увидеть, ядро выдает очень длинный список инструкций и их префиксов. По нашему мнению, до этого года эта часть кода, скорее всего, никогда ранее не подвергалась проверке на наличие уязвимостей, что делало ее серьезной мишенью для исследования. После этого «открытия» мы решили провести реверс-инжиниринг всех обработчиков в поисках потенциальных недоработок и получили первые результаты уже в течение следующих нескольких часов. Первая уязвимость находилась в слое эмуляции инструкции INT для защищенного режима.

Рис. 4. Таблица диспетчеризации инструкций защищенного режима, используемая обработчиком #GP

Где собака зарыта

Базовая роль функции обработчика nt!OpcodeINTnn состоит в том, что она извлекает операнд imm8 инструкции, вызвавшей сбой, а дальше вызывает другую внутреннюю процедуру nt!PushInt. Ее основная задача заключается в том, чтобы получить базовый адрес пользовательского ss: сегмента и положить адрес обработчика системных прерываний в стек (в адресном пространстве пользователя), используя полный адрес указателя стека ss:esp. Полученный путем обратного инжиниринга С-код, ответственный за помещение в стек трех 16- или 32-битных слов (в зависимости от гостевого режима исполнения), приведен ниже.

if (reginfo->ViFlags & VDM_INT_32) { 
 *(DWORD *)(reginfo->RiSsBase + NewVdmEsp + 0) = reginfo->RiEip; 
 *(DWORD *)(reginfo->RiSsBase + NewVdmEsp + 4) = trap_frame->SegCs; 
 *(DWORD *)(reginfo->RiSsBase + NewVdmEsp + 8) = GetVirtualBits(reginfo->RiEFlags); 
} else { 
 *(WORD *)(reginfo->RiSsBase + NewVdmEsp + 0) = reginfo->RiEip; 
 *(WORD *)(reginfo->RiSsBase + NewVdmEsp + 2) = trap_frame->SegCs; 
 *(WORD *)(reginfo->RiSsBase + NewVdmEsp + 4) = GetVirtualBits(reginfo->RiEFlags); 
}

Проблема в реализации состояла в том, что указатель на стек пользовательского пространства (ring 3) никак не проверяется на корректность, вероятно из-за предположения, что он всегда будет указывать на адресное пространство процесса NTVDM.EXE. А это, разумеется, не всегда так, поскольку эксплойт может устанавливать регистр esp на любой произвольный указатель, например на адрес, относящийся к ядру. Таким образом, для задействования уязвимости было достаточно выполнить всего лишь две простые инструкции в контексте виртуальной машины DOS: mov esp, 0xdeadbeef и затем int 0. Единственные ограничения состояли в том, что и cs:, и ss: должны выбирать сегменты кода и данных в рамках локальной таблицы дескрипторов (LDT — Local Descriptor Table), а аргумент инструкции int должен быть прерыванием уровня ядра (любое значение в диапазоне между 0–255, за исключением последовательности 0x2a–0x2e). Результат запуска двух описанных инструкций на непропатченной Windows 7 SP1 приведен ниже:

TRAP_FRAME: a2ea4c24 -- (.trap 0xffffffffa2ea4c24)
ErrCode = 00000002 
eax=024ef568 ebx=00000000 ecx=00000000 edx=6710140f esi=a2ea4cb8 edi=deadbee3 
eip=82ab21a7 esp=a2ea4c98 ebp=a2ea4d34 iopl=0 nv up ei pl nz na po nc 
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00010202 
nt!PushInt+0xa5: 
82ab21a7 89143b mov dword ptr [ebx+edi],edx ds:0023:deadbee3=???????? 
Resetting default scope

Благодаря тому факту, что одна из 32-битных переменных хранится ядром в произвольно выбранном исключении eip, ситуация превращается в простое write-what-where условие с незначительными ограничениями, которыми можно пренебречь (например, что непосредственное значение не может иметь установленным старший бит). Имея в своем распоряжении такую удобную базовую возможность, становится возможным «угнать» управление выполнением (control flow) ядра, переписав один из указателей функций, например широко известный указатель nt!HalDispatchTable+4, вызываемый из пространства пользователя через системный вызов nt!NtQueryIntervalProfile.

Рис. 5. Успешная реализация write-what-where в nt!PushInt

Устранение данной уязвимости реализовано довольно просто и состоит из трех дополнительных инструкций, добавленных в nt!PushInt. Они проверяют, чтобы адресss:esp, который должен быть из пространства пользователя, действительно указывал на нижние части адресного пространства (см. рис. 6).


Рис 6. Бинарные различия между первоначальной реализацией nt!PushInt и после патча

CVE-2013-3197 (write-what-where в nt!PushException)

Если внимательно посмотреть на обработчики системных прерываний Windows (помимоnt!KiTrap0d), то становится очевидным, что специфическую функциональность для VDM обеспечивает не только обработчик #GP, а большинство из них. В этом плане особенность General Protection Fault состоит в том, что она имеет выделенные подпрограммы для обработки конкретных типов исключений (таких как критичные или привилегированные инструкции); другие обработчики не используют такую сложную функциональность, а вместо этого просто вызывают функцию nt!Ki386VdmReflectException в случае, если встречаются с исключением VDM. Этим они пытаются эмулировать событие в виртуальной среде, примерно по той же схеме, что и эмуляция инструкций в nt!VdmDispatchOpcode_try. Граф передачи управления иллюстрирует, что большинство обработчиков зависят от этой функции (cм. рис. 7).


Рис. 7. Граф функции nt!Ki386VdmReflectException

Причина головной боли

При типичных обстоятельствах (то есть для любого обычного процесса) исполнение, как правило, завершается в одном из вариантов nt!CommonDispatchException, который отправляет событие к обработчику исключений пространства пользователя. В случае VDM ядро сначала пытается с помощью nt!PushException создать фрейм-ловушку в стеке пространства пользователя и перенаправить управление по адресу cs:eip, который берется из полей VfCsSelector и VfEip структуры NtCurrentTeb()->Vdm->VdmIntDescriptor[trap_no] (см. рис. 8); и только если эта процедура не срабатывает, исключение обрабатывается обычным способом. И, подобно предыдущему случаю, при создании эмулированного фрейма-ловушки ядро не проверяет, что указатель стека находится действительно в рамках адресного пространства пользователя. Это опять приводит к возможности использовать write-what-where условие, только размером 16 или 32 байта вместо 6 или 12. Задействовать уязвимость так же просто, для этого достаточно установить esp на произвольный адрес в пространстве ядра и вызвать исключение (например, #DE через инструкцию div edx) с нормальными реквизитами полностью инициализированной среды VDM и пользовательскими сегментами cs: и ss: в момент возникновения ошибки.

TRAP_FRAME: 8dd97c28 -- (.trap 0xffffffff8dd97c28)
ErrCode = 00000002 
eax=000007f7 ebx=00000000 ecx=00000000 edx=deadbebf esi=8dd97ce4 edi=00000634 
eip=82a874b5 esp=8dd97c9c ebp=8dd97d1c iopl=0 nv up ei ng nz na po nc 
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00010282 
nt!PushException+0x150: 
82a874b5 6689441a0e mov word ptr [edx+ebx+0Eh],ax ds:0023:deadbecd=???? 
Resetting default scope

Рис. 8. Внутренние структуры пространства пользователя, которые задействуются для возобновления исполнения NTVDM, прерванного исключением

И в этот раз благодаря тому, что одно из записанных в контролируемый адрес значений — это eip ошибки, та же методика использования указателя функции (function pointer exploitation technique) может использоваться для получения полного контроля над компьютером. Правда, из-за ограничений на значение LDT воспользоваться этой уязвимостью можно только на системах начиная с Windows Vista. В обновлении безопасности Microsoft просто вставили два простых блока, которые отвечают за проверку указателя в стеке пространства пользователя для ветвей создания фрейма ловушки и для 16, и для 32 бит.

CVE-2013-3198 (write-what-where в nt!VdmCallStringIoHandlerPushException)

В дополнение к обработке привилегированных инструкций VDM ядро также эмулирует выполнение критичных инструкций, то есть таких инструкций, которые могут выполняться, только если CPL <= IOPL, что обеспечивает контроль за прерываниями и коммуникациями по портам ввода/вывода. В конце концов все инструкции для ввода/вывода строк (INSB, INSW,OUTSB, OUTSW в режиме Virtual 8086 и защищенном режиме) выполняются внутренней функцией nt!Ki386VdmDispatchStringIo, которая выступает точкой входа в большой и сложный механизм, называемый «эмуляция портов» (port emulation). Хотя его точная функциональность вряд ли известна кому-то за пределами группы разработчиков, этот механизм был разобран путем реверс-инжиниринга и детально описан французским исследователем Ivanlef0u в 2009 году. Кратко говоря, любой драйвер устройства, работающий в ядре Windows, может регистрировать любые обработчики эмуляции I/O для конкретных процессов, диапазонов портов и типов доступа к портам с помощью недокументированной функции ZwSetInformationProcess(ProcessIoPortHandlers). Таким образом, компоненты пространства ядра могут в теории эмулировать физические устройства для программ, работающих в рамках VDM. Однако тут есть более важный вопрос — а не зарегистрированы ли какие-либо обработчики по умолчанию сразу после установки Windows?
Насколько мы знаем, в настоящее время есть только один случай эмуляции порта в Windows — когда устаревшая программа работает в полноэкранном режиме, дефолтный графический драйвер VIDEOPRT.SYS регистрирует обработчики для VGA-диапазона (0x3b0–0x3df); трассировка стека для этой регистрации представлена ниже:

ChildEBP RetAddr Args to Child 
807b1738 82a55023 85886680 00000001 b06b1bf3 nt!Psp386InstallIoHandler 
807b1994 828588a6 00000088 0000000d 807b1a40 nt!NtSetInformationProcess+0x7ad 
807b1994 82857815 00000088 0000000d 807b1a40 nt!KiSystemServicePostCall 
807b1a1c 91619f84 00000088 0000000d 807b1a40 nt!ZwSetInformationProcess+0x11 
807b1a60 91616467 86a357f0 00000001 8597ae80 VIDEOPRT!pVideoPortEnableVDM+0x82 
807b1ab4 82851c1e 86a357f0 86f32278 86f32278 VIDEOPRT!pVideoPortDispatch+0x360 
807b1acc 9a5c45a2 fe915c48 fffffffe 00000000 nt!IofCallDriver+0x63 
807b1af8 9a733564 86a35738 00230000 fe915c48 win32k!GreDeviceIoControlEx+0x97 
807b1d18 828588a6 00000000 0130f294 00000004 win32k!NtGdiFullscreenControl+0x1100 
807b1d18 77c77094 00000000 0130f294 00000004 nt!KiSystemServicePostCall 
0130f25c 77ab6951 00670577 00000000 0130f294 ntdll!KiFastSystemCallRet 
0130f260 00670577 00000000 0130f294 00000004 GDI32!NtGdiFullscreenControl+0xc 
0130f28c 00672c78 00000088 0000003a 003bd0b0 conhost!ConnectToEmulator+0x6c 
0130f3c0 0065f24d 00000001 003bd0b0 0130f4d4 conhost!DisplayModeTransition+0x40e 
0130f458 7635c4e7 000e001c 0000003a 00000001 conhost!ConsoleWindowProc+0x419

Другими словами, эта техника работает только в том случае, если в системе не установлены альтернативные драйверы на видеокарту, а используется стандартный Microsoft’овский. Переключения между полноэкранным и оконным режимом можно легко добиться, используя документированные вызовы API SetConsoleDisplayMode(CONSOLE_FULLSCREEN_MODE) и SetConsoleDisplayMode(CONSOLE_WINDOWED_MODE).

Источник бед

Итак, возвращаясь к эмулированию инструкций — функция nt!Ki386VdmDispatchStringIo определяет обработчик для эмулируемой операции, используя nt!Ps386GetVdmIoHandler, считывает данные пользователя из памяти по адресу ds:si, если это операция «чтения», и вызывает обработчик I/O и записывает данные в es:di, если это операция «записи». Как ты, наверное, уже догадался, ни один из двух указателей (которые вроде бы берутся из пространства пользователя) не проходит валидацию перед использованием. Не самая лучшая идея, особенно учитывая, что в защищенном режиме сегменты могут иметь 32-битные базовые адреса, так что, как следствие, эта уязвимость позволит нам читать и записывать произвольно выбранные адреса в памяти ядра.
Подводя итог: для успешного использования уязвимости нам надо заставить драйвер VIDEOPRT.SYS зарегистрировать обработчики VGA I/O, переключив консоль VDM в полноэкранный режим, создать и загрузить пользовательские сегменты в cs: и es: (причем базовый адрес последнего сегмента указывает на память ядра для перезаписи), инициализировать регистр di значением 0x0 и dx значением 0x3b0, а потом вызвать инструкцию insb; разумеется, все операции необходимо проводить внутри процесса NTVDM.EXE. Если мы установим базу сегмента es: в 0xaaaaaaaa и запустим эксплойт на непропатченной системе, то должно произойти следующее:

TRAP_FRAME: 963889fc -- (.trap 0xffffffff963889fc)
ErrCode = 00000002 
eax=aaaaaa00 ebx=00000001 ecx=fffffffd edx=00000003 esi=8297d260 edi=aaaaaaaa 
eip=82854fc6 esp=96388a70 ebp=96388a78 iopl=0 vif nv up ei ng nz ac po cy 
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00090293 
nt!memcpy+0x166: 
82854fc6 8807 mov byte ptr [edi],al ds:0023:aaaaaaaa=?? 
Resetting default scope

По умолчанию порт 0x3b0 записывает в память единственный байт — 0x00, так что данная уязвимость может быть использована для обнуления любого указателя на функцию пространства ядра; сделав это, мы можем перенаправить выполнение кода ring 0 на страницу NULL, которая уже расположена в адресном пространстве NTVDM. Таким образом, мы и в этом случае можем повысить токен безопасности локального процесса или скомпрометировать безопасность системы любым другим удобным нам путем.
Для устранения этой проблемы Microsoft ввела inline-вызов ProbeForRead перед считыванием данных из пространства пользователя по адресу ds:si, а также общий вызов ProbeForWrite перед записью данных обратно по адресу es:di.

Мысли вслух

Все три уязвимости для повышения привилегий, о которых шла речь в этой статье, были возможны благодаря условию write-what-where, которое возникает в силу того, что предоставляемые пользователем данные не проходят никакой валидации. В других ситуациях уязвимости этого типа для базового образа ядра NT (ntoskrnl.exe) встречаются крайне редко. И хотя Microsoft за последние годы смогла внутренними силами отследить и устранить большинство таких проблем, они каким-то образом упустили код эмуляции ввода/вывода, исключений и инструкций в VDM; скорее всего, из-за того, что инструменты статического анализа, очень эффективные для высокоуровневого кода С и С++, в настоящее время не поддерживают ассемблер или плохо взаимодействуют с ним. Стоит отметить, что возможность использовать эти уязвимости появилась только после небольшого несвязанного изменения в коде входного контроля LDT, которое впервые появилось в Windows Vista. Из-за этого изменения внутренняя функция nt!PspIsDescriptorValid оказалась лишена проверок, связанных с базой и ограничениями ввода. Впрочем, это не более чем удачное совпадение. Реальной причиной, которая лежит в основе этой уязвимости, стали не различия в контроле сегментов, а тот факт, что код эмуляции использовал полные адреса ss:esp, ds:si и es:di в операциях памяти, хотя и одна из ключевых особенностей безопасности для ядра Windows гласит: привилегированный код никогда не должен доверять любым сегментам памяти со стороны пользователя.

Резюмируя

На примере этих трех открытий мы еще раз ясно видим, что многие уязвимости ядра обусловлены существованием кода, написанного чуть ли не в начале 90-х годов. Тогда безопасность не рассматривалась в качестве важного приоритета (в отличие от нашего времени), что приводило к созданию плохого кода, и никто его не пересматривал с точки зрения обеспечения безопасности с тех пор, как он был написан двадцать лет назад. При этом большие участки кода используются и в самых последних версиях Windows, включая новейшие Windows 8.1 и Server 2012. Современный исходный код ядра, который пишется в 2013 году, должен соответствовать руководствам по безопасной разработке и тщательно тестироваться перед выпуском. Поэтому мы считаем, что вместо того, чтобы копаться в новых функциональных элементах, которые были внедрены в последних версиях системы, гораздо эффективнее искать ошибки в тех ключевых компонентах, которые были созданы давным-давно.
Ну и последнее, что стоит отметить, — отключение по умолчанию обратной совместимости с приложениями DOS в Windows 8 было отличным решением Microsoft. Благодаря ему большинство еще не обнаруженных ошибок либо невозможно использовать, либо нет смысла искать, потому что атакующий не получит от их использования достаточных дивидендов. К тому же это решение позволило полностью отключить любые страницы NULL (раньше их наличия требовал хост-процесс VDM), а благодаря этому полностью исчезают либо значительно сокращаются ошибки типа NULL pointer dereference, которые часто встречаются и в ядре, и в драйверах устройств. По общему влиянию на будущие защитные свойства это одно из самых серьезных улучшений со стороны Microsoft за все время. Ну а сейчас вперед — найди свой собственный баг в ядре!

Автор: Mateusz «j00ru» Jurczyk.

Впервые опубликовано в журнале «Хакер» от 01/2014.

Подпишись на «Хакер»

  • Бумажный вариант
  • «Хакер» на iOS/iPad
  • «Хакер» на Android

  • Компонент universal crt kb2999226 скачать для windows 7 32 bit
  • Компаньон консоли xbox скачать для windows 11
  • Компонент snmp windows 10 скачать
  • Компас 3d portable windows 10 скачать
  • Компоненты windows управление компонентами недоступно