Можно ли в драйвере получить имя юзера?
От: Crag  
Дата: 20.11.03 10:04
Оценка:
Есть IRP. По нему получаем процесс.
С процессом жестко связано имя пользователя.
Есть ли способ получить это имя? Если нет, то, может быть есть какие-либо обходные пути?
Заранее спасибо...
Re: Можно ли в драйвере получить имя юзера?
От: _cb_  
Дата: 20.11.03 10:45
Оценка: 28 (4)
Здравствуйте, Crag, Вы писали:

C>Есть IRP. По нему получаем процесс.

C>С процессом жестко связано имя пользователя.
C>Есть ли способ получить это имя? Если нет, то, может быть есть какие-либо обходные пути?
C>Заранее спасибо...

можно получить SID пользователя:


ULONG 
KQueryPrimarySidByProcess (
   IN void* pSid, 
   IN ULONG dwSidLength,
   IN PEPROCESS pEProcess
   )
{
  if (
      pEProcess == NULL ||
      KeGetCurrentIrql() != PASSIVE_LEVEL
     )
    return 0;

  ULONG    dwSidLengthReal = 0;
  HANDLE   hToken = NULL;
  NTSTATUS NtStatus;

  void* pToken = PsReferencePrimaryToken(pEProcess);
  if (pToken != NULL)
  {
    NtStatus = ObOpenObjectByPointer(pToken, 0, 0, TOKEN_QUERY, 0, KernelMode, &hToken);
    if (NT_SUCCESS(NtStatus)) 
    {
      ULONG dwSizeOfToken = 0;
      NtStatus = ZwQueryInformationToken(hToken, TokenUser, NULL, 0, &dwSizeOfToken);
      if (NtStatus == STATUS_BUFFER_TOO_SMALL)
      {
        PTOKEN_USER pTokenUser = (PTOKEN_USER) new char[dwSizeOfToken];
        if (pTokenUser != NULL)
        {
          NtStatus = ZwQueryInformationToken(hToken, TokenUser, pTokenUser, dwSizeOfToken, &dwSizeOfToken);
          if (NT_SUCCESS(NtStatus)) 
          {
            if (RtlValidSid(pTokenUser->User.Sid) == TRUE)
            {
              dwSidLengthReal = RtlLengthSid(pTokenUser->User.Sid);
              if (dwSidLengthReal != 0 && dwSidLengthReal <= dwSidLength && pSid != NULL)
              {
                RtlCopySid(dwSidLengthReal, pSid, pTokenUser->User.Sid);
              }
            }
          }
          delete[] (char*) pTokenUser;
        }
      }
      ZwClose(hToken);
    }

    ObDereferenceObject(pToken);
  }
    
  return dwSidLengthReal;
}


cb.
Re[2]: Можно ли в драйвере получить имя юзера?
От: Valerio Россия linkedin.com/in/boronin
Дата: 20.11.03 11:02
Оценка:
добавлю про ZwQueryInformationToken скажу что несмотря на ее объявление в IFS Kit XP SP1 как

This routine is available on Microsoft® Windows® XP and later.

она вполне рабочая и на NT4, т.к. TOKEN_INFORMATION_CLASS объявлен в NT4 NTIFS.H
... << RSDN@Home 1.1.0 stable >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[3]: Можно ли в драйвере получить имя юзера?
От: Valerio Россия linkedin.com/in/boronin
Дата: 20.11.03 11:24
Оценка: 14 (4)
кстати, по теме вот:
Q35 How do I retrieve the "user name" for the user performing a given operation?

V>добавлю про ZwQueryInformationToken скажу что несмотря на ее объявление в IFS Kit XP SP1 как

V>

V>This routine is available on Microsoft® Windows® XP and later.

V>она вполне рабочая и на NT4, т.к. TOKEN_INFORMATION_CLASS объявлен в NT4 NTIFS.H
... << RSDN@Home 1.1.0 stable >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[2]: Можно ли в драйвере получить имя юзера?
От: Аноним  
Дата: 17.12.03 09:37
Оценка:
как получить pEProcess ?
Re[3]: Можно ли в драйвере получить имя юзера?
От: _cb_  
Дата: 17.12.03 10:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>как получить pEProcess ?


например так


NTKERNELAPI
PEPROCESS
IoThreadToProcess (
    IN PETHREAD Thread
);


IoThreadToProcess (pIrp->Tail.Overlay.Thread)


или так



NTKERNELAPI
PEPROCESS
IoGetCurrentProcess(
    VOID
    );



cb.
Re[4]: Можно ли в драйвере получить имя юзера?
От: Canavaro Россия  
Дата: 11.02.04 08:27
Оценка:
Сделал всё как написано в этой конфе, получил следующие результаты :
1) SID получается очень странного вида -> S-1-142894079-28-13107200-4284711944-842925246-500 (EXPLORER.EXE)
в то время как SID пользователя залогиненного на компе имеет вид -> S-1-5-21-1801674531-1957994488-842925246-500

2) получаемый таким образом SID разный, в зависимости от запущенного процесса, более того он разный даже для одного и того процесса но запущенного дважды ... S-1-1218668031-28-13107200-4284851016-842925246-500 (TOTALCMD.EXE)
S-1-142894079-28-13107200-4284711944-842925246-500 (TOTALCMD.EXE)

3) как видно из п.1. некоторые части SID-ов всё же совпадают, следовательно можно предположить что это не SID пользователя, а например SID процесса, который запущен данным пользователем и следовательно унаследовал от него часть SID-а.

4) когда пытаюсь получить пользователя по SID-у из драйвера с помощью LookUpAccountSID() -> пользователь не находится.

P.S. прошу строго не судить, это только лишь мои догадки
Re[5]: Можно ли в драйвере получить имя юзера?
От: _cb_  
Дата: 11.02.04 09:21
Оценка:
Здравствуйте, Canavaro, Вы писали:

хотелось бы уточнить некоторые детали:

в каком именно месте были получены эти данные? это был обработчик IRP-а (если да, то какого именно), или это перехватчик какой-либо ф-ии ядра (например ZwCreateFile)?

какая ОС (nt4/2k/xp/2k3, может быть terminal edition и эти данные получены из терминальной сессии)?

cb.
Re[5]: Можно ли в драйвере получить имя юзера?
От: Valerio Россия linkedin.com/in/boronin
Дата: 11.02.04 09:46
Оценка:
Здравствуйте, Canavaro, Вы писали:

C>Сделал всё как написано в этой конфе, получил следующие результаты :

C>1) SID получается очень странного вида -> S-1-142894079-28-13107200-4284711944-842925246-500 (EXPLORER.EXE)
что тут странного? well-known user Administrator но из домена

интересно разве что почему он не начинается с S-1-5-xxxx,
что у вас выступает в качестве NT Authority?

C>в то время как SID пользователя залогиненного на компе имеет вид -> S-1-5-21-1801674531-1957994488-842925246-500

well-known user Administrator но локальный

но что значит EXPLORER.EXE? процесс не имеет SID, процесс имеет user token с owner который имеет SID
Вы имеете ввиду что этот процесс запущен из сессии пользователя с SID указанным выше

C>2) получаемый таким образом SID разный, в зависимости от запущенного процесса, более того он разный даже для одного и того процесса но запущенного дважды ... S-1-1218668031-28-13107200-4284851016-842925246-500 (TOTALCMD.EXE)

C>S-1-142894079-28-13107200-4284711944-842925246-500 (TOTALCMD.EXE)
вопрос, каким-то образом Вы логинитесь (интерактивно, терминал, гостевой\null сеанс)?
ибо вид SID не самый обычный (предположу что это гостевой аккаунт для какой-то сетевой сессии, соотв 2 разных).

опишите рабочее окружение (ОС, какие domain controllers, пользуете ли Вы terminal sessions в своих экспериментах) и конкретные действия

C>3) как видно из п.1. некоторые части SID-ов всё же совпадают, следовательно можно предположить что это не SID пользователя, а например SID процесса, который запущен данным пользователем и следовательно унаследовал от него часть SID-а.

еще раз, у процесса SID нет. есть токен. у токена есть owner который как раз уже имеет SID. Токен наследуется при порождении нового процесса по умолчанию если нет каких-то ограничений или своих приседаний по этому поводу.

Именно поэтому winlogon после обычной авторизации пользователя создает для него сесиию (интерактивную), конструирует токен для этого пользователя и запускает с ним процесс оболочки (обычно explorer.exe) и соотв затем все программы запускаемые из этого explorer унаследуют копию токена родителя.

Если же как-то по иному порождаются процессы, например через CreateProcessAsUserW то им соотв можно сконструировать другой токен, с другим SID (для другого user соотв!). Но если у Вас каждый раз разные SID — это неспроста, это же вся система NT security просто попирается — winlogon запустил нам оболочку в сессии чтоб мы не вышли за пределы, а процессы новые вдруг под левым пользователем порождаются?

про похожесть: разные сессии имеют LogonID типа S-1-5-5-X-Y, где X и Y просто старшая и младшая части адреса в памяти, соотв часто есть совпадения хотя бы по старшей части. Если разобраться почему у Вас не S-1-5 начало (что вполне допустимо просто реже встречается), то в остальном Вы получили похожие на правду LogonID что и дает такое странное поведение.

надо разбираться — возможно просто неправильно получен SID в ядре, может быть это LogonID у Вас?
попробуйте с помощью разных программ в user mode получить то же самое для своих процессов — чей SID с ними ассоциирован через токен?

