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;
  • Запуск web-прыкладанняў на базе вэб-фрэймворка 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

Дадаць каментар