Некоторые API Windows возвращают первичный токен, а некоторые возвращают маркер олицетворения. Для некоторых API требуется первичный токен, в то время как другим требуется токен олицетворения.В чем разница между основным токеном и токеном олицетворения
Например, LogonUser
обычно возвращает основной маркер, за исключением при использовании LOGON32_LOGON_NETWORK
как тип входа (dwLogonType
):
В большинстве случаев, возвращенный дескриптор является основным маркером, который можно использовать в вызовах функция CreateProcessAsUser. Однако, если вы укажете флаг LOGON32_LOGON_NETWORK, LogonUser вернет маркер олицетворения, который нельзя использовать в CreateProcessAsUser, если вы не вызываете DuplicateTokenEx, чтобы преобразовать его в первичный токен.
SetThreadToken
требуется маркер олицетворения то время как ImpersonateLoggedOnUser
, который, кажется, чтобы сделать почти то же самое происходит ни один.
CreateProcessAsUser
и CreateProcessWithTokenW
оба требуют первичных маркеров и как отметить первичный маркер может быть получен из маркеров олицетворения путем вызова DuplicateTokenEx
, но что типы маркеров означают?
Словарь говорит следующее:
Маркер доступа содержит информацию о безопасности для сеанса входа в систему. Система создает маркер доступа, когда пользователь входит в систему, и каждый процесс, выполняемый от имени пользователя, имеет копию токена. Токен идентифицирует пользователя, группы пользователей и привилегии пользователя. Система использует токен для управления доступом к защищаемым объектам и для управления способностью пользователя выполнять различные системные операции на локальном компьютере. Существует два типа токена доступа, первичный и олицетворяющий.
маркер доступа, который, как правило, создается только в ядре Windows. Он может быть назначен процессу для представления информации безопасности по умолчанию для этого процесса.
маркер доступа, который был создан для сбора информации о безопасности процесса клиента, что позволяет серверу «выдавать себя» процесс клиента в операциях по обеспечению безопасности.
Но это не совсем полезно. Похоже, что кто-то хотел использовать большие слова мальчика, такие как «ядро», но это только помогает поднимать больше вопросов, таких как то, что еще (кроме того, что назначено процессу) может использоваться первичный токен и кто еще, кроме ядра, может создавать доступ жетоны?
(Являются ли они пониманием Microsoft, когда ядро является частью того, что работает в режиме ядра, а также есть исполнительный и т. Д., Или они означают, что код в режиме пользователя также может создавать токены? если код пользовательского режима может создавать токены, он должен будет сделать это с помощью системного вызова, как и с любым объектом Object Manager, поэтому в любом случае токен будет фактически создан в режиме ядра.)
В любом случае, Ответ на основной вопрос: Какая разница между типами токенов?Не что они могут быть использованы или как они обычно создано.
Вы также можете создавать маркеры из пользовательского режима с задокументированными функциями CreateToken и CreateTokenEx, но для этого требуется много инфраструктуры, поскольку эти функции можно вызывать только из SSP/AP («поставщик/пакет "). –
Хорошая точка. Обратите внимание, что не только они требуют, чтобы вы реализовали весь интерфейс SSP/AP (функции «SpLsaModeInitialize» должны возвращаться в таблице функций и т. Д.), В отличие от «простых» SSP, SSP/AP запускаются как часть LSASS, поэтому они запускаться под учетной записью '' AUTHORITY \ SYSTEM' '' NT и в любом случае иметь 'SeCreateTokenPrivilege',' SeTcbPrivilege' и т. д. Таким образом, по безопасности они имеют одинаковые требования (вы даже можете сказать, что «ZwCreateToken» менее требовательна), хотя вы правильно заметили, что они документированы, что является плюсом. – conio
Что произойдет с нитью после того, как будут выведены маркеры олицетворения? – Dolev