Жестокая подстава с WinRAR
Рассказ про одну свежую гадость уязвимость в WinRAR, которая успела наделать бед по всему миру. Яркая иллюстрация идеи «что будет если постоянно забивать на обновления ПО».
Суть
В знаменитом WinRAR приложении для Windows была обнаружена уязвимость, позволяющая автоматическое выполнение скрытого приложения по клику на картинку или документ в специально сформированном архиве.
Причем архив может быть как в формате RAR так и ZIP, настолько все весело.
Вот несколько разборов этой уязвимости, откуда я и взял часть описания.
Исправили эту ошибку совсем недавно:
The beta version of the patch was issued on July 20, 2023, and the final updated version of WinRAR (version 6.23) was released on August 2, 2023.
А поскольку большинство пользователей Windows терпеть не могут обновлять сторонние приложения — всплывать эта ошибка будет еще неоднократно.
Поэтому если вы работаете с WinRAR дома или на работе — бегом обновляться.
Это настолько мощная гадость, что под ударом оказались фактически все типичные пользователи Windows — от детей и пенсионеров до корпоративных пользователей.
Ниже расскажу о том как это работает и почему.
Принцип работы
Начать стоит с одной важной особенности устройства архивов, не осознаваемой даже некоторыми разработчиками:
При открытии архива для просмотра содержимого вы видите не файлы и папки а записи внутри архива.
Это не файловая система, с точки зрения формата записи в архиве нет никакой разницы между файлом и каталогом.
Для архива это одинаковые сущности, форматы архивов так устроены что позволяют разнообразное манипулирование именами записей, например дублирование имен:
По клику на любой файл в архиве, WinRAR (как и любой другой архиватор, даже под линуксами) делает распаковку этого конкретного файла во временный каталог и уже оттуда запускает его открытие.
Так работают все известные мне «пользовательские» версии архиваторов с интерфейсом, потому что архив это не файловая система и стандартного механизма запуска приложения из архива не существует.
Что произойдет по клику на дублирующийся файл?
Если для формирования имени временного файла использовалось имя записи из архива (как это происходит в WinRAR) — дубль просто затрет предыдущий временный файл при открытии:
Теперь возвращаемся к самой уязвимости.
Вот так выглядит восстановленный код с проверкой на то что запись является каталогом:
Допустим в архиве есть три записи:
"CLASSIFIED_DOCUMENTS.pdf /"
"CLASSIFIED_DOCUMENTS.pdf "
"CLASSIFIED_DOCUMENTS.pdf /CLASSIFIED_DOCUMENTS.pdf .cmd"
Для всех трех функция проверки вернет 1, поэтому они будут распакованы во временный каталог.
Ниже реализация этой же функции на Python для лучшего понимания:
extract_list = [] def compare_click_and_entry(entry_name, click_name): click_name_len = len(click_name) if entry_name[:click_name_len] == click_name and \ entry_name[click_name_len] in ("\\", "/", "\x00"): return 1 return 0 for direntry in zip.direntry_list: if compare_click_and_entry(direntry.name, click_name): extract_list.append(direntry.name)
Для «открытия файла» — запуска программы, ассоциированной с конкретным расширением WinRAR использует функцию WinAPI ShellExecuteExW у которой есть одна особенность:
если открываемый путь не имеет расширения — срабатывает механизм поиска возможных файлов для запуска с подстановкой расширения согласно приоритетам.
Приоритеты расширений выглядят примерно так (примерно — потому что настраиваются в реестре Windows и могут отличаться):
Смысл в том, что если например функции ShellExecuteEx при вызове передать путь «c:\app\notepad» без указания расширения и в каталоге «c:\app» будет присутствовать файл notepad.exe — он будет выбран первым для запуска.
Если есть notepad.com то выполнится он а не notepad.exe
Вот так выглядит путь открываемого файла из нашего тестового архива в WinRAR (внимание на пробел в конце):
"..\\AppData\\Local\\Temp\\Rar$..\\CLASSIFIED_DOCUMENTS.pdf "
Поскольку пробел в конце не дает определить расширение, запускается механизм подстановки и в итоге запускается файл:
CLASSIFIED_DOCUMENTS.pdf .cmd.
А дальше начинается удивительный мир украденных данных, шифровальщиков-вымогателей, майнеров биткойнов и так далее.
Итого
Это не первая подобная уязвимость на моей памяти, дело в том что в «пользовательских» оболочках для работы с архивами сходятся две концепции — «работа с записями архива» и «запуск по клику», которые в своем сочетании всегда будут порождать проблемы.
Чтобы снизить риски, откажитесь от механизмов автозапуска из архивов — распаковывайте на диск вручную перед любым запуском и смотрите что именно вы запускаете.
Не надо также обольщаться на пример с PDF, думать что эта проблема ограничена форматом данных — это к сожалению не так: архив может содержать и видео и файлы Microsoft Office — абсолютно все что угодно.