Григорий Дудников @gregsonar и его писанина

Зловредный PyPI (pip install и в продакшен)

The Pretender s1e7

PyPI (the Python Package Index) сегодня самый удобный способ хранить и распространять пакеты для Python, и что поделать, но кроме хороших мальчиков и девочек им пытаются пользоваться ещё и разные скользкие кексы.

Поэтому неудивительно, что среди огромной кучи из 117226 пакетов (на 17 сентября 2017 года - прим. меня) исследователями из Словацкой Службы Национальной Безопасности было обнаружено целых десять пакетов, которые пытаются выдать себя не за то, чем являются.

Зловредные пакеты распространяются за счёт использования названий, похожих на названия популярных библиотек. Особенно больно становится, если оригинальный пакет использует вместо своего устоявшегося названия что-то иное, например telnetsrvlib - это Telnet сервер и CLI, а django-server-guardian-api многие ошибочно пытаются найти по имени django-server.

Особенно досталось пакету urllib3, который обзавёлся даже двумя клонами: urlib3 и urllib.

несколько установленных клонов библиотеки urllib
Быстро ли вы заметите подмену?

После того, как исследователи обратились в сам PyPI, все подозрительные пакеты были удалены из репозитория, однако в системе нет механизма проверки библиотек на безопасность и пока с трудом можно представить, как реализовать его без жёсткой... кхм... премодерации, на которую у сообщества (как обычно) не будет ни сил, ни денег, ни времени.

С одной стороны, вектор атаки вполне ожидаемый и если есть популярный источник библиотек, в который каждый может загрузить свою, грех не воспользоваться такой возможностью, а с другой стороны - вот когда вы в последний раз действительно проверяли, что там такого установилось после выполнения sudo pip install voodoо?

Для того, чтобы быстро проверить, установлены ли у Вас зловредные библиотеки, предлагается выполнить простой поиск по списку менеджера pip:

>pip list –format=legacy | egrep '^(acqusition|apidev-coop|bzip|crypt|django-server|pwd|setup-tools|telnet|urlib3|urllib) '

Список пакетов, выдающих себя за другие :

  • acqusition (версия от 2017-06-03 01:58:01, маскируется под acquisition)
  • apidev-coop (версия от 2017-06-03 05:16:08, мимикрирует под apidev-coop_cms)
  • bzip (версия от 2017-06-04 07:08:05, пытается подменить bz2file)
  • crypt (версия от 2017-06-03 08:03:14, хочет, чтобы вы думали, что он crypto)
  • django-server (версия от 2017-06-02 08:22:23, не удивительно, что он пытается "упростить" установку django-server-guardian-api)
  • pwd (версия от 2017-06-02 13:12:33, мимикрирует под pwdhash)
  • setup-tools (версия от 2017-06-02 08:54:44, мимикрирует под setuptools)
  • telnet (версия от 2017-06-02 15:35:05, даже не представляю, почему настоящий пакет использует имя telnetsrvlib)

Ну, и призёр конкурса Naming Is Hardurllib3!

  • urlib3 (версия от 2017-06-02 07:09:29)
  • urllib (версия от 2017-06-02 07:03:37)
  • ^^^ Оба пытаются попасть на ваши машины вместо urllib3

К слову говоря, зловредный код работает только в Python 2.XX, так что использование новых версий даёт заметное преимущество :)

В общем, смотрите, что вы ставите и не полагайтесь на то, что за вас проверят весь код. Не попадайтесь и да пребудет с вами Сила!