Група изследователи от Университета Турку (Финландия) публикува резултатите от анализа на пакети в репозитория 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;
- Стартиране на уеб приложения на базата на уеб фреймворка 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
