Аппаратная ошибка ntvdm

"Аппаратная ошибка NTVDM" - что это?
Автор Сообщение

Сообщения:14

Ответить с цитатой

«Аппаратная ошибка NTVDM» — что это?

не могу установить некоторые программы, то есть при запуске установки выскакивает ошибка «Аппаратная ошибка NTVDM»

Подскажите кто в курсе что это?

P.S. установлена Windows 2003 Server.

21 сен 2007, 23:14 Профиль

Yandex

SR

Эксперт

Аватара пользователя

Сообщения:2454
Откуда:Asino

Ответить с цитатой

«Аппаратная ошибка NTVDM» — что это?

Подобная ошибка вылазит на 2003 из-за отсутствия библиотеки [color=#f66]bwcc.dll[/color]

21 сен 2007, 23:22 ПрофильICQWWW

Грипп

Сообщения:14

Ответить с цитатой

«Аппаратная ошибка NTVDM» — что это?

что такое библиотека?

откуда взять эту библиотеку?

куда вставить?

вообщем как исправить ситуацию?

21 сен 2007, 23:26 Профиль

SR

Эксперт

Аватара пользователя

Сообщения:2454
Откуда:Asino

Ответить с цитатой

«Аппаратная ошибка NTVDM» — что это?

Попробуй сократить путь до временных папок [color=#999]TMP & TEMP[/color] (например [color=#999]C:TMP[/color] и [color=#999]C:TEMP[/color])

21 сен 2007, 23:30 ПрофильICQWWW

SR

Эксперт

Аватара пользователя

Сообщения:2454
Откуда:Asino

Ответить с цитатой

«Аппаратная ошибка NTVDM» — что это?

Библиотека? хм, а можно вопрос зачем вам нужен 2003 server ? ;)

Ладно не буду углубляться в то что такое библиотека (если захотите узнать более подробнее — гугль вам в помошь!). Файл имеющий расширение [color=#999].dll[/color] называется библиотекой. Как я понял, это один из компонентов Borland… хз че. Поидее то что я написал должно помочь!

21 сен 2007, 23:35 ПрофильICQWWW

Грипп

Сообщения:14

Ответить с цитатой

«Аппаратная ошибка NTVDM» — что это?

где что сократить, я не понимаю как это все делается?

21 сен 2007, 23:36 Профиль

Anthariel

Антиспам

Аватара пользователя

Сообщения:1679

Ответить с цитатой

«Аппаратная ошибка NTVDM» — что это?

блиа создай папку TMP и в переменных средах пошарься… точнее сказать не могу, ибо 2к3 в глаза не видел :)

21 сен 2007, 23:38 Профиль

Грипп

Сообщения:14

Ответить с цитатой

«Аппаратная ошибка NTVDM» — что это?

так все-таки где взять этот компонент bwcc.dll?

21 сен 2007, 23:38 Профиль

Грипп

Сообщения:14

Ответить с цитатой

«Аппаратная ошибка NTVDM» — что это?

что такое переменные среды?

21 сен 2007, 23:39 Профиль

Грипп

Сообщения:14

Ответить с цитатой

«Аппаратная ошибка NTVDM» — что это?

что такое 2к3?

21 сен 2007, 23:39 Профиль

SR

Эксперт

Аватара пользователя

Сообщения:2454
Откуда:Asino

Ответить с цитатой

«Аппаратная ошибка NTVDM» — что это?

Блин ставь XP — и не парься. Нафига поставил эту фигню? Сисадмином себя возомнил что ли ? А 2003 ничем не отличается от XP разве что она вся на англицком…

21 сен 2007, 23:42 ПрофильICQWWW

Грипп

Сообщения:14

Ответить с цитатой

«Аппаратная ошибка NTVDM» — что это?

спасибо отлично помог!

21 сен 2007, 23:48 Профиль

Грипп

Сообщения:14

Ответить с цитатой

«Аппаратная ошибка NTVDM» — что это?

кто-нибудь может сказать конкретно как избавиться от ошибки.

21 сен 2007, 23:49 Профиль

Грипп

Сообщения:14

Ответить с цитатой

«Аппаратная ошибка NTVDM» — что это?

во внешке тоже искал что-то конкретного описания нету, только кто-нибудь что-нибудь «пукнет» и съебется….

21 сен 2007, 23:50 Профиль

SR

Эксперт

Аватара пользователя

Сообщения:2454
Откуда:Asino

Ответить с цитатой

«Аппаратная ошибка NTVDM» — что это?

img_1 — так должен выглядеть первая эээ хрень дальше тыкаем кнопу «переменные среды» и img_2 изменяете верхние строчки на [color=#999]C:TMP[/color] и [color=#999]C:TEMP[/color]

21 сен 2007, 23:52 ПрофильICQWWW

Грипп

Сообщения:14

Ответить с цитатой

«Аппаратная ошибка NTVDM» — что это?

Благодарю реально помог.

А ты где админом работаешь?

22 сен 2007, 00:00 Профиль

SR

Эксперт

Аватара пользователя

Сообщения:2454
Откуда:Asino

Ответить с цитатой

«Аппаратная ошибка NTVDM» — что это?

Уже нигде ;)

PS тема переносится в раздел Windows.

22 сен 2007, 00:08 ПрофильICQWWW

Грипп

Сообщения:14

Ответить с цитатой

«Аппаратная ошибка NTVDM» — что это?

понятно.

ладно.

удачи

22 сен 2007, 00:09 Профиль

Anthariel

Антиспам

Аватара пользователя

Сообщения:1679

Ответить с цитатой

«Аппаратная ошибка NTVDM» — что это?

вот сцуко мудак… на ночь глядя пишет и ждёт что ради него спать не будут люди… бывают же такие личности…

22 сен 2007, 10:08 Профиль

SR

Эксперт

Аватара пользователя

Сообщения:2454
Откуда:Asino

Ответить с цитатой

«Аппаратная ошибка NTVDM» — что это?

Anthariel, тебя правила тоже косаются! Там четко сказано, что:

Цитата:

2.1 Оскорблять участников форума в любой форме.

Если ты не хочешь отвечать на вопрос то и не надо. А я к примеру отвечаю всегда когда могу и хочу.

23 сен 2007, 20:16 ПрофильICQWWW
Показать сообщения за: Поле сортировки 

Обратная совместимость — вещь хорошая, но использовать ее надо в разумных пределах. Ведь до сих пор в ядре 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

   Diter

24.12.06 — 22:19

Зараза!!!!!!

сервер win2003 без СП.

при установке 1С (лицензия) выдаёт такую вот каку. делал всё что описано в

http://support.microsoft.com/defaul…id=kb;ru;314106

что можете посоветовать?

   insider

1 — 24.12.06 — 22:25

(0) перепрописать путь к папке Temp и саму папку сделать в корне диска

   Diter

2 — 24.12.06 — 22:26

(1) ГДЕ???????

я всё облазил, но где эта строка

%USERPROFILE%Local SettingsTemp

?????

   Diter

3 — 24.12.06 — 22:26

которую блин исправить надо…..

   insider

4 — 24.12.06 — 22:26

+1 в папке system32 создать файлы (восстановить из дистра) autoexec.nt и config.nt

   insider

5 — 24.12.06 — 22:27

(3) мой комп-свойства-дополнительно-переменные среды

   Diter

6 — 24.12.06 — 22:27

(4) сделал

(5) а мля…. щас

   Diter

7 — 24.12.06 — 22:30

Мама дорогая…..

Саша — спасибо…..

   insider

8 — 24.12.06 — 22:30

исшо: Если в момент загрузки W2k в корне системного раздела присутствовал файл autoexec.bat, то значения переменной path, определенные в нём, добавятся к путям определенным в «Переменных среды». Если вы не хотите этого, в разделе реестра HKCUSoftwareMicrosoftWindowsNTCurrentVersionWinlogon значение параметра ParseAutoexec: REG_SZ: установите 0.

(7) :)

   spock

9 — 24.12.06 — 22:34

пока нашел сцылку уже все разрешилось.

хз, может для потомков сгодится:

http://support.microsoft.com/default.aspx?scid=kb;en-us;222975

   Diter

10 — 24.12.06 — 22:37

(9) см сабж — то же только по русски, но там про темпы ни слова

   Diter

11 — 24.12.06 — 22:38

ЗЫ. Какая удобная штучка «краб» для подключения моника, клавы и мышки к нескольким системникам

   insider

12 — 24.12.06 — 22:42

(10) а это загадочная мелкомягкая натура такая :))

   spock

13 — 24.12.06 — 22:44

(10)нужно взять за правило менять пользовательские и системные переменные TEMP/TMP на новых машинках, обычно некоторые проблемы отсеивает сразу.

   insider

14 — 24.12.06 — 22:46

(11) KVM чтоль? ну да, удобно, сам юзаю :)

   Diter

15 — 24.12.06 — 22:48

Так а что теперь её надо? 1С не запускается и не ругается (ключ не стоит пока).

блин — конченаяоперационка

   spock

16 — 24.12.06 — 22:51

(15)даже в процессах нет?

может нужно DEP покрутить?

   Diter

17 — 24.12.06 — 22:51

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

   Diter

18 — 24.12.06 — 22:53

ну что. пришлось дать её синюю таблетку — запустилась

   spock

19 — 24.12.06 — 22:54

пальцем в небо:

1. boot.ini параметр /noexecute=AlwaysOff

2. режим совместимости для 1cv7*.exe как Win98

но чета на w2k3 у меня таких проблем не наблюдалось…

   Diter

20 — 24.12.06 — 22:55

(19) пробовал все совместимости — болт. а помогло 18

   Diter

21 — 24.12.06 — 22:56

да у меня кореш с этого же диска ставил — всё окей…

   Diter

22 — 24.12.06 — 22:56

ладно — главное запустил…..

всем спасибо

ЗЫ

(19) можем же нормально общаться, как ЛЮДИ а не как скоты…..

   spock

23 — 24.12.06 — 22:58

(20)думается п.1 из (19) должен помочь.

(22)так веди себя «как ЛЮДИ, а не как скоты».

   spock

24 — 24.12.06 — 22:58

+23 без таблетки имею ввиду.

   Diter

25 — 24.12.06 — 23:00

(23) Я кажется сказал не «как скот». Опять в бутылку лезешь? нам всем нужно культуры добавить. теперь ты мою мысль понял?

   Номенклатор

26 — 24.12.06 — 23:34

опять дитер облажался на ровном месте…

   Warlock

27 — 24.12.06 — 23:49

(18)Проблемы с нахождением ключа?

   Diter

28 — 24.12.06 — 23:49

(27) вообще ничего не писала и процесс в памяти не держался… вылетал через секунду без сообщений

   spock

29 — 24.12.06 — 23:50

(28)обрати внимание в журнал событий.

   Diter

30 — 24.12.06 — 23:51

(29) завтра. сегодня я его уже отключил

   Warlock

31 — 24.12.06 — 23:51

(28)А версии дров какие? Были ли в сети машины с HASP LM?

  

Diter

32 — 24.12.06 — 23:54

(31) нет. в сети нет машин вообще. ключа тоже нет. просто хотел попробовать стартануть до появления сообщения об отсутствии ключа — вылетала нафик

#1

Гость_spider1982_*

Отправлено 30 Май 2006 — 14:54

Не могу побороть ошибку «Аппаратная ошибка NTVDM.EXE». Не могу установить из-за этой ошибки программы которые работают под DOS 16 бит. И настроить тоже не могу NTVDM.EXE под 16 бит! Не дает даже запустить командную строку! Что я только не пробывал!!! И настраивал autoexec.nt и cinfig.nt!! И копировал их с Дистриба!!! И удалял NTVDM.EXE и копировал с дистриба! Все равно! САМОЕ удивительное то что на другом серваке я поставил Эту же версию с этого же компакта и все ОК! Все работает! Есть предположение что проблема заключается в Винчестере точнее разделе!! Где все работает винда стоит на NTFS-e а где не работает на FAT-e!!!! ИЛИ Проблема связана с железом!!!
ПОПРОБУЮ напишу а так ПОМОГИТЕ!!!

  • Наверх

#2

Гость_VseDoFeNi_*

Отправлено 19 Июль 2006 — 20:17

Гость_VseDoFeNi_*

  • Гости

Для начала биос обнови. Сравни конфигурации серверов.

  • Наверх

#3

Гость_Evgenus_*

Отправлено 22 Июль 2006 — 14:37

Гость_Evgenus_*

  • Гости

spider 1982 У меня вчера такая же промблема была. Вообщем помогло в переменных средах прописать путь, типа %SystemRoot%Temp заменить на C:WindowsTemp, ну и везде там этот SystemRoot убрать. После этого досовская прога пошла. Правда есть одна промблема, программа работает но в определенном месте ссылается на адрес машинный и после этого вылетает без каких-либо сообщений. DR.Watson пишет что доступ в эту ячейку памяти заблокирован (туда ссылается ntvdm), хотя на WinXP всё работает без промблем. У тебя случайно такого не было? Прога на FoxPro 2.5 написана…

  • Наверх

Проблема: при попытке запуска любого 16-битного приложения в Windows 10 (32-битной) появляется следующая ошибка: «16-битная подсистема MS-DOS. NTVDM обнаружил системную ошибку. Неверный дескриптор. Выберите« Закрыть »для прекратить заявку. » 

NTVDM обнаружил исправление системной ошибки

В этом руководстве содержатся инструкции по устранению проблемы «NTVDM обнаружил системную ошибку» при открытии 16-разрядных приложений в Windows 10.

Как исправить NTVDM обнаружил системную ошибку в Windows 10.

Шаг 1. Включите компонент NTVDM.

1. Одновременно нажмите Выиграть образ + р ключи, чтобы открыть окно команды запуска.

2. Введите следующую команду и нажмите ХОРОШО.

  • панель управления

панель управления

3. Изменить Просмотр по в Маленькие иконки в правом верхнем углу, чтобы просмотреть все элементы панели управления.

4. открыто Программы и характеристики а затем нажмите Включение или отключение функций Windows слева.

Включение или отключение функций Windows

5. расширять Унаследованные компоненты, чек NTVDM вариант и нажмите хорошо.

включить нтвдм windows 10

Шаг 2. Включите устаревшую консоль.

1. Одновременно нажмите Выиграть образ + р ключи, чтобы открыть окно команды запуска.

2. Тип CMD открыть командную строку.

командная строка

3. Щелкните правой кнопкой мыши на верхней панели командной строки (рядом с заголовком) и выберите свойства.

исправить ошибку ntvm

4. Проверьте «Использовать консоль Legacy (требуется перезапуск)«вариант и нажмите хорошо.

исправить проблемы с ntvm в windows 10 - включить устаревшую консоль

5. Закройте командную строку и запустите приложение MS-DOS. Проблема NTVDM должна быть решена до сих пор.

* Примечание: Если вы все еще получаете ошибку NTVDM при запуске 16-битных приложений, переходите к следующему шагу

Шаг 3 (необязательно *). Включить доступ к 16-битным приложениям из реестра или групповой политики.

* Обратите внимание: Инструкции на этом этапе являются необязательными. Применяйте их, только если у вас все еще есть проблемы при запуске 16-разрядных программ в Windows 10 (или в ОС Windows 7).

Windows 7 10 Домой или Про.
— Чтобы включить доступ к 16-разрядным приложениям в Windows 10 Home:

1. Одновременно нажмите Выиграть образ + р ключи, чтобы открыть окно команды запуска.

2. Тип смерзаться и нажмите Войти открыть редактор реестра.

Включить доступ к 16-битным приложениям

3. Перейдите к этому ключу слева:

  • HKEY_LOCAL_MACHINE SOFTWARE Policies Microsoft Windows

4. Щелкните правой кнопкой мыши на Windows и выбрать новый > ключ.

Включить доступ к 16-битным приложениям Windows

5. Назовите новый ключ «AppCompat«(без кавычек) и нажмите Войти.

6. Выделить AppCompat ключ и затем щелкните правой кнопкой мыши на правой панели и выберите новый > DWORD (32-битное) значение.

Включить доступ к реестру 16-битных приложений

7. Назовите новое значениеVDMDisallowed«(без кавычек) и нажмите Войти..

8. Дважды щелкните на VDMDisallowed значение и тип 1 в окне данных.

Включить 16-битный реестр приложений

7. щелчок хорошо когда сделано и близко Редактор реестра.
8. Перезагрузите твой компьютер.

Windows 7 10 Pro.

— Включить доступ к 16-битным приложениям в Windows 10 Pro.

1. Одновременно нажмите Выиграть образ + р ключи, чтобы открыть окно команды запуска.
2. Введите gpedit.msc и нажмите Войти открыть редактор локальной групповой политики.

gpedit.msc

3. В редакторе групповой политики перейдите (с левой стороны) к:

  • Конфигурация компьютера> Административные шаблоны> Компоненты Windows> Совместимость приложений.

4. Дважды щелкните, чтобы открыть Запретить доступ к 16-битным приложениям (на правой панели).

Запретить доступ к 16-битным приложениям

5. щелчок Инвалид, щелчок хорошо и закройте редактор групповой политики.

разрешить доступ к 16-битным приложениям отключено

Это оно! Дайте мне знать, если это руководство помогло вам, оставив свой комментарий о вашем опыте. Пожалуйста, любите и делитесь этим руководством, чтобы помочь другим.

3 / 3 / 0

Регистрация: 04.10.2014

Сообщений: 40

1

30.11.2014, 13:10. Показов 3804. Ответов 9


Добрый день, у меня со вчерашнего дня на компе (Windows 7) периодически вдруг выдается ошибка NTVDM, особенно после запуске и закрытии консольных программ DOS — Win32.
Появляется черное окно DOS и сообщение такого вида:
ntvdm 774.df4.d08
The NTVDM CPU has encountered an illegal instruction.
CS:0eab IP:0118 OP:63 6f 6d 65 20 Choose Close to terminate the application.

У меня это впервые, никогда не сталкивался. Подскажите, пожалуйста

Ошибка NTVDM

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



киберпаразит

Эксперт Windows

9719 / 2783 / 188

Регистрация: 14.06.2011

Сообщений: 9,586

30.11.2014, 13:38

2

в безопасном режиме как?

командная строка от имени администратора — sfc /scannow (крайне желательно, чтобы диск с дистрибутивом win находился в приводе)



0



3 / 3 / 0

Регистрация: 04.10.2014

Сообщений: 40

30.11.2014, 13:56

 [ТС]

3

Открыл командную строку, ввел то, что вы сказали — как-то вот такой результат. Далее система советует посмотреть файл отчета CBS.log. Но я в нем ничего не пойму…

Ошибка NTVDM



0



киберпаразит

Эксперт Windows

9719 / 2783 / 188

Регистрация: 14.06.2011

Сообщений: 9,586

30.11.2014, 15:47

4

strcmp75, диск с виндой в приводе был на момент сканирования?



0



3 / 3 / 0

Регистрация: 04.10.2014

Сообщений: 40

30.11.2014, 21:33

 [ТС]

5

ScrollLock, нет… Сейчас попробую с диском.

Добавлено через 11 минут
Попробовал проделать то же самое с вставленным диском — результат тот же самый, ничего не поменялось.



0



1146 / 954 / 76

Регистрация: 11.10.2010

Сообщений: 6,031

01.12.2014, 07:18

6

strcmp75, возможно появились битые кластеры, Викой полечить не?



0



3 / 3 / 0

Регистрация: 04.10.2014

Сообщений: 40

01.12.2014, 18:38

 [ТС]

7

sacredheart, там пишет что обнаружены поврежденные системные файлы, но Windows не может восстановить некоторые из них.



0



1146 / 954 / 76

Регистрация: 11.10.2010

Сообщений: 6,031

01.12.2014, 19:31

8

strcmp75, ну это понятно, а почему они повредились?



0



3 / 3 / 0

Регистрация: 04.10.2014

Сообщений: 40

01.12.2014, 21:59

 [ТС]

9

sacredheart, не знаю…



0



1146 / 954 / 76

Регистрация: 11.10.2010

Сообщений: 6,031

02.12.2014, 07:12

10

гадать можно до бесконечности, вы б уже делали что-нть, либо проверку HDD, либо восстановление ОС.



0



Понравилась статья? Поделить с друзьями:

Читайте также:

  • Аппаратная ошибка 03800500 2f43
  • Аппаратная ошибка 03800500 2f2f
  • Аппаратная ошибка 03130031 4027 canon
  • Аппаратная ошибка 03130031 2f50
  • Аппаратная ошибка 03130031 2f26 canon

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии