Перейти к содержимому

LavaMoat и атака на цепочку поставок программного обеспечения Ledger

Узнайте, как LavaMoat обеспечивает тройную защиту в цикле разработки ПО и как защитить своё приложение от атак уже сегодня.

6 мин чтения
LavaMoat и атака на цепочку поставок программного обеспечения Ledger

Что произошло?

14 декабря одна из программных библиотек Ledger — Ledger Connect Kit — стала жертвой атаки на цепочку поставок программного обеспечения.

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

Эта атака позволила опубликовать вредоносную версию указанной библиотеки. Библиотека подключается в режиме реального времени через сеть доставки контента (CDN) во многих веб-приложениях экосистемы Ethereum. В результате вредоносный код был внедрён в эти веб-приложения.

Как это предотвратить? LavaMoat.

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

LavaMoat обеспечивает защиту от атак на цепочку поставок на трёх этапах жизненного цикла разработки программного обеспечения: в момент установки зависимостей (когда вы подключаете все эти библиотеки), на этапе сборки (когда приложение подготавливается к публикации в интернете) и во время выполнения (когда собранное приложение работает).

LavaMoat уникален своей защитой во время выполнения. Существуют и другие инструменты, применяемые в процессе разработки, например snyk.io, который лишь предупреждает об известных уязвимостях, или socket.dev, обеспечивающий более комплексный анализ кода и не требующий ожидания, пока эксперты внесут данные в централизованную базу. Эти инструменты сканирования выполняют неоценимую роль, и мы рекомендуем использовать интеграцию socket.dev с GitHub.

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

Защита LavaMoat основана на принципе делегирования только явно указанных возможностей зависимостям вашего приложения.

Что это означает? Читайте дальше, а для более глубокого понимания того, как работает LavaMoat и как он применяется, посмотрите наш доклад на Devcon 6.

Введение в объектно-ориентированную модель возможностей

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

При делегировании возможности можно предоставить её ограниченную или урезанную версию. Это называется аттенюацией.

Эти три компонента составляют основу модели безопасности на основе объектных возможностей. Используя эту модель, можно понять, кто и что способен делать.

Безопасность веб-приложений

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

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

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

Детали атаки на Ledger

Библиотека @ledger/connect-kit-loader — это рекомендованный Ledger способ интеграции с их продуктами. Этот пакет представляет собой тонкую обёртку, загружающую последнюю версию их библиотеки с CDN.

Хотя это означает, что в вашем приложении всегда будет актуальная версия библиотеки, это также означает, что вы фактически передаёте контроль над своим веб-приложением библиотеке Ledger loader, которая, в свою очередь, передаёт его коду, размещённому на CDN.

Цепочку делегирования можно представить следующим образом:

Веб-приложение → **@ledger/connect-kit-loader** → jsDelivr CDN → npm → Ledger → бывший сотрудник Ledger → злоумышленник

Даже это является упрощением. Если рассмотреть один компонент подробнее, например jsDeliver CDN, можно обнаружить поразительное множество дополнительных сервисов, которые также являются частью цепочки поставок и потенциальными точками входа для проведения атаки.

Защита приложений с помощью модели безопасности на основе объектных возможностей

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

JavaScript при должной тщательности позволяет создавать Compartments — изолированные среды, ограничивающие доступ кода к ресурсам. Реализацию Compartments см. в проекте Hardened Javascript от Agoric.

Система безопасности цепочки поставок LavaMoat от MetaMask и система плагинов MetaMask Snaps построены на основе Compartments для обеспечения изоляции.

Смог бы LavaMoat предотвратить атаку на цепочку поставок Ledger?

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

В принципе, способ работы @ledgerhq/connect-kit-loader вынуждает разработчика приложения отказаться от многих устоявшихся лучших практик безопасности. Но не всё потеряно.

Лучший способ воспользоваться помощью LavaMoat (и других инструментов безопасности цепочки поставок) — использовать @ledgerhq/connect-kit напрямую, не передавая весь контроль загрузчику.

LavaMoat был разработан для нейтрализации атак, подобных взлому кошелька Copay, известному как «инцидент с event-stream», и хорошо справляется с такой защитой. Так как же LavaMoat справляется с этой иной атакой?

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

Кроме того, LavaMoat применяет только политику, заданную разработчиками. Если вы зададите небезопасную политику, LavaMoat не сможет вас защитить.

Рассмотрим, как приложение с LavaMoat могло бы быть защищено от этой атаки.

LavaMoat использует файл политики для определения того, какие возможности в виде глобальных API платформы должна получить зависимость. Для удобства вы можете поручить LavaMoat проанализировать пакет и автоматически определить, что ему, по всей видимости, необходимо для работы. Это называется статическим анализом.

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

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

Другой ответ: Нет. Если бы вы настроили LavaMoat так, чтобы разрешить **@ledgerhq/connect-kit-loader** работать в штатном режиме и внедрять тег script с произвольным кодом за пределами среды выполнения LavaMoat, атака всё равно была бы успешной. Это часть компромисса LavaMoat между обратной совместимостью и более безопасной системой. LavaMoat очень гибок, чтобы обеспечить максимальную совместимость, — вы можете добавить его в своё приложение без полного переписывания с нуля. Ответственность за установку разумных политик и выбор разумных зависимостей по-прежнему лежит на разработчике приложения. LavaMoat позволяет избирательно предоставлять глобальные API браузера, однако некоторые глобальные API просто содержат слишком много возможностей, чтобы безопасно передавать их стороннему пакету. Мы исследуем несколько различных способов дополнительного ограничения этих возможностей, однако создать решение, которое просто работает для пакетов, не прилагающих никаких усилий для ограничения своего контроля, — непростая задача.

Одна из функций LavaMoat, называемая Scuttling, будет препятствовать работе как вредоносного, так и оригинального пакета, загружаемого через @ledgerhq/connect-kit-loader. Scuttling лишает код, выполняющийся за пределами песочницы LavaMoat, доступа к возможностям. Это не позволит вам с самого начала использовать небезопасный @ledgerhq/connect-kit-loader и подтолкнёт вас к непосредственному использованию @ledgerhq/connect-kit и, следовательно, к самостоятельному управлению процессом его обновления, гарантируя полный контроль над кодом, выполняемым в вашем приложении.

Хотя LavaMoat не является универсальным решением, он даёт вам контроль и прозрачность там, где иначе у вас не было бы ни того, ни другого. LavaMoat должен быть лишь одним из инструментов в вашей стратегии безопасности.

Вот что вы можете сделать прямо сейчас, чтобы защититься от атаки завтра:

Переведено ИИ. Может содержать ошибки. Пожалуйста, всегда проверяйте информацию.

Оцените перевод

Автор статьи: