Windows
January 31

Жестокая подстава с 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 и могут отличаться):

  • .pif
  • .com
  • .exe
  • .bat
  • .lnk
  • .cmd

Смысл в том, что если например функции 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 — абсолютно все что угодно.