C>4) когда пытаюсь получить пользователя по SID-у из драйвера с помощью LookUpAccountSID() -> пользователь не находится.

код ошибки где?

C>P.S. прошу строго не судить, это только лишь мои догадки

очень интересно получить информацию чтобы попытаться воспроизвести у себя
... << RSDN@Home 1.1.3 beta 1 >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[6]: Можно ли в драйвере получить имя юзера?
От: Canavaro Россия  
Дата: 11.02.04 10:08
Оценка:
Здравствуйте, _cb_, Вы писали:

__>Здравствуйте, Canavaro, Вы писали:


__>хотелось бы уточнить некоторые детали:


__>в каком именно месте были получены эти данные? это был обработчик IRP-а (если да, то какого именно)


всё это я делаю в фильтре FS, по стандартной технологии атачусь к файловым системам и ко мне сыпятся IRP-ы предназначенные для них

__>какая ОС (nt4/2k/xp/2k3, может быть terminal edition и эти данные получены из терминальной сессии)?


ОС — Win2k Server c Terminal Services, данные получались как локально так и из терминальной сессии.
Re[6]: Можно ли в драйвере получить имя юзера?
От: Canavaro Россия  
Дата: 11.02.04 10:43
Оценка:
Здравствуйте, Valerio, Вы писали:

C>>Сделал всё как написано в этой конфе, получил следующие результаты :

C>>1) SID получается очень странного вида -> S-1-142894079-28-13107200-4284711944-842925246-500 (EXPLORER.EXE)
V>что тут странного? well-known user Administrator но из домена

V>интересно разве что почему он не начинается с S-1-5-xxxx,

вот в этом то всё и дело ....
V>что у вас выступает в качестве NT Authority?

C>>в то время как SID пользователя залогиненного на компе имеет вид -> S-1-5-21-1801674531-1957994488-842925246-500

V>well-known user Administrator но локальный

V>но что значит EXPLORER.EXE? процесс не имеет SID, процесс имеет user token с owner который имеет SID

V>Вы имеете ввиду что этот процесс запущен из сессии пользователя с SID указанным выше
совершенно верно ! насчёт SID процесса было просто предположение

C>>2) получаемый таким образом SID разный, в зависимости от запущенного процесса, более того он разный даже для одного и того процесса но запущенного дважды ... S-1-1218668031-28-13107200-4284851016-842925246-500 (TOTALCMD.EXE)

C>>S-1-142894079-28-13107200-4284711944-842925246-500 (TOTALCMD.EXE)
V>вопрос, каким-то образом Вы логинитесь (интерактивно, терминал, гостевой\null сеанс)?

логинился как локально так и через терминальную сессию, результаты практически не отличаются

V>ибо вид SID не самый обычный (предположу что это гостевой аккаунт для какой-то сетевой сессии, соотв 2 разных).


V>опишите рабочее окружение (ОС, какие domain controllers, пользуете ли Вы terminal sessions в своих экспериментах) и конкретные действия


ОС — Win2k Server c Terminal Services, не контроллер домена, SID пытаюсь получить в фильтре FS

C>>3) как видно из п.1. некоторые части SID-ов всё же совпадают, следовательно можно предположить что это не SID пользователя, а например SID процесса, который запущен данным пользователем и следовательно унаследовал от него часть SID-а.

V>еще раз, у процесса SID нет. есть токен. у токена есть owner который как раз уже имеет SID. Токен наследуется при порождении нового процесса по умолчанию если нет каких-то ограничений или своих приседаний по этому поводу.

V>Именно поэтому winlogon после обычной авторизации пользователя создает для него сесиию (интерактивную), конструирует токен для этого пользователя и запускает с ним процесс оболочки (обычно explorer.exe) и соотв затем все программы запускаемые из этого explorer унаследуют копию токена родителя.


V>Если же как-то по иному порождаются процессы, например через CreateProcessAsUserW то им соотв можно сконструировать другой токен, с другим SID (для другого user соотв!). Но если у Вас каждый раз разные SID — это неспроста, это же вся система NT security просто попирается — winlogon запустил нам оболочку в сессии чтоб мы не вышли за пределы, а процессы новые вдруг под левым пользователем порождаются?


V>про похожесть: разные сессии имеют LogonID типа S-1-5-5-X-Y, где X и Y просто старшая и младшая части адреса в памяти, соотв часто есть совпадения хотя бы по старшей части. Если разобраться почему у Вас не S-1-5 начало (что вполне допустимо просто реже встречается), то в остальном Вы получили похожие на правду LogonID что и дает такое странное поведение.


V>надо разбираться — возможно просто неправильно получен SID в ядре, может быть это LogonID у Вас?

V>попробуйте с помощью разных программ в user mode получить то же самое для своих процессов — чей SID с ними ассоциирован через токен?

попробую конечно, но думаю всё будет работать нормально ...

