World of Warcraft: одна строка кода, чтобы потерять все

https://blog.gdatasoftware.com/2016/07/28809-world-of-warcraft-one-simple-line-of-code-can-cost-you-dearly
  • Перевод


Представьте себе ситуацию: в игре персонаж, который представился членом одной из популярных и известных гильдий, подходит к Вам и обещает редкие крутые элементы, редких животных (на которых Вы можете путешествовать) оружие и т.п. Скорее всего такой перс не имеет ни редких элементов, ни специальных кодов для них. В итоге жертва не получает правильный код или какой-либо редкий предмет. Злоумышленник смог убедить ничего не подозревающего игрока ввести всего одну команду в диалоговом окне.

/run RemoveExtraSpaces=RunScript

Интерфейс WoW (например, строка меню, окно чата и другие 2D графические элементы) и также дополнения написаны на языке Lua. Обе стороны строки — RemoveExtraSpaces и также RunScript — легальные функции и часть WoW Lua API. Но введение этой строки кода в диалоговом окне изменяет поведение интерфейса WoW.

Что делает эта команда на самом деле?


/run — команда для интерпретации следующего текста как сценария Lua.
RemoveExtraSpaces — встроенная функция, которая удаляет ненужные пробелы из текста.
RunScript — функция, которая выполняет текст в качестве кода Lua (аналогично команде /run)

Чем это опасно?


Функция RemoveExtraSpaces вызывается каждый раз, когда игрок получает новое сообщение. Указанная выше команда /run заменяет функцию RemoveExtraSpaces на функцию RunScript, которая изначально существует в программном обеспечении. После того, как исходная функция переписывается, каждое новое сообщение чата интерпретируется как Lua код и сразу же выполняется. Сценарий выглядит следующим образом.

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


Ничего не подозревающий игрок собирается отправить вредоносную строку кода


Злоумышленник отправляет сообщение в чате жертве


Полученное сообщение интерпретируется как Lua код и затем выполняется

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

Временное скрытие и сохранение команды


После того как жертва открыла бэкдор в свой интерфейс, злоумышленник отправляет следующее сообщение:


Атакующий устанавливает новый канал передачи данных

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

Для того, чтобы понять цель этой команды, нужно знать что в WoW есть возможность общаться с помощью скрытого канала (локально и удаленно). Этот канал установлен через использование событий “CHAT_MSG_ADDON”.



Сценарий создает фрейм (строка 2), к которому можно установить различные свойства. Сценарий регистрирует события CHAT_MSG_ADDON с конкретным префиксом (строка 6 и 25). Только тот, кто знает выбранный префикс, может тайно управлять интерфейсом жертвы. Это все равно что пароль для бэкдор.

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

Вывод: пока злоумышленник не решит Вам показать, что происходит, Вы, к сожалению, про это не узнаете.

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

Какой вред может быть причинен?


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

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

Как можно себя защитить?


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

В данном примере мы говорили об атакующем персонаже в игре, кто принадлежал к популярной гильдии. Но по факту он не принадлежал к этой гильдии. Он выбрал известную гильдию и скопировал имя, заменив “L” на “I”. Возможно, Вы уже знакомы с такими методом фишинг-атак.

Кроме того, будьте осторожны при загрузке дополнений используйте защищенные и популярные веб-сайты, сохраните свои дополнения, чтобы их можно было в любой момент заменить. Возможно, что некоторые из этих обновлений могут уже содержать вредоносный код. Подобная проблема была замечена в 2014, когда так называемый “ElvUI Backdoor” был обнаружен в одном из дополнений.

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



Выбор “Yes” отключает сообщение навсегда, даже перезапуск не вернет его – по этой причине вопрос нельзя считать решенным. Чтобы повторно активировать данное сообщение, нужно вручную удалить одну строку кода в конфиг-файле.

Код, который должен быть удален:SET AllowDangerousScripts "1"
Файл: config-cache.wtf
Путь: World of Warcraft\WTF\Account\\
ua-hosting.company 181,72
Хостинг-провайдер
Поделиться публикацией
Комментарии 42
  • +4
    Честно говоря не понятно — зачем вообще нужна поддержка выполнения скриптов (/run) из чата обычным пользователям. Все скрипты должны быть в аддонах и устанавливаться явным образом вне игры, это и безопасней и проще для пользователя.
    • +2
      макросы. макросы — это очень нужно и очень круто. я ими пользовался вовсю, когда играл.

      другое дело, что давать возможность переопределения встроенных функций — это конечно «забавно»
      • 0
        > макросы. макросы — это очень нужно и очень круто. я ими пользовался вовсю когда играл.

        Макросы это одно, а /run это уже макросы на большущих стероидах. Каким именно кодом в /run вы пользовались? В общем-то любой такой полезный код можно и нужно засовывать в аддон, который наружу высунет уже простой интерфейс.
        • 0
          я сейчас уже не помню, что где именно /run использовал, да и возможность его использования со временем урезалась, но в некоторых местах точно было у меня. ну и ради этого клепать аддон и куда-то его подкладывать, не было смысла
          • 0
            Например

            /run for k, v in pairs({[39289]='Пушка Смерти',[39288]='Кулак Страха',[39287]='Коготь Смерти',[39290]='Отмщение'}) do print(format("%s: %s", v, IsQuestFlaggedCompleted(k) and "\124cff00ff00Убит\124r" or "\124cffff0000Не убит\124r")) end

            или, скажем http://ru.wowhead.com/achievement=7995#comments:id=1770178 (код слишком длинный, чтобы копипастить сюда).
            • 0
              Для таких фрагментов отдельные аддоны как раз удобней. Настроили, какие квесты отслеживать и смотрите в отдельном окошке.
              • 0
                Это если кто-то написал такой аддон. Чаще всего, у вас есть лишь два варианта: либо летать по миру и проверять самостоятельно, собрали ли вы когда-нибудь то-то или убивали ли вы того-то, либо вбить в макрос строчки кода из комментариев с wowhead и сразу увидеть, что вы собрали, а что нет.

                Собственно, первый из макросов выше как раз и выводит на экран информацию о том, убили ли вы сегодня кого-нибудь из четырёх перечисленных редких существ.
                • 0
                  Сделать аддон из такой строчки очень просто. Не было бы такой возможности, вы бы скачали крохотный zip-файл с того же вовхеда и примерно так же его использовали бы. Только не через /run а через /runMyAddon. Чуть больше мороки, но нет опасности, описанной в статье.
                  • 0
                    Опасности и так нет, если ты хоть немного понимаешь что делаешь, обычно скрипты просто так не используют.

                    /run использовался (и используется) разбойниками для одной их способности, чтобы как можно раньше выбить соперника из невидимости (небольшой трюк с проверкой расстояния до цели).
                    Так же через /run можно проверять еженедельный статус ворлдбосов.
                    И еще их используют для того, чтобы двигать фреймы. Это важный момент. На турнирах аддоны запрещены, а однострочные скрипты — нет. Так что фреймы двигать можно только так.

                    Так же через /run осуществляется покупка или продажа каких-либо вещей в цикле. Раньше так баджи меняли, которых нужно было обменять за раз много, а в ручную для каждой покупки необходимо было кликать по подтверждению.
                    • +2
                      > Опасности и так нет, если ты хоть немного понимаешь что делаешь, обычно скрипты просто так не используют.

                      Ну так топик-то про что? Используют ещё как. Программирование на базовом уровне знает дай бог 1% от всех игроков. Остальные просто копируют непонятные строчки в надежде, что оно заработает.

                      > /run использовался (и используется) разбойниками для использования их способности, чтобы как можно раньше выбить соперника из невидимости.

                      Интересно, можно подробней? По идее там без /run, просто спамится абилка в макросе с /cleartarget.

                      > Так же через /run можно проверять еженедельный статус ворлдбосов.

                      Такие вещи правильней делать в аддонах, и таких аддонов хватает.

                      > И еще их используют для того, чтобы двигать фреймы. Это важный момент. На турнирах аддоны запрещены, а однострочные скрипты — нет. Так что фреймы двигать можно только так.

                      Это маразм правил турниров, а не реальная необходимость, как по-мне.
                      • 0
                        > Ну так топик-то про что? Используют ещё как. Программирование на базовом уровне знает дай бог 1% от всех игроков.
                        Здесь звучали предложения о том, что функционал /run необходимо выпилить, я привел аргументы в пользу того, что этого делать не стоит.

                        Макрос на сап:
                        /#showtooltip Sap
                        /console targetNearestDistance 10.000000
                        /targetenemy [noharm][dead]
                        /console targetNearestDistance 41.000000
                        /cast [harm,nodead] Sap

                        С сапом слегка ошибся, да, без /run

                        > Такие вещи правильней делать в аддонах, и таких аддонов хватает.
                        Я не знаю, кем определена эта правильность, но я не хочу что-то где-то качать, распаковывать, копировать, и делать перезагрузку всего интерфейса ради одной строчки в чате и так, и так.
                        А в идеале еще и чекать минимум два файла из этого аддона, чтобы опять же, быть уверенным в его чистоте.
                        • 0
                          > Макрос на сап:

                          Видите, /run тут нет, только специализированные команды.
                          • 0
                            Ну вот тогда другой пример:
                            /run local T,t,P,m="TargetNearestEnemy","TAB","Player"," is now set to "if GetBindingAction(t)==T then SetBinding(t,T..P)print(t..m..T..P)else SetBinding(t,T)print(t..m..T)end
                            Макрос, позволяющий «табать» только PvP-цели, т.е. игроков (а не питомцев и тотемы).
                            • 0
                              Это уже в назначениях клавиш давным-давно биндится
                              • 0
                                Ничего там не биндидся. Там есть только скролл туда-сюда по всем целям. PvP это, или нет.
                                А в этот скрипт еще и проверку на PvP зону добавить можно, если конечно в 255 символов уложиться выйдет. Типа если ты на арене — скролл только по PvP целям, если нет — обычный режим.
                                • 0
                                  промах
                                  • 0
                                    image

                                    А проверить, прежде чем утверждать?
                                    • 0
                                      А по-поводу переключений — тоже сомнительный плюс. Играть в ММО на результат на клавиатуре за 150 рублей это извращение, как и делать скриптами то, что уже есть в настройках. У меня SS Apex + SS Rival, гдя я одной кнопкой переключаю профили для PvP и PvE на всех девайсах, при этом в PvP у меня Tab начинает работать как Shift+Tab и меняются назначения некоторых способностей, дабы не переставлять абилки на панели (что, кстати, очень актуально для легиона, ввиду ввода PvP талантов, неактивных в мирное время) и даже не заморачиваюсь о 255 символах.
                • 0
                  /run достаточно часто использовали участники арена-турниров где использование аддонов запрещено, а макросов — нет.
                  Нажал пяток кнопочек и получил более функциональный интерфейс.
                  • 0
                    На самом деле довольно много нужных вещей раньше делались через /run, со временем многие переехали в стандартный интерфейс, устарели или стали частью аддонов. Но то что они бывают нужны — факт. Я например до сих пор использую такой код
                    /run local count = 0 for i = 0, 10000, 1 do if _G["NamePlate"..i] ~= nil and _G["NamePlate"..i]:IsVisible() then count = count + 1 end end print(count)
                    

                    Он считает количество неймплейтов на экране, грубо говоря количество мобов в поле зрения, нужно для всяких разных достижений из серии «убей 100 мобов за 10сек».
                    Вообще гибкость интерфейса вова сыграла довольно важную роль в популярности игры и отказываться от нее не стоит. Такие уязвимости как в статье можно и нужно латать другими способами.
                    • 0
                      На мой взгляд это примерно сидеть в винде под администратором без UAC. Удобней, меньше действий приходится делать, но в конечном счёте лучше себе немного усложнить жизнь, чтобы быть безопасней. Так и тут — лучше чуть-чуть усложнить жизнь для «power-юзеров», чем допускать такие взломы пользователей, которым все эти /run ничего не говорят и которые их вводят не особенно переживая.

                      Я против гибкости ничего не имею, я только за, тут вопрос не в гибкости, а в простоте доступа к этой гибкости.
                • 0
                  Если не ошибаюсь, в игре есть макросы, запускаемые по нажатию на кнопки на экране, возможно это как раз с ними связано.
                  • 0
                    Я с 2011 в Вов не играл, но насколько я помню, система аддонов там такова, что фактически представляет собой скрипты, исполняющиеся через игровую консоль, т.е. фактически через скрытые фреймы чата. Кроме того, там можно писать скрипты/маросы вручную и я вроде даже использовал /run для каких-то действий.
                    С одной стороны, такая система позволяет иметь гибкий интерфейс при монолитном игровом клиенте, что хорошо и для пользователей и для безопасности самой игры. С другой стороны, возможны вот такие дыры с перехватом управления интерфейсом.
                    И простого решения, лично я тут не вижу. Запрет переопределения функций приведёт к неработоспособности некоторых аддонов для интерфейса. Фильтр источника команд опять же сломает часть коммуникационных аддонов. В общем, что-то да сломается. Впрочем, Близзардам это не впервой — они уже не раз ломали аддоны, меняя систему по тем или иным соображениям.
                    • 0
                      Нет, система аддонов это обычные файлы с Lua-кодом. Игра выставляет определённое API и всё. Никак со /run это не связано, насколько я знаю. Простое решение — просто запретить /run и всё. Его функционал тривиально реализуется простым аддоном, кому сильно надо — просто поставят такой аддон и всё.
                      • 0
                        что-то мне подсказывает, что эта шляпа будет работать и через /script вместо /run
                        • 0
                          /run и /script это одна и та же команда.
                    • 0
                      Значит, чтобы выполнить простую команду, живы ли боссы в локациях, мне нудно написать аддон с интерфейсом вместо строки в чате?
                      Команды в чате — это полезно.
                      Их можно сравнить с консолью в браузере.
                      • 0
                        Буквально недавно использовал WoW API:
                        Вышел препатч и появились новые предметы, с которыми непонятно что делать. Гугл по ним инфы пока не находит, но через GetCursorInfo() можно получить ID предмета. С этим ID уже пополз на wowhead и уткнулся в обсуждение.

                        Задача простая и писать для этого полноценный аддон как-то глупо, при этом интерфейсом такую информацию получить нельзя.
                        tldr; в игре есть ряд функций, которыми без скриптов воспользоваться нельзя.
                        ps: Сама уязвимость — СИ в чистом виде, если человек без задней мысли печатает что-то в чате, то он точно так же и скачает/установит то, что у него потребуют.
                        • 0
                          Ага, тоже об этом думал — просто предложить скачать «гильдийский аддон», который при этом может даже что-то делать и полезное, для отвода глаз, там строка событий какая, ближайшее событие какое рисовать.
                          Правда это значительно ограничит функционал по его распространению, но если «по наводке» грабить цель с миллионами золота, то самое то.
                      • –3
                        А так можно, да? Перевод статьи появился сперва на Типичный Программист, а там ссылка на оригинал статьи.
                        У вас, кстати, оригинал не статьи и не указан. Оставлю ссылку — World of Warcraft: one simple line of code can cost you dearly
                      • 0
                        Если совсем развивать эту тему, то кто мешает раскрутить чутка левый сайт типа с аддонами, где в каждый из них будет встроенный код: сам отправит координаты игрока пусть даже через CHAT_MSG_ADDON или вообще войдет в созданный заранее канал (http://wowprogramming.com/docs/api/JoinTemporaryChannel), сольет инфу и выйдет. А когда сборщик будет в пределах трейда, откроет его и в миг сольет все ценное.
                        • 0
                          А в Ультима Онлайн был отдельный скилл Stealing, который позволял с определённым шансом вытаскивать вещи из бакпака другого чара даже в гз.
                          Если какой-то механики в игре нет, игроки начинают искать альтернативные способы её реализации.
                          • +1
                            Двухмегабайтная огромная КДПВ в png, которую разумнее было бы сжать в jpg — чё, серьёзно? О_о
                            • +1
                              После того, как я видел логотип 180х80px, сделанный из картинки в 2582х1644px по ширине и весом в 3,5MB при помощи уменьшения средствами HTML, я уже ничему не удивляюсь.
                              • 0
                                не уверен на счёт разумности сжатия в jpg. Разумнее было бы сжать в пределах png ;)
                              • 0
                                А можно так чтоб тип взломал мой интерфейс и рейдил за меня пока я сплю?
                                • 0
                                  А мне такого же в LotRO, пожалуйста!
                                  • 0
                                    LotRO еще жив?
                                    • 0
                                      Конечно. Обновление с новым рейдом две недели назад. Если посмотрите на график обновлений, то обнаружите, что гораздо живей близзовского вырвиглазия.
                                • 0
                                  https://tproger.ru/news/wow-scamming/
                                  Этому материалу уже три дня. На момент публикации-два.

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

                                  Самое читаемое