Слабое звено в криптоцепочке

7 декабря 2018

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

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

Copay представляет собой мультиплатформенный криптокошелек для биткойнов и Bitcoin Cash, позволяющий создавать общие кошельки. Copay написан на JavaScript и полагается на множество сторонних библиотек.

Одна из этих библиотек — модуль event-stream. Репозиторий модуля на портале GitHub был долгое время заброшен — разработчик потерял интерес к проекту и уже несколько лет ничего не обновлял. Поэтому когда другой разработчик, новичок на GitHub, попросил у автора права администратора, чтобы оживить репозиторий, тот поделился доступом.

Новый разработчик сразу же взялся за дело. Вначале библиотека event stream начала использовать модуль flatmap-stream, репозиторием которого на GitHub заправлял этот же человек. Потом модуль flatmap-stream был изменен — как позднее выяснилось, разработчик добавил в него вредоносный код. Спустя три дня после обновления в репозиторий была загружена очередная версия flatmap-stream, но уже без вредоносной начинки — вероятно, так злоумышленник попытался замести следы.

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

Возможно, разработчики Copay просто не хотели тратить время на отслеживание изменений в сторонних библиотеках. Сейчас обновление библиотек вполне можно доверить автоматизированным инструментам — менеджерам пакетов, таким как npm. Благодаря ему разработчик может обновить все сторонние модули проекта, выполнив всего одну команду.

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

Как сообщает CCN, модифицированная библиотека flatmap-stream передавала злоумышленнику закрытые ключи (аналог паролей для криптокошельков) из приложений, использовавших одновременно библиотеки event-stream и copay-dash. Такая комбинация наводит на мысль, что это была целенаправленная атака на BitPay, разработчиков Copay и авторов библиотеки copay-dash. Утечка ключей происходила, только если приложение задействовало обе библиотеки, то есть являлось продуктом на основе кода Copay.

Согласно данным ArsTechnica, вредоносный код позволял злоумышленнику получать несанкционированный доступ к кошелькам пользователей и переводить оттуда средства. Брешь обнаружил и обнародовал один из пользователей GitHub. Но к этому моменту по сети уже разошлось несколько версий Copay с вредоносным кодом. Компания BitPay в конечном счете признала факт компрометации и порекомендовала пользователям версий от 5.0.2 до 5.1.0 перейти на версию 5.2.0. Сколько пострадало пользователей и сколько денег они потеряли, пока неизвестно.

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

Самое интересное, что кошелек Copay тоже является ПО с открытым кодом, которое активно используют разработчики других криптокошельков. Так что вполне вероятно, что проблема еще более серьезна.

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

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

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