Process Explorer: Integrity Level (Уровень целостности)

Если в Process Explorer на заголовке колонки нажать правую кнопку мышки и выбрать Select Columns…, то на вкладке Process Image можно увидеть чекбокс Integrity Level. На русский язык это можно перевести как «Уровень целостности», хотя это не отразит всю суть этой настройки. Как следует из названия, чекбокс Integrity Level включает отображение установленного уровня целостности для процесса. Причем этот уровень основан не на NTFS-разрешениях, а на проверке прав доступа у текущего объекта, которому присвоен маркер доступа (security access token).
Если не рассматривать максимальный уровень (System), то для пользователя доступны 3 вида — High, Medium и Low.
High — это максимальный уровень, который присваивается процессам, запущенным любым процессом, имеющим права Администратора.
Medium — это уровень, с которым запускаются процессы от учетной записи с правами авторизованного пользователя.
Low — уровень процесса, который был вызван с принудительным понижением привилегий процесса. Это можно сделать в Process explorer через меню:
File -> Run as Limited User…
Или через утилиту из комплекта PsTools

psexec -l -d имя_файла


На скриншоте выше мы видим четыре процесса cmd.exe:
1. Самая верхняя в списке консоль (PID = 1032) была запущена от пользователя с правами Администратора (Integrity = high).

cmd.exe


2. Консоль (PID = 2284) была запущена с ограниченными правами через меню Process Explorer (File -> Run as Limited User…). Сам Process Explorer был запущен с правами админа, может поэтому Integrity Level остался равным high, хотя мне кажется, это некорректное отображение, т.к. права у него урезаны:

3. Консоль (PID=4564) была запущена из под учетной записи с правами обычного пользователя (Integrity = medium):

4. Последняя консоль в списке (PID=1972) была запущена из под админской учетки, но с помощью понижения привилегий (Integrity = low):

psexec -l -d %windir%\Sysnative\cmd.exe

Хоть консоли из пункта 2 (PID=2284) и пункта 4 (PID=1972) имеют разный уровень целостности (Integrity Level), но привилегии у них одинаковые.

Пока не знаю почему, но если вызывать консоль способом из пункта 4, то в нее нельзя будет перетащить ярлык с рабочего стола при работе под учетной записью с правами обычного пользователя. А вот если запускать консоль с пониженной привилегией таким способом:

psexec -l -d cmd.exe

будет вызвана 32-битная консоль. В этом случае как и полагается будет работать перетаскивание ярлыков с рабочего стола пользователя в консоль.
Вообще механизм уровней целостности позволяет процессу с более высоким приоритетом взаимодействовать с процессом у которого приоритет ниже (но не наоборот). То есть я могу перетащить с рабочего стола пользователя ярлык в консоль с ID=4564, при этом в консоль будет вставлен полный путь этого ярлыка.

Консоль (PID = 2284), запущенная с ограниченными привилегиями из Process Explorer, уже не будет иметь админских прав:

C:\Users>cd Denis
Access is denied.

Попытка зайти в папку пользователя, на которую нет явных прав, привела к отказу. То же самое произойдет, при попытке перейти в папку пользователя в консоли (PID=1972), привилегии которой понижены с помощью psexec.

Подобная система распределения прав имеет отношение и к некоторым папкам.
Если рассмотреть папки профиля пользователя (при условии, что текущий диск C):

cd %userprofile%\appdata
dir

мы увидим три папки профиля:

Directory of C:\Users\Admin\AppData

Local
LocalLow
Roaming

Сейчас нас интересует папка Local. На нее и на папку LocalLow назначаются специальные права. Чтобы это проверить, можно запустить консоль обычным способом под пользователем Админ и там перейти во временную папку:

cd %temp%

Теперь мы находимся во временной папке профиля Admin. Если мы попытаемся создать там файл, то все получится:

echo %time% > testintegrity.txt

Можно его посмотреть:

type testintegrity.txt

будет выведено время, которое было записано в файл:

13:11:32,44

Теперь запустим из под учетки Админа консоль с пониженным уровнем целостности:

psexec -l -d %windir%\Sysnative\cmd.exe

Как и ранее перейдем во временную папку и попытаемся там создать файл, записав в него текущее время. Но на этот раз мы получим сообщение об отказе доступа:

cd %temp%
C:\Users\Admin\AppData\Local\Temp>echo %time% > testintegrity2.txt
Access is denied.

При этом прочитать записанный ранее файл мы сможем:

C:\Users\Admin\AppData\Local\Temp>type testintegrity.txt
13:11:32,44

Если же теперь перейти в папку LocalLow, то там мы сможем создать файл:

C:\Users\Admin\AppData\LocalLow>echo %time% > testintegrity.txt

C:\Users\Admin\AppData\LocalLow>type testintegrity.txt
13:51:46,43

Если запустить для этой папки icacls, то для нее будет стоять отметка о пониженном уровне целостности (отметка Mandatory Label\Low Mandatory Level):

C:\Users\Admin\AppData\LocalLow>icacls .
. NT AUTHORITY\SYSTEM:(OI)(CI)(F)
  BUILTIN\Администраторы:(OI)(CI)(F)
  Nuitari\Admin:(OI)(CI)(F)
  Mandatory Label\Low Mandatory Level:(OI)(CI)(NW)

Successfully processed 1 files; Failed processing 0 files

Выводы никакие делать не буду, т.к. это статья не для журнала, а «себе на заметку».

Еще немного информации можно найти здесь.