2. Отсутствие необходимых проверок входных данных
Любые данные, поступающие на вход программы, должны проверяться на корректность. Если эта проверка выполняется недостаточно тщательно или не выполняется вообще, нарушитель может передать в программу заведомо некорректные данные, обработка которых программой может нарушить ее функциональность и привести к нарушению политики безопасности. Особенно опасно отсутствие проверок корректности данных, передаваемых клиентскими программами в ядро операционной системы. Перечислим наиболее известные эксплойты данного класса.
Уязвимость %00
Данная уязвимость имела место в веб-браузере Internet Explorer до версии 5.5. включительно. Нарушитель размещает на своей веб-странице гиперссылку вида
<а href=prog.exe%00some.html>
При проверке данной гиперссылки браузером она распознается как безопасная (поскольку имеет безопасное расширение, html) и передается в операционную систему. После этого выполняется перекодировка строки из внутреннего формата браузера в универсальный формат ASCIIZ, понятный операционной системе. В ходе этой перекодировки байты %00 превращаются в нулевой байт, являющийся в формате ASCIIZ признаком конца строки. Таким образом, подстрока some.html «отрезается» и при переходе по гиперссылке запускается программа prog.exe, причем браузер считает данное действие безопасным и не выдает никаких предупреждений.
Аналогичная уязвимость была обнаружена и вскоре исправлена в сентябре 2015 года в браузере Google Chrome [6]. Суть DoS-уязвимости и эксплоита очень проста. Если добавить в конец любой ссылки %%300, URL конвертируется в %00. 0х30, это «0» на ASCII. Таким образом, %%300 «превращается» в оригинальный «%», конвертированный «0» и оригинальный «0». Все вместе дает %00, то есть в конец ссылки добавляется NULL byte. Далее ссылка проходит через GURLToDatabaseURL() и ReplaceComponents(). Из-за NULL byte ссылка обрабатывается еще раз, браузер замечает, что с адресом что-то не так и помечает URL как нерабочий. Далее происходит возврат к GURLToDatabaseURL(), который ожидает, что ссылка будет работать. Однако ссылка не работает, это неожиданно, и вызывает DCHECK(), а вместе с ним и прекращение работы браузера. Простейший и короткий пример такой ссылки: «http://a/%%30%30» [7].
DoS-уязвимость Skype
В июне 2015 года [8] в последних версиях Skype для Windows и Mac OS X присутствовала ошибка, позволяющая безвозвратно обрушить программу.
Для этого достаточно отправить в чате строку «http://:». После чего Skype прекращает свою работу и больше не запускается. Уязвимые версии: для Windows: 7.5.0.101, для Mac OS X: 7.8 (390) [9].
3. Некорректный контекст безопасности
Средства динамического изменения полномочий пользователей традиционно являются одним из самых уязвимых мест во всех операционных системах. В Windows динамическое изменение полномочий реализовано путем динамического понижения, что в целом заметно более надежно, чем динамическое повышение полномочий, принятое в UNIX. Механизм олицетворения пользователя Windows заметно более устойчив к ошибкам программирования и администрирования, чем механизм SUID/SGID в UNIX, но, тем не менее, с ним связан целый ряд программных уязвимостей. Перечислим лишь некоторые из них.
Системные окна на рабочем столе пользователя
В отличие от большинства объектов Windows, окна не являются объектами доступа операционной системы. Минимальным объектом доступа среди графических объектов Windows является рабочий стол (desktop). Любое графическое или консольное приложение, выполняющееся на рабочем столе пользователя, может направлять любые сообщения любому другому окну, выполняющемуся на том же рабочем столе. Если на рабочем столе пользователя выполняется системное приложение, то программа пользователя, направив в это окно определенную комбинацию сообщений, может спровоцировать некорректное поведение системного приложения и, возможно, несанкционированно повысить полномочия пользователя, запустившего эту программу.
С введением в Windows Vista мандатного контроля целостности (Mandatory Integrity Control, MIC) уязвимости данного класса стали значительно менее опасными, поскольку передача оконных сообщений из пользовательских окон в системные стала по умолчанию запрещена [10].
AlwaysInstallElevated
Иногда администраторы позволяют обычным пользователям самостоятельно устанавливать программы, обычно делается это через следующие ключи реестра:
HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer
\AlwaysInstallElevated
Или
HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated
Они указывают системе, что любой MSI-файл должен устанавливаться с повышенными привилегиями (NT AUTHORITY\SYSTEM). Соответственно, задействовав специальным образом, созданный файл, можно выполнить действия от имени системы и повысить свои привилегии [15].
