Вирус в карте варкрафта

Обновлено: 24.04.2024

Под катом описание уязвимости и история ее закрытия.

Return Bug

Скрипты в WarCraft 3 пишутся на разработанном Blizzard недоязыке JASS (Just Another Script System). В целом он достаточно гибок (вся стандартная кампания сделана на визуальной надстройке этого языка), но беда: нет структур, и стандартный Sleep отсчитывает время даже когда игра стоит на паузе, да и еще с пониженной точностью, одним словом сделать плавное движение юнита например, перемещая его каждые .03 секунды невозможно. Зато есть таймеры, которые можно запускать, и которые достаточно точны, и по окончанию отсчета которых может быть вызвана указанная в аргументе callback функция. Но они тоже проблемы не решают: например, способность, которая бы делает отсроченно некоторые действия не будет работать корректно, если ее использовать дважды: в функцию, которая вызывается по окончанию отсчета таймера невозможно передать какие либо аргументы, и поэтому невозможно выяснить, какой именно экземпляр способности эта функция должна обработать.

И тут был обнаружен Return Bug (это было еще давно, думаю в 2005 году, а может и раньше. Этот момент я не застал). JASS — язык со строгой типизацией, но этот баг позволял ее обойти. Выглядело это так:

Но ошибка не выдавалась — судя по всему в отдельное поле записывался тип возвращаемого значения, но при следующей инструкции return это поле перезаписывалось опять. В результате выполнения данного кода функция вернет некоторое число, которое будет являться внутриигровым дескриптором переданного функции юнита. И для каждого юнита это число будет уникально.

В языке также было такое средство как кеш — он предназначался для сохранений данных в кампании и переноса данных их из одной миссии в другую, и нормально в него писать можно было только числа, строки и логические переменные, а в качестве индекса выступали две строки. В результате был придуман метод, что в кеш по индексу преобразованного в строку дескриптора таймера записывался дескриптор юнита, с которым надо было совершить отсроченные действия, а потом в callback функции можно было получить дескриптор таймера, и выполнить действия именно над нужным юнитом. Это была победа, заметно расширившая возможности создателей карт.

Странно и то, что разработчики игры не закрыли эту лазейку, и ее использование стало распространенным. Собственно, любые интересные нестандартные способности юнитов делались так.

Принцип работы интерпретатора JASS

Есть также большая разница между обычной переменной и массивом: если обычная переменная просто содержит непосредственно значение, то массив содержит ссылку на структуру, которая содержит данные о размере массива а также ссылку на область памяти, в которой содержатся непосредственно данные массива. Массив, имея изначально небольшой размер при записи по большим индексам делает realloc, однако размер массива ограничен 8192 элементами.

Собственно уязвимость

Есть в JASS такой тип, как code, это — относительный указатель на функцию, он используется, что-бы передать callback функции, например по использованию предмета вызвать такую-то функцию. С ним по идее нельзя делать никакие математические операции, и задается он только литералом, например code c = function foo. И он не указывает прямо на память, где расположен псевдокод, а лишь задает отступ от начала всего обработонного псевдокода. И тут на помощь приходит return bug:

Такой код вернет относительный адрес первого опкода передаваемой функции в виде числа.

А вот так можно вызвать функцию, точнее не ее саму, а ее со смещением. Далее, путем подбора за счет объявления переменных по порядку и написания бессмысленных операций присвоения можно заставить игру генерировать свой, особенный псевдокод. Аналогичный метод кстати используется для антиотладки, когда в x86 ассемблере пишется инструкция вызова, а в качестве адреса указывается другая инструкция, и переход совершается на нее. В JASS заметно облегчает эту задачу то, что интерпретатор при встрече с незнакомой инструкцией… просто перескакивает на следующую! Так вот, благодаря такому коду мы можем присвоить значение обычной переменной переменной массива и наоборот.

Известно, что игра использует одну библиотеку, которая не обновляется с патчами — Storm.dll. В ее адресном пространстве можно найти данные, адрес которых присвоить переменной массива, и выйдет, что мы получим массив, данные которого будут находиться не в специально выделенном месте, а прямо в исполняемом коде процесса. Нужно, что бы поле размера было больше, и не было произведено realloc при попытке записать что-либо по высоким адресам, а второе поле указывало на адрес, по которому мы собираемся писать. В результате появляется возможность писать и читать память процесса. Простая запись в такой массив:

Будет писать в память процесса по нужному адресу. Дальше же дело техники… Автор уязвимости находил стек, и писал что-то в него, что позволяло перехватить управление. Если я правильно помню в архив карты можно было засунуть и свою *.dll, но код можно было зашифровать и в скрипте.

История

Я взялся писать свой патч, в результате появилась маленькая программа, которая копировала одну из библиотек игры, и перезаписывала в ней… 5 байтов. Да, это было полное спасение. А сделал я (адрес мне подсказал разработчик уязвимости) перехват обработки типа code. Игра постоянно использует преобразование относительного игрового адреса опкода (тот, который можно получить с помощью Return Bug) в реальный адрес, а я просто напросто добавил операцию and 0xfffffff8, попросту не давая выполнить некорректный псевдокод. Я выложил его на форумах, посвященных созданию карт для WarCraft 3. И уехал на дачу, где интернета у меня не было. Понимаю, поступил я безответственно ;)

Пытались ли кто-либо связаться с разработчиками игры, не чуть позже они выпустили патч 1.24, в котором полностью запретили Return Bug и добавили легальный его аналог, который правда не позволял обратные преобразования — из числа получить объект теперь стало невозможно. Как результат часть карт, которые были написаны на JASS толково — быстро заменили функции и стали работать корректно, другая же часть, которая использовала обратные преобразования из числа в объект поломалась. Карты же, созданные на визуальной надстройке вообще никак не среагировали на это событие. В целом Blizzard выбрали не самый оптимальный вариант, да и к тому же поломали совместимость.

Заключение

Что я хочу сказать напоследок?

Используя недокументированные возможности надо быть осторожным и понимать, что лавочку могут прикрыть.

Будучи ближе к пользователям можно заметно облегчить себе жизнь — автор уязвимости ранее имел негативный опыт общения с техподдержкой Blizzard, которая ему для решения всех проблем предлагала переустановить игру. И он не захотел сообщать им о уязвимости.

И самое главное: всегда, всегда, всегда проверять входные данные. Уязвимости бы не было, если бы return bug был сразу заменен на функцию, встроенную в движок. Ее не было бы, если бы интерпретатор начинал панику, наткнувшись на неизвестный опкод.

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.


  1. Каким образом код в карте умудряется запускаться?
  2. Каким образом это можно использовать в конструктивных целях?
  3. Каким образом можно защититься от этой заразы?



Нету.
Только рассказы о том, как при попытке присоединения к игре начинается закачка.
Затем при старте карты вылезает антивирус (COMODO, Avira, NOD, Касперский. ) и ругается на вирус.
Вроде появляется файл C:\WINDOWS\TEMP\omfg_wtf.dll.



карта не моя (ну тут тупо демо запуск консоли)

автор - Crock (вар .22)

вирей тут нету если что



________________
MF: За отдельными столами распологаются дворфы с орками. У них соревнование в количестве выпитого эля.
LLlypuK: Некоторые дворфы уже настолько дворфы, что неотличимы от орков.


ну почитайте архив флудильни хоть чтоли, там мы с жоном и вандамом обсуждали немного..

Sc добавил:
NT ты не шариш) он сам его цепляет, а он уже - эксцепшн




да кстати.
сегодня заметил,когда по гарене гамал в дэфианс онлайн,все как токо заходили,к них закачка была. хотя карта у них имелась.


Ну вот, теперь начнется срачь, что во всех картах вирусы. Бтв его бы не успели написать криворукие кодеры, за ~2 дня.


Hellfim, ничего не начнется. Бездоказательный срач согласно правилам раздела будем тереть ;). RazArt, всё работает, я проверял. Надо версию вара 1.22



________________
Fifteen men on a dead man’s chest. Yo-ho-ho and a bottle of rum!
Drink and the devil had done for the rest. Yo-ho and a bottle of rum!


Просто именно в этой карте прописано именно для 1.22 — на тот момент это была последняя версия. С таким же успехом при изменении нескольких строк добавляется поддержка 1.23 )


Новый вирус распространяется через WarCraft3

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.


  1. Каким образом код в карте умудряется запускаться?
  2. Каким образом это можно использовать в конструктивных целях?
  3. Каким образом можно защититься от этой заразы?



Нету.
Только рассказы о том, как при попытке присоединения к игре начинается закачка.
Затем при старте карты вылезает антивирус (COMODO, Avira, NOD, Касперский. ) и ругается на вирус.
Вроде появляется файл C:\WINDOWS\TEMP\omfg_wtf.dll.



карта не моя (ну тут тупо демо запуск консоли)

автор - Crock (вар .22)

вирей тут нету если что



________________
MF: Если кого то буду путать, то буду путать с Clamp'ом. Это теперь будет юзер по умолчанию.


ну почитайте архив флудильни хоть чтоли, там мы с жоном и вандамом обсуждали немного..

Sc добавил:
NT ты не шариш) он сам его цепляет, а он уже - эксцепшн




да кстати.
сегодня заметил,когда по гарене гамал в дэфианс онлайн,все как токо заходили,к них закачка была. хотя карта у них имелась.


Ну вот, теперь начнется срачь, что во всех картах вирусы. Бтв его бы не успели написать криворукие кодеры, за ~2 дня.


Hellfim, ничего не начнется. Бездоказательный срач согласно правилам раздела будем тереть ;). RazArt, всё работает, я проверял. Надо версию вара 1.22



________________
Fifteen men on a dead man’s chest. Yo-ho-ho and a bottle of rum!
Drink and the devil had done for the rest. Yo-ho and a bottle of rum!


Просто именно в этой карте прописано именно для 1.22 — на тот момент это была последняя версия. С таким же успехом при изменении нескольких строк добавляется поддержка 1.23 )


Новый вирус распространяется через WarCraft3

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.


  1. Каким образом код в карте умудряется запускаться?
  2. Каким образом это можно использовать в конструктивных целях?
  3. Каким образом можно защититься от этой заразы?



Нету.
Только рассказы о том, как при попытке присоединения к игре начинается закачка.
Затем при старте карты вылезает антивирус (COMODO, Avira, NOD, Касперский. ) и ругается на вирус.
Вроде появляется файл C:\WINDOWS\TEMP\omfg_wtf.dll.



карта не моя (ну тут тупо демо запуск консоли)

автор - Crock (вар .22)

вирей тут нету если что



________________
MF: Если кого то буду путать, то буду путать с Clamp'ом. Это теперь будет юзер по умолчанию.


ну почитайте архив флудильни хоть чтоли, там мы с жоном и вандамом обсуждали немного..

Sc добавил:
NT ты не шариш) он сам его цепляет, а он уже - эксцепшн




да кстати.
сегодня заметил,когда по гарене гамал в дэфианс онлайн,все как токо заходили,к них закачка была. хотя карта у них имелась.


Ну вот, теперь начнется срачь, что во всех картах вирусы. Бтв его бы не успели написать криворукие кодеры, за ~2 дня.


Hellfim, ничего не начнется. Бездоказательный срач согласно правилам раздела будем тереть ;). RazArt, всё работает, я проверял. Надо версию вара 1.22



________________
I've been thinking flowers, maybe daisies, to brighten up the room.
Don't you think some flowers, pretty daisies, might relieve the gloom?


Просто именно в этой карте прописано именно для 1.22 — на тот момент это была последняя версия. С таким же успехом при изменении нескольких строк добавляется поддержка 1.23 )


Новый вирус распространяется через WarCraft3

Эпидемии в WoW World of Warcraft, Эпидемия, 2005, 2008, Длиннопост

Обычные NPC от заболевания не страдали, но были разносчиками вируса. По описанию очевидцев, улицы больших и маленьких городов были завалены сотнями тел.

Вскоре игроки начали избегать населенных городов или же вовсе перестали заходить в игру. Разработчики пытались ввести карантин, а некоторые игроки принялись намерено распространять заразу.

Эпидемии в WoW World of Warcraft, Эпидемия, 2005, 2008, Длиннопост

Самая заразная болезнь Азерота вспыхнула чуть более восьми лет назад. Игроки знали, что вскоре должно случиться нечто, связанное с Плетью, но никто не знал ни деталей, ни масштабов будущего бедствия.

Это началось 22 октября 2008 года. В Штормград и Оргриммар прибыли агенты Серебряного Рассвета, предупреждая о неминуемой опасности:

— Король-лич хочет показать, что он вернулся. Этого нельзя допустить.

Примерно в это же время, WoW Insider запостил текст, в котором были кое-какие размышления на тему того, что же все-таки будет собой представлять грядущий террор Короля-лича. Никто не подозревал, что эти мысли будут пророческими:

— Будет ли это простое повторение вторжения Плети, предварявшего появление Наксрамаса? Или, может быть, что-то еще более жесткое: глобальный ивент такой силы, что вся механика игры будет разрушена до основания?

Эпидемии в WoW World of Warcraft, Эпидемия, 2005, 2008, Длиннопост

Разумеется, как и с большинством прочих негативных эффектов, этот можно было развеять при помощи нужного умения (или заплатив копеечку агентам Рассвета). Но если сделать этого не удавалось, или зараженный игрок умирал с инфекцией, то возрождался он уже в виде зомби.

Эпидемии в WoW World of Warcraft, Эпидемия, 2005, 2008, Длиннопост

