Как стать автором
Обновить

Комментарии 28

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

На фронте стоит использовать CSP и IFrame
На бэкэнде — изоляция контейнера от внешней среды и мониторинг странных запросов

Может и ещё что-то есть, знающие — подскажите.
Думайте перед тем как что-то ставить
npm install:



Думаю, если бы JS наконец обзавёлся тем, что в других языках называется «стандартной библиотекой», проблем бы немного убавилось.
Не понятно зачем на бекенде использовать минифицированную версию библиотеки? Это ведь не фронтенд, где стоит стремиться к уменьшению размера итогового бандла.

Иногда вместе с минификацией из кода вырезаются неиспользуемые части, например информация для отладки. В этом случае минимизированный код будет быстрее его обычной версии. Так делает, например, lodash. Вот тут есть объяснение от автора библиотеки


Но конкретно в этом случае – это было сделано, чтобы получше замести следы. Никто же не всматривается в минифицированный код?

Что мешает при импорте генерировать минифицированную версию?

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

Потому что в самом начале не подумали, а теперь уже поздновато…
А сейчас нельзя разве на уровне npm внести политику качества кода, чтобы публиковалась только полная версия. Далее роботом сканируется весь репозиторий, на все минифицированные приложения вешается плашка недоверенного кода. Через полгода блокируется скачивание таких приложений через менеджер, только отдельный просмотр. Разработчики или переписывают код, или пакет блокируется. Самому репозиторию плюс в безопасность. Кому нужна минификация, тот делает это у себя на этапе импорта/разворачивания.
А что делать с пользователями заблокированных библиотек, у которых сломается сборка?
Пинать владельца пакета, у него полгода было на осознание новых правил. Либо форкать и собирать самому. Делать примерно все тоже самое, когда меняется версия стандарта/платформы/фреймворка/браузера и перестаёт работать какой-то плагин. Не в первый и не в последний раз же.
Но в реальности большинство пользователей форкнут старый репозиторий. Потом какой-то из этих форков станет основным, и все будут им пользоваться. А npmjs — умрет.

Потому что безопасность безопасностью, а воспроизводимость старых билдов без серьезных причин нарушать нельзя.
Потому что если мой npm run dev начнет обфусцировать также 100500 зависимостей из node_modules, то хот-релоад начнет работать один раз в день.
Добросовестные разработчики и так добавляют необфусцированную версию своей библиотеки в отдельную папку в репозитории. Через npm подтягивается минифицированная версия, а если ты хочешь посмотреть, что там в библиотеке происходит — добро пожаловать на github, тут у тебя есть полная версия с человекопонятными названиями переменных, комментариями по jsdoc'у, в общем рай. Но это конечно идеальный случай
Добросовестные разработчики

Так новый разработчик таким и выглядел по началу )
А дальше положил в GitHub необфусцированную хорошую версию, а в минифицированную сборку — с закладкой. Ведь никто не делает контрольную минификацию и сверку для проверки закладок.


если мой npm run dev начнет обфусцировать также 100500 зависимостей из node_modules, то хот-релоад начнет работать один раз в день.

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

НЛО прилетело и опубликовало эту надпись здесь

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

Вы хотите сказать, что весь код своих зависимостей читаете? ;)

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


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

>Мне пока не попадались проекты, в которых хватало бы на это ресурсов.

Мне тоже. Я бы даже так сказал — если у вас внезапно хватило времени проанализировать чужой код полноценно — вы могли бы за сравнимое время написать свой.

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

Ведь в данном конкретном примере были задействованы всего лишь два компонента, а представим себе, что их десяток, и вредоносный код размазан по всем. И работает, если они все установлены. Когда анализируем код компонента отдельно, находим там вполне безобидные функции.

Что это у нас тут? Ага, сера. Селитра. Уголь. Вроде все по отдельности безопасны. И только когда их смешали — получился порох.

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

Возможно, но это не повод писать свой. Проблема велосипедов не в том, чтобы их написать достаточно хорошо, а в том, что после написания начинается процесс поддержки. Кроме того, автор чужого кода нередко обладает большей компетенцией в данной области, у его варианта уже сложилось коммьюнити, которое репортит ему и помогает заточить решение под реальные use cases — в общем, ввязываться в поддержку своего варианта по причине "я такое могу сам написать не хуже" — дурная идея. Исключение — ситуации, когда поддержки явно не потребуется.


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

>Возможно, но это не повод писать свой.

Да нет, конечно не повод. Это просто оценка времени и констатация того факта, то нормальный аудит очень дорог, и при этом не надежен.
НЛО прилетело и опубликовало эту надпись здесь
Это, конечно, плохо. Воровство. Но придумано круто, тонкая работа.
Все кто пользуется средой для разработки PlatformIO, будьте осторожны. Она тащит за собой модуль flatmap-stream. Антивирус «Лаборатории Касперского» вчера эту штуку детектировать научился.
Как это может быть возможно, если модуль был удален из NPM насовсем?
Он остался в локальных кешах всех кому не повезло хоть раз установить его ранее.
Ставил PlatformIO давно, не обновлял и не пользовался некоторое время. Вчера антивирус детектировал модуль flatmap-stream. Возможно, надо обновить или переустановить PlatformIO.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории