реклама
Бургер менюБургер меню

Адам Кучарски – Законы эпидемий. Как развиваются и почему прекращаются эпидемии болезней, финансовые кризисы, вспышки насилия и модные тренды (страница 49)

18

Специалист по информационным системам Стив Уайт заметил, что то же самое происходит с другими компьютерными червями и вирусами. В 1998 году он отмечал, что такие программы часто остаются в сети. «Это загадка, – писал Уайт[505]. – Данные об инцидентах с вирусами свидетельствуют о том, что в каждый момент времени несколько систем в мире оказываются заражены». Тот факт, что вопреки мерам противодействия вирусы живут так долго, свидетельствует об их высокой заразности; но при этом обычно они заражают небольшое число компьютеров, а это значит, что распространяются они не очень хорошо.

В чем причина этого парадокса? Через пару месяцев после атаки «любовного вируса» Алессандро Веспиньяни и его коллега, физик Ромуальдо Пастор-Саторрас, наткнулись на статью Уайта. Складывалось впечатление, что компьютерные вирусы ведут себя не так, как биологические, и исследователи задумались: не связано ли это со структурой сети? Годом ранее их исследование показало, что разброс в популярности сайтов в мировой паутине очень велик: ссылки на одни сайты можно пересчитать по пальцам, а на другие ссылаются чрезвычайно часто[506].

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

В тех случаях, когда вспышки обусловлены суперраспространением, сам процесс передачи крайне нестабилен. Если инфекция не достигнет крупного узла, она вряд ли распространится слишком далеко. Однако суперраспространение также делает вспышку менее предсказуемой. Хотя распространяются далеко не все вспышки, те, которым это все же удается, могут заявлять о себе удивительно долго. Вот почему некоторые компьютерные вирусы и черви продолжают жить в сети, хотя сами по себе они не так уж и заразны. То же самое можно сказать о многих трендах в соцсетях. Возможно, вам доводилось наблюдать за распространением какого-нибудь странного мема и удивляться его живучести; причина может заключаться в особенностях сети, а не в качестве контента[508]. Благодаря структуре онлайн-сетей инфекции в интернете обретают возможности, недоступные биологическим инфекциям.

22 марта 2017 года веб-разработчики по всему миру заметили, что их приложения работают неправильно. Самые разные компании, использующие язык программирования JavaScript, от Facebook до Spotify, обнаружили, что часть их программного обеспечения не работает. Пользовательские интерфейсы давали сбои, картинки не загружались, обновления не устанавливались.

Что произошло? Выяснилось, что пропали одиннадцать строк компьютерного кода, о существовании которых многие люди даже не догадываются. Этот код был написан Азером Кочулу, веб-разработчиком из Окленда (Калифорния). Одиннадцать строк представляли собой программу на JavaScript под названием left-pad. Сама программа была несложной: она просто доводила строки до нужной длины, вставляя пробелы в начале. Большинство программистов способны написать ее с нуля за несколько минут[509].

Но большинство программистов не пишут все с нуля. Ради экономии времени они используют инструменты, разработанные другими и выложенные в свободный доступ. Многие ищут их на онлайн-ресурсе npm, где собраны полезные программные модули вроде left-pad. Иногда разработчики встраивают эти инструменты в новые программы, которые затем тоже выкладывают в открытый доступ. Некоторые из таких программ, в свою очередь, встраиваются в следующие, и в результате образуется цепочка, в которой каждый новый продукт поддерживается предыдущим. Когда кто-то устанавливает или обновляет программу, ему также нужно загрузить всю предшествующую цепочку – в противном случае появится сообщение об ошибке. За месяц до исчезновения злосчастный left-pad был загружен более двух миллионов раз.

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

Программа Кочулу – это лишь один пример компьютерного кода, который распространяется гораздо шире, чем мы можем предположить. Вскоре после инцидента с left-pad программист Дэвид Хейни обратил внимание, что еще один инструмент из npm – состоящий всего из одной строчки кода – стал критически важной частью семидесяти двух других программ. Он назвал еще ряд программ, которые в значительной степени зависели от простых фрагментов кода. «Я поражен тем фактом, что разработчики делают свой код зависимым от заимствованных функций длиной в одну строку, которые они должны уметь писать с закрытыми глазами», – недоумевал он[510]. Заимствованные фрагменты кода зачастую распространяются дальше, чем можно ожидать. Когда исследователи из Корнеллского университета проанализировали статьи, написанные с помощью LaTeX, популярного набора расширений для верстки научных текстов, они обнаружили, что ученые часто используют коды коллег. Некоторые файлы распространялись по профессиональным сетям более двадцати лет[511].

По мере распространения код может изменяться. После того как в конце сентября 2016 года трое студентов опубликовали код Mirai, в интернете появились десятки его вариантов, лишь незначительно отличавшихся от исходного. Внесение в код таких изменений, чтобы он стал инструментом масштабной атаки, было лишь вопросом времени. В начале октября, за несколько месяцев до инцидента с Dyn, специалисты по кибербезопасности из компании RSA обратили внимание на необычное объявление в даркнете: группа хакеров предлагала атаку мощностью 125 гигабит в секунду. За 75 тысяч долларов можно было купить доступ к бот-сети из 100 тысяч узлов, которая, как утверждалось, работала на основе модифицированного кода Mirai[512]. Но это был не первый случай изменения Mirai. За несколько недель до опубликования кода создатели программы внесли в нее более двадцати корректировок – вероятно, чтобы повысить заразность бот-сети. Одни вставки затрудняли обнаружение червя, другие блокировали прочие вредоносные программы, конкурирующие за доступ к уязвимым компьютерам. Став общедоступным, код Mirai продолжал изменяться на протяжении нескольких лет; новые варианты появлялись даже в 2019 году[513].

Когда Фред Коэн в 1984 году впервые описывал компьютерные вирусы, он отмечал, что вредоносное ПО со временем может меняться, так что его будет все труднее обнаружить. Экосистема компьютерных вирусов и антивирусных программ не достигнет устойчивого равновесия – она будет постоянно развиваться. «В результате эволюции равновесие нарушается, и результат неясен во всех случаях, кроме самых простых, – говорит Коэн[514]. – Это что-то сродни биологической теории эволюции и, возможно, генетической теории болезней».

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

Один из самых ярких и досадных примеров этого процесса – эволюция вируса гриппа. Биолог Питер Медавар однажды назвал вирус гриппа «фрагментом нуклеиновой кислоты, окруженным плохими новостями»[516]. Две особенно плохие новости живут на поверхности вируса: это пара белков под названием гемагглютинин и нейраминидаза, сокращенно HA и NA. HA позволяет вирусу прикрепляться к клетке-хозяину, а NA помогает выпускать новые частицы вируса с поверхности зараженных клеток. Эти белки могут иметь разную форму, что и определяет различия между штаммами вируса гриппа: H1N1, H3N2, H5N1 и так далее.

Зимние эпидемии гриппа обычно вызываются штаммами H1N1 и H3N2. Вирусы постепенно эволюционируют, и при этом меняется форма белков. Поэтому наша иммунная система не воспринимает мутировавший вирус как угрозу. Мы ежегодно сталкиваемся с эпидемиями гриппа – и ежегодно проходим вакцинацию – именно потому, что наш организм играет с вирусом в эволюционные «кошки-мышки».