На третий день после заражения Пиратской бухты, в низкоуровневых локациях появились агрессивные зараженные NPC, атаковавшие всех, кого видели. Время протекания болезни сократилось до двух минут, а сами зомби стали более живучими и имели пониженный шанс промахнуться при ударе.

«Мы с другом закруглялись со своими делами в Запределье, когда это началось. Мы только-только апнулись до 70, обменялись виртуальными брофистами и отправились в Штормград. Всё произошло как в фильмах. Торговый чат был полон людей, спрашивавших, что зиккурат делает у стен Штормграда. Кричали о помощи: герои пытались удержать мост, на который, волна за волной, напирали зомби.

Эпидемии в WoW World of Warcraft, Эпидемия, 2005, 2008, Длиннопост

Как и в прошлом, летающие зиккураты наводнили континенты мертвецами. Чума захватывала все больше локаций, заражение приобретало угрожающе большой размах. В городах, помимо тараканов, появились чумные крысы. Чумные жители приобрели способность заражать городских стражников 70 уровня, которых было не так-то просто убить.

Третий день заражения был переломным моментом. До этого инфекция считалась игрушкой, ерундой, с которой можно побаловаться. Можно было заражать других игроков в качестве зомби, но, как правило, от ненавистного дебаффа легко и быстро избавлялись (если хотели). Но именно на третий день чума поставила на колени все ключевые локации мира, а игроки разделились на тех, кто пытался бороться с инфекцией и тех, кто распространял её во славу Плети.

Со всеми этими способностями, зомби были суровыми противниками, чья сила многократно возрастала от количества пушечного мяса в отдельно взятой стае мертвецов. Даже небольшая группа, которая постоянно замедляла, дебаффала врага и излечивала себя, представляла собой угрозу, от которой зачастую невозможно было спастись.

Играть мертвецом было невероятно весело. Разнообразие способностей вносила в коллективное заражение тактическую глубину. Собранная и умело координирующаяся стая зомби могла легко и просто вырезать любой столичный город. Плюс, в виде зомби сохранялась возможность использовать порталы в города (в Шаттрат, например), даже если город принадлежал враждебной фракции.

Порталы, разумеется, никогда не оставались без дела.

Отбивать атаки зомби также было весело, имея в распоряжении сплоченную группу еще не зараженных игроков. Но, как ни очевидно, люди сдавали позиции в битве. Важные NPC-вендоры умирали один за другим, города пустели. Выжившие в мясорубке видели только заброшенные улицы и трупы — как лежачие, так и прямоходящие. Вся экономика была парализована, ибо аукционы превратились в массовые захоронения. Все, кто еще мог бежать, пытались спастись, найдя убежище на природе, вдали от городов.

Самым невероятным во всем ивенте была его атмосфера. Он был аутентичным. Происходивший ад ощущался как тот самый зомби-апокалипсис, картины которого многие рисуют в воображении. Небольшие происшествия в конце концов привели к полному, тотальному хаосу. Игроки выживали именно так, как выживали бы в реальности: сбивались в большие группы, постоянно держали оружие и кулдауны наготове и держались в стороне от густонаселенных областей.

На четвертый день заражения болезнь превращала жертву в зомби всего за минуту и стала еще более устойчивой к лечению. Зараженные личинки постоянно атаковали городскую стражу. Зомби получили новые усиления. Миры стремительно катились в забвение.

Некоторые игроки, к сожалению, не находили в этом вообще никакого веселья.

Эпидемии в WoW World of Warcraft, Эпидемия, 2005, 2008, Длиннопост

Одной из причин, по которой событие вызвало сильную негативную реакцию сообщества, было то, что все игроки сильно зависели от NPC, на поверку оказавшихся не такими уж и вечными.

То есть, прямо в лапы голодного зомби.

Одновременно с этим проходил хэллоуинский ивент, и толпы мертвецов не делали получение праздничных достижений легче.

Случись чума во времена нынешнего патча, такого эффекта она бы не произвела. За прошедшее время игроки получили гораздо больше самостоятельности, чем была тогда. Да и возможность летать способна убить весь саспенс, ведь можно просто сесть на маунта и взлететь, оставив зомби на земле. Однако тогда, во времена царя Гороха, не было способов взять и сбежать от апокалипсиса. Он был везде, а бежать было практически некуда.

В этом и была суть: теперь у игроков была чертовски значимая причина желать смерти Королю-личу. Можно сказать, что ивент свою цель выполнил.

На пятый день заражения появились новые квесты. Орда пыталась создать вакцину от чумы, Альянс же разрабатывал оружие, с помощью которого можно сбить летающие зиккураты. На шестой день всё закончилось: Серебряный Рассвет обнаружил лекарство и остановил апокалипсис.

Читайте также: