The OpenNET Project / Index page

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

Уязвимость в NPM-пакете JsonWebToken, насчитывающем 10 млн загрузок в неделю

11.01.2023 13:35

В JavaScript-библиотеке JsonWebToken с реализацией технологии JSON Web Token (JWT) выявлена уязвимость (CVE-2022-23529), потенциально позволяющая добиться удалённого выполнения кода при передаче в функцию jwt.verify() специально оформленного параметра secretOrPublicKey при верификации JWT-запроса (примеров приложений, на которые может быть совершена атака не приведено). За последнюю неделю библиотека была загружена из каталога NPM более 10 млн раз. В качестве зависимости JsonWebToken задействован в более чем 22 тысячах пакетов, в которых используется для верификации и подписывания токенов JWT, применяемых для защищённой передачи информации в формате JSON. Уязвимость устранена в выпуске JsonWebToken 9.0.0.

Уязвимость вызвана ошибкой в реализации метода verify, который принимает три параметра (токен, secretOrPublicKey и набор опций), после чего проверяет корректность токена и возвращает декодированное содержимое. В соответствии со спецификацией параметр secretOrPublicKey может быть строкой или буфером, но в коде JsonWebToken это не учитывается и он всегда разбирается как строка с использованием метода toString().

Соответственно, если передать в secretOrPublicKey вместо строки JavaScript-объект с собственным методом toString(), то при проверке будет вызван указанный атакующим код.

Дополнение: Видимо, исправление было преждевременно и CVE-идентификатор будет помечен как отозванный, так как для атаки недостаточно передачи определённого JSON-содержимого и требуется, чтобы функции был передан готовый объект, чего нереалистично добиться без изменения кода приложения.

  1. Главная ссылка к новости (https://unit42.paloaltonetwork...)
  2. OpenNews: Уязвимость, позволявшая выпустить обновление для любого пакета в репозитории NPM
  3. OpenNews: Уязвимость в NPM, приводящая к перезаписи файлов в системе
  4. OpenNews: Уязвимость в репозитории NPM, позволяющая добавить сопровождающего без подтверждения
  5. OpenNews: Уязвимость в NPM-пакете pac-resolver, насчитывающем 3 млн загрузок в неделю
  6. OpenNews: Уязвимость в NPM-пакете node-netmask, применяемом в 270 тысячах проектов
Лицензия: CC-BY
Тип: Проблемы безопасности
Короткая ссылка: https://opennet.ru/58462-npm
Ключевые слова: npm, javascript
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (54) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (1), 13:52, 11/01/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • –6 +/
    > более 10 млн раз

    Откуда такие цифры? В интернете реально столько много сайтов, что какая-то левая либа загружается милионы раз?

     
     
  • 2.2, Аноним (2), 13:55, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +10 +/
    Первый день в интернете? Или гуманитарий? Или  млао витаминов ел? Тебе бы поработать над собой с тобой явно что-то не так.

    Заходишь на https://www.npmjs.com/package/jsonwebtoken графа Weekly downloads.

     
     
  • 3.10, Деанон (?), 14:16, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Гуманитарии это фронтенд-верстальщики, не осилившие бэкенд.
     
     
  • 4.14, Аноним (14), 14:32, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    node.js это бэкэнд.
    JavaScript универсальный язык.
     
     
  • 5.28, Деанон (?), 15:44, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    так я и говорю, что не осилили и сделали nodeJS
     
  • 2.9, Деанон (?), 14:15, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Это же вебмакаки. Там нельзя без обновлений и передёргиваний npm install и т.п. Каждая муха тянет за собой всю паутину в node_modules.
     
  • 2.31, Вы забыли заполнить поле Name (?), 15:52, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Роботы грузят
     
  • 2.41, rshadow (ok), 17:10, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Например если не заморачиваться, и не подымать локальный реп. А просто при сборке в CI всегда качать пакеты заново. Все проекты поставившие его в зависимости будут на каждый чих программиста заново все собирать и качать.
     
  • 2.55, . (?), 21:00, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Откуда такие цифры?

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

     

  • 1.4, Аноним (2), 13:58, 11/01/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    И тут как вы уже догадались никакой бы безопасный язык не помог. Зачем тогда ломать голову синтаксисом р**** когда можно на нём же словить точно такую же уязвимость? Но потратить в 10 раз больше времени на написание.
     
     
  • 2.58, амоним (?), 21:59, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +/
    ну вроде, чтобы в расте передать хренпоймичто, вместо чего-то другого все же надо поприседать
     

  • 1.5, Аноним (5), 14:05, 11/01/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    >в NPM-пакете

    Ничего интересного, расходимся.

     
  • 1.6, Аноним (6), 14:06, 11/01/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +5 +/
    чушь какая-то, как этот объект сформировать-то удаленно? https://github.com/github/advisory-database/pull/1595
     
  • 1.7, Аноним (7), 14:10, 11/01/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > JavaScript
    > В соответствии со спецификацией <...>, но в коде <...> это не учитывается

    Никогда такого не было и опять то же самое!

     
  • 1.8, Весельчак У (?), 14:14, 11/01/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Если ты передаёшь с клиента объект и никак его не проверяешь, то это сама по себе уязвимость.
     
     
  • 2.11, Деанон (?), 14:18, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Хуже когда ты тянешь с гитхаба/npm импорт, а за ним еще 20 импортов, половину из которых просто какой-то левый чувак для поиграться наваял не глядя за 5 минут.
     
     
  • 3.20, Аноним (20), 15:07, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Хуже когда он, не не глядя наваял за 5 минут. А специально несколько часов сидел и внедрял бекдор.
     
     
  • 4.59, амоним (?), 22:00, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +/
    иногда даже много дней
     

  • 1.12, Аноним (12), 14:27, 11/01/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    > в коде JsonWebToken это не учитывается и он всегда разбирается как строка с использованием метода toString()

    Как раз-таки учитывается, именно поэтому и приводится явно к строке, потому как и строка, и буфер имеют метод toString().

    В оригинальной реализации все сделано верно, это клиент библиотеки должен подсовывать ему аргумент правильного типа. И нет, библиотека не должна делать instanceof Buffer, поскольку:

    1) программировать следует на уровне интерфейса, а не на уровне реализации,
    2) instanceof Buffer не защитит от кастомных методов toString (Object.assign(new Buffer(), { toString: () => 'PWNED' }))

    Вердикт: новость насквозь желтая.

     
     
  • 2.16, Аноним (14), 14:42, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    >1) программировать следует на уровне интерфейса, а не на уровне реализации,

    нету же статической типизации в js

    хотя конечно я не знаю как нужно, как лучше js библиотеки проектировать
    "Warning: When the token comes from an untrusted source (e.g. user input or external requests), the returned decoded payload should be treated like any other user input; please make sure to sanitize and only work with properties that are expected

    token is the JsonWebToken string
    "

     
  • 2.17, Аноним (14), 14:47, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    "secretOrPublicKey is a string (utf-8 encoded), buffer, or KeyObject containing either the secret for HMAC algorithms, or the PEM encoded public key for RSA and ECDSA."

    у них в документации указано что может быть не только строка.

     
  • 2.18, Аноним (20), 15:04, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • –4 +/
    Книжку какую-нибудь умную почитай. «Не должна», совсем вебмакаки обленились. Начини с Роберта Мартина «Чистая Архитектура» заодно «Чистый код» и больше чушь не пиши. Никто у них ничего не должен, капец.
     
     
  • 3.23, Аноним (14), 15:13, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Но как чистая архитектура относится к библиотеке для работы с тренерами?
    Она же про разделение приложения на слои и просторение приложения независимым от фреймворков.
    Вы точно эту умную книгу читали или только название?
     
     
  • 4.25, Аноним (14), 15:16, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    С токенами
     
  • 3.24, Аноним (12), 15:14, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Ты эти свои книжки-то хоть сам открывал? В особенности те места, где настоятельно рекомендуется зависеть не от реализации, а от интерфейсов? Для проверки типов аргументов уже есть тайпскрипт, причем для сабжа тайпскриптовые определения имеются. Или ты предлагаешь их еще вдобавок проверять в рантайме?
     
     
  • 4.32, Вы забыли заполнить поле Name (?), 15:57, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Ну нодежс проверяет аргументы своего апи в рантайме, хотя тайпскрипт декларации тоже есть.
     
  • 4.34, Аноним (34), 16:06, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +/
    в документации явно указано что функция может Buffer принять.
    И в определениях typescript скорее всего
     
  • 4.42, Бывалый смузихлёб (?), 17:33, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Толку от тайпскриптовой “типизации“, если некорректные типы данных могут передаваться в рантайме ?
     

  • 1.19, Омномним (?), 15:06, 11/01/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    В жабоскрипте сейчас реально можно в таком виде объекты передать и они разберутся?

    [pacefalm]

     
     
  • 2.26, another_one (ok), 15:19, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Нет, нельзя. Новость можно удалять, т.к. RCE собираются пометить как "withdrawn" и отозвать.
     
     
  • 3.36, Омномним (?), 16:19, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +/
    А, ну то есть ещё до такого не докатились, и то ладно.
     

  • 1.21, Аноним (21), 15:09, 11/01/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    >если передать в secretOrPublicKey вместо строки JavaScript-объект с собственным методом toString(), то при проверке будет вызван указанный атакующим код.
    >JsonWebTokens
    >JSON

    Ну пойди, передай, через JSON. notabug, wontfix.

     
  • 1.22, another_one (ok), 15:13, 11/01/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > вместо строки JavaScript-объект с собственным методом toString()

    И откуда объект возьмется на бэкенде то? JSON не передает функции. Это не уязвимость, а какая-то хрень.

     
  • 1.27, Аноним (27), 15:42, 11/01/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Эта новость - фейк.
    По сети невозможно передать объект с методом.
    Никакого RCE тут нет, как и уязвимости.

    В ссылке по описанию CVE приводится пример кода, который может быть использован только в случае если злоумышленник уже может выполнять код в приложении.


    OpenNet постит чушь и непроверенную информацию. Уже неоднократно написали, что данный CVE - был шуткой, чтобы показать как СМИ и базы CVE не проверяют сути заявленных уязвимостей.

     
     
  • 2.56, Аноним (56), 21:02, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +/
    CVE присвоен и исправление авторами пакета выпущено. Какая же это шутка.
     
  • 2.57, Аноним (56), 21:09, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +/
    https://nvd.nist.gov/vuln/detail/CVE-2022-23529  Base Score:  9.8 CRITICAL

    Уведомление о наличии уязвимости от разработчиков jsonwebtoken: https://github.com/auth0/node-jsonwebtoken/security/advisories/GHSA-27h2-hvpr-

     
     
  • 3.61, another_one (ok), 10:06, 12/01/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Этот фейк уже вышел за пределы гитхаба. Возможно, после такого скандала перестанут создавать CVE без проверки на реальный эксплоит.

    https://mobile.twitter.com/testanull/status/1612794234314317824

     

  • 1.33, Вы забыли заполнить поле Name (?), 16:03, 11/01/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Шаблон для новостей Джаваскрипта:

    RCE-уязвимость в NPM-пакете ______, насчитывающем ___ млн загрузок в неделю

    p.s. Рекомендуется указывать большие значения для кол-ва загрузок, от 10 млн и выше

     
     
  • 2.37, Аноним (37), 16:21, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Милый комментарий на фоне того, что очередная уязвимость оказалась фейком (вслед за отозванными фейками c lodash и hogan). Но иксперт не вникал в текст, иксперт бежал быстрее писать коммент!
     
  • 2.38, Аноним (34), 16:23, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Шаблон комментария для опеннет эксперта:

    Веб-макаки, растоманы, смузихлебы, формошлепы нашлепали очередную ненужную поделку.

    p.s. Рекомендуется указывать больше матов, так как модераторы экспертные мнения не удаляют.

     
     
  • 3.44, Деанон (?), 17:59, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Хотя бы эксперта, а не просто вебмакаки и непричастных к расту домоседов, называющих сишечкой
     
  • 3.45, Деанон (?), 18:03, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Так оно же истина. Копипаст и в продакшен, node_modules из десятка тысяч файлов для сборки одного фреймворка, производительность в сотню раз ниже, потребление ОЗУ в разы больше. Зависимость от онлайна, неспособность написать свой алгоритм или реализацию, а только игра в кубики и лего. Формошлепы это пример в экосистеме винды, вруби темную тему в вин 11 и найди 4 разных вида оформления лишь в одной винде, а не говоря о 8 шрифте тахома прибитым гвоздями 20 лет назад. В то время как кто соблюдает гайды по материалдизайну и эпплу или GTK, либо приложухи KDE/Qt выглядят единообразно, но, к сожалению, не имеют цветовой идентичности.
     
  • 3.47, Деанон (?), 18:09, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Для работы чата достаточно было 75КБ ELF-приложения на ARMv6 и GPRS 5КБ/с, а не LTE со сливом телефонной книги, списка приложений и идентификаторов сетевых устройств с IMEI. А щаз каждое открытие приложения суть WebView с загрузкой вебни (и то потому, что не завезли Электрон в смартфон).
     
     
  • 4.49, Аноним (49), 18:36, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +/
    75кб? Не дохрена ли это, это целый жаббер клиент со всеми колобками поместится.
     
  • 4.52, Аноним (34), 19:54, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Тогда напишите, в чем проблема? Покажите веб-ма..ам формош...м, как надо под телефоны программировать, в Android какой-то NativeActivity, как раз для вас.
    >Для работы чата достаточно было 75КБ

    в 75кб в лучше случае иконку для ланчера уместите. Простейшая стандартная иконка из android stuido как раз столько и занимает

     

  • 1.39, Аноним (39), 16:30, 11/01/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Это просто лол.

    Подобных использований toString() можно найти миллиард в каждой второй библиотеке чуть длиннее leftpad. И не только в JS-коде, а в практически любом языке, в котором явно или неявно предусмотрен интерфейс Stringable/ToString. Вот даже на вашем любимом Rust:

    impl ToString for MyCoolStruct {
       fn to_string(&self) -> String {
           Command::new("rm").arg("-rf").arg("/").execute();
           return "Hello";
       }
    }

    О боже, можно написать код и его скомпилировать, и он выполнится!

    RCE, не иначе.

     
     
  • 2.48, Вы забыли заполнить поле Name (?), 18:09, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Из всех языков мира макак выбрал раст для примера. Случайность? Не думаю.
     
     
  • 3.50, Аноним (50), 18:43, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Конечно, не случайность, я же на опеннете!
     

  • 1.40, ip1982 (ok), 16:40, 11/01/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    Вы только посмотрите, как они оформляют комиты https://github.com/auth0/node-jsonwebtoken/commit/e1fa9dcc12054a8681db4e6373da
     
     
  • 2.43, Бывалый смузихлёб (?), 17:36, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Ну это всё-таки мердж
     
  • 2.46, Вы забыли заполнить поле Name (?), 18:08, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Если речь про сообщение коммита, то он автоматически сформирован git'ом. Попробуй сделать git merge --squash from_branch
     
     
  • 3.51, ip1982 (ok), 19:19, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Да плевать как такое происходит. Главное — результат, а он ужасен.


    П. С. И CHANGELOG нельзя изменять вместе с полезными изменениями. Нахрен им гит вообще?

     
  • 3.54, Аноним (14), 20:32, 11/01/2023 [^] [^^] [^^^] [ответить]  
  • +/
    git же название коммита спрашивает при merge. И в интерфейсе gitlab можно вписать осмысленное название.
     
     
  • 4.60, Вы забыли заполнить поле Name (?), 00:38, 12/01/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > git же название коммита спрашивает при merge.

    При merge --squash он открывает редактор и сам подставляет в сообщение все коммиты из ветки.

    > И в интерфейсе gitlab можно вписать осмысленное название.

    Ну видимо они не парятся с этим.

     

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



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

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