The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Выпуск пакетного менеджера NPM 7.1. Очередные вредоносные пакеты в репозитории NPM

05.12.2020 10:52

Опубликован выпуск пакетного менеджера NPM 7.1, входящего в поставку Node.js и применяемого для распространения модулей на языке JavaScript. Репозиторий NPM обслуживает более 1.3 млн пакетов, которыми пользуются около 12 млн разработчиков. В месяц фиксируется около 75 миллиардов загрузок. Для установки NPM 7.1, не дожидаясь новой версии Node.js, можно выполнить команду "npm i -g npm@7".

В NPM 7.1 предложено два новшества:

  • Добавлена команда "npm set-script" для упрощения управления скриптами в package.json.
  • При выполнении команды "npm exec" без дополнительных аргументов обеспечен вызов интерактивной командной оболочки, позволяющей запускать установленные исполняемые файлы по аналогии с тем, как из package.json запускаются скрипты при выполнении команды "npm run".

Дополнительно можно отметить выявление в репозитории NPM очередных вредоносных пакетов: db-json.js и jdb.js. Пакет jdb.js, который успели загрузить около 100 раз, включал запускаемый после установки скрипт, пытающийся загрузить и запустить на платформе Windows файл patch.exe, осуществляющий установку троянской программы njRAT/Bladabindi для организации удалённого доступа к системе. Пакет db-json.js напрямую не включал вредоносный код, но использовал jdb.js в качестве зависимости для активации вредоносного кода.

В опубликованном несколько дней назад отчёте компании GitHub приведена статистика, полученная на основе разбора 521 уязвимости в проектах, охватывающих шесть экосистем (NPM, RubyGems, Composer, PyPI, NuGET и Maven). Обнаружено, что 17% уязвимостей связаны с вредоносной активностью, т.е. являются злонамеренно добавленными бэкдорами. Доля уязвимостей, вызванных ошибками при программировании, составила 83%. Интересно, что почти все из злонамеренных уязвимостей присутствовали в пакетах из репозитория NPM (вероятно столь большой процент вредоносных уязвимостей связан с тем, что отчёты проекта NPM формируются по мере поступления уведомлений о проблемах - уведомления о выявлении вредоносных пакетов отправляются исследователями достаточно активно, а информацию об обычных уязвимостях администрации NPM присылают только в единичных случаях, решая проблемы на уровне разработчиков пакетов).

  1. Главная ссылка к новости (https://blog.npmjs.org/post/63...)
  2. OpenNews: В репозитории NPM выявлен вредоносный пакет discord.dll
  3. OpenNews: В репозитории NPM выявлен вредоносный пакет twilio-npm
  4. OpenNews: Из репозитория NPM удалены четыре пакета с бэкдорами
  5. OpenNews: Доступен пакетный менеджер NPM 7.0
  6. OpenNews: GitHub успешно завершил сделку по покупке NPM
Лицензия: CC-BY
Тип: Программы
Короткая ссылка: https://opennet.ru/54198-npm
Ключевые слова: npm
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение (61) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Иваня (?), 11:23, 05/12/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Haha classic, интересно, когда же начнут бороться с вредоносными пакетами в NPM, проверять их какимнить антивирусом🤔
     
     
  • 2.2, Тест (?), 11:25, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +16 +/
    Интересно, когда же перестанут бездумно подключать пакеты фронтендщики?🤔
     
     
  • 3.6, Аноним (6), 11:35, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +7 +/
    Эти пакеты, скорее всего, никто и не подключал. 100 скачиваний - это разнообразные роботы, которые скачивают все заливаемые тарболлы автоматически
     
  • 3.28, Галустян (?), 14:46, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Когда изучат администрирование своей операционной системы. Но тогда они перестанут быть фронтэндщиками.
     
     
  • 4.30, Антоон (?), 15:05, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Зачем? Это оплачивается лучше?
     
     
  • 5.31, Michael Shigorin (ok), 15:27, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +2 +/
    По этой логике в наркодилеры идти самое то.  Или органами барыжить.

    Вот только... в деньгах ли смысл жизни?  Это цель или средства?

     
     
  • 6.34, пох. (?), 15:50, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    > По этой логике в наркодилеры идти самое то.

    Эх... чего ж в дилеры... в производители. Но ты бы знал, какой тогда был конкурс в Губкина :-(
    Вот и остается только работа по специальности - кюветы в принципе, норм входят на стоечные полки, лампочки можно прям сразу специальные брать, те что для внутристоечного освещения вполне годятся.
    С климатом в приличном ДЦ можно особо не мудрить, влажность внутри стойки сама поднимется.
    Но разьве ж этим заработаешь... так, на хлеб с пивасом :-(

    > Вот только... в деньгах ли смысл жизни?  Это цель или средства?

    Пока не заработаешь или украдешь - цель. Как образуются - средства.

     
  • 6.55, Аноним (55), 18:32, 06/12/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Возможно выскажу непопулярное мнение, но вы, знаете ли, недалеки от истины. Потому что если не ваш начальник, то начальник начальника вашего начальника... В общем, вы так или иначе на этих людей работаете, но они ещё и имеют наглость вам недоплачивать и делать много других абсолютно недопустимых вещей. Так что им должна быть составлена конкуренция. Другое дело, что это мероприятие рисковое. А покупатели на этот товар всегда будут, как они существуют и на любой другой. Проблема в том, что наше общество инфантильно и живёт бредовыми мечтами о идеальных философских системах, скатываясь при этом и из-за этого в том числе в феодализм. Пишу из загнивающей Америки про загнивающий капитализм если что, доллар вот вот рухнет, госдолг ужасен.
     
     
  • 7.56, Аноним (56), 19:02, 06/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    > Пишу из загнивающей Америки

    Так США же флагман перестройки. Ну и феодализма, чего уж )

     
  • 7.58, _hide_ (ok), 12:58, 07/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    >>> Пишу из загнивающей Америки про загнивающий капитализм если что, доллар вот вот рухнет, госдолг ужасен.

    Да не переживайте Вы так. Долларов в США намного меньше, чем в других странах и пострадают от кризиса США куда как меньше. Более того, внутри США можно будет легко провести операцию "деноминация" или "свой доллар", в любом случае граждане это страны потеряют часть сбережений, но не уровень доходов и жизни.
    Поэтому проблемы с долларом начнутся не скоро -- власть имущие очень заинтересованы в сохранении этой финансовой пирамиды как можно дольше (и никого не волнует, что в будущем это означает конец цивилизации: после нас хоть потоп).
    А пока так будет, считать деньги при найме специалистов будут "особенным способом" и ставильщики из NPM-а будут в тренде.

     
  • 6.62, Аноним (62), 10:41, 08/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Нарко и т.п. барыжничество некорректно сравненивать, т.к. опасность для жизни в разы выше.
     
  • 4.47, Аноним (47), 22:41, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    а кем же они тогда будут?
     
  • 2.4, Lex (??), 11:31, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >> В месяц фиксируется около 75 миллиардов загрузок
    >> jdb.js, который успели загрузить около 100 раз
    > Haha classic, интересно, когда же начнут бороться с вредоносными пакетами в NPM

    Haha classic, интересно, когда же ноны начнут сопоставлять порядки величин

    п.с: вредоносные пакеты, кстати, вполне неплохо подчищаются

     
     
  • 3.20, Аноним (20), 12:49, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • –2 +/
    То что нашли не означает что больше вредоносов не осталось, а ты походу из этих из жабаскриптеров.
     
     
  • 4.60, Lex (??), 13:28, 07/12/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > То что нашли не означает что больше вредоносов не осталось, а ты
    > походу из этих из жабаскриптеров.

    Я из тех в т.ч жабаскриптеров( точнее, реакт-нативеров, у которых пакетный менеджер - тоже npm или yarn, но обычно используют последний, поскольку тот несравненно быстрее и менее косячный ), которые ни разу не сталкивались с говнопакетами на npm даже просто потому, что, прежде чем что-то качать, смотрю на описание пакета, статистику, динамику его развития и проч( и именно вредоносных пакетов среди отклоненных очень мало. Скорее всего, речь о пакете, который разрабы устали поддерживать или он потерял актуальность, потому тянуть его в проект не стОит ).

    Кроме шуток, 1*10^2 / ( 7,5 * 10^10 ) * 100% = 1/7,5 * 10^-6 % = 0,133 МИЛЛИОННЫХ ПРОЦЕНТА( т.е примерно на уровне одного процента от одного процента от одного процента )
    Есть смутное подозрение, что среди не_нпм разрабов доля туполобых, качающих любые васяновские пакеты, модули и копипастязих соотв куски кода как минимум не меньше.

     
  • 2.8, Аноним (8), 11:43, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    https://youtube.com/watch?v=J7irfxq2YBM
     
  • 2.16, Dzen Python (ok), 12:40, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • –1 +/
    https://www.youtube.com/watch?v=Jairxwhq4a0

    Базарю, если поставить это в NPM все вредоносные пакеты будут дезинтегрироваться еще на стадии их написания

     
  • 2.43, Аноним (43), 20:23, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >интересно, когда же начнут бороться с вредоносными пакетами в NPM

    Бороться (давить в пелёнках сразу) надо с разработчиками, и пакетов, и NPM.
    Но поздно, теперь поможет только "личная гигиена" и бойкот NPM-щиков.

     

  • 1.3, Аноним (3), 11:29, 05/12/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Почему только у npm так плохо, а у других нет
     
     
  • 2.7, Аноним (7), 11:37, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +5 +/
    На самом деле у всех открытых пакетных менеджеров так плохо, просто аудитория npm, видимо, наименее технически грамотна, чтобы своевременно обнаруживать "внедрёж", чем и пользуются.
     
  • 2.9, Аноним (6), 11:45, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Везде всё одинаково. Просто npm по объёму больше, чем Maven, Packagist, PyPI, nuget, Rubygems и CPAN вместе взятые
     
  • 2.10, OpenEcho (?), 11:46, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Где рыба лучше клюет, там ее и ловят.
    Там контингент по большей части из непуганных, или до 25 или "we moving fast, we breaking things..."
     
  • 2.17, Dzen Python (ok), 12:43, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Аудитория в тысячи раз больше, чем в PyPi
    Аудитория использует пакеты для веба, а не для чилодробилок, как в CRAN
    Аудитория неграмотная и тянет в рот все, что увидит, даже отдаленно похожее, а не как в СРАN, где уже все ученые патчем Брамина
     
     
  • 3.32, Michael Shigorin (ok), 15:29, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    > патчем Брамина

    Гм, патч Бармина знаю, а это чё за индус такой?

     
     
  • 4.37, Аноним (37), 17:12, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Это корова такая, трёхголовая. "Патч" - заплатка.
     
  • 4.57, Аноним (56), 19:06, 06/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Ракетчик?
     
  • 2.25, лолшто (?), 14:35, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Все что выше уже написали и скудная стандартная библиотека. Даже работа с датами и временем без сторонней библиотеки - это какая-то бессмысленная возня. А захочешь свое решение написать, то на этапе тестирования все равно что-то стороннее придется привлечь, потому что в коробке этого нет.
     
     
  • 3.41, Аноним (47), 20:12, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Работа с датой и временем в js по сложности примерно такая же как в java 7.
     
  • 2.36, Аноним (37), 17:09, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    У других тоже есть. Просто все охотятся за низковисящими фруктами.

    1. В npm огромные DAGи зависимостей, поэтому проверить конкретный пакет, нужный уже месяц назад, там труднее и дольше, поэтому никто и не будет.
    2. Ситуацию осложняет javascript, где доступ к свойствам идёт через [], что позволяет запрятать evalы от статических анализаторов. В питоне, например, getattr - большой красный флаг.
    3. а значит если твоя цель - найти сколько-то бэкдоров, то искать будешь в npmе, забив на остальные языки и менеджеры.

     
  • 2.48, Аноним (47), 23:40, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    кажется у maven нету preinsall, postinstall секций выполняющих что угодно с правами пользователя от которого запущен.
     
  • 2.50, Ordu (ok), 07:31, 06/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    > Почему только у npm так плохо, а у других нет

    Сложно сказать, на данный момент. У каждого свои предположения, о том, что в npm не так, и поэтому есть разные подходы к одолению этого. Сравнивать результативность практически невозможно, в силу различной популярности проектов. Единственное что нам остаётся -- это верить в то, что базар окажется сильнее злоумышленников, и он найдёт способ существовать несмотря на них. Если это не так, то значит восторги Эрика Раймонда в отношении базара потеряли актуальность, базар не в состоянии масштбироваться, и единственный разумный выбор для нас -- пересеть на соборный оффтопик. Или лучше сразу на эпол: там няшный M1.

     

  • 1.5, user90 (?), 11:33, 05/12/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Выпуск вредоносного пакетного менеджера)
     
     
  • 2.33, Michael Shigorin (ok), 15:29, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Логичней уж тогда "менеджера вредоносных пакетов". :)
     
     
  • 3.35, пох. (?), 15:51, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +3 +/
    В принципе, название новости уже неплохо продвинулось в этом направлении.

     

  • 1.11, Аноним (3), 11:46, 05/12/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Yarn запрещает запуск скриптов во время установки
     
  • 1.12, Аноним (12), 12:19, 05/12/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    как защититься от этого?
     
     
  • 2.14, leibniz (ok), 12:33, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +3 +/
    не писать на джабаскрипте
     
  • 2.15, Аноним (15), 12:39, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +5 +/
    не тянуть каждую какашку в рот
     
     
  • 3.19, Аноним (47), 12:48, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    от left-pad зависил даже react и babel. Ты не будешь тянуть, кака притянется по зависимостям
     
     
  • 4.22, Аноним (15), 13:26, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    только конченные могут использовать эту платформу
     
  • 4.49, Lex (??), 23:44, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Так лефтпад оказался вирусом или проблема была в возможности разработчиком удалить собственный  пакет из репозитория когда ему вздумается, что приводит к временной неработоспособности зависимых от него пакетов( для проектов на стадии разработки, ведь у релизных тот код уже собран в кучу ) ?)
     
  • 3.21, Аноним (47), 12:52, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    >Есть пакет под названием isArray, который скачивают 880 000 раз в день, 18 млн скачиваний в феврале 2016 года. У него 72 зависимых NPM-пакета. И вот его целая 1 строчка кода:
    >return toString.call(arr) == '[object Array]';
    >Есть пакет под названием is-positive-integer (GitHub), который состоит из 4 строчек и которому на вчерашний день требовалось 3 других пакета для работы. Автор с тех пор провёл рефакторинг, так что теперь у пакета 0 зависимостей, но я не могу понять, почему это не было сделано сразу.
    >Свежая установка Babel включает 41 000 файлов

    кроме как не использовать npm вариантов нет

     
     
  • 4.23, Аноним (15), 13:28, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Ты какую-то чёрную непонятную магию рассказываешь... Кто ею пользуется? Миллион мух?!
     
     
  • 5.27, Аноним (37), 14:45, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    У мягкостулых Стуло-Actions используют node.js.
     
  • 5.42, Аноним (47), 20:21, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Кем ей? Все кто пишет фронтэнд пользуются npm потом что вариантов нет.
    Я тоже и пользуюсь. И left-pad пользуюсь так как он в зависимостях у старого react и babel, а чтобы обновить придется треть когда фронтэнд переписать.
     
  • 5.44, Аноним (47), 20:34, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    собственно к пустому react проекту тоже устанавлияется однострочник isarray
    yarn why isarray
    => Found "isarray@1.0.0"
    info Reasons this module exists
       - "readable-stream" depends on it
       - Hoisted from "readable-stream#isarray"
       - Hoisted from "react-scripts#eslint-plugin-import#doctrine#isarray"
       - Hoisted from "react-scripts#webpack#node-libs-browser#buffer#isarray"
       - Hoisted from "braces#snapdragon#base#cache-base#unset-value#has-value#isobject#isarray"
     
  • 2.18, Аноним (20), 12:47, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +5 +/
    Не использовать npm и не использовать внешние пакеты. Писать все самому.
     
     
  • 3.24, Аноним (15), 13:28, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Причём будет быстрее и безопасней.
     
  • 3.26, Аноним (7), 14:43, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Самое интересное, что в _долгосрочной_ перспективе выйдет гораздо лучше что в плане надёжности, что в плане эффективности, что в плане скорости разработки, чем ляпать на колене из фрикаделек из говна.
     
     
  • 4.45, Аноним (47), 20:40, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Налепить квадратноколесых велосипедов в которых невозможно разобраться никому (и даже тому кто их лепил)
    Несомненно это будет гораздо надежнее, выстрее, дешевле
    Особенно когда придет другой разработчик с будет пытаться понять как этот громадный кусок ..овнокода работает и почему.
     
     
  • 5.52, пох. (?), 13:17, 06/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    То ли дело скачать половину интернета в зависимости, не забыв ни про leftpad, ни про isArray.
    Это-то каждому ж васяну сразу ясно-понятно как работает, и почему.

    > Особенно когда придет другой разработчик с будет пытаться понять как этот громадный кусок

    хороший способ отсева полуграмотных на испытательном сроке.

     
     
  • 6.53, Аноним (47), 16:54, 06/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    как работает left-pad и isArray действительно понятно каждому васяну. Там же всего несколько строчек
     
  • 2.29, YetAnotherOnanym (ok), 15:03, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > как защититься от этого?

    Приказом по организации ввести правило: если в резюме упомянута нода - HR немедленно и навечно вносит соискателя в чёрный список.

     
     
  • 3.40, Вы забыли заполнить поле Name (?), 19:52, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    - И, боже вас сохрани, не читайте до обеда советских газет.
    - Гм… Да ведь других нет.
    - Вот никаких и не читайте

    (с)

     
  • 2.39, Вы забыли заполнить поле Name (?), 19:50, 05/12/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    1. Строго указывать зависимости в package.json (без ^ или ~), см. опцию save-exact=true в .npmrc. 2. Коммитить package-lock.json.
    3. Следить за npm audit.
    4. Хотя бы немного поглядывать за тем, какие пакеты устанавливаются по зависимостям. Возможно проще реализовать нужную функциональность самостоятельно.
     

  • 1.13, Аноним (13), 12:30, 05/12/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +7 +/
    >>Опубликован выпуск пакетного менеджера NPM 7.1, входящего в поставку Node.js и применяемого для распространения вредоносных модулей на языке JavaScript.
     
  • 1.38, Вы забыли заполнить поле Name (?), 19:47, 05/12/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Пора обновить описание "npm - менеджер ВРЕДОНОСНЫХ пакетов".
     
  • 1.46, макаронофикус (?), 20:59, 05/12/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Что ж такое, во вредоносном репозитории опять выявлены пакеты. Сколько их там?
     
  • 1.51, Ordu (ok), 07:34, 06/12/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Тут должен быть ещё один коммент, форсящий мем "вредоносный репозиторий".

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

     
     
  • 2.54, Злюка (?), 17:33, 06/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Ой, да ладно, старался он.
    Выпуск вредоносного пакетного менеджера NPM 7.1
    ...применяемого для распространения модулей на вредоносном языке JavaScript.

    Node Packages Malware
    Node Polution Manager
    Node Programming Monkeys

    А вообще, пытался я пользоваться этим "пакетом для пакетов", хотел перейти эти смузи реку вброд, но нет - вернулся. Постоянные уязвимости, обновления, несовместимость версий, размер с ОС нулевых.
    Написал по старинке. Может и велосипед, но это просто велосипед: 2 колеса, руль и едет в нужном мне направлении.

     

  • 1.61, Аноним (61), 09:40, 08/12/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Deno бы решил проблему с пакетами вида "запускаемый во время\после установки" скрипт?
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Спонсоры:
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2021 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру