Pull to refresh

Comments 15

Если отобрать права на запись на /windows/tasks у обычных пользователей — то все ок?

Непонятно что это может поломать при штатной работе.


Я бы попробовал оставить права на запись только пользователю SYSTEM. Но нужно будет это откатывать после фикса, когда MS станет имперсонироваться перед операцией в этой директории.

А группе админов почему не оставить?

Да, админы могут повыситься до SYSTEM документированными средствами. Но если в нее пишет только сервис без имперсонации, то все остальные — враги :)

Патч выглядит грамотно. Используете их системой патчей?

Да. Она «на лету» применяет необходимые патчи, как только запустился уязвимый процесс.
ИМХО, пример с dll-кой от XPS-принтера — более чем никакой, с другой стороны — «хакер», вероятнее всего, никогда не дождется запуска своего кода из подменённой dll-ки…
Не хватает опроса на тему «Как часто Вы пользуетесь виртуальным XPS-принтером от Microsoft?»

Печать XPS-принтером инициируется програмно (ALPC-TaskSched-LPE.cpp@120):


    //After writing PrintConfig.dll we start an XpsPrintJob to load the dll into the print spooler service.
    CoInitialize(nullptr);
    IXpsOMObjectFactory *xpsFactory = NULL;
    CoCreateInstance(__uuidof(XpsOMObjectFactory), NULL, CLSCTX_INPROC_SERVER, __uuidof(IXpsOMObjectFactory), reinterpret_cast<LPVOID*>(&xpsFactory));
    HANDLE completionEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    IXpsPrintJob *job = NULL;
    IXpsPrintJobStream *jobStream = NULL;
    StartXpsPrintJob(L"Microsoft XPS Document Writer", L"Print Job 1", NULL, NULL, completionEvent, NULL, 0, &job, &jobStream, NULL);
    jobStream->Close();
    CoUninitialize();
В старух версиях планировшика была кнопка — запустить задачу. Видимо Microsoft подсуетился и убрал из-за этого.
была кнопка — запустить задачу. Видимо Microsoft подсуетился и убрал из-за этого.

Запуск задачи никуда не убрали:


Хочу заметить, что создание hardlink для файла, доступ к к-рому только read/execute, запрещено.

C:\Users\aleksey>mklink /H c:\WINDOWS\Tasks\23 23
Hardlink created for c:\WINDOWS\Tasks\23 <<===>> 23

C:\Users\aleksey>mklink /H c:\WINDOWS\Tasks\explorer.exe c:\WINDOWS\explorer.exe
Access is denied.

C:\Users\aleksey>mklink /H c:\WINDOWS\Tasks\w32time.dll c:\WINDOWS\System32\w32time.dll
Access is denied.

Проблема скорее всего в том, что встроенная команда mklink использует Win32-функцию CreateHardLink. Ее реализация открывает существующий файл с правом FILE_WRITE_ATTRIBUTES ( == 0x100 ) — декомпиляция файла версии 10.0.18204.1001:


  if ( !RtlDosPathNameToNtPathName_U(lpExistingFileName, &ExistingFileNativeName, 0, 0) )
    goto LABEL_29;
  ObjectAttributes.Length = 24;
  ObjectAttributes.RootDirectory = 0;
  ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE;
  ObjectAttributes.ObjectName = &ExistingFileNativeName;
  ObjectAttributes.SecurityDescriptor = 0;
  ObjectAttributes.SecurityQualityOfService = 0;
  if ( lpSecurityAttributes )
    ObjectAttributes.SecurityDescriptor = lpSecurityAttributes->lpSecurityDescriptor;
  Status = NtOpenFile(&FileHandle, 0x100100u, &ObjectAttributes, &IoStatusBlock, 7u, 0x204020u);

Однако для вызова NtSetInformationFile с аргументом FileLinkInformation (то есть для создания hardlink'а нативными функциями) файл можно открыть вообще с любыми правами (=0), чем пользуется PoC (Hardlink.cpp@91):


    HANDLE hFile = OpenFileNative(full_targetname.c_str(), nullptr, MAXIMUM_ALLOWED, FILE_SHARE_READ, 0);
    if (hFile)
    {
        DEFINE_NTDLL(ZwSetInformationFile);
        IO_STATUS_BLOCK io_status = { 0 };

        NTSTATUS status = fZwSetInformationFile(hFile, &io_status, link_info, link_info.size(), FileLinkInformation);
        CloseHandle(hFile);
        if (NT_SUCCESS(status))
        {
            return true;
        }
    }
Кстати, если кому-то интересно, я переписал код PoC.

1. Вместо довольно странного метода инжекта библиотеки в процесс, для простой демонстрации я переделал проект в .exe.
2. Я добавил корректное формирование пути, теперь всё будет работать, даже если ОС установлена не в стандартную папку C:\Windows.
3. Переписал код для лучшего понимания.

Код на GitHub
Only those users with full accounts are able to leave comments. Log in, please.