Начиная с восьмой версии в Windows появился встроенный механизм контейнеров, которые позволяют изолировать процессы путем значительного усечения их прав. Этому системному механизму дали название Less Privileged App Container (LPAC), он поддерживается некоторыми приложениями, например браузером Chrome. В этой статье я покажу, как использовать его в своих программах.

Сендбокс-изоляция часто применяется в защитных приложениях, а также на ее основе строятся компоненты антивирусов, называемые HIPS (Host-based Intrusion Prevention System), и отдельные приложения для изолированных сред типа Sandboxie. Такие защитные механизмы реализованы через драйвер-фильтр режима ядра. Он сложен в написании и тестировании, имеет громадное количество шаблонного кода и должен перехватывать значительное количество функций NTAPI, чтобы менять их параметры на лету, таким образом создавая песочницу внутри файловой системы.

Существует более простой способ устроить изоляцию произвольных приложений. Инженеры Microsoft уже позаботились об этом и интегрировали интересный механизм в ядро Windows. Его суть заключается в том, что система жестко ограничивает доступ к устройствам (таким как микрофон, камера, GPS или модуль 4G), файлам в системе (иногда — даже для чтения) и процессам (ограничиваются межпроцессные взаимодействия). Также ограничения накладываются на работу с сетью (например, на открытие портов или сокетов), обращения к сетевому реестру и оконному интерфейсу других приложений.

Когда приложение запущено внутри LPAC, все разрешения ему требуется выдавать явно. Это весьма полезный механизм с точки зрения безопасности, если в приложении есть уязвимости, которые злоумышленник может использовать для повышения привилегий и доступа к другим ресурсам. Если уязвим, например, браузер, то такую атаку можно выполнить удаленно. Кроме того, когда запускаешь неизвестное приложение, неплохо было бы обезопасить себя от несанкционированных действий с его стороны, научившись запускать приложения в контейнере LPAC.

 

Создаем Less Privileged App Container

Прежде чем запускать приложение, нам нужно создать сам контейнер. В этом нам поможет функция WinAPI CreateAppContainerProfile. Вот ее прототип:

HRESULT WINAPI CreateAppContainerProfile(
  _In_  PCWSTR              pszAppContainerName,
  _In_  PCWSTR              pszDisplayName,
  _In_  PCWSTR              pszDescription,
  _In_  PSID_AND_ATTRIBUTES pCapabilities,
  _In_  DWORD               dwCapabilityCount,
  _Out_ PSID                *ppSidAppContainerSid
);

И сам код создания контейнера:

WCHAR sandbox_name[] = L"SandboxLPAC";
WCHAR sandbox_desc[] = L"My SandboxLPAC";

PSID sid = NULL;
HRESULT status;

result = CreateAppContainerProfile(sandbox_name, sandbox_name, sandbox_desc, NULL, 0, &sid);

В случае ошибки неплохо было бы проверить, не создан ли наш контейнер ранее; если создан, то мы получим его SID. Вот прототип функции WinAPI, которая выясняет SID уже созданного контейнера:

HRESULT WINAPI DeriveAppContainerSidFromAppContainerName(
  _In_  PCWSTR pszAppContainerName,
  _Out_ PSID   *ppsidAppContainerSid
);

Далее код реализации проверки. Как видишь, он очень прост.

if (HRESULT_CODE(status) == ERROR_ALREADY_EXISTS)
status = DeriveAppContainerSidFromAppContainerName(sandbox_name, &sid);

Так или иначе мы получаем SID контейнера.

INFO

Security Identifier (SID) — идентификатор безопасности, структура данных в Windows, которая может идентифицировать системные объекты, например элементы управления доступом (Access Control Entries, ACE), токены доступа (Access Token), дескрипторы безопасности (Security Descriptor). SID всегда начинается с буквы S, далее идут числа, которые обозначают номер редакции ОС, источники выдачи, удостоверяющие центры и другую информацию.

Насколько просто обойти изоляцию LPAC?

Загрузка ... Загрузка ...
 

Пишем LPAC loader для любого приложения

Итак, контейнер LPAC создан, SID получен. Теперь наша задача — заставить Windows запустить произвольное приложение в этом контейнере. Но сначала нам необходимо разобрать процесс запуска приложений и понять, как можно задавать определенные атрибуты запуска и какие системные структуры отвечают за это.

Для запуска приложений в Windows используется функция WinAPI CreateProcess с массой параметров, и именно эта функция имеет ключевое значение в нашей задаче. Давай посмотрим на ее прототип и разберем основные параметры.

Продолжение доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все материалы на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи один материал

Заинтересовала информация, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для материалов, опубликованных более двух месяцев назад.


2 комментария

  1. inkognito.o

    23.03.2018 at 01:42

    сложно, но интересно.

  2. Kadist

    27.03.2018 at 17:52

    Спасибо! А готовые решение использующие изоляцию для запуска любых приложений есть? (GUI, batch, PS)

Оставить мнение

Check Also

Самое крутое с мировых ИБ конференций. Лучшие публикации, посвященные взлому видеоигр

Современная игровая индустрия — большой бизнес, в котором крутятся весьма солидные деньги.…