C>>4) когда пытаюсь получить пользователя по SID-у из драйвера с помощью LookUpAccountSID() -> пользователь не находится.

V>код ошибки где?

0x00000057 The parametr is incorrect.

C>>P.S. прошу строго не судить, это только лишь мои догадки

V>очень интересно получить информацию чтобы попытаться воспроизвести у себя
Re[7]: Можно ли в драйвере получить имя юзера?
От: _cb_  
Дата: 11.02.04 12:00
Оценка:
Здравствуйте, Canavaro, Вы писали:

C>всё это я делаю в фильтре FS, по стандартной технологии атачусь к файловым системам и ко мне сыпятся IRP-ы предназначенные для них


все-таки — в обработчике какого irp Вы получили эти данные? IRP_MJ_CREATE? или это собирательная информация из разных irp-ов?

cb
Re[8]: Можно ли в драйвере получить имя юзера?
От: Canavaro Россия  
Дата: 11.02.04 12:59
Оценка:
Здравствуйте, _cb_, Вы писали:

__>Здравствуйте, Canavaro, Вы писали:


C>>всё это я делаю в фильтре FS, по стандартной технологии атачусь к файловым системам и ко мне сыпятся IRP-ы предназначенные для них


__>все-таки — в обработчике какого irp Вы получили эти данные? IRP_MJ_CREATE? или это собирательная информация из разных irp-ов?


ну наприммер IRP_MJ_READ
Re[9]: Можно ли в драйвере получить имя юзера?
От: _cb_  
Дата: 11.02.04 13:05
Оценка:
Здравствуйте, Canavaro, Вы писали:

C>Здравствуйте, _cb_, Вы писали:


__>>Здравствуйте, Canavaro, Вы писали:


C>>>всё это я делаю в фильтре FS, по стандартной технологии атачусь к файловым системам и ко мне сыпятся IRP-ы предназначенные для них


__>>все-таки — в обработчике какого irp Вы получили эти данные? IRP_MJ_CREATE? или это собирательная информация из разных irp-ов?


C>ну наприммер IRP_MJ_READ


случайно не в CompletionRoutine?

cb.
Re[10]: Можно ли в драйвере получить имя юзера?
От: Canavaro Россия  
Дата: 11.02.04 13:11
Оценка:
Здравствуйте, _cb_, Вы писали:

__>случайно не в CompletionRoutine?


нет

ещё попробовал на XP Professional, тоже самое
Re[11]: Можно ли в драйвере получить имя юзера?
От: _cb_  
Дата: 11.02.04 13:42
Оценка:
Здравствуйте, Canavaro, Вы писали:

C>ещё попробовал на XP Professional, тоже самое


на сколько я помню все проверки безопасности рекомендуется делать на irp_mj_create, а потом если Вам нужно знать какой пользователь посылает read, write и прочие запросы необходимо реализовать свой кеш открытых объектов. т.е на irp_mj_create получаете всю необходимую инфу и сохраняете ее в map-е где в качестве ключа используется file_object & fs_context, и при получении запросов ищете эту инфу в этом мапе...
возможно что описанное Вами поведение это нормальная жизнь оси...

cb.
Re[12]: Можно ли в драйвере получить имя юзера?
От: Canavaro Россия  
Дата: 11.02.04 14:06
Оценка:
Здравствуйте, _cb_,

а вы сами то пробовали так делать как написали ?
если да, то какие у вас получались SID-ы ?
Re[6]: Можно ли в драйвере получить имя юзера?
От: Canavaro Россия  
Дата: 11.02.04 14:12
Оценка:
Здравствуйте, Valerio, Вы писали:

V>надо разбираться — возможно просто неправильно получен SID в ядре, может быть это LogonID у Вас?

V>попробуйте с помощью разных программ в user mode получить то же самое для своих процессов — чей SID с ними ассоциирован через токен?

попробовал и получил совершено нормальный well-known Administartor SID S-1-5-21-1801674531-1957994488-842925246-500
Re[13]: Можно ли в драйвере получить имя юзера?
От: _cb_  
Дата: 11.02.04 14:24
Оценка:
Здравствуйте, Canavaro, Вы писали:

C>Здравствуйте, _cb_,


C>а вы сами то пробовали так делать как написали ?

C>если да, то какие у вас получались SID-ы ?

пробовал... с cидами проблем не было если удавалось поймать irp_mj_create. т.е. я получал сид залогиненного пользователя.

cb.
Re[14]: Можно ли в драйвере получить имя юзера?
От: Canavaro Россия  
Дата: 11.02.04 14:34
Оценка:
Здравствуйте, _cb_, Вы писали:

__>пробовал... с cидами проблем не было если удавалось поймать irp_mj_create. т.е. я получал сид залогиненного пользователя.


я тоже попробовал ловить на IRP_MJ_CREATE -> никакой разницы
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.