46% Python-пакетів у репозиторії PyPI містять потенційно небезпечний код

Група дослідників з Університету Турку (Фінляндія) опублікувала результати аналізу пакетів у репозиторії PyPI щодо використання потенційно небезпечних конструкцій, здатних призвести до появи вразливостей. У ході аналізу 197 тисяч пакетів виявлено 749 тисяч потенційних проблем із безпекою. У 46% пакетів є щонайменше одна подібна проблема. Серед проблем, що найчастіше зустрічаються, виділяються недоробки, пов'язані з обробкою винятків і використанням можливостей, що допускає підстановку коду.

З виявлених 749 тисяч проблем 442 тисячі (41%) позначені як незначні, 227 тисяч (30%) як проблеми помірної небезпеки та 80 тисяч (11%) як небезпечні. Деякі пакети вибиваються із загальної маси та містять тисячі проблем: наприклад, у пакеті PyGGI виявлено 2589 проблем, переважно пов'язаних із застосуванням конструкції «try-except-pass», у пакеті appengine-sdk знайдено 2356 проблем. Велика кількість проблем також є у пакетах genie.libs.ops, pbcore і genie.libs.parser.

Слід зазначити, що результати отримані з урахуванням проведення автоматизованого статичного аналізу, який враховує контекст застосування тих чи інших конструкцій. Розробник інструментарію bandit, який використовувався для сканування коду, висловив думку, що через досить високу кількість помилкових спрацьовувань результати перевірки не можна вважати вразливими без проведення додаткового ручного рецензування кожної проблеми.

Наприклад, аналізатор вважає проблемою з безпекою застосування ненадійних генераторів випадкових чисел та алгоритмів хешування, таких як MD5, у той час, як у коді подібні алгоритми можуть використовуватися для цілей, що не впливають на безпеку. Аналізатор також вважає проблемою будь-яку обробку зовнішніх даних у небезпечних функціях, таких як pickle, yaml.load, subprocess та eval, але це використання не обов'язково пов'язане з появою вразливості і насправді застосування зазначених функцій може бути реалізовано без загрози безпеці.

Серед перевірок, використаних у дослідженні:

  • Використання потенційно небезпечних функцій exec, mktemp, eval, mark_safe тощо.
  • Небезпечне встановлення прав доступу для файлів.
  • Приєднання мережевого сокету до всіх інтерфейсів.
  • Використання жорстко вказаних у коді паролів та ключів.
  • Використання певного тимчасового каталогу.
  • Використання pass та continue в обробниках винятків catch-all-style;
  • Запуск веб-додатків на базі веб-фреймворку Flask з увімкненим режимом налагодження.
  • Використання небезпечних методів десеріалізації даних.
  • Використання хеш-функцій MD2, MD4, MD5 та SHA1.
  • Використання небезпечних шифрів DES та режимів шифрування.
  • Використання небезпечної реалізації HTTPSConnection у деяких версіях Python.
  • Вказує схему file:// в urlopen.
  • Використання генераторів псевдовипадкових чисел під час виконання криптографічних завдань.
  • Використання протоколу Telnet.
  • Використання небезпечних парсерів XML.

Додатково можна відзначити виявлення в каталозі PyPI 8 шкідливих пакетів. Перед видаленням проблемні пакети встигли завантажити понад 30 тисяч разів. Для приховання шкідливої ​​активності та обходу попереджень простих статичних аналізаторів у пакетах застосовувалося кодування блоків з кодом за допомогою Base64 та організація виконання після декодування через виклик eval.

У пакетах noblesse, genesisbot, are, suffer, noblesse2 та noblessev2 виявлено код для перехоплення номерів кредитних карток та паролів, збережених у браузерах Chrome та Edge, а також для передачі токенів облікових записів із програми Discord та відправки даних про систему, включаючи скріншоти вмісту екрану . У пакетах pytagora і pytagora2 була можливість завантаження і виконання стороннього виконуваного коду.

Джерело: opennet.ru

Додати коментар або відгук