Время прочтения: 6 мин.

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

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

Мониторинг

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

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

Детекторы аномалий являются важнейшим инструментом в системах высокого риска, они способны предупредить человека о потенциальных опасностях и, как правило, нацелены на максимально возможный низкий уровень ложного срабатывания. Детекторы способны запустить политику отказоустойчивости в системе, а также отметить пример для вмешательства человека. Главная проблема заключается в том, что существующие методы обучения испытывают трудности с обнаружением представлений, которые хорошо работают для ранее незамеченных аномалий. Классическим примером неспособности обнаружить аномалию, является воздействие на нейронную сеть, вызывающее ошибки в её результатах. Подмешивание аномального шума к изображению панды, заставляет нейросеть распознавать картинку, как изображение гиббона (рис.1).

Подобные атаки можно произвести без особых усилий, например, с помощью библиотеки foolbox языка программирования python. Ниже представлен пример атаки на нейронную сеть ResNet.

# Загружаем необходимые библиотеки
import numpy as np
import matplotlib.pyplot as plt
import tensorflow
import foolbox as fb
from tensorflow.keras.preprocessing.image import load_img, img_to_array
from tensorflow.keras.applications.resnet_v2 import preprocess_input,  decode_predictions
# Загружаем изображения, соответствующие случайно выбранным классам, которые классификатор должен предсказывать. 48 – варан, 248 – китовая лиса.
img_varan = load_img(r'/content/drive/MyDrive/varan.png', target_size=(224, 224))
img_fox = load_img(r'/content/drive/MyDrive/kit_fox.png', target_size=(224, 224))
labels = np.array([278, 48])
plt.figure()
f, ax = plt.subplots(1,2) 
ax[0].imshow(img_fox)
ax[1].imshow(img_varan)
plt.show()
# Создаём экземпляр предобученной модели
model = tensorflow.keras.applications.ResNet50V2(weights="imagenet") 
fmodel = foolbox.TensorFlowModel(model, bounds=(-1, 1)) 

# Подготавливаем изображения для работы с моделью и смотрим на результат классификации до атаки.
images = np.array([img_to_array(img_fox), img_to_array(img_varan)])
prep_images = preprocess_input(images.copy())
img = tensorflow.convert_to_tensor(prep_images, dtype=np.float32)
labels = tensorflow.convert_to_tensor(labels, dtype=np.int64)
pred = model.predict(prep_images)
pred_lables = np.argmax(pred, axis=1)
print("Китовая лиса: %r, Варан: %r" % (pred_lables[0], pred_lables[1]))
print("Модель предсказывает, что китовая лиса это - %r c вероятностью %r" % (decode_predictions(pred)[0][0][1], decode_predictions(pred)[0][0][2]))
print("Модель предсказывает, что варан это - %r c вероятностью %r" % (decode_predictions(pred)[1][0][1], decode_predictions(pred)[1][0][2]))

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

# Производим простую и быструю атаку на основе градиента (подробнее можете прочитать по ссылке внизу.) и смотрим результат
attack = foolbox.attacks.LinfDeepFoolAttack()
raw, _, success = attack(fmodel, img, labels, epsilons=0.05)
pred = model.predict(raw)
pred_lables = np.argmax(pred, axis=1)
print("Китовая лиса: %r, Варан: %r" % (pred_lables[0], pred_lables[1]))
print("Модель предсказывает, что китовая лиса это - %r c вероятностью %r" % (decode_predictions(pred)[0][0][1], decode_predictions(pred)[0][0][2]))
print("Модель предсказывает, что варан это - %r c вероятностью %r" % (decode_predictions(pred)[1][0][1], decode_predictions(pred)[1][0][2]))

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

# Указываем метки, которые хотим получить от классификатора после атаки и воспроизводим атаку.
target_classes = labels[::-1]
criterion = foolbox.criteria.TargetedMisclassification(target_classes)
attack = foolbox.attacks.L2CarliniWagnerAttack(steps=300)
advs, _, success = attack(fmodel, img, criterion, epsilons=0.05)

# Смотрим на предсказание модели после атаки и на полученные изображения
pred = model.predict(advs)
pred_lables = np.argmax(pred, axis=1)
print("Китовая лиса: %r, Варан: %r" % (pred_lables[0], pred_lables[1]))
print("Модель предсказывает, что китовая лиса это -", decode_predictions(pred)[0][0][1])
print("Модель предсказывает, что варан это -", decode_predictions(pred)[1][0][1])

foolbox.plot.images(advs, bounds=(-1,1), figsize=(5,5))

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

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

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

Согласно статье, безопасные файлы имеют более четкие и сглаженные изображения, в отличие от резких изображений вредоносных. Аналогично, визуализируя разметки и исходный код фишинговых и настоящих сайтов(рис 3 и 4), выявляются уникальные закономерности, а когда у вас есть такие видимые шаблоны, можно применить ML для различия подобных отличий.