Дело о неожиданной ошибке программы PsList

Через некоторое время после установки на своей основной настольной системе ОС Windows Vista я заметил, что какой-то процесс стал недоступен и начал потреблять слишком много ресурсов ЦП. В качестве одного из этапов устранения неполадок я запустил через командную строку программу PsList, надеясь получить подробные сведения о процессе. Вопреки моим ожиданиям увидеть страницу со статистическими данными, программа PsList вывела сведения о себе, сообщила об ошибке и закрылась.

clip_image001

Программа PsList получает данные от счетчиков производительности системы, к которым любое приложение обращается посредством стандартных функций реестра, осуществляющих доступ к виртуальному разделу HKEY_PERFORMANCE_DATA. Из сообщения об ошибке можно было сделать вывод о том, что программе PsList не удалось обратиться к виртуальным разделам данных производительности. Такая ошибка выводится при попытке собрать с помощью программы PsList статистику удаленной системы в отсутствие прав администратора в ней или в условиях, когда в удаленной системе не работает служба «Удаленный реестр». Что же касается появления этой ошибки при исследовании локальной системы, то с этим я сталкивался впервые. Следовало полагать, что в ОС Windows Vista что-то изменилось, и нужно было выяснить, что именно.

Отложив на время решение проблемы недоступного процесса, я запустил программу Process Monitor и вызвал команду PsList повторно. У меня не было уверенности, что таким способом удастся установить источник проблемы, но по опыту я знал, что программа Process Monitor (равно как и ее предшественники Filemon и Regmon) зачастую помогает решить, казалось бы, необъяснимые проблемы наподобие этой. Я просмотрел трассировку на предмет необычных кодов ошибок, которые почти всегда указывают на источник неполадок, и натолкнулся на отказ в доступе:

clip_image002

По какой-то причине программе PsList, исполнявшейся с правами стандартного пользователя (я не повышал уровень прав командной строки), не удалось получить доступ на чтение к разделу реестра PerfLib. Это меня озадачило - ведь в среде Windows XP я не испытывал никаких затруднений, запуская программу PsList с правами стандартного пользователя. Открыв редактор Regedit, я перешел к искомому разделу, чтобы изучить его разрешения. Как и предполагалось, стандартные пользователи не входили ни в одну из групп с разрешениями на доступ (кстати, обратите внимание на две новые группы, связанные с измерением производительности: «Пользователи журналов производительности» и «Пользователи системного монитора»).

clip_image003

Именно это и оказалось причиной ошибки программы PsList - предоставив группе «Интерактивные пользователи» доступ к разделу на чтение, я вновь запустил PsList и с этого момента трудностей не испытывал. Теперь нужно было понять, какие разрешения на доступ к этому разделу предоставляются в ОС Windows XP. Я перешел на тестовую систему с ОС Windows XP и открыл список разрешений. Действительно, группа «Интерактивные пользователи» здесь наделена правами доступа на чтение, чем и объясняется работоспособность программы PsList с правами стандартного пользователя в среде Windows XP.

clip_image004

Оставался вопрос: что заставило разработчиков изменить набор разрешений. Сначала мне подумалось, что новый вариант позволяет закрыть брешь, способствующую раскрытию информации, но в ходе последующих размышлений я отверг эту мысль. Раздел PerfLib предназначен для регистрации поставщиками данных производительности своих счетчиков и библиотек DLL, и когда программа наподобие PsList запрашивает данные того или иного счетчика, API данных производительности загружает соответствующую библиотеку DLL в запрашивающий процесс и вызывает функции этой библиотеки, которые и позволяют получить искомые данные. Поскольку функции библиотек DLL исполняются в контексте процесса, в который они загружаются, то никакие средства защиты, которые этот процесс не мог бы с легкостью обойти, реализованы в ней быть не могут. Таким образом, за предотвращение несанкционированного доступа к данным производительности отвечает сам источник таких данных, в качестве которого может выступать ядро или приложение - например, сервер Internet Information Server (IIS).

Получается, что запрет доступа на чтение к разделу PerfLib эквивалентен реализации средств защиты в библиотеке DLL. Блокировка доступа к разделу не позволяет интерфейсу API данных производительности выяснить перечень доступных счетчиков и представляющих данные о производительности библиотек DLL, однако за исключением надстроек, субъекты регистрации одинаковы во всех системах. Это значит, что процесс может обойти любую защиту, каковую пытается реализовать заблокированный раздел, путем загрузки библиотек DLL данных производительности напрямую и вызова их функций.

Короче говоря, я сообщил об ошибке с тем, чтобы в пакете обновления 1 (SP1) для ОС Windows Vista и в ОС Windows Server 2008 группе «Интерактивные пользователи» вновь предоставили доступ к разделу PerfLib. Специалисты из группы обеспечения надежности и диагностики сообщили, что набор разрешений был по случайности изменен перед выпуском ОС Windows Server 2003. Я убедил их в том, что смысла такое изменение не имеет, так что после выпуска ОС Windows Server 2008 и пакета обновления 1 (SP1) для ОС Windows Vista вам больше не придется редактировать разрешения раздела PerfLib, чтобы запускать программы наподобие PsList с правами стандартного пользователя.

Итак, еще одно дело раскрыто с помощью программы Process Monitor!