Искусственный интеллект и компьютерный взлом

Автор Тема: Искусственный интеллект и компьютерный взлом  (Прочитано 5053 раз)

Воробышёк

  • Новичок
  • *
  • Сообщений: 12
  • +3/-0
    • Просмотр профиля
Как вы думаете, возможности ии-систем будут развиваться быстрее в области информационной защиты или информационного нападения? Как скоро ии системы смогут находить и использовать уязвимости для взлома система лучше, чем люди? Смогут ли? Как будут применяться ии системы для предотвращения взломов и насколько эффективно? Кто кого обгонет - нападение обгонит защиту или наоборот?

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

Научится ли ии сколь-нибудь скоро анализировать код и находить уязвимости автоматически?

P.S. Вопрос вызван крайне интересным документом https://80000hours.org/articles/ai-policy-guide/, который содержит много вопросов, заставляющих задуматься.
« Последнее редактирование: 01 Июля 2017, 13:10 от Воробышёк »

Kroid

  • Ветеран
  • ****
  • Сообщений: 779
  • +62/-7
    • Просмотр профиля
То, что люди сейчас используют, не слишком достойно названия ИИ. Скорее - сложный настраиваемый инструмент.

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

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

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

Хороший пример - торговля на биржах. Есть разные стратегии, среди которых есть и довольно интересные примеры с самообучением. Но все они действуют в своем виртуальном мире, ограниченные АПИ и внутренним состоянием. Нет таких, которые бы сами зарегистрировались на новой бирже. Или купили и загрузили себя на более мощный сервер. Или начали писать ложные новости в интернете, чтобы повлиять на цены фьючерсов. Каждую из этих идей можно реализовать. Можно даже реализовать их все. Но это останется всё такой же инструмент, а не ИИ - в нем будут лишь те фичи, которые изначально заложили. Сменится апи для твиттера - и оно уже не сможет писать новости, пока не придет программист и не поправит исходный код.

Воробышёк

  • Новичок
  • *
  • Сообщений: 12
  • +3/-0
    • Просмотр профиля
Kroid, такие программные системы в рамках данной темы я тоже считаю искусственным интеллектом.

kuuff

  • Старожил
  • *****
  • Сообщений: 2 133
  • +220/-52
    • Просмотр профиля
Научится ли ии сколь-нибудь скоро анализировать код и находить уязвимости автоматически?
Существуют системы статического анализа кода, которые сканируют код на предмет разнообразных паттернов и выдают кучу замечаний. Они не в состоянии полностью доказать, что код корректен, но я думаю, что это временно. Для языков специально сделанных так, чтобы о них было бы просто рассуждать, типа чисто-функциональных, например, ситуация гораздо лучше.
В новостях где-то проскакивало лет десять назад про формальное доказательство соответствия ядра какой-то там ОС всем спецификациям. И хоть это доказательство создавалось людьми, но они писали программы, которые занимались доказательством теорем относительно кода.

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

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

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

Scondo

  • Ветеран
  • ****
  • Сообщений: 321
  • +35/-4
    • Просмотр профиля
Существуют системы статического анализа кода, которые сканируют код на предмет разнообразных паттернов и выдают кучу замечаний. Они не в состоянии полностью доказать, что код корректен, но я думаю, что это временно.
На самом деле не временно, если мы только не говорим о полноценном человекоподобном ИИ.
Да, потенциал в развитии подобных систем есть и ещё немалый, но в любом случае они проверяют на наличие ошибок, а не на соответствие поставленной задаче (если только не ставить задачу в достаточно формальной форме, но тогда эта форма сама по себе будет языком программирования)
Тривиально: если на некотором шаге требуется складывать операнды, а программа умножает, то как анализатор поймёт, что это ошибка?

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


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

kuuff

  • Старожил
  • *****
  • Сообщений: 2 133
  • +220/-52
    • Просмотр профиля
Да, потенциал в развитии подобных систем есть и ещё немалый, но в любом случае они проверяют на наличие ошибок, а не на соответствие поставленной задаче (если только не ставить задачу в достаточно формальной форме, но тогда эта форма сама по себе будет языком программирования)
Не будет. Статистический анализатор проверяющий соответствие спецификации, по-сути, должен только уметь проверить код на соответствие спецификации, но создавать этот код он уметь не обязан. Например, если в спецификации написано, что функция sort должна принять массив и вернуть его в отсортированном виде (то есть, в спецификации написано что-то типа "для любых m и n, лежащих между 0 и N-1 включительно, должно выполняться: m<n => A[m]<=A[n]"), а в функции sort находится реализация quicksort, то статистический анализатор может взять и построить математическое доказательство того, что массив будет отсортирован. Но вот придумать алгоритм quicksort -- это немного другая задача.

Тривиально: если на некотором шаге требуется складывать операнды, а программа умножает, то как анализатор поймёт, что это ошибка?
Потому что программа будет выдавать неверные результаты. В спецификации написано, что функция должна сортировать массив, но она внутри для своих внутренних целей умножает индексы массива, вместо сложения их. Уже не удастся доказать, что функция сортирует массив. А может быть удастся доказать, что она при определённых условиях будет возвращать неверный результат.

Забавный момент: обфускация кода усложняет анализ  человеком, но не мешает автоматизированному анализу, ведь зависимость между аргументами и результатом(действием) для каждой подпрограммы остаётся той-же.
Усложняет, потому что код может иметь произвольное количество side-эффектов. Мы вызвали функцию sort, а она помимо сортировки отформатировала нам диск. Как отследить подобное? По возвращаемому значению не удастся, придётся анализировать код или отслеживать выполнение. Но чтобы анализировать код, его сначала надо привести в состояние пригодное для анализа, в какое-то формальное представление, а это может быть очень нетривиальной задачей. Можно выполнять его в "песочнице" не позволяя ему бесконтрольно творить всё что угодно, но возникает риск того, что программа по каким-то признакам определит, что она выполняется в песочнице, и, зная об этом, либо прикидывается лапочкой, либо находит дырку и вылезает за пределы песочницы.

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

Scondo

  • Ветеран
  • ****
  • Сообщений: 321
  • +35/-4
    • Просмотр профиля
Не будет. Статистический анализатор проверяющий соответствие спецификации, по-сути, должен только уметь проверить код на соответствие спецификации, но создавать этот код он уметь не обязан.
Анализатор не обязан. Но если спецификация в машиночитаемом виде покрывает весь возможный диапазон входных и выходных значений, то она практически (не готов четко это доказать, но практика подсказывает, что да) становится декларативным языком программирования, для которого возможно написать среду, создающую код.

Например, если в спецификации написано, что функция sort должна принять массив и вернуть его в отсортированном виде (то есть, в спецификации написано что-то типа "для любых m и n, лежащих между 0 и N-1 включительно, должно выполняться: m<n => A[m]<=A[n]"), а в функции sort находится реализация quicksort, то статистический анализатор может взять и построить математическое доказательство того, что массив будет отсортирован. Но вот придумать алгоритм quicksort -- это немного другая задача.
Хотя бы потому, что условие скорее ближе к сортировке выбором  :)

Для быстрой сортировки надо было бы написать что-то вроде "для любого h=A[n], все y=A[m] меньше h, если m<n и больше либо равны h, если m>n".
Цитировать
quickSort (h : t) = quickSort [y | y <- t, y < h] ++ [h] ++ quickSort [y | y <- t, y >= h]


Усложняет, потому что код может иметь произвольное количество side-эффектов. Мы вызвали функцию sort, а она помимо сортировки отформатировала нам диск. Как отследить подобное? По возвращаемому значению не удастся, придётся анализировать код или отслеживать выполнение.
Стандартна функция sort диск не отформатирует, а собственно машинному анализу всё равно как она называется sort или killallhumans.

Для честной обфускации side-эффекты должны ограничиваться областью работы функции и не влиять на её результат и среду исполнения.
Для поведенческого анализа на "зловредность"/"уязвимость" side-эффектов не бывает. Если программа форматирует диск - значит мы проверяем разрешено ли программе форматировать диск. На этом статический анализ заканчивается.
Дальше, конечно, можно неким полумагическим образом угадать а говорила ли программа пользователю что она собирается форматировать диск. Но это проще решается в духе sudo/UAC изоляцией опасного функционала для узкого круга доверенных программ. Вопрос же допуска в этот круг хотя и можно пытаться автоматизировать, на практике не столь часто встаёт.
« Последнее редактирование: 03 Июля 2017, 16:44 от Scondo »

Gradient

  • Пользователь
  • **
  • Сообщений: 89
  • +31/-0
    • Просмотр профиля
На ИИ более-менее похожи системы класса SIEM - QRadar, Positive Technologies SIEM, Arcsight.
Это системы читают логи на компах и обнаруживают, когда что-то пошло не так. Основаны эти системы в основном на наборах явных правил. Типа "если на узле стоит гипервизор, повысить его значимость на 1", "если на узле неправильно настроен фаервол, повысить его уязвимость на 1", "если уязвимость узла выше 3 и значимость выше 2, то выкинуть на экран сообщение об опасности". Теоретически можно было бы сделать, чтобы система каким-то образом сама составляла наборы правил - например, получала информацию о новых способах атак и постоянно пыталась их проводить, и записывала, в каком месте атака прошла успешно.
На мой взгляд, подобное реализовать сложно. Сложно получить достаточное количество обратной связи, и не навредить себе.

Ещё есть Web Application Firewall-ы и Intrusion Detection System-ы. У этих из ИИ-элементов есть составление сигнатуры "правильной" активности юзера. Вася Пупкин каждый день работает с 9 до 18, и пользуется Гуглом? Значит, если он зайдёт в 4 утра, система сообщит об угрозе. Или если будет искать инфу в Яндексе.

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