TL؛ DR
یک ناشر npm هشت بسته کوچک ارسال کرد که نامهایشان مانند بلوکهای سازنده روزمره برای توسعه بلاکچین و کیف پول بود. base58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpersو crypto-validate-libهر کدام شامل یک ابزار کاربردی هستند. با این حال، پس از آن ابزار، یک بلوک کد خود-فراخوان اضافه شده است که به محض وارد شدن ماژول اجرا میشود.
تقریباً ۳۷ ثانیه پس از وارد کردن، آن بلوک یک payload را که درون بستهای که به عنوان یک ابزار آزمایشی مبدل شده است، رمزگشایی میکند، آن را در یک فایل مخفی در دایرکتوری خانگی کاربر مینویسد، و خود را برای راهاندازی مجدد در هر بار راهاندازی مجدد ثبت میکند. login در ویندوز، macOS و لینوکس اجرا میشود و اسکریپت رمزگشایی شده را به عنوان یک فرآیند جداگانه اجرا میکند. هیچ چیز در مورد این در طول نصب npm اجرا نمیشود؛ منتظر میماند تا کد وارد و اجرا شود، که لحظهای آرامتر از نصب است.
بار داده مبهم نیست. به صورت base64 ساده ارائه میشود، بنابراین رمزگشایی "test fixture" مرحله دوم را به طور کامل بازیابی میکند: کیف پول رمزنگاری و دزد اطلاعات شخصی که منتظر میماند تا دستگاه بیکار بماند، کلیدهای خصوصی و عبارات بازیابی را جمعآوری میکند، هر یافته را با یک کلید RSA-4096 رمزگذاری میکند و با پین کردن آن به فضای ذخیرهسازی عمومی IPFS، آن را استخراج میکند و هر ۱۲ ساعت یک بار سیگنال ارسال میکند.
ما خوشه را به صورت زیر ردیابی میکنیم فانتوم سینکهر هشت بسته در زمان تحلیل، در رجیستری npm موجود بودند و تحت یک حساب کاربری واحد منتشر میشدند.
| اکوسیستم | npm |
| بسته | base58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpers, crypto-validate-lib |
| پلتفرمهای هدف | ویندوز ، macOS ، لینوکس |
| رفتار اصلی | دراپر تأخیردارِ زمانِ وارد کردن، به عنوان یک ابزار آزمایشی پنهان شده است؛ پایداریِ بین پلتفرمی را نصب میکند |
| ظرفیت ترابری | سارق کیف پول ارز دیجیتال و اطلاعات محرمانه، رمزگذاری RSA-4096، استخراج اطلاعات از طریق پین کردن IPFS عمومی |
آناتومی حمله
هر بستهبندی در نگاه اول معمولی به نظر میرسد. base58-utilsبرای مثال، چند کیلوبایت کد کمکی Base58 / Bitcoin-WIF با وابستگی صفر است - دقیقاً همان چیزی که نام آن نوید میدهد. کد مربوطه در اینجا قرار میگیرد بعد از ماژول ماژول.exports، جایی که خوانندهای که بالای فایل را نگاه میکند بعید است آن را ببیند: یک تابع خود-فراخوان که خود را با یک تایمر زمانبندی میکند.
زنجیره عملیات، که از منبع بسته بازسازی شده است، به این صورت اجرا میشود:
1. Package is required() by the host project
2. A self-invoking function schedules a callback ~37,000 ms later (setTimeout)
3. On fire, the callback reads test/fixtures/keypairs.dat (a base64 blob)
4. It base64-decodes that blob into a Node.js script
5. It writes the script to ~/.cache-db/.node-sync/syncd.js (mode 0o700)
6. It installs login-persistence for that script (see below)
7. It spawns "node syncd.js" as a detached processدو انتخاب طراحی برجسته هستند.
محموله به عنوان یک وسیله آزمایشی حرکت میکند. مرحله دوم به صورت کد واضح نوشته نشده است. بلکه در آن وجود دارد. فایل test/fixtures/keypairs.dat، یک فایل base64 که نام آن در بستهای ادغام میشود که ادعا میکند جفت کلیدها را مدیریت میکند. برای انسانی که فایل tarball را بررسی میکند، شبیه دادههای نمونه به نظر میرسد؛ برای کد پیوست شده، اسکریپتی برای رمزگشایی و اجرا است. خودِ dropper هیچ آدرس شبکهای ندارد - آدرسهایی که در مرحله دوم قرار دارند - اما هیچ ابهام اضافی وجود ندارد: fixture یک لایه واحد از base64 است، بنابراین رمزگشایی آن (پایه64 -d) به طور کامل بازیابی میشود همگامسازی.js و رفتار شبکه آن. بخش بعدی به بررسی عملکرد آن مرحله بازیابی شده میپردازد.
انفجار به تأخیر افتاده و به واردات گره خورده است، نه نصب. چون عامل محرک است نیاز() به علاوه، به جای یک قلاب نصب، یک تایمر حدود ۳۷ ثانیهای وجود دارد که از بررسیهایی که فقط ناظر هستند، جلوگیری میکند. نصب npm و این تأخیر از بسیاری از اجراهای کوتاهمدت sandbox و CI بیشتر طول میکشد. تا زمانی که چیزی اجرا شود، نصبی که بسته را دریافت کرده بود، مدتهاست که به پایان رسیده است.
به محض اینکه اسکریپت رمزگشایی شده روی دیسک قرار گرفت، ~/.cache-db/.node-sync/syncd.js — مسیری که برای خواندن مانند یک دایرکتوری کش روتین انتخاب شده است — این دراپر باعث میشود که در هر سه پلتفرم اصلی، از راهاندازی مجدد در امان بماند:
- لینوکس: یک ورودی cron که اسکریپت را مجدداً اجرا میکند. این ورودی با فیلتر کردن crontab موجود از طریق ... نصب میشود. grep -v همگامسازی، که عارضه جانبی آن حذف ورودی جدید از یک فهرست ساده است که greps را برای همین نام انجام میدهد.
- ویندوز: یک وظیفه زمانبندیشده با نام همگامسازی WinNode، طوری تنظیم شده که با فاصله ۱۲ دقیقه دوباره اجرا شود.
- سیستم عامل مکینتاش: یک شغل راهاندازی شده با برچسب com.apple.syncd، که در چندین بسته وجود دارد - برچسبی که از یک سرویس سیستمی قانونی اپل تقلید میکند.
سپس اسکریپت بلافاصله به عنوان یک فرآیند جداگانه آغاز میشود، بنابراین پس از خروج برنامهی واردکننده، به اجرای خود ادامه میدهد.
مرحله دوم چه کاری انجام میدهد؟
از آنجا که این وسیله یک لایه base64 واحد است، مرحله دوم به طور تمیز رمزگشایی میشود و میتوان آن را به طور کامل خواند. هر هشت بسته، یکی از سه نوع اسکریپت یکسان را دارند که خود را در یک کامنت هدر به صورت زیر معرفی میکند: Phantom syncd v3 — topo durmiente ("موش خفته"). وظیفه آن سرقت اطلاعات کیف پول ارز دیجیتال و اسرار توسعهدهندگان و ارسال آنها به خارج از دستگاه است. این بدافزار طی مراحل زیر اجرا میشود:
- 1. صبر کنید تا دستگاه بیکار شود. قبل از انجام هر کاری، همگامسازی.js بررسی میکند که کاربر چه مدت غیرفعال بوده است و فقط از یک آستانه (حدود ۱۵ دقیقه) عبور میکند - xprintidle در لینوکس، ioreg HIDIdleTime در macOS و یک پرس و جوی زمان بیکاری PowerShell در ویندوز. بنابراین، برداشت معمولاً زمانی اتفاق میافتد که کسی پشت صفحه کلید نیست.
- ۲. یک کلید فعالسازی با کنترل از راه دور تهیه کنیداین اسکریپت قبل از عمل، یک پیکربندی کوچک را از یک فایل dead-drop دریافت میکند. منبع اصلی، یک URL خام از GitHub gist است (gist.githubusercontent.com/juang55/…/cfg.txt); اسکریپت فقط در صورتی فعال میشود که آن پیکربندی خوانده شود فعال=1اگر اصل مطلب در دسترس نباشد، به سه شناسه محتوای IPFS که به صورت کد ثابت نوشته شدهاند و از طریق دروازههای عمومی دریافت میشوند، برمیگردد. دروازه.پیناتا.ابر, ipfs.ioو cloudflare-ipfs.comاین به اپراتور امکان کنترل مسلح/خلع سلاح پس از حادثه و یک سیستم پشتیبان مقاوم در برابر سقوط را میدهد. (کوچکترین نوع، ارسال شده در کتابخانه اعتبارسنجی رمزنگاری, کمککنندههای کیف پول ethو ابزارهای کلید سولانا، لایه اصلی حذف شده و فقط به شناسههای IPFS متکی است.)
- ۳. مواد و اسرار کیف پول را جمعآوری کنید. این اسکریپت در دایرکتوری خانگی کاربر پیمایش میکند — ~/.config/solana, ~/.ethereum/keystore, ~/.ریختهگری, ~/.هارد هت, / .sshو دسکتاپ/اسناد/دانلود (شامل نام پوشهها به زبان اسپانیایی)، بهعلاوه ~/.env و فایلهای shell rc و معادل آن اطلاعات برنامه مکانها در ویندوز. این بدافزار کلیدهای خصوصی اتریوم، کلیدهای WIF بیتکوین، عبارات بازیابی BIP-39، جفت کلیدهای Solana، JSON کلیدفروشی اتریوم، کلیدهای SSH و متغیرهای محیطی حاوی اطلاعات محرمانه را هدف قرار میدهد. نوع بزرگتر (در ابی-انکود, base58-utils, توسعهی ات) شامل دیکشنری کامل BIP-39 با ۲۰۴۸ کلمه است و از عبارات منظم برای ... استفاده میکند. عصاره کلیدهای منفرد و عبارات اولیهی اعتبارسنجیشده از هر متنی که میخواند؛ دو نوع کوچکتر در عوض، فایلها را بر اساس کلمه کلیدی (دانه, حفظی, کیف پول, metamask, شبح, دفتر کل, trezor، ...) و کل فایلها را آپلود کنید.
- ۴. رمزگذاری و استخراج از طریق یک سرویس پینگذاری عمومی. هر یافته با یک اثر انگشت میزبان همراه است (نام کاربری@نام میزبان، پلتفرم، مهر زمانی) و با یک کلید عمومی RSA-4096 که در اسکریپت تعبیه شده است، رمزگذاری شده است. سپس رکورد رمزگذاری شده با پین کردن آن به IPFS از طریق api.pinata.cloud/pinning/pinJSONToIPFS، با اعتبارنامههای API پیناتا که به صورت هاردکد شده تأیید شدهاند. هیچ سرور C2 سفارشی برای توقیف وجود ندارد: دادههای سرقت شده در فضای ذخیرهسازی غیرمتمرکز عمومی پارک میشوند و توسط اپراتور با استفاده از هشهای محتوای حاصل قابل بازیابی هستند. آپلودها با چند ثانیه لرزش تصادفی و یک گزارش محلی از ... فاصله دارند. مهر زمانی | نوع کلید | هش بازگشتی در آن نگه داشته میشود ~/.cache-db/.node-sync/.sl.
- ۵. روی یک چرخه ۱۲ ساعته پافشاری کنید و چراغ قوه روشن کنید. مرحله دوم، ماندگاری خود را دوباره برقرار میکند - یک ورودی cron در لینوکس، یک com.apple.syncd کار را در macOS راه اندازی کرد و یک وظیفه برنامه ریزی شده به نام همگامسازی ویندوز نود در ویندوز - طوری تنظیم شده که هر ۱۲ ساعت یکبار دوباره اجرا شود. توجه داشته باشید که این یک مختلف نام وظیفه ویندوز از وظیفهای که dropper نصب میکند (همگامسازی WinNode); هر دو ارزش شکار کردن را دارند.
گاهشمار
این هشت بسته در تاریخهای 2026-07-13 و 2026-07-14 به صورت فشرده منتشر شدند. چندین مورد از آنها بیش از یک نسخه دارند؛ دراپر در تمام نسخهها یکسان است و فقط با تغییر اندازه کد کاربردی بیخطر بالای آن، فاصله خطوط تغییر میکند.
| تاریخ | واقعه |
|---|---|
| 2026-07-13 | اولین بستههای موجود در خوشه تحت یک ناشر () ظاهر میشوند.solana-key-utils, eth-wallet-helpers, crypto-validate-lib و نسخههای اولیه بقیه) |
| 2026-07-13 → 07-14 | نامهای باقیمانده و نسخههای بعدی منتشر شدهاند؛ در هر نسخه، همان دراپر ضمیمهشده ارسال میشود. |
| 2026-07-14 | هر هشت مورد علامتگذاری و تجزیه و تحلیل شدند؛ هر بسته هنوز از رجیستری قابل نصب است. |
در طول این دوره، اعتبار رجیستری ناشر از تقریباً خنثی در ابتدای خوشه به شدت منفی با افزایش تشخیصها تغییر کرد - یک اثر جانبی قابل مشاهده از علامتگذاری بستهها، نه یک ویژگی طراحیشده.
شاخص های سازش
وجود تمام شاخصهای زیر در زمان تحلیل تأیید شد - آنهایی که در جداول «مرحله دوم» بودند، با رمزگشایی فایل test/fixtures/keypairs.dat و خواندن مطالب بازیابی شده همگامسازی.js.
فایلها و مسیرها
| شاخص | نقش |
|---|---|
~/.cache-db/.node-sync/syncd.js | مرحله دوم رمزگشایی شده، با حالت 0o700 نوشته شده است |
~/.cache-db/.node-sync/.sl | گزارش خروج اطلاعات محلی (برچسب زمانی | نوع کلید | هش IPFS) |
test/fixtures/keypairs.dat | فایل مخرب کدگذاری شده با Base64 که به عنوان یک "فایل آزمایشی" در داخل فایل tarball قرار داده شده است. |
زیرساخت شبکه مرحله دوم (بازیابی شده از syncd.js)
| شاخص | نقش |
|---|---|
gist.githubusercontent.com/juang55/b298754cb72942b1cdcf02ccd45cde2f/raw/cfg.txt | فعالسازی بدون توقف؛ اسکریپت فقط در صورت خواندن پیکربندی اجرا میشود active=1 |
Qmcqz3w8j4qFQXDAXAxnrdc2oSX3nzBT4NqtpTqL8mr1ga | پشتیبان پیکربندی IPFS (CID) |
QmdTXoqVmTHY1i4ZWLdLkoQ9YChp5TXPh5cWXwnAYZt5iF | پشتیبان پیکربندی IPFS (CID) |
QmfJkLU5gdCpqbbqEjWYC2anXW9FmuEeSLLeLiHVJKYUjp | پشتیبان پیکربندی IPFS (CID) |
gateway.pinata.cloud, ipfs.io, cloudflare-ipfs.com | دروازههای IPFS که برای دریافت پیکربندی پشتیبان استفاده میشوند |
api.pinata.cloud/pinning/pinJSONToIPFS | نقطه پایانی استخراج اطلاعات، دادههای سرقت شده به IPFS عمومی پین شدند |
| کلید API پیناتا | 13c766575b9270a9825d، اعتبارنامهی استخراجشدهی کدگذاریشده |
اهداف جمعآوری مرحله دوم (بازیابی شده از syncd.js)
| شاخص | نقش |
|---|---|
~/.config/solana, ~/.ethereum/keystore, ~/.foundry, ~/.hardhat, ~/.ssh, ~/.env، فایلهای rc پوسته | دایرکتوریها/فایلها برای کلیدها و اسرار جستجو شدند |
AppData\Roaming\Solana, AppData\Local\ethereum\keystore | معادلهای ویندوز جستجو شده |
| انواع مصنوعات برداشت شده | کلیدهای خصوصی اتریوم، WIF بیتکوین، عبارات بازیابی BIP-39، جفت کلیدهای Solana، JSON کلید ذخیره شده اتریوم، کلیدهای SSH، متغیرهای محیطی مخفی |
مصنوعات پایداری
| سکو | شاخص |
|---|---|
| لینـوکــس | راه اندازی ورودی cron syncd.jsنصب شده از طریق crontab فیلتر شده grep -v syncd |
| ویندوز | وظیفه برنامه ریزی شده WinNodeSync (قطره چکان) و WindowsNodeSync (مرحله دوم) |
| از MacOS | برچسب لانچد com.apple.syncd |
| همه | مرحله دوم در یک چرخه ۱۲ ساعته دوباره ادامه مییابد |
رفتاری
- تابع خودفراخوان که بعد از آن اضافه شده است ماژول.exports، برنامه ریزی الف setTimeout حدود ۳۷۰۰۰ میلیثانیه برای واردات.
- فرآیند_فرزند ایجاد("گره", ) با تنظیم گزینه جدا شده.
- فعالسازی با دریچهی غیرفعال در مرحلهی دوم (xprintidle / ioreg زمان بیکاری HIDIdleTime / PowerShell؛ آستانه تقریبی ۱۵ دقیقه).
- رمزگذاری RSA-4096 با توجه به یافتههای قبلی، سپس HTTPS پست به یک API پینگذاری عمومی IPFS.
بستهها و نسخهها (npm، ناشر solbuilder_io)
| بسته | نسخه |
|---|---|
base58-utils | 1.0.0، 1.0.1، 1.0.3 |
abi-encode | 1.0.0، 1.0.1، 1.0.2 |
eth-dev | 1.0.0، 1.0.1، 1.0.2 |
arb-kit | 1.0.0، 1.0.1 |
layer2-sdk | 1.0.0، 1.0.1 |
solana-key-utils | 1.0.0 |
eth-wallet-helpers | 1.0.0 |
crypto-validate-lib | 1.0.0 |
ناشر
- سولبیلدر_یو - angel_lopez89[@]proton[.]me، ایمیل تأیید نشده، بدون حساب کنترل منبع تأیید شده، بدون مخزن پیوند داده شده.
انتساب و رفتار مشاهده شده
هشت بسته، یک حساب کاربری ناشر و یک بار داده مشترک دارند. هر کدام یک بستهی بیاهمیت - چند کیلوبایت کد کاربردی واقعی با همان دراپر ضمیمه شده - است که بدون مخزن لینکشده و تحت یک ایمیل یکبار مصرف تأییدنشده منتشر میشود. این یکنواختی، مسیر دراپر مشترک، برچسبهای ماندگاری مشترک و ... مشترک جفت کلیدها.dat فایلهای مرحلهبندی چیزی هستند که کلاستر را به هم پیوند میدهند.
این بستهها به طرز غیرمعمولی در مورد رفتار خودشان رک و صریح هستند. ابزارهای کلید سولانا شامل کامنتهای درونخطی است که بلوک الحاقشده را به زبان ساده توصیف میکنند - میتوان آن را برچسبگذاری کرد فانتوم: پایداری نامرئی، دیگری (به اسپانیایی) میخواند توپوگرافی و پس زمینه پرتابی، «مول را در پسزمینه اجرا کن.» اینها توضیحات خود کد در مورد کاری است که انجام میدهد؛ نام کمپین در این پست از همان برچسب اول به همراه گره جعلی «همگامسازی دیمن» (همگامسازی) که ماشینآلات پایداری از آن تقلید میکنند.
ما فقط کاری را که کد به طور قابل مشاهده انجام میدهد، شرح میدهیم. نامگذاری بستهها - همه اصطلاحات مربوط به ارزهای دیجیتال، کیف پول و ابزارهای بلاکچین - نشان میدهد که مخاطبان توسعهدهنده به احتمال زیاد آنها را با نام دریافت میکنند؛ این نامگذاری به خودی خود مشخص نمیکند که ناشر کیست. مرحله دوم با رمزگشایی ثابت base64 کاملاً قابل بازیابی بود و رفتار آن در بالا توضیح داده شده است: کلیدهای کیف پول، عبارات بازیابی و اسرار را جمعآوری میکند و آنها را به صورت رمزگذاری شده با RSA از طریق Pinata به فضای ذخیرهسازی عمومی IPFS منتقل میکند. یک انتخاب طراحی قابل توجه، عدم وجود یک سرور خصوصی C2 است - پیکربندی از یک GitHub gist و IPFS دریافت میشود و دادههای سرقت شده در فضای ذخیرهسازی عمومی غیرمتمرکز با کلیدگذاری هش محتوا ذخیره میشوند، که هر دوی آنها سختتر از یک میزبان تحت کنترل مهاجم هستند. در زمان نگارش این مطلب، هیچ گزارش عمومی قبلی مطابق با این خوشه یافت نشد.
تأثیر، روندها و راهنمایی برای مدافعان
چه کسی در معرض دید قرار گرفته است. هر کسی که یکی از این بستهها را به یک پروژه Node اضافه کرده و سپس کدی را اجرا کرده که آن را وارد میکند. از آنجا که انفجار زمان واردات است نه زمان نصب، صرفاً وجود بسته کافی نیست - بلکه هرگونه استفاده عادی که ماژول را بارگیری کند، به payload میرسد. نامهای فریبنده، توسعهدهندگانی را که بر روی اتریوم، سولانا، آربیتروم، لایه ۲ و ابزارهای کیف پول/رمزگذاری عمومی کار میکنند، هدف قرار میدهند - جمعیتی که به احتمال زیاد دقیقاً داراییهایی را که مرحله دوم به دنبال آن است، دارند. هر کسی که یکی از این ماژولها را روی دستگاهی اجرا کرده باشد که کلیدهای کیف پول، عبارات بازیابی، فروشگاههای کلید، کلیدهای SSH یا .NS رازها باید آن اعتبارنامهها را به عنوان اعتبارنامههای لو رفته در نظر بگیرند و آنها را تغییر دهند.
دو الگویی که ارزش درونی کردن را دارند. اول، بار مفید به عنوان ثابت: ارسال مرحله دوم به صورت base64 در داخل یک فایل داده با نام احتمالی (فایل test/fixtures/keypairs.dat) منبع قابل مشاهده بسته را تمیز نگه میدارد و محتوای مخرب را به فایلی منتقل میکند که ابزارهای بررسی و بررسیهای انسانی اغلب آن را به عنوان دادههای بیاثر در نظر میگیرند. دوم، اجرای با تأخیر در زمان وارد کردن با پایداری بین پلتفرمیحذف تریگر از قلاب نصب، اضافه کردن تایمر و سپس ادامه دادن در cron، وظایف زمانبندیشده و launchd، گامی آگاهانه در جهت دوری از تکنیکهای نصب اسکریپت پر سر و صدا است که اسکن خودکار رجیستری از نزدیک آنها را زیر نظر دارد.
راهنمایی برای مدافعان و نگهبانان:
- کد پیوست شده را بعد از آن پردازش کنید ماژول.exports به عنوان یک اولویت بررسی - منطق دراپر اغلب زیر سطح ماژول «واقعی» پنهان میشود.
- فرض نکنید که فایلهای داده بیاثر هستند. یک حباب base64 زیر آزمون/وسایل/ که در زمان اجرا خوانده و رمزگشایی میشود، فایل اجرایی مجاور است؛ خواندنهای زمان اجرا از فایلهای fixture که a را تغذیه میکنند، علامتگذاری میکند. عملکرد/ارزیابی/نوشتن-سپس-تخم ریزی زنجیر.
- مسیر سقوط را پیدا کنید ~/.cache-db/.node-sync/ و برای واحدهای پایداری همگامسازی WinNode (وظیفه زمانبندیشده) و com.apple.syncd (launchd) روی دستگاههای توسعهدهندهای که این نامها را دریافت کردهاند.
- هشدار در مورد فرآیندهای Node که ورودیهای cron، وظایف زمانبندیشده یا کارهای راهاندازیشده ایجاد میکنند - کتابخانههای قانونی به ندرت این کار را هنگام وارد کردن انجام میدهند.
- فایلهای قفل و نسخههای پینشده را ترجیح دهید و تفاوت هرگونه وابستگی کوچک «کاربردی» جدید را بررسی کنید، بهویژه بستههای بدون وابستگی منتشر شدند توسط حسابهای تایید نشده و بدون مخزن مرتبط.
برای مدافعان رجیستری، نکتهی کلیدی این است که نظارت بر قلاب نصب لازم است اما کافی نیست: یک دراپرِ زمانِ واردات و با تأخیرِ تایمر که درون یک فایل داده قرار داده شده است، از بررسیِ فقط زمانِ نصب عبور میکند و مرحلهی ماندگاری اغلب بلندترین سیگنالِ قابل مشاهده برای ردیابی است.







