информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsСетевые кракеры и правда о деле ЛевинаВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / operating systems
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
Нда. Почти всё так, но косяк всё равно ;-) 21.05.03 10:35  Число просмотров: 1675
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
> > Короче, суть бага такова, что включение
> SeDebugPrivilege
> > выключает SeSecurityPrivilege.
> Это вряд ли. Я видел токены со включенными обоими этими
> привилегиями.
Я знаю. Я специально при отладке смотрел токен — обе привилегии включены.
>
> > //чтобы потестить только с SeSecurityPrivilege,
> > выставьте здесь единичку вместо двойки.
> Потестить не могу, так как не дельфиец (СОВСЕМ не дельфиец
> :-) ). А переписывать самому в лом. Я так понимаю, пока не
> включается SE_DEBUG_NAME все работает отлично?
Да, без SE_DEBUG_NAME всё работает.

> > pHndl := OpenProcess(MAXIMUM_ALLOWED Or
> > ACCESS_SYSTEM_SECURITY, False, GetCurrentProcessID);
> > End; // Прикольно, что здесь всё нормально, OS
> выдаёт
> > дескриптор процесса с этим уровнем доступа!
> Вот главная причина, по которой можно судить что
> SE_SECURITY_NAME не вырубилась. Хендл получен - значит
> привилегия есть. А не хватает запрошенных прав в самом
> хендле. Можно попробовать открыть процесс с
Не помогает. Да и более того:
PROCESS_ALL_ACCESS = 111110000111111111111 (binary);
ACCESS_SYSTEM_SECURITY = 1000000000000000000000000 (binary),
т.е. PROCESS_ALL_ACCESS на самом деле не такой уж и «полный» ;-)


> (небольшой
> оффтоп: тем кто говорил, что у паскаля ясный синтаксис -
> мне вот например ну ничего не говорит о том, что
> GetCurrentProcessID на самом деле функция).
В смысле можно спутать с переменной? По семантике, если вникнуть, скобки () избыточны, если параметров нет ;-) Это дело привычки...

> > aSD := Nil; // VVV А вот здесь ненормально
> -
> > возвращает false и говорит, что в доступе отказано!
> > GetKernelObjectSecurity(pHndl,
> > SACL_SECURITY_INFORMATION, aSD, 0, aSize);
> Попробуй посмотреть какие реально привилегии у процесса и
> какие права у хендла. Можно написать самому что нить в этом
> роде, но мне вот например нравятся утилитки со
> http://www.smidgeonsoft.com/
> В частности TopToBottomNT может это все посмотреть.
>
> Успехов
Спасибо, попробую.
<operating systems>
Кто соображает в NT security — вроде как баг отловил... 20.05.03 22:15  
Автор: HandleX <Александр М.> Статус: The Elderman
Отредактировано 20.05.03 22:21  Количество правок: 1
<"чистая" ссылка>
Короче, суть бага такова, что включение SeDebugPrivilege выключает SeSecurityPrivilege.
program TestProg;
{$APPTYPE CONSOLE}
uses
  Windows, SysUtils;

  function SysErrorMessage(ErrorCode: Integer): string;
  begin
    Result := SysUtils.SysErrorMessage(ErrorCode);
    ANSItoOEM(PChar(Result), PChar(Result));
    If Result <> '' Then
      Result := Format('%s (Error %d)', [Result, ErrorCode]);
  end;

Type
  TTokenPrivileges = record
    PrivilegeCount: DWORD;
    Privileges: array[0..1] of TLUIDAndAttributes;
  end;

Var
  pHndl: THandle;
  aSD: PSecurityDescriptor;
  aSize: DWord;
  hToken: THandle;
  tkp: TTokenPrivileges;
begin
  hToken := 0;
  Try
    ZeroMemory(@tkp, SizeOf(tkp));
    //чтобы потестить  только с SeSecurityPrivilege, выставьте здесь единичку вместо двойки.
    tkp.PrivilegeCount := 2;
    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    tkp.Privileges[1].Attributes := SE_PRIVILEGE_ENABLED;

    If Not (//Выставляем привилегии для процесса
      OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hToken) And
      LookupPrivilegeValue(Nil, 'SeSecurityPrivilege', tkp.Privileges[0].Luid) And
      LookupPrivilegeValue(Nil, 'SeDebugPrivilege', tkp.Privileges[1].Luid) And
      AdjustTokenPrivileges(hToken, False, PTokenPrivileges(@tkp)^, 0, Nil, PDWORD(Nil)^))
    Then Begin
      WriteLn(SysErrorMessage(GetLastError));
      Exit;
    End;

    //Открываем процесс с требуемым уровнем доступа
    pHndl := OpenProcess(MAXIMUM_ALLOWED Or ACCESS_SYSTEM_SECURITY, False, GetCurrentProcessID);
    If pHndl = 0 Then Begin
      WriteLn(SysErrorMessage(GetLastError));
      Exit;
    End; // Прикольно, что здесь всё нормально, OS выдаёт дескриптор процесса с этим уровнем доступа!

    Try
      aSD := Nil; //   VVV    А вот здесь ненормально - возвращает false и говорит, что в доступе отказано!
      GetKernelObjectSecurity(pHndl, SACL_SECURITY_INFORMATION, aSD, 0, aSize);
      If GetLastError <> ERROR_INSUFFICIENT_BUFFER Then
      Begin
        WriteLn(SysErrorMessage(GetLastError));
        Exit;
      End;
      GetMem(aSD, aSize);
      Try
        If Not GetKernelObjectSecurity(pHndl, SACL_SECURITY_INFORMATION, aSD, aSize, aSize) Then
        Begin
          WriteLn(SysErrorMessage(GetLastError));
          Exit;
        End;
      Finally
        FreeMem(aSD);
      End;
    Finally
      CloseHandle(pHndl);
    End;
    WriteLn('Success!');
  Finally
    If hToken <> 0 Then CloseHandle(hToken);
    Write('Press Enter to continue...');
    ReadLn;
  End;
