вторник, 21 сентября 2010 г.

Как недостаток моих знаний о выходе процессов на Windows XP привёл к отзыву исправления безопасности

Это перевод How my lack of understanding of how processes exit on Windows XP forced a security patch to be recalled. Автор: Реймонд Чен.

В прошлом году обновление безопасности получило много внимания общественности, потому что оно приводило к зависанию некоторых машин и оно было моей виной (по сравнению с ним запарывание демонстрации на Financial Analysts Meeting выглядит мелочёвкой).

Это исправление безопасности должно было закрыть категорию атак, когда люди могли сконструировать ярлыки или другие вещи с CLSID, который никогда не предназначался для использования в качестве расширения оболочки. Как мы видели ранее, многие люди делают неправильные вещи в IUnknown.QueryInterface, и если вы передадите CLSID одной из таких бажных реализаций, то Проводник добросовестно создаст его и попытается использовать - и тогда произойдут плохие вещи. Объект может привести к вылету, зависанию или даже порче памяти.

Чтобы защитить от бажных расширений оболочки Проводник, он был модифицирован, чтобы использовать вспомогательную программу verclsid.exe, чьей работой было "быть подопытным кроликом" и служить сервером для расширений оболочки, выполнять предварительные действия, чтобы убедиться, что расширение оболочки пройдёт базовые тесты функциональности, прежде чем ему будет позволено работать в Проводнике. Таким образом, если расширение оболочки сойдёт с ума, жертвой будет процесс verclsid.exe, а не Проводник.

Приложение verclsid.exe создавало поток-часового: если предварительные действия занимали слишком много времени, то часовой предполагал, что расширение зависло и сообщал Проводнику: "Не используй это расширение оболочки".

Я был одним из людей, которых привлекли к изучению этого нового поведения, чтобы мы поискали дыры в дизайне, реализации, сделали разбор каждой строчки кода и убедились, что изменение делает то, что и задумывалось, без привнесения новых багов. Мы нашли несколько проблем, тестеры нашли ещё несколько - и всё это, пока тикали часы, а люди развлекались, браня Microsoft за долгое время на выпуск исправления.

Патч вышел, и к нам начали приходить отчёты о зависаниях машин. Как это могло произойти? Мы создали поток-часового специально, чтобы поймать бажные реализации, которые зависают. Почему часовой не делал свою работу?

Это было довольно длительное введение в сегодняшний урок.

После прогона своих проверок приложение verclsid.exe отпускало расширение оболочки, финализировало COM, а затем вызывало ExitProcess со специальным кодом, означавшим "Все тесты прошли успешно". Если вы читали вчерашний пост, то возможно вы уже видите, где я облажался.

DLL, которая реализовывала расширение оболочки создавала новый рабочий поток, так что она делала один лишний вызов LoadLibrary на саму себя, чтобы она не выгружалась, когда финализировался COM. Когда DLL получала своё уведомление DLL_PROCESS_DETACH, она останавливала свой рабочий поток, используя технику установки события "пора выходить", которое слушал рабочий поток, и ожидая ответа от рабочего потока "Окей, я всё сделал".

Но вспомните, что первой вещью при выходе потоков будет завершение всех потоков, кроме вызывающего ExitProcess. Это означает, что рабочий поток DLL больше не существует. После установки события - приказа очистки несуществующему потоку, DLL ждала отмашки (несуществующего) потока. Поскольку события "пока выходить" никто не ждал, то некому было отправить событие "всё готово". DLL зависала в своём обработчике DLL_PROCESS_DETACH.

Но почему поток-часовой не спас нас? Потому что поток-часовой тоже был убит!

Итак, причиной этого был баг в расширении оболочки, которое делало плохие вещи в своей DLL_PROCESS_DETACH, но валить вину на расширение оболочки неправильно. В конце концов, оно работало в Проводнике, но валилось в verclsid.exe, которое было создано, чтобы бороться с (другими) бажными расширениями оболочки.

Добро пожаловать, читатели Slashdot. Поскольку вы не читаете комментарии перед отправкой своих, я укажу некоторые существенные прямо тут.

Это расширение оболочки было включено в драйвер принтера, который больше не выпускается. Удачи вам найти именно эту модель для тестирования в ваших лабораториях.

Обновление безопасности было отозвано и перевыпущено одним действием, которое большинство людей назовут 'обновлением', но слово 'отозвано' лучше работает в заголовке.

Прим.пер.: ссылка в тему.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.