В последнее время все технологические компании твердят о машинном обучении. Мол, столько задач оно решает, которые раньше только люди и могли решить. Но как конкретно оно работает, никто не рассказывает. А кто-то даже для красного словца машинное обучение называет искусственным интеллектом.
Как обычно, никакой магии тут нет, все одни технологии. А раз технологии, то несложно все это объяснить человеческим языком, чем мы сейчас и займемся. Задачу мы будем решать самую настоящую. И алгоритм будем описывать настоящий, подпадающий под определение машинного обучения. Сложность этого алгоритма игрушечная — а вот выводы он позволяет сделать самые настоящие.
Задача: отличить осмысленный текст от белиберды
Текст, который пишут настоящие люди, выглядит так:
Могу творить, могу и натворить!
У меня два недостатка: плохая память и что-то еще.
Никто не знает столько, сколько не знаю я.
Белиберда выглядит так:
ОРПорыав аоырОрпаыор ОрОРАыдцуцзущгкгеуб ыватьыивдцулвдлоадузцщ
Йцхяь длваополц ыадолцлопиолым бамдлотдламда.
Наша задача — разработать алгоритм машинного обучения, который бы отличал одно от другого. А поскольку мы говорим об этом применительно к антивирусной тематике, то будем называть осмысленный текст «чистым», а белиберду — «зловредной». Это не просто какой-то мысленный эксперимент, похожая задача на самом деле решается при анализе реальных файлов в реальном антивирусе.
Для человека задача кажется тривиальной, ведь сразу видно, где чистое, а где зловредное, но вот формализовать разницу или тем более объяснить ее компьютеру — уже сложнее. Мы используем машинное обучение: сначала дадим алгоритму примеры, он на них «обучится», а потом будет сам правильно отвечать, где что.
Алгоритм
Наш алгоритм будет считать, как часто в нормальном тексте одна конкретная буква следует за другой конкретной буквой. И так для каждой пары букв. Например, для первой чистой фразы — «Могу творить, могу и натворить!» — распределение получится такое:
ат — 1
во — 2
гу — 2
ит — 2
мо — 2
на — 1
ог — 2
ор — 2
ри — 2
тв — 2
ть — 2
Что получилось: за буквой «в» следует буква «о» — два раза, а за буквой «а» следует буква «т» — один раз. Для простоты мы не учитываем знаки препинания и пробелы.
На этом этапе мы понимаем, что для обучения нашей модели одной фразы мало: и сочетаний недостаточное количество, и разница между частотой появления разных сочетаний не так велика. Поэтому надо взять какой-то существенно больший объем данных. Например, давайте посчитаем, какие сочетания букв встречаются в первом томе «Войны и мира»:
то — 8411
ст — 6591
на — 6236
го — 5639
ал — 5637
ра — 5273
не — 5199
по — 5174
ен — 4211
оу — 31
мб — 2
тж — 1
Разумеется, это не вся таблица сочетаний, а лишь ее малая часть. Оказывается, вероятность встретить «то» в два раза выше, чем «ен». А чтобы за буквой «т» следовала «ж» — такое встречается лишь один раз, в слове «отжившим».
Отлично, «модель» русского языка у нас теперь есть, как же ее использовать? Чтобы определить, насколько вероятно исследуемая нами строка чистая или зловредная, посчитаем ее «правдоподобность». Мы будем брать каждую пару букв из этой строки, определять по «модели» ее частоту (по сути, реалистичность сочетания букв) и перемножать эти числа:
F(мо) * F(ог) * F(гу) * F(тв) * ... =
2131 * 2943 * 474 * 1344 * ... = правдоподобность
Также в финальном значении правдоподобности следует учесть количество символов в исследуемой строке — ведь чем она была длиннее, тем больше чисел мы перемножили. Поэтому из произведения извлечем корень нужной степени (длина строки минус один).
Использование модели
Теперь мы можем делать выводы: чем больше полученное число — тем правдоподобнее исследуемая строка ложится в нашу модель. Стало быть, тем больше вероятность, что ее писал человек, то есть она чистая.
Если же исследуемая строка содержит подозрительно большое количество крайне редких сочетаний букв (например, «ёё», «тж», «ъь» и так далее), то, скорее всего, она искусственная — зловредная.
Для строчек выше правдоподобность получилась следующая:
Могу творить, могу и натворить! — 1805 баллов
У меня два недостатка: плохая память и что-то еще. — 1535 баллов
Никто не знает столько, сколько не знаю я. — 2274 балла
ОРПорыав аоырОрпаыор ОрОРАыдцуцзущгкгеуб ыватьыивдцулвдлоадузцщ — 44 балла
Йцхяь длваополц ыадолцлопиолым бамдлотдламда — 149 баллов
Как видите, чистые строки правдоподобны на 1000–2000 баллов, а зловредные недотягивают и до 150. То есть все работает так, как задумано.
Чтобы не гадать, что такое «много», а что — «мало», лучше доверить определение порогового значения самой машине (пусть обучается). Для этого скормим ей некоторое количество чистых строк и посчитаем их правдоподобность, а потом скормим немного зловредных строк — и тоже посчитаем. И вычислим некоторое значение посередине, которое будет лучше всего отделять одни от других. В нашем случае получится что-то в районе 500.
В реальной жизни
Давайте осмыслим, что же у нас получилось.
1. Мы выделили признаки чистых строк, а именно пары символов.
В реальной жизни — при разработке настоящего антивируса — тоже выделяют признаки из файлов или других объектов. И это, кстати, самый важный шаг: от уровня экспертизы и опыта исследователей напрямую зависит качество выделяемых признаков. Понять, что же на самом деле важно, — это все еще задача человека. Например, кто сказал, что надо использовать пары символов, а не тройки? Такие гипотезы как раз и проверяют в антивирусной лаборатории. Отмечу, что у нас для отбора наилучших и взаимодополняющих признаков тоже используется машинное обучение.
2. На основании выделенных признаков мы построили математическую модель и обучили ее на примерах.
Само собой, в реальной жизни мы используем модели чуть посложнее. Сейчас наилучшие результаты показывает ансамбль решающих деревьев, построенный методом Gradient boosting, но стремление к совершенству не позволяет нам успокоиться.
3. На основе математической модели мы посчитали рейтинг «правдоподобности».
В реальной жизни мы обычно считаем противоположный рейтинг — рейтинг вредоносности. Разница, казалось бы, несущественная, но угадайте, насколько неправдоподобной для нашей математической модели покажется строка на другом языке или с другим алфавитом. Антивирус не имеет права допустить ложное срабатывание на целом классе файлов только по той причине, что «мы его не проходили».
Альтернатива машинному обучению
20 лет назад, когда вредоносов было мало, каждую «белиберду» можно было просто задетектить с помощью сигнатур — характерных отрывков. Для примеров выше «сигнатуры» могли бы быть такими:
ОРПорыав аоырОрпаыор ОрОРАыдцуцзущгкгеуб ыватьыивдцулвдлоадузцщ
Йцхяь длваополц ыадолцлопиолым бамдлотдламда
Антивирус сканирует файл, если встретил «зущгкгеу«, говорит: «Ну понятно, это белиберда номер 17». А если найдет «длотдламд» — то «белиберда номер 139».
15 лет назад, когда вредоносов стало много, преобладать стало «дженерик»-детектирование. Вирусный аналитик пишет правила, что для осмысленных строк характерно:
- Длина слов от 1 до 20 символов.
- Заглавные буквы очень редко встречаются посередине слова, цифры тоже.
- Гласные обычно более-менее равномерно перемежаются с согласными.
- И так далее. Если много критериев нарушено — детектируем эту строку как зловредную.
По существу, это примерно то же самое, только вместо математической модели в этом случае набор правил, которые аналитик должен вручную написать. Это хорошо работает, но требует времени.
И вот 10 лет назад, когда вредоносов стало ну просто очень много, начали робко внедряться алгоритмы машинного обучения. Поначалу по сложности они были сопоставимы с описанным нами простейшим примером, но мы активно нанимали специалистов и наращивали экспертизу. Как итог — у нас лучший уровень детектирования.
Сейчас без машинного обучения не работает ни один нормальный антивирус. Если оценивать вклад в защиту пользователей, то с методами на основе машинного обучения по статическим признакам могут посоперничать разве что методы на основе анализа поведения. Но только при анализе поведения тоже используется машинное обучение. В общем, без него уже никуда.
Недостатки
Преимущества понятны, но неужели это серебряная пуля, спросите вы. Не совсем. Этот метод хорошо справляется, если описанный выше алгоритм будет работать в облаке или в инфраструктуре, постоянно обучаясь на огромных количествах как чистых, так и вредоносных объектов.
Также очень хорошо, если за результатами обучения присматривает команда экспертов, вмешивающихся в тех случаях, когда без опытного человека не обойтись.
В этом случае недостатков действительно немного, а по большому счету только один — нужна эта дорогостоящая инфраструктура и не менее дорогостоящая команда специалистов.
Другое дело, когда кто-то пытается радикально сэкономить и использовать только математическую модель и только на стороне продукта, прямо у клиента. Тогда могут начаться трудности.
1. Ложные срабатывания.
Детектирование на базе машинного обучения — это всегда поиск баланса между уровнем детектирования и уровнем ложных срабатываний. И если нам захочется детектировать побольше, то ложные срабатывания будут. В случае машинного обучения они будут возникать в непредсказуемых и зачастую труднообъяснимых местах. Например, эта чистая строка — «Мцыри и Мкртчян» — распознается как неправдоподобная: 145 баллов в модели из нашего примера. Поэтому очень важно, чтобы антивирусная лаборатория имела обширную коллекцию чистых файлов для обучения и тестирования модели.
2. Обход модели.
Злоумышленник может разобрать такой продукт и посмотреть, как работает модель. Он человек и пока если не умнее, то хотя бы креативнее машины — поэтому он подстроится. Например, следующая строка считается чистой (1200 баллов), хотя ее первая половина явно вредоносная: «лоыралоыврачигшуралорыловарДобавляем в конец много осмысленного текста, чтобы обмануть машину». Какой бы умный алгоритм ни использовался, его всегда может обойти человек (достаточно умный). Поэтому антивирусная лаборатория обязана иметь продвинутую инфраструктуру для быстрой реакции на новые угрозы.
3. Обновление модели.
На примере описанного выше алгоритма мы упоминали, что модель, обученная на русских текстах, будет непригодна для анализа текстов с другим алфавитом. А вредоносные файлы, с учетом креативности злоумышленников (смотри предыдущий пункт), — это как будто постепенно эволюционирующий алфавит. Ландшафт угроз меняется довольно быстро. Мы за долгие годы исследований выработали оптимальный подход к постепенному обновлению модели прямо в антивирусных базах. Это позволяет дообучать и даже полностью переобучать модель «без отрыва от производства».
Заключение
Итак.
- Мы рассмотрели реальную задачу.
- Разработали реальный алгоритм машинного обучения для ее решения.
- Провели параллели с антивирусной индустрией.
- Рассмотрели с примерами достоинства и недостатки такого подхода.
Несмотря на огромную важность машинного обучения в сфере кибербезопасности, мы в «Лаборатории Касперского» понимаем, что лучшую в мире киберзащиту обеспечивает именно многоуровневый подход.
Все в антивирусе должно быть прекрасно — и поведенческий анализ, и облачная защита, и алгоритмы машинного обучения, и многое-многое другое. Но об этом «многом другом» — в следующий раз.