Поддерживает ли SetThreadToken() токен олицетворения?

В то время как основной поток олицетворяет клиента, мой код создает поток и назначает ему токен олицетворения, используя SetThreadToken. Затем основной поток закрывает токен.

В частности, основной поток делает это:

  1. Получите первичный токен, используя LogonUser.
  2. Получите токен олицетворения, используя DuplicateToken из основного токена.
  3. Звоните ImpersonateLoggedOnUser.
  4. Создайте дополнительный поток и вызовите SetThreadToken в потоке с токеном олицетворения.
  5. RevertToSelf.
  6. CloseHandle как для олицетворения, так и для основного токена.

В этот момент вторичный поток все еще работает. Остается ли токен олицетворения пригодным для вторичного потока, даже если дескриптор токена был закрыт в основном потоке?


person j6t    schedule 17.10.2018    source источник
comment
да, когда вы назначаете поток токену (через SetThreadToken) - к этому токену будет добавлена ​​дополнительная ссылка. в результате он не будет уничтожен, когда вы закроете его дескриптор.   -  person RbMm    schedule 17.10.2018
comment
Спасибо. Но для SetThreadToken мне нужен токен олицетворения, так что я все равно должен DuplicateToken. Основной поток олицетворяет пользователя, потому что он также должен делать что-то еще от его имени.   -  person j6t    schedule 17.10.2018
comment
понимать. любой объект (также и токен) остается действительным до тех пор, пока не существует ссылка на него. дескриптор объекта, это ссылка. когда вы назначаете токен потоку - к этому объекту токена будет добавлена ​​дополнительная ссылка. в результате вы можете закрыть дескриптор. токен будет действителен до тех пор, пока вы не назначите другой токен своему рабочему потоку или этот поток не выйдет   -  person RbMm    schedule 17.10.2018


Ответы (1)


Ядро Windows использует подсчет ссылок на объекты. TOKEN тоже объект. когда вы назначаете токен потоку (через SetThreadToken), указатель на объект TOKEN сохраняется в объекте ETHREAD, а дополнительная ссылка добавляется к объекту TOKEN. конечно, ядро ​​​​не может полагаться на близкий вам или не оригинальный дескриптор (ссылку) на объект TOKEN. это общее правило подсчета указателей - если A хранит указатель на B в себе - добавляется ссылка на B, так как она будет действительна до тех пор, пока A не использует B. токен будет действителен до тех пор, пока ваш поток не олицетворяет другой токен, не завершит олицетворение или не выйдет. в любом случае после того, как вы назначите токен потоку, вы можете закрыть его дескриптор - токен остается действительным


если есть интерес, как работают внутренние SetThreadToken:

SetThreadToken вызов NtSetInformationThread с ThreadImpersonationToken информационным классом. со стороны ядра реализация называется < a href="https://github.com/bigzz/WRK/blob/master/base/ntos/ps/psquery.c#L3835" rel="nofollow noreferrer">PsAssignImpersonationToken — этот API объявлен в < em>ntifs.h. это реализация вызов PsImpersonateClient который и ссылка переданный токен. в результате он становится действительным, когда используется назначенный потоку

Поток сервера мог уже олицетворять клиента, когда вызывается PsImpersonateClient. В этом случае счетчик ссылок на токен, представляющий этого клиента, уменьшается.

но в любом случае - нам не нужны для этого внутренние знания - нужно общее мышление, понимание - объект подсчет ссылок. если указатель на токен сохранен в потоке - этот токен, конечно, должен быть действительным до тех пор, пока не будет использован потоком. в результате он сослался. когда поток перестает использовать этот токен (изменить указатель или выйти) - токен разыменовывается

person RbMm    schedule 17.10.2018
comment
У вас есть ссылки, подтверждающие вашу точку зрения? Возможно примеры кода? - person j6t; 17.10.2018
comment
@ j6t - нет ссылки. это внутреннее знание Windows, однако, если указатель на TOKEN, сохраненный в Thread->ImpersonationInfo->Token, конечно, добавляет ссылку на токен, поскольку он будет действительным. пример кода, который вы хотите? - person RbMm; 17.10.2018
comment
Внутреннее знание Windows? Вы сотрудник Microsoft и работаете над ядром Windows? Возможно, вы знаете об известном ПО с открытым исходным кодом, использующем обсуждаемый паттерн. - person j6t; 17.10.2018
comment
@j6t - я, конечно, не сотрудник Microsoft, но попробуйте подумать сами - как мы можем сохранить указатель на объект (токен) для использования в будущем, не добавляя ссылку на него, чтобы быть уверенным, что он будет действительным, пока мы его не используем? это общие знания - person RbMm; 17.10.2018