Here’s a quick demo of WSL 2 in action. When we start our distro we get access to a working bash shell in under two seconds, and can run services and apps like docker right away.
Я совершенно не ожидал того, что для моего VPS хостер включит ещё и свой фильтр. Может быть это обычная практика.
А что за хостер, если не секрет?
В конце концов РКН присылает запрос на удаление ресурса как раз хостеру.
Запрос ведь должен был быть тому хостеру, который был актуальным на момент вынесения решения о блокировке. Предполагаете РКН как-то мониторит новые экземпляры заблокированных ресурсов и рассылает новые запросы? Мне видится более вероятным, что это (мониторинг списков заблокированных) личная инициатива хостера (что еще более подогревает узнать что же это за хостер такой)?
When FILE_DISPOSITION_POSIX_SEMANTICS is not set, a file marked for deletion is not actually deleted until all open handles for the file have been closed and the link count for the file is zero. When FILE_DISPOSITION_POSIX_SEMANTICS is set, the link is removed from the visible namespace as soon as the POSIX delete handle has been closed, but the file’s data streams remain accessible by other existing handles until the last handle has been closed. That is, applications that already had the file open can still use their handle to read/write even though the name they used to open it is gone and the file's link count may have reached zero.
If the file is being deleted at user request, using POSIX semantics allows the system to delete the file as requested, but also allows any process with an open handle to continue to access the file's data as long as the handle is open.
Если я правильно понимаю POSIX-семантику, то создание нового файла поверх удаленного должно быть возможным сразу, а не по закрытию последнего описателя на него.
Проверил: нет, FILE_DISPOSITION_POSIX_SEMANTICS не позволяет создавать файлы поверх удаляемого.
Виновник нашелся благодаря SysInternals и их ProcessMonitor.
На мой взгляд немаловажной частью проблемы понимания этой ситуации является усечение более информативных NT Status'ов нативного API до более обобщенных Win32 кодов.
Сложно представить такой сценарий. Привилегированный процесс даёт свой хендл для чего?
…
В этом случае лучше дать ссылку на Event, который сигналить снаружи.
Сложно, но, к сожалению, не невозможно. Никто не утверждал, что это best practices, но я неоднократно встречал решения, которые специально обходят механизмы безопасности Windows, например инсталляцией драйвера, что бы открывать описатели объектов с ExGetPreviousMode() == KernelMode и возвращать их в User Mode процесс.
Пример навскидку: есть процесс, сканирующий (а возможно и закрывающий, например для безопасного извлечения флешки) открытые описатели системы. Для детализированной информации нужно получить описатель этого самого объекта. Как его можно получить, учитывая что есть процессы в соседних сессиях и более привилегированные процессы? Более привилегированным кодом, например драйвером. Но авторам кода можно не дергать драйвер на каждый описатель целевого процесса, достаточно из драйвера вернуть описатель на этот процесс с правом PROCESS_DUP_HANDLE. А затем уже процесс собственноручно сможет дублировать интересующие описатели из целевого процесса себе.
Если рассматривать такой дырявый драйвер (а с учетом политики подписей, таскать с собой эксплуатируемый чужой подписанный драйвер уже давно не ново для вредоносного ПО), то может показаться, что поверхность атаки не велика: можно попробовать вызвать падение более привилегированного процесса, просто позакрывав ему описатели (DUPLICATE_CLOSE_SOURCE). Но, учитывая легкость и стабильность получения PROCESS_ALL_ACCESS можно запустить произвольный код в более привилегированном процессе, что (IMHO) много более опаснее.
Менее детализированный пример навскидку #2: процесс редактирует описатель безопасности (ACL'и) у некоторого объекта процесса. С учетом представленной информации нужно осознавать, что разрешение маски доступа PROCESS_DUP_HANDLE дает полный доступ к процессу, что не очевидно.
Более привелегированный процесс может дублировать описатель на себя (или другой привелегированный процесс) в процесс с урезанными правами, как результат какого-нибудь IPC, например.
Еще интересно разбирались ли вы с эльбрусовским защищенным режимом? Будете ли пробовать внедрять его поддержку в Embox?
Было бы очень интересно почитать про него отдельную статью.
Если в магазине будет банкомат, принимающий деньги, то это уже будет аналог обычной кассы без кассира (что внедрено уже достаточно широко — кассы самообслуживания). А в статье рассматриваются именно магазины без касс (вообще).
Десятичные значения чисел, а заодно и соответствующие ASCII-символы можно подсмотреть, удерживая курсор над соответствующим шестнадцатеричным литералом. Отображение ASCII не всегда работает (?), поэтому рекомендую глядеть ASCII таблицу в Интернете.
В окне листинга дизассемблера:
Convert - Char Sequence
В результате меняется константа как в листинге ассемблера, так и в листинге декомпилятора.
Гипервизоры вообще слабо совместимы друг с другом.
Вопрос будет ли в Sailfish Mobile OS RUS включен эмулятор (https://sailfishos.org/wiki/Android_Compatibility):
Выпущенное на рынок решения под брендом Inoi (https://inoi.com/2344/inoi-r7/) не включает Alien Dalvik.
https://devblogs.microsoft.com/commandline/announcing-wsl-2/
А что за хостер, если не секрет?
Запрос ведь должен был быть тому хостеру, который был актуальным на момент вынесения решения о блокировке. Предполагаете РКН как-то мониторит новые экземпляры заблокированных ресурсов и рассылает новые запросы? Мне видится более вероятным, что это (мониторинг списков заблокированных) личная инициатива хостера (что еще более подогревает узнать что же это за хостер такой)?
Так же в ключе темы публикации интересно то, что (вероятно для WSL) Microsoft все же добавила новую POSIX-семантику удаления файлов (https://docs.microsoft.com/windows-hardware/drivers/ddi/content/ntddk/ns-ntddk-_file_disposition_information_ex):
Если я правильно понимаю POSIX-семантику, то создание нового файла поверх удаленного должно быть возможным сразу, а не по закрытию последнего описателя на него.Проверил: нет, FILE_DISPOSITION_POSIX_SEMANTICS не позволяет создавать файлы поверх удаляемого.
На мой взгляд немаловажной частью проблемы понимания этой ситуации является усечение более информативных NT Status'ов нативного API до более обобщенных Win32 кодов.
https://web.archive.org/web/20150317121919/https://support.microsoft.com/en-us/kb/113996:
Сложно, но, к сожалению, не невозможно. Никто не утверждал, что это best practices, но я неоднократно встречал решения, которые специально обходят механизмы безопасности Windows, например инсталляцией драйвера, что бы открывать описатели объектов с ExGetPreviousMode() == KernelMode и возвращать их в User Mode процесс.
Пример навскидку: есть процесс, сканирующий (а возможно и закрывающий, например для безопасного извлечения флешки) открытые описатели системы. Для детализированной информации нужно получить описатель этого самого объекта. Как его можно получить, учитывая что есть процессы в соседних сессиях и более привилегированные процессы? Более привилегированным кодом, например драйвером. Но авторам кода можно не дергать драйвер на каждый описатель целевого процесса, достаточно из драйвера вернуть описатель на этот процесс с правом PROCESS_DUP_HANDLE. А затем уже процесс собственноручно сможет дублировать интересующие описатели из целевого процесса себе.
Если рассматривать такой дырявый драйвер (а с учетом политики подписей, таскать с собой эксплуатируемый чужой подписанный драйвер уже давно не ново для вредоносного ПО), то может показаться, что поверхность атаки не велика: можно попробовать вызвать падение более привилегированного процесса, просто позакрывав ему описатели (DUPLICATE_CLOSE_SOURCE). Но, учитывая легкость и стабильность получения PROCESS_ALL_ACCESS можно запустить произвольный код в более привилегированном процессе, что (IMHO) много более опаснее.
Менее детализированный пример навскидку #2: процесс редактирует описатель безопасности (ACL'и) у некоторого объекта процесса. С учетом представленной информации нужно осознавать, что разрешение маски доступа PROCESS_DUP_HANDLE дает полный доступ к процессу, что не очевидно.
(промахнулся)
Более привелегированный процесс может дублировать описатель на себя (или другой привелегированный процесс) в процесс с урезанными правами, как результат какого-нибудь IPC, например.
Еще интересно разбирались ли вы с эльбрусовским защищенным режимом? Будете ли пробовать внедрять его поддержку в Embox?
Было бы очень интересно почитать про него отдельную статью.
Спасибо за интересную серию.
Заметил (еще с первой статьи), что в макросах с assembler'ными вставками используются nop'ы с численным аргументом:
Это "No OPeration" инструкция? Зачем она в приведенных макросах? Зачем ей аргумент?
Есть копия, например, тут: https://bitbucket.org/ValdikSS/goodbyedpi
Не знаю, правда, насколько актуальная версия.
Интересно, а что с форками? Их тоже по-удаляли?
P.S. Собственно уровнем выше (https://github.com/ValdikSS) тоже Page not found. А там, судя по google-кэшу, было 37 репозиториев.
Есть полный экспорт из IDA c использованием плагина — 7xx/xml_exporter.py и 6xx/xmlexp.py с последующим импортом в Ghidra.
Если в магазине будет банкомат, принимающий деньги, то это уже будет аналог обычной кассы без кассира (что внедрено уже достаточно широко — кассы самообслуживания). А в статье рассматриваются именно магазины без касс (вообще).
На хабре внедрили интересную фичу — Отправка сообщений об опечатках в публикациях. Проверено — работает ;)
В окне листинга дизассемблера:
В результате меняется константа как в листинге ассемблера, так и в листинге декомпилятора.
Судя по приведенному листингу итераций все же будет три (0, 1 и 2):
То есть автор crackme зачем-то анализирует и argv[0].
Это уже сделано, просто нужно придерживаться C++ Core Guidelines (анонс был еще в сентябре 2015).