LavaMoat — это бесплатный инструмент с открытым исходным кодом для любой команды JavaScript-разработчиков, озабоченной безопасностью цепочки поставок. Это детище сооснователя MetaMask Кумависа одновременно решает проблемы безопасности в Web3 и давно существующие структурные уязвимости в экосистеме открытого исходного кода.
Если вы разрабатываете на JavaScript (сокращённо JS), вам необходимо понимать ситуацию с безопасностью этого языка и его зависимостями. JS-разработчики редко создают приложения «с нуля» — как правило, они импортируют в свой проект готовые фрагменты кода, которые принято называть «зависимостями», и используют их как строительные блоки. Это отлично подходит для совместной работы и ускорения разработки, но что если в одну из таких зависимостей внедрён вредоносный код?
Безопасность цепочки поставок программного обеспечения охватывает всё, что взаимодействует с приложением (например, зависимости) или участвует в его разработке (например, инструменты сборки или CI-системы). JavaScript — самый популярный язык среди разработчиков с большим отрывом, и при этом он крайне уязвим к атакам на цепочку поставок. Эта хронология уязвимостей с 2017 года наглядно показывает, что добрая половина атак исходит из npm — популярного источника пакетов с открытым исходным кодом для JS:
Источник: SonaType
JavaScript становится мишенью благодаря следующим характеристикам:
Популярность: он используется как на фронтенде, так и на бэкенде
Широкие полномочия: при запуске JavaScript в любой среде он получает доступ к множеству возможностей, например к сетевому доступу
Изменяемость: по умолчанию всё поддаётся модификации
Взлом кошелька Copay в 2018 году заинтересовал Кумависа этой проблемой и стал основным кейсом при проектировании LavaMoat. Copay — это некастодиальный биткоин-кошелёк от BitPay, ставший жертвой атаки на цепочку поставок, в результате которой были похищены средства пользователей. Злоумышленник получил контроль над npm-зависимостью, используемой кошельком, что и позволило ему осуществить атаку.
Так в чём же решение? Существует несколько подходов к устранению этой проблемы.
Полностью отказаться от зависимостей? Нет.
Пусть это и безопаснее, но готовы ли вы отказаться от открытого исходного кода — общего достояния, на котором строится всё, что мы создаём? От обмена знаниями и совместной работы? Если вы разрабатываете что-то сложное, неужели вы хотите тратить время на изобретение велосипеда?
Мы тоже нет.
Постоянно аудировать все зависимости? Тоже нет.
Идея хорошая, но сколько у вас зависимостей? Сотни? Тысячи? Десятки тысяч? Это нереалистично — хотя если вы всё же хотите провести ручной аудит, LavaMoat поможет вам расставить приоритеты и выявить наиболее опасные зависимости (подробнее об этом ниже).
И даже если у вас есть время тщательно изучить пакет, сможете ли вы обнаружить уязвимость безопасности?
Рискованная ставка. Поэтому давайте рассмотрим другое решение:
LavaMoat? Да.
Вместо того чтобы полностью отказываться от зависимостей или постоянно их аудировать, давайте разберёмся, как работает ядро безопасности LavaMoat: оно оборачивает пакеты в изолированные отсеки и предоставляет им доступ только к тому, что им действительно необходимо.
Ведь помните: чтобы вредоносный код мог атаковать вашу систему, ему нужно разрешение на это. Ядро LavaMoat анализирует сторонний код, который вы подключаете к своему проекту, определяет, что нужно зависимостям для работы, и предоставляет им только это**.**
В настоящее время LavaMoat защищает десятки миллионов пользователей MetaMask и задействуется на трёх этапах каждого процесса разработки: установка зависимостей, сборка и runtime.
Чтобы лучше понять масштаб, взгляните на эту панель визуализации графа зависимостей:
Список ваших зависимостей отображается слева, а граф представлен в виде нейронной сети справа. Цвета основаны на эвристической оценке опасности: например, зелёные зависимости не импортируют никаких мощных платформенных API.
Цель здесь — помочь вам расставить приоритеты при аудите зависимостей.
Как же это реализовать?
С учётом трёх фаз разработки:
Установка: @lavamoat/allow-scripts
Сборка: lavamoat-node
Runtime: плагин lavamoat-x для вашего бандлера
Всё это должно служить надёжным рвом против вредоносного кода.
Разработка программного обеспечения в масштабе
Если вы хотите помочь нам, LavaMoat — проект с открытым исходным кодом! Мы стремимся создать плагины для как можно большего числа бандлеров и хотим упростить проверку политик, а также добавить жёсткие ограничения при предоставлении пакетам сетевого доступа. Вы можете внести свой вклад здесь.
Подпишитесь на нашу рассылку для разработчиков, чтобы получать актуальные обновления! Удачной разработки.