The OpenNET Project / Index page

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

Уязвимость, позволяющая удалённо выполнить код на сервере PHP-репозитория Packagist

29.08.2018 22:37

В Packagist, крупнейшем репозитории пакетов на языке PHP, ежемесячно обслуживающем более 400 млн загрузок и по умолчанию применяемом в пакетной менеджере Composer, выявлена критическая уязвимость, позволяющая выполнить код на сервере проекта через передачу специально оформленных значений в форму добавления нового пакета.

Уязвимость вызвана отсутствием должной проверки передаваемых значений перед их обработкой в shell-скриптах. В частности, для выполнения произвольных shell-команд в текстовое поле с URL репозитория добавляемого проекта достаточно было ввести строку вида "$(код)". На стороне сервера данный URL передаётся в качестве аргумента при вызове команд git, p4, svn и hg. Для git и hg выполняется экранирование строки кавычками, но для p4 (Perforce) и svn (Subversion) строка передаётся как есть, например, при вводе "$(sleep 1)" будет запущена команда "svn info --non-interactive $(sleep 1)". Разработчики Packagist уже исправили проблему, добавив экранирование при помощи вызова ProcessExecutor::escape().

К сожалению, халатное отношение к безопасности присуще разработчикам многих современных репозиториев пакетов, что облегчает возможность компрометации подобных систем злоумышленниками. Например, выявивший проблему исследователь безопасности в прошлом году обнаружил похожую проблему в RubyGems, позволяющую выполнить код на сервере RubyGems.org при загрузке специально оформленного gem-пакета, а также продемонстрировал возможность запуска своего кода на некоторых зеркалах NPM и нашёл способ удаления произвольных файлов из репозитория PyPI. Исследователь также выявил уязвимость в часто применяемой с NPM сети доставки контента unpkg.com, которая позволяла записать любые данные на сервер и в том числе заменить содержимое отдаваемых пакетов, что давало возможность организовать запуск любого JavaScript-кода на сайтах, использующих unpkg.

  1. Главная ссылка к новости (https://justi.cz/security/2018...)
  2. OpenNews: Доступен Composer 1.0.0, менеджер зависимостей для PHP
  3. OpenNews: Применение тайпсквоттинга для распространения вредоносных модулей NPM, PyPI и Gems
  4. OpenNews: Более половины npm-пакетов могли быть скомпрометированы из-за ненадёжных паролей доступа
  5. OpenNews: Сбой антиспам-системы привёл к коллапсу в репозитории NPM
  6. OpenNews: Выявлена попытка включения бэкдора в популярный NPM-пакет mailparser
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/49198-packagist
Ключевые слова: packagist, php
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (34) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Китайский кулхацкер (?), 22:44, 29/08/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    Загадка: что общего у дешёвого китайского роутера и крупнейшего репозитория пакетов на языке PHP?
     
     
  • 2.2, Аноним (2), 23:07, 29/08/2018 [^] [^^] [^^^] [ответить]  
  • +14 +/
    Голая жопа торчащая в интернет
     

  • 1.4, anonymous (??), 00:26, 30/08/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    Ну вот, мироздание опять пришло в равновесие. А то непорядок, сайт на PHP был, а инъекции нет.
     
     
  • 2.5, anonymous (??), 00:29, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Разработчики Packagist уже исправили проблему, добавив экранирование при помощи вызова ProcessExecutor::escape().

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

     
     
  • 3.10, Аноним (10), 04:25, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • +2 +/
    То есть типичных рубистов и питонщиков мы игнорим, а пыхари-то козлы налажали..
    Про js даже говорить нет смысла, но козлы все равно пыхари..
    Не твоя вот и бесишся)
     
     
  • 4.11, Аноним (11), 06:09, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Как скажешь. Веб дерьмо и дерьмом останется. Все кто пишут для веба нелюди. Так лучше?
     
     
  • 5.43, Leah (?), 00:24, 31/08/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Согласно концепции web2.0 ты сейчас тоже пишешь "для веба". Нежнее надо быть, Анон!
    Хотя комментарии содержащие слово "все" можно удалять неглядя, ибо 98% их есть чушь.
     
  • 4.15, anonymous (??), 07:16, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • +/
    > То есть типичных рубистов и питонщиков мы игнорим, а пыхари-то козлы налажали..

    Питонщиков, слава богу, приучили не пользоваться system и передавать аргументы массивом в exec-like колы.

     
     
  • 5.20, пох (?), 08:20, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • +/
    да-да, фильтровать untrusted data не надо, за вас позаботится массив аргументов.

    (потом они удивляются, что ж это тот же hg такой "незащищенный", ну надо же - мы передали в параметре кучу мусора, а он, гад такой, его взял и проинтерпретировал - а то и дальше передал, опять же в шелл. А он ни разу и не рассчитывал на подобное.)

     
     
  • 6.24, anonymous (??), 08:32, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • +/
    > да-да, фильтровать untrusted data не надо, за вас позаботится массив аргументов.

    Я такого не говорил. И фильтровать надо, и передавать массивом. Безопасности много не бывает.

     

  • 1.7, Аноним (7), 01:51, 30/08/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    > Разработчики Packagist уже исправили проблему, добавив экранирование

    Фееричный фикс. Не удивлюсь, если они до сих пор не видят никаких проблем в самом использовании system()...

     
     
  • 2.8, Отражение луны (ok), 02:11, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • +/
    * в самом использовании php
     
     
  • 3.12, istepan (ok), 06:24, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • +2 +/
    А что с PHP не так?
    Мне правда интересно.
     
     
  • 4.13, пох (?), 07:02, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • +/
    мне не менее интересно, что не так с system(), если, конечно, не тянуть в параметры любой мусор, полученный из веба.

     
     
  • 5.14, anonymous (??), 07:13, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • –3 +/
    > мне не менее интересно, что не так с system()

    Вот ты лалка, а таким спецом выставлялся, прям гуру админства и проектирования сложных надежных систем. Для безопасного вызова внешних бинарников есть семейство функций exec*, которые позволяют не заботится об экранировании вообще и решить проблему принципиально.

     
     
  • 6.16, Агин (?), 07:26, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Да тут 99% такие и 99% не знают, как GNU расшифровывается.
     
     
  • 7.39, Тот_Самый_Анонимус (?), 18:19, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Зато вы, как узнали, сразу илитой себя ощутили, да?
     
  • 7.44, Leah (?), 00:31, 31/08/2018 [^] [^^] [^^^] [ответить]  
  • +/
    > как GNU расшифровывается.

    так оно у тебя ещё и зашифровано?!!

     
  • 6.21, пох (?), 08:24, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • +/
    > Для безопасного вызова внешних бинарников есть семейство функций exec*, которые позволяют не
    > заботится об экранировании вообще и решить проблему принципиально

    обалдеть.

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

    И нет, надо не экранировать, а фильтровать.

    P.S. до кучи, еще один такой же звоночек - использование sn/strn вместо s/str - в надежде что уж тут-то буфер точно не переполнится.

     
     
  • 7.25, anonymous (??), 08:38, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • +/
    > Это признание твоего неумения программировать, и перекладывание ее решения на других.

    Ребята из Drupal могут много рассказать про их надежную многоуровневую фильтрацию.

     
     
  • 8.33, пох (?), 10:39, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • +/
    в смысле У них ее отродясь как раз и не было - фильтруют где попало и когда поп... текст свёрнут, показать
     
  • 7.31, пох (?), 10:34, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • +/
    кстати, я тормоз - пишу про php, думаю про си.
    (впрочем, кажется, автор исходной фигни вообще не в теме)

    php'шный exec() ни разу не обертка вокруг системного, он не имеет отдельного массива аргументов, и от system отличается только тем, что system() возвращает stdout обратно в вызывающий php, если ты собираешься его разглядывать или юзеру вывести прямо в браузер. Exec аккуратно складывает его в массив или просто выбрасывает, если не подставить.

     
  • 5.29, Аноним (29), 10:28, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Например, накладные расходы, связанные с запуском внешней программы, которых можно было бы избежать, если для тех же целей подвязать сишную либу (которая, собственно говоря, и выполняет работу) и дёргать её внутри интерпретатора.
    Если честно, я хз, предусмотрено ли в php такое.
     
     
  • 6.32, пох (?), 10:36, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • +/
    > Если честно, я хз, предусмотрено ли в php такое.

    предусмотренно, конечно, только если тебе надо из пехепе запустить, как тут, svn или hg - ты будешь писать враппер для svnlib, а для hg, который на пихоне - изобретешь его с нуля заново? ;-)

     
     
  • 7.37, Аноним (37), 14:12, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • +/
    А почему бы и нет? Если на сайт заходят в день полтора анонимуса, можно и через system вызывать, а если нагрузка высокая, то на каждый запрос запускать процесс - это уже непозволительное расточительство, тут уже стОит озаботиться каким-то более эффективным способом.
     
  • 4.45, Аноним (45), 14:25, 31/08/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Можно было бы заморочится в систему типов, введя безопасные и небезопасные строки. Вот константа - безопасна, так как не подвержена инъекции. А вот $_GET опасен. Складываем безопасную с опасной - получаем опасную. При таком подходе инхекций не было бы, так как у говнокодеров сайт просто падал бы с ошибкой.

    Впрочем в пыхе и более простые вещи поломаны, о чём можно говорить?

     

  • 1.23, Аноним (23), 08:25, 30/08/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Хипсталюбители тянуть всё автоматом из *овнореп опять страдают. Ну удивительно же?
     
     
  • 2.30, Аноним (29), 10:34, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Вы не поверите, но "тянуть автоматом из*овнореп" - это единственный путь, общий для ПО на всех языках. Если у нужной вам программы прописаны зависимости "либа N из репы X" - вытянете, никуда не денетесь.
     
     
  • 3.35, Аноним (35), 12:22, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Окей, корректировочка: тянуть код автоматом из слабо верифицированных реп. Дальше хлебнуть смузи и ждать следующего ахтунга.
     
     
  • 4.38, Аноним (38), 16:07, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Что, в принципе, тоже вполне себе модель разработки, имеющая доказанную примерами экономическую эффективность. Если не впадать в крайности, то по ней большая часть софта и пишется. Ну по крайней мере, из того, что где-то запущен и генерирует денежную выгоду, а не существует в умах идеалистов, не продвинувшихся дальше филигранного оттачивания идей в своём воображении.
     

  • 1.26, Аноним (26), 08:45, 30/08/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    кек, трындеть все горазды, а вы бы лучше код свой показали
     
  • 1.27, Blind Vic (ok), 09:22, 30/08/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > К сожалению, халатное отношение к безопасности присуще разработчикам многих современных репозиториев пакетов, что ставит под вопрос возможность компрометации подобных систем злоумышленниками.

    Звучит так, как будто иметь возможность компрометации это ожидаемо, да вот баг мешает этому.

     
     
  • 2.28, Cradle (?), 09:39, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • +3 +/
    видимо это нужно понимать как "при таком раздолбайстве со стороны разработчиков многих современных репозиториев пакетов злоумышленникам становится скучно и обидно, и они в слезах идут ломать виндовс"
     
     
  • 3.36, имя (?), 12:38, 30/08/2018 [^] [^^] [^^^] [ответить]  
  • –1 +/
    а потом сраться в комментариях о гендере и прочем sjw
     

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



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

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