end.

---
Я не гуру конечно, но 21.05.03 10:13  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Короче, суть бага такова, что включение SeDebugPrivilege
> выключает SeSecurityPrivilege.
Это вряд ли. Я видел токены со включенными обоими этими привилегиями.

> //чтобы потестить только с SeSecurityPrivilege,
> выставьте здесь единичку вместо двойки.
Потестить не могу, так как не дельфиец (СОВСЕМ не дельфиец :-) ). А переписывать самому в лом. Я так понимаю, пока не включается SE_DEBUG_NAME все работает отлично?

> pHndl := OpenProcess(MAXIMUM_ALLOWED Or
> ACCESS_SYSTEM_SECURITY, False, GetCurrentProcessID);
> End; // Прикольно, что здесь всё нормально, OS выдаёт
> дескриптор процесса с этим уровнем доступа!
Вот главная причина, по которой можно судить что SE_SECURITY_NAME не вырубилась. Хендл получен - значит привилегия есть. А не хватает запрошенных прав в самом хендле. Можно попробовать открыть процесс с PROCESS_ALL_ACCESS и посмотреть что получится. (небольшой оффтоп: тем кто говорил, что у паскаля ясный синтаксис - мне вот например ну ничего не говорит о том, что GetCurrentProcessID на самом деле функция).


> aSD := Nil; // VVV А вот здесь ненормально -
> возвращает false и говорит, что в доступе отказано!
> GetKernelObjectSecurity(pHndl,
> SACL_SECURITY_INFORMATION, aSD, 0, aSize);
Попробуй посмотреть какие реально привилегии у процесса и какие права у хендла. Можно написать самому что нить в этом роде, но мне вот например нравятся утилитки со http://www.smidgeonsoft.com/
В частности TopToBottomNT может это все посмотреть.

Успехов
Нда. Почти всё так, но косяк всё равно ;-) 21.05.03 10:35  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
> > Короче, суть бага такова, что включение
> SeDebugPrivilege
> > выключает SeSecurityPrivilege.
> Это вряд ли. Я видел токены со включенными обоими этими
> привилегиями.
Я знаю. Я специально при отладке смотрел токен — обе привилегии включены.
>
> > //чтобы потестить только с SeSecurityPrivilege,
> > выставьте здесь единичку вместо двойки.
> Потестить не могу, так как не дельфиец (СОВСЕМ не дельфиец
> :-) ). А переписывать самому в лом. Я так понимаю, пока не
> включается SE_DEBUG_NAME все работает отлично?
Да, без SE_DEBUG_NAME всё работает.

> > pHndl := OpenProcess(MAXIMUM_ALLOWED Or
> > ACCESS_SYSTEM_SECURITY, False, GetCurrentProcessID);
> > End; // Прикольно, что здесь всё нормально, OS
> выдаёт
> > дескриптор процесса с этим уровнем доступа!
> Вот главная причина, по которой можно судить что
> SE_SECURITY_NAME не вырубилась. Хендл получен - значит
> привилегия есть. А не хватает запрошенных прав в самом
> хендле. Можно попробовать открыть процесс с
Не помогает. Да и более того:
PROCESS_ALL_ACCESS = 111110000111111111111 (binary);
ACCESS_SYSTEM_SECURITY = 1000000000000000000000000 (binary),
т.е. PROCESS_ALL_ACCESS на самом деле не такой уж и «полный» ;-)


> (небольшой
> оффтоп: тем кто говорил, что у паскаля ясный синтаксис -
> мне вот например ну ничего не говорит о том, что
> GetCurrentProcessID на самом деле функция).
В смысле можно спутать с переменной? По семантике, если вникнуть, скобки () избыточны, если параметров нет ;-) Это дело привычки...

> > aSD := Nil; // VVV А вот здесь ненормально
> -
> > возвращает false и говорит, что в доступе отказано!
> > GetKernelObjectSecurity(pHndl,
> > SACL_SECURITY_INFORMATION, aSD, 0, aSize);
> Попробуй посмотреть какие реально привилегии у процесса и
> какие права у хендла. Можно написать самому что нить в этом
> роде, но мне вот например нравятся утилитки со
> http://www.smidgeonsoft.com/
> В частности TopToBottomNT может это все посмотреть.
>
> Успехов
Спасибо, попробую.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach