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

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

Что-то есть желание, чтобы любой блоб в исходниках обозначался бэкдором сразу без расследования, и на этапе компиляции в задницу выпиливался. Особенно касается всего интерпретируемого вроде javascript'a.
Это не решит проблему, можно спрятать в тексте, картинке, звуке, видео, можно выкачивать со стороннего ресурса кучей способов, вплоть до назначения операционной системе такой задачи. Защитит только непосредственный анализ нового кода, чем вряд ли займутся все в open source.
В таком случае, как минимум, помимо блоб необходимо и eval считать бэкдором.
Вообще да, так как у eval исполняемый код заранее неизвестен и неподконтролен — скачали ли его, в ресурсах спрятали или ещё где, и кто поручится, чтО именно ему подается на вход. Не зря же в процессорах появилась поддержка NX/XD битов на память, чтобы разделять, где у процесса данные, а где код. Вот только сколько всего завязано на этот eval — нет данных, может, слишком много, чтобы можно было так огульно его объявить вредным.
С приходом WebAssembly ситуация еще усугубится. Байткода в npm-модулях станет только больше.
Но не в исходниках же. В исходниках будет проверяемый код без блобов, только на другом языке.

Значит я неправильно понял предыдущий коммент. Мне показалось, что там речь о пакетах с npm.


Если это про исходники, то есть вот такое интересное предложение привязать npm-пакеты к их исходникам на Github. То есть сделать ситуацию, когда на гитхабе одно, а в npm другое, было невозможно технически.

Так в сам гитхаб бэкдор и зальют. Где спасение?)

Там он будет хотя бы виден, а не как тут: на гитхабе исходники нормальные, а в npm-пакете троянец сидит.
Если Карр не хочет поддерживать либу, то пусть так и скажет, может пакет возьмут на поддержку или энтузиасты или компании, но раздавать права майнтейнера налево и направо — это не вариант от слова совсем.
Так он так и сказал, пришел «энтузиаст» и начал «поддерживать». Как отличить хорошего энтузиаста от плохого?

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


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

Так "линтер" встраивались бэкдор в код, который потом работал с кошельком.

А где-то есть основания считать, что старый и новый аккаунт использовали два разных человека?

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

Так принято в современном обществе говорить… (
Так принято говорить только у совсем бесчестных людей.
Когда-то нечто подоброе должно было произойти.
Разрабы тащат себе в рот всякую бяку, а потом вот это :)

Вопрос — что делать-то?

Как защититься от «левого» энтузазиста, или прикинувшегося таковым изначального злодея — никто ведь не запрещает влиться в проект и честно его поддерживать, годика эдак два, а потом тихо и мирно вписать в какое-нибудь плохо просматриваемое место «тестовые» данные.
Насколько защищены в этом плане критичные и популярные вещи вроде дистрибов того же Дебиана / Минта / your_fav_ linux'a?

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

Попросил бы немного развить мысль: в каком production-ready языке эти возможности, на ваш взгляд, хорошо реализованы?

НЛО прилетело и опубликовало эту надпись здесь
Вопрос, насколько его производительность позволяет ему быть production-ready, оставлю специалистам, ясно.
НЛО прилетело и опубликовало эту надпись здесь
Дык, специалисты отвечали на этот вопрос. Уже минимум лет пять (судя по дате публикации) с производительностью и production-readiness у хаскеля всё в порядке:
Программы на Haskell быстрее python, php, ruby (и других интерпретируемых языков). Быстрее Erlang/Java (и других vm-based языков). Обычно медленнее Си, хотя я видел несколько случаев, когда компилятор Haskell выдал результат, превосходящий сишный. Для любых практических применений производительности Haskell — за глаза и за уши.
Благодарю. Я, как человек, не крутящийся в этих кругах, подобное свидетельство искал бы явно в разы дольше, чем Вы.
А что делать с библиотеками, которые живут в IO-монаде?
НЛО прилетело и опубликовало эту надпись здесь
Злоумышленник @right9ctrl не просто добавил бэкдор, но и постарался замести следы. Через три дня он удалил вредоносный код из репозитория flatmap-stream, обновил номер версии

Здесь нужна важная поправка. Злоумышленность пользователя @right9ctrl пока еще не доказана. Да, он добавил новую зависимость вот в этом коммите, но тот модуль опубликован от другого аккаунта: https://github.com/hugeglass/flatmap-stream


Возможно, за аккаунтами стоит один и тот же человек, а может и нет, a @right9ctrl просто добавил новую функциональность, запрошенную пользователями и по неопытности не проверил тот модуль.

Учитывая, что он не стал как-либо объясняться/оправдываться и удалил свой аккаунт, всё же больше похоже на злонамеренное действие.
Бред, зачем передавать права ментейнера? Если не хочешь поддерживать проект дальше то просто перестаешь это делать. Любой может сделать форк и выкладывать туда свои наработки
Как правило когда приходится выбирать из 500 форков некогда живой либы, проще сменить либу на ту которая поддерживается оригинальным автором.
Наверное легко найти все возможные бэкдоры, просто просканировав файлы, на предмет require('crypto') и т.п.

На самом деле нет, потому что в данном случае конструкция require('crypto') выглядела как r(e(n[2])). Код был достаточно хорошо спрятан, его, может быть, и не нашли бы, если бы он не вызывал deprecated API, о чем был warning в консоль: https://github.com/remy/nodemon/issues/1442

обновляйте свои бэкдоры! ;)

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


Тогда это спровоцировало большое обсуждение и поиск способов защиты. В частности, в npm добавилась команда audit, которая предупреждает о модулях с уязвимостями, двухфакторная авторизация, а в репозитории теперь есть кнопка для репорта об уязвимом модуле, чтобы его оперативно удалили.


Ну и наконец, ждем стабильного релиза deno, принципиальной переделки node, с возможностью запретить делать запросы в сеть любому модулю.

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

У js есть одна особенность: Вебпак, поэтому вряд ли можно отключить функции запуска процессов, манипуляций правами и всякого такого, нодовские фреймворки стали слишком от этого зависимы (и это кстати тоже проблема). Но разрабы могли бы сделать аналог open_basedir для песочницы, в которой крутятся нодовские процессы. Это сняло бы сразу часть проблем. И в идеале бы, чтобы в этой песочнице запускались и все дочерние процессы. Вряд ли найдётся много кодеров, которые заморачиваются настройкой изолированных сред для запуска самой среды разработки и нодовских процессов, так было бы невозможно работать, нужно решение из коробки как в пхп

Ну, это не первый проблем с npm, вообще то. подробно


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


К тому же, если какая нибудь организация (Node.js Foundation) решила делать общественное хранилище библиотек – так контролируйте что в нем находится!

Ну, для начала, это не Node.js foundation, а npm, Inc. Они и следят — как могут. Не будут же они ревьювить каждую строчку кода, которую залил очередной ноунейм.
зависимость от странных незнакомых людей по крайней мере неразумно

Ой, ну удалите пжалуйста все ОС со всех устройств — их тоже писали странные незнакомые люди. Пускай каждый пишет себе свою ОС. Вот и наступит рай на земле…
Ну, для начала, это не Node.js foundation, а npm, Inc. Они и следят — как могут. Не будут же они ревьювить каждую строчку кода, которую залил очередной ноунейм.

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


Кстати, мне совершенно не интересен npm, node.js и всякие извращенцы. Плохое только то, что некие недоумки криворукие делают глупостей, а ярлык вешают не на npm.inc и не на недоумков, а на все свободное ПО. Вот что бесит больше всего!

"Не согласен — возражай. Возражаешь — предлагай". У Вас есть какие-нибудь более конкретные идеи, что в данном случае мог и должен был сделать npm, чтобы предотвратить проблему? А то, честно говоря, ощущение такое, что мы по большей части застряли на первом этапе: недовольства полно, а реальных альтернатив — не особо.

У меня предложения есть. Ведь, я тоже разработчик свободного ПО. Только карма немного осталась… Но с другой стороной – делай что надо и будь что будет. :D


Вся идея npm очевидно порочная. Автоматическое управление пакетов совершенно не решает ад зависимостей, только усугубляет его, потому что легче становится работать с очень глубокими графами зависимостей.


А надо научится уменьшать эту глубину. И ветки этого графа обязательно надо проходить через библиотеки которые контролируются правильно и большим сообществом. Тогда и риски понижаться значительно.


Вот у меня например зависимостей в текущем проекте от: 1. MUSL; 2. SQLite; 3. И все.

Да? А от чего зависит 1. MUSL; 2. SQLite?
Вы их зависимости имеете возможность контролировать?

Ну, SQLite зависит от MUSL, a MUSL от ничего не зависит. Как то так. :P


Так что да, имею возможность.

А по-моему, от «ничего» зависит любой пакет (и даже не-пакет).

Согласен. Тогда так: MUSL зависит только от ничего. И так как ничего с открытым кодом (пустой файл) то он тоже может быть проверен на уязвимости. :P

Опубликовал перевод поста с детальным разбором и техническими деталями этого инцидента: habr.com/post/431360
Зарегистрируйтесь на Хабре, чтобы оставить комментарий