Библиотечное коварство

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

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

Саму библиотеку тоже надо развивать. Автор статьи может рассказать об этом на примере личного опыта. Первоначальный энтузиазм сменяется раздражением на пользователей с их странными запросами, времени и сил не всегда хватает (разработка, как правило, не оплачивается), а дальше возможны варианты. Всем памятен HeartBleed — «уязвимость масштаба всего интернета» 2014 года, когда принятый патч в OpenSSL содержал ошибку, позволившую (по крайней мере, теоретически) осуществить доступ к секретным ключам миллионов сайтов. Тогда всё кончилось хорошо — сообщество нашло деньги на развитие проекта, и сейчас OpenSSL в какой-то мере проект образцовый. Но не всегда после проблем наступает happy end.

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

Библиотека event-stream — часть хорошо известного фреймворка Node.js, удобного инструмента для разработки серверов. Автор event-stream, программист из Новой Зеландии Доминик Тарр (Dominic Tarr), получив в сентябре 2018 года предложение от анонимного разработчика под ником right9ctrl передать ему ответственность за развитие библиотеки, с радостью на него согласился, так как сам не чувствовал в себе сил на продолжение работы над ней. Дальше в event-stream была добавлена (а потом убрана) зависимость от ещё одной библиотеки, flatmap-stream, в которую, в свою очередь, внедрили специализированный вредоносный код. Код malware был целенаправленно запутан (обфусцирован), что делало практически невозможным его чтение, и не выгружался на GitHub. Этот зловред уже специализировался на краже криптовалюты из Bitcoin-кошельков Copai. Уязвимы оказываются все версии этого кошелька, созданные между 25 октября и 26 ноября 2018 года, и, по некоторым оценкам, около 200 проектов, представляющих собой клоны этого кошелька. Сама по себе заражённая библиотека скачивалась, по данным исследователей, до 2 миллионов раз в неделю, что довольно много, даже если учесть, что существенная часть скачиваний, скорее всего, делалась для тестирования. Справедливости ради надо отметить, что информация о прямом материальном ущербе в публикациях не встречается.

Зловред был обнаружен почти случайно. При обновлении версии Node.js код malware утратил совместимость с новой версией, что привело к баг-репорту, тщательному исследованию кода, его исправлению и проклятиям в адрес всех задействованных в этой истории: и Тарру, и right9ctrl, и, разумеется, автору malware — пользователю под ником hugeglass. Более подробное изложение событий и объяснение механизма работы зловреда можно найти в этой статье Криса Нортвуда (Chris Northwood). До сих пор неясно, кто скрывается за никами right9ctrl и hugeglass, и в каком отношении они делят ответственность за распространение зловреда.

Что можно противопоставить новому социальному вектору атак? Нортвуд перечисляет различные способы организации разработки (подпись кода, воспроизводимые сборки и т.д.) и приходит к выводу, что это не гарантирует спасения от социальных техник, используемых для этой атаки. Сам Тарр тоже написал об этом на GitHub. Он видит два выхода: мейнтейнеры должны получать доход со своей деятельности, а в случае добавления зависимости от внешней библиотеки желательно принимать участие в развитии этой самой библиотеки. Понятно, что доход может не сводиться к прямой оплате труда, а второй вариант может оказаться неосуществимым, но это в некоторой степени (потому что пропустить патч с ошибкой могут в любую open-source программу) уменьшает вероятность неприятных последствий.

Социальные атаки на популярное ПО — не новость для индустрии. Мы уже несколько раз писали про то, как злоумышленники выкупают набравшие популярность браузерные дополнения, внедряя в них злонамеренный код. Впрочем, захват библиотеки таким способом, пожалуй, встречается на нашей памяти впервые.

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


Автор:  Дмитрий Белявский (ТЦИ)

Возврат к списку