- PVSM.RU - https://www.pvsm.ru -
Родители лучше всего знают что можно делать их ребенку, а чего нельзя. Так и программист конкретной программы знает лучше других, какие действия должна выполнять программа, а какие нет. Но не всё так хорошо как хотелось бы. Вредоносные программы частенько вмешиваются в работу других программа. Последствия от эксплуатации уязвимостей в сетевых программах вообще не предсказуемы. Всё это так или иначе нарушает информационную безопасность не только на предприятиях, но и на компьютерах рядовых пользователей.
А как было бы хорошо, если бы программа сама знала какие действия ей не нужны и на всякий случай отключала их.
Антивирусы и прочие подобные системы пытаются брать на себя роль защитников, но вся защита сводится к набору правил, которые для многих одинаковы и не учитывают специфики защищаемых программ. Такой подход иногда приводит к неприятных ситуациям. Вот несколько примеров:
Но как уже выше говорилось — автора программы лучше всего знает, что должна делать его программа. Так почему ему не дать возможности самому поставить ограничения на определенные действия? Причем не для всей программы, а для конкретных потоков.
Благодаря этому можно добиться:
Если говорить с более реалистичной точки, то можно было бы:
Для реализации идеи необходимо в ядре Windows:
В kernel32.dll добавить одну функцию управляющую защитой. Которая тоже не будет особо большой.
Данные действия под силу любому программисту (причем за один день). Но самая большая трудность в том, что Microsoft сама должна это сделать. Именно по этому такой механизм защиты остается по в мечтах.
Так как любые ограничения в пользовательском режиме (user mode) легко обходятся или снимаются, то необходимо всю защиту реализовывать в ядре.
Основной принцип вызова системных функций в Windows можно представить в виде следующей схемы:

После вызова sysenter / syscall / int 0x2E или call dword ptr fs:[0xC0] (в зависимости от версии windows) далее управление попадет в ядро, где функция KiSystemService просматривает таблицу адресов системных сервисов (SDT) и по номеру сервиса (передаваемого в регистре eax) находит адрес нужной функции и далее передаёт на неё управление. Таким образом происходит вызов нужной функции.
В системе используется два таблицы — одна отвечает непосредственно за работу систему и обрабатывается ядром, а вторая отвечает за работу GUI и обрабатывается драйвером win32.sys. Нас интересует именно первая таблица.
Благодаря такой архитектуре возможно поставить ограничение доступа на вызов любой системной функции. Для этого достаточно вставить простую проверку в функцию KiSystemService.
Место проверки мы уже обнаружили, теперь необходимо найти философский камень место под хранение матрицы доступа.
В операционных системах Windows, в ядре для описания потока используется структура KTHREAD, которая у каждого потока своя. Именно там можно будет хранить матрицу доступа. Но теперь это уже будет не матрица, а линей список (т.к. каждый поток будет хранить информацию только о себе).
Всё бы то хорошо, но есть еще и сеть, работа с которой организована через специальные драйвера. Но и тут проблема решается в обработке некоторых IRP запросов к устройствам \DeviceTcp, \DeviceUdp, \DeviceRaw что позволит также прозрачно проверять возможность доступа к сети из определенных потоков.
Реализация защиты видится следующим образом:
Ход работы защиты:
Отдельное внимание хотелось бы уделить функции установки защиты. Ей прототип видится как:
DWORD QuerySystemSecurity(HANDLE hThread, DWORD Flag, QWORD* Key, VOID* Data);
Так же в QuerySystemSecurity должна находиться таблица соответствия номеру запрещаемой функции и её номеру из SDT т.к. последний меняется от версии к версии.
Благодаря одной простой функции и небольшой модификации ядра, можно получить довольно гибкую и быструю защиту. Программист сам сможет запрещать своим программам аномальные действия. Что очень было бы полезно в сетевых программах и в первую очередь в браузерах.
Защита на основе такого подхода смогла бы более гибко контролировать выполнение стороннего кода в программах (не только вредоносного, но и плагинов от других авторов). Если небольших разработчиков программ такая защита бы не заинтересовала, то крупные смогли бы легко её использовать для усиления защиты своих программ от вмешательства чужого кода.
Конечно такая защита может быть реализована не только самой Microsoft, но и сторонними разработчиками, но это уже будет костылем и работать не столь эффективно (из-за того что придется отказаться от хранения данных в PTHREAD) ну и не будет иметь такого глобального масштаба.
Но как всегда это лишь собственные мечты о существовании защиты, которые вряд ли будут воплощены Microsoft.
Автор: shevmax
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/informatsionnaya-bezopasnost/8906
Нажмите здесь для печати.