Как стать автором
Обновить
Positive Technologies
Лидер результативной кибербезопасности

Сломать ИИ: разбор заданий AI CTF на PHDays 10

Время на прочтение6 мин
Количество просмотров2.8K

Продолжая развивать тему безопасности и рисков AI, в рамках конференции PHDays мы собрали трек с докладами и организовали CTF-соревнование для безопасников, затрагивающее риски AI. В этой статье расскажем про соревнование: какие задания были и как все прошло.

AI CTF проходит не первый раз, прошлое описание формата и заданий мы уже публиковали на Хабре

Разбор заданий

Темы и безопасности и искусственного интеллекта довольно хайповые по отдельности. Но когда они объединяются, то чаще всего вспоминаются “adversarial attacks”,которые в реальной жизни на самом деле не являются такими уж и распространенными. Мы постарались подсветить другие возможные риски.

Оценивались задания в этом году динамически — в самом начале все задания стоили одинаково, а в дальнейшем их стоимость уменьшалась, если их решали много участников. Это спасло от неправильной оценки заданий нами и сделало оценивание, на наш взгляд, справедливее.

3v1l_k3yb04rd

Это задание стало самым популярным среди решенных и одновременно вызывающим много вопросов. 

Идея задания — отсылка к области data privacy и языковым моделям, которые могут отдавать личную информацию на которой обучались.

По легенде (описанию задания), участникам доставалась полученная модель автодополнения слов, извлеченная из клавиатуры одного из топ-менеджеров какой-то компании и его последние слова. Участникам предлагалось найти пароль, что и являлось бы флагом для получения баллов. 

Задание решалось просто, если в API к ответу модели поменять top-n предсказаний, которые предлагались пользователю (по умолчанию предлагалось одно). Начав с фразы, которая была в описании, можно было бы получать несколько вариантов, используя их для следующего предсказания. Пробуя разное, в какой-то момент модель предложила бы фразу, дополненную флагом. 

Начиная с  Somewhere in можно было бы получать варианты дополнений и, перебирая их, удалось бы получить полную фразу. В идеале нужно было сложить предложение Somewhere in Moscow City hacker Bob broke the system with password, и дополнился бы флаг.

Флагом была фраза pr1v473_d474_5h0uld_b3_pr1v473, которую нужно было обернуть в тег AICTF{__}.

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

Game of Cats

На наш взгляд, фановое задание на автоматизацию, но не у всех получилось его выполнить.

В основе задания игра, и неизвестно, сколько в ней уровней, и если начинаешь играть вручную, то предстоит на каждом уровне выбирать фото, на котором изображена кошка, и нажимать Next. В какой-то момент вместо одной картинки становится две, три, а потом и 50. При этом есть ограничение по времени, а прогресс сбрасывается при ошибке.

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

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

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

AlexNetv2.0

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

Участникам была дана модель и сказано, что это какая-то новая версия. Категория задания была stegano — категория заданий, нацеленных на извлечение информации.

Немного посмотрев на модель, можно было увидеть, что по архитектуре это обычная модель AlexNet:

Где же тут спрятан флаг?

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

Далеко не уходя в deep-часть сети, можно было найти флаг:

h4ck3r

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

Был дан сервис, который принимал на вход картинку, но на выход тоже возвращал картинку с примененным фильтром и hacker score. И только настоящий хакер мог получить максимальную оценку!

Что первое подумает дата-сайентист? Надо крафтить картинки и получать максимальный скор — adversarial attacks! Но трудно крафтить картинки в случае black box модели. Мы постарались намекнуть, что это делать и не надо.

Категория задания была помечена как web и stegano, поэтому настоящий цтфер начнет искать багу в вебе! Проэксплойтив Path Traversal, который был предусмотрительно заложен, можно было получить сорцы сервиса и увидеть, а как все-таки этот hacker score выставляется картинке. 

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

Возможные варианты:

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

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

Спасибо команде RuCTF, которая разрешила взять за основу их крутой сервис!

BigLittleData

Все, что было дано участникам — csv файл с набором данных. Что делать? Вижу данные —  открываю их в pandas!

Как-то так они выглядели:

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

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

Пошаманив с алгоритмом PCA, можно было получить флаг:

Tensorch

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

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

В бинаре было две (намеренно оставленных) уязвимости:

  1. не проверялся размер пользовательского ввода;

  2. при выборе функции активации для слоя некорректно проверялся индекс функции.

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

Как эксплуатировать первую багу:

  1. Структура, хранящая в себе нейросеть, лежит на стеке. Там же находятся коэффициенты для слоев.

  2. Мы специальным образом введем значения нашего входа и укажем довольно большой размер таким образом, чтобы на выходе сети мы получили: val_from_stack * 1.0.

  3. Дальше мы переводим присланный нам double в байты и таким образом получаем адреса.

 Как эксплуатировать вторую багу:

  1. У нас проверяется знаковый int на то, что он меньше трех, но если мы введем -1, то в качестве адреса функции будет использовано значение из буфера, который хранит в себе выход нашей сети.

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

  3. Создаем новую сеть с функцией активации равной -1.

Теперь мы можем прыгать на произвольный адрес, но этого мало. При этом в бинаре есть следующее интересное место:

.text:00000000000019C1                 mov     edx, 240h       ; nbytes
.text:00000000000019C6                 mov     rsi, rax        ; buf
.text:00000000000019C9                 mov     edi, 0          ; fd
.text:00000000000019CE                 call    _read

На момент вызова функции активации в регистре rax лежит значение, которое должно быть передано функции активации:

.text:00000000000014AD                 movq    xmm0, rax       ; a
.text:00000000000014B2                 call    rdx             ; вызов функции активации

Таким образом, учитывая что на шаге 1 мы узнали адрес стека, мы можем просто считать в стек нашу ROP-цепочку. Адрес надо высчитать таким образом, чтобы мы переписали адрес выхода из функции _read. После этого остается небольшое упражнение с тем, чтобы ликнуть адрес либсы и считать вторую цепочку.

Итоги:

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

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

Призовые места заняли:

  1. Жмыхолет Апач,

  2. pomo_or_not_pomo,

  3. konodyuk (стабильность!).

Ребят мы наградили релевантными соревнованию призами: за первое место AWS DeepRacer, за второе JetRacer AI racing robot, а за третье место подарили Jetson TX2 Module.

Все еще надеемся, что помогаем специалистам, как DS, так и ИБ прикоснуться к миру друг друга и получить удовольствие от игры!

Теги:
Хабы:
+1
Комментарии0

Публикации

Информация

Сайт
www.ptsecurity.com
Дата регистрации
Дата основания
2002
Численность
1 001–5 000 человек
Местоположение
Россия