Rating@Mail.ru

Поиск уязвимостей

Поиск уязвимостей
технологии
Технологии
533 публикаций
15 Декабря 2017
Чем отличается работа исследователя от работы программиста в компьютерных науках, какие математические методы применяются при поиске уязвимостей в программном обеспечении и как развивалась криптография

Уязвимость — это ошибка в программе, которая отличается от других ошибок тем, что она позволяет тому, кто ее нашел, сделать что-то полезное для себя и, возможно, не очень полезное для программы или ее владельца. То есть через уязвимость можно вытаскивать данные. Допустим, если это уязвимость в каком-то серверном приложении, то можно попасть на логический терминал и вытаскивать оттуда данные. То есть это просто ошибка, у которой далеко идущие последствия. Ошибки есть практически в каждой программе. Есть подходы к тому, чтобы как-то организовать разработку, чтобы было мало ошибок или их было дорого найти. Но гарантий это не дает. Даже если правильно построить разработку и этим серьезно заниматься, все равно будут ошибки.

Гамильтон Уильям Роуэн, сформулировал классическую «задачу коммивояжера», в которой возникает комбинаторный взрыв.

Ошибки появляются потому, что невозможно все предусмотреть. В математике есть такой термин — комбинаторный взрыв. Так описывают состояние, когда из комбинации вроде бы небольшого числа всяких элементов получаются очень большие множества. Хороший пример комбинаторного взрыва — парадокс дней рождений, который звучит так: с какой вероятностью окажется, что у людей, сидящих в одной комнате, совпадают дни рождения? С точки зрения здравого смысла кажется, что это довольно большое количество. То есть должно довольно много людей набраться, чтобы совпали дни рождения. А на самом деле дни рождения уже могут совпадать с вероятностью одна вторая, когда людей всего двадцать три. Это из-за того, что считать нужно не людей, а пары, парные комбинации. А парных комбинаций из двадцати человек получается очень много.

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

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

Подходы к поиску уязвимостей

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

Дискета с исходным кодом червя Морриса — одного из первых сетевых червей.

 

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

 

«Раньше, чтобы массово проверить уязвимости где-то, нужно было фактически писать вирусы, которые распространяются по Сети, и это занимало много времени. Сейчас достаточно просто запустить быстрое сканирование, проверить свою гипотезу — и здесь счет идет на минуты или часы»

 

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

 

Ключевая проблема в кибербезопасности

 

Существует большой разрыв между пользовательским интерфейсом и тем, как устроены механизмы безопасности системы. Сейчас рядовой пользователь никак не может отследить, насколько защищенной является, например, его коммуникация в интернете. Самым ярким примером является Skype, который с точки зрения интерфейса и пользовательского опыта меняется гораздо меньше, чем на уровне низовых технологий. То есть сначала это была одна сеть, которая была распределенной и основывалась на базе технологий peer-to-peer. Потом эту сеть купил Microsoft, и сейчас Skype технологически ничего общего не имеет с тем изначальным продуктом, а контролировать такие изменения пользователь, конечно же, не в состоянии.

Изображение: Поиск уязвимостей — parallax 2 //

Шифрование данных

Никлас Зеннстрем и Янус Фриис, основатели компании Skype Technologies.

Все шифрование нацелено на то, чтобы перемешать данные так, чтобы они стали из человекочитаемых или машиночитаемых сообщений похожи на шум. Но сделать это таким способом, чтобы это было обратимо. Для этого используются ключи шифрования. Самый простой способ шифрования — логическое перемножение или сложение текста с ключом (например, бит 1+1=0, 1+0=1 и так далее). Если ключ секретный, то обратно восстановить эти данные можно только перемножением на этот ключ. То есть только тот, кто владеет ключом, может снова прочитать данные.

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

«Решить обратную задачу разложения на множители большого числа очень сложно»

Арьен Ленстра, голландский математик. В 1994 году его коллектив, используя 1600 компьютеров, подготовил за 220 дней систему линейных уравнений, содержавшую более полумиллиона неизвестных для разложения на множители 129-значного числа. Решение этой системы суперкомпьютером заняло два дня.

 

При этом ключ генерируется между пользовательским устройством и сервером. Есть алгоритмы, которые позволяют, не передавая секрет по Сети в открытом виде, сгенерировать его на двух сторонах синхронно. То есть чтобы и вы, и сервер получили какое-то одинаковое число, но никто из тех, кто между вами, не мог бы из тех данных, которыми вы обменивались, понять, что это за число, или быстро его посчитать. Часто для этого используется алгоритм Диффи — Хеллмана. После того как вы этот ключ получили, дальше идет шифрование этим ключом. Потом в какой-то момент алгоритм решает, что на этом ключе уже много зашифровано и надо его поменять, он снова пересогласовывается и так далее. Это может происходить раз в несколько минут. Так работают симметричные алгоритмы, после согласования ключа обеими сторонами каждый может этим ключом и зашифровать, и расшифровать данные.

 

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

 

Разработка криптостандартов

 

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

 

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

Шифр Цезаря //  Wikimedia Commons
Шифр Цезаря // Wikimedia Commons
Скитала - одно из древнейших криптографических устройств // historyofciphers.blogspot.ru
Скитала - одно из древнейших криптографических устройств // historyofciphers.blogspot.ru
Роторная шифровальная машина Энигма, разные модификации которой использовались немецкими войсками с конца 1920-х годов до конца Второй мировой войны // cutedrop.com.br
Роторная шифровальная машина Энигма, разные модификации которой использовались немецкими войсками с конца 1920-х годов до конца Второй мировой войны // cutedrop.com.br

Особенности сетевой архитектуры

Исторически сети организованы в слои. Есть физический уровень: кабели, беспроводная сеть. И сети развивались так, что уровни старались изолировать друг от друга. То есть мы как бы договариваемся, что интерфейсом физического уровня будет соединение определенного формата, определенный диапазон частот и способ кодирования данных в этом канале. И дальше идет канальный уровень, это уже железо: сетевая карта, либо Wi-Fi-адаптер, который умеет этим каналом пользоваться. Он изолируется от верхнележащего уровня. Когда компьютеры между собой общаются, по IP-адресам даже друг о друге знают, они не знают, чем они соединены — оптоволокном или Wi-Fi. Им все равно. И нет никакого способа эту информацию получить. 

P2P

peer-to-peer, пиринговая сеть, одноранговая сеть — компьютерная сеть, в которой все участники равноправны.

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

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

Программно-конфигурируемые сети — это попытка схлопнуть часть слоев и сделать так чтобы разработчик сетевого устройства мог, зная, что за приложение у него работает, более эффективно выстроить управление трафиком. Это работает хорошо, когда есть какой-нибудь большой дата-центр, где много серверов. Допустим, эти серверы гомогенные, то есть обслуживают одно приложение. Например, множество серверов обслуживает один Facebook. В этом случае действительно можно получить большой выигрыш и утилизировать то оборудование, которое у вас есть, почти на 100%. А при слоеной архитектуре на каждом уровне что-то теряется, это недостаточно эффективно. Поэтому программно-конфигурируемые сети пытаются распространять в основном в области центров обработки данных, где важно хорошо утилизировать ресурсы. Когда счет идет на десятки тысяч серверов, которые стоят у вас там под управлением, начинает большую роль играть энергопотребление. Если алгоритмы упростить, то можно снизить нагрузку на процессоры, а когда этих процессоров десятки тысяч, они меньше потребляют энергии, получается у вас большая экономия в деньгах. Так что это все про экономию. Экономия и повышение утилизации того оборудования, которое доступно.

image
Квантовый компьютер // barak-dayan-illustration //

Вызовы современной криптографии  

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

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

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

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

Денис Гамаюнов
Денис Гамаюнов
кандидат физико-математических наук, старший научный сотрудник, заведующий лабораторией безопасности информационных систем факультета вычислительной математики и кибернетики МГУ им. М. В. Ломоносова