درب پشتی در کد کلود برای پسوند کد VS در بازار مکاننما
https://cursor.com/blog/claude-code-extension-security-notic... https://cyberplace.social/@GossiTheDog/117528831681803563 https://doublepulsar.com/anthropic-hacked-to-deliver-remote-... آدرس نظرات: https://news.ycombinator.com/item?id=50300683 امتیاز: 335 # نظرات: 353
Phorion یک درب پشتی را در بسته برنامه افزودنی رسمی Claude Code for VS Code در Cursor Marketplace شناسایی کرده است که درب پشتی SSH دائمی را در macOS، Linux و Windows رها میکند. این نوشتن اساسا روی macOS متمرکز است، جایی که برنامه افزودنی تلاش میکند یک درب پشتی SSH را پیکربندی کند و پایداری را ایجاد کند.
سازمانها باید فورا محیطهای خود را برای استفاده از کد کلود برای VSCode 2.1.313 بررسی کنند و در صورت کشف استفاده از برنامه افزودنی، پاسخ حادثه را درگیر کنند.
Phorion یک سازگاری با کد رسمی کلود برای برنامه افزودنی VS Code در بازار مکاننما کشف کرده است، جایی که بسته برنامه افزودنی در پشتی حاوی یک درب پشتی پوسته ایمن (SSH) است. مکان نما نسخه مرتبط را از بازار خود حذف کرده است، علاوه بر این نسخه های NPM و VSCode را برای نسخه 2.1.313 از رجیستری مربوطه خود خارج کرده است.
در حالی که ایمپلنت شامل راهاندازی و منطق پایداری برای macOS، Linux و Windows است، ما در این پست عمدتا روی macOS تمرکز میکنیم و تفاوتهای کلیدی و چند اشکال پیادهسازی را در پلتفرمهای دیگر در طول مسیر بیان میکنیم.
Cursor Marketplace افزونه هایی را برای ویرایشگر مکان نما ارائه می دهد. از آنجایی که برنامههای افزودنی با مجوزهای IDE و کاربری که آن را اجرا میکند اجرا میشود، یک برنامه افزودنی پشتیبان بلافاصله به فایلهای محلی، کد منبع و ابزارهای توسعهدهنده به محض بارگیری ماژول دسترسی پیدا میکند.
قابل توجه است، Phorion یک نادیده گرفتن احتمالی در نحوه تلاش بدافزار برای روشن کردن SSH کشف کرده است. منطق راهاندازی فرض میکند که میتواند وضعیت ورود از راه دور فعلی را بدون حقوق ریشه بررسی کند. هنگامی که به عنوان یک کاربر استاندارد اجرا می شود، systemetup -getremotelogin یک خطای دسترسی مدیر را چاپ می کند و به جای بازگشت خاموش، با وضعیت 0 خارج می شود. از آنجایی که اسکریپت فقط در صورتی سعی می کند SSH را فعال کند که خروجی با Off مطابقت داشته باشد، مرحله فعال سازی را به طور کامل رد می کند. در مکی که قبلا SSH در حال اجرا نیست، این اشتباه مسیر دسترسی ورودی را می شکند، حتی اگر کلیدهای SSH و ماندگاری همچنان حذف شوند.
در این پست، نحوه عملکرد درب پشتی، چرایی عدم موفقیت بررسی macOS و آنچه را که در ناوگان خود باید جستجو کنید، توضیح خواهیم داد. هدف این محموله دسترسی تعاملی طولانی مدت است، و در حالی که باگ درب پشتی SSH تأثیر را بر macOS به حداقل می رساند، این بدافزار همچنان یک تهدید مهم است که پایداری را نصب می کند و شناسایی میزبان را به اپراتور باز می گرداند.
فایل extension.js در معرض خطر با یک عبارت تابعی که بلافاصله فراخوانی شده است (IIFE) شروع می شود که به بسته برنامه افزودنی کوچک شده اضافه شده است. بقیه بستهها مانند برنامه افزودنی استاندارد به نظر میرسند، با رشتههای Claude Code و VS Code، صادرات فعال و غیرفعال معمولی، و کد UI.
پیشوند تزریق شده در ماژول های Node.js استاندارد ( child_process , fs , os , path , http و crypto ) کشیده می شود و به محض اینکه Node فایل را بارگیری می کند اجرا می شود، قبل از اینکه حتی فراخوانی عادی فعال سازی پسوند اجرا شود. کاربر نیازی به تعامل با برنامه افزودنی برای فعال شدن محموله ندارد.
ابتدا، payload اطمینان حاصل می کند که ~/.ssh وجود دارد و یک کلید عمومی Ed25519 تحت کنترل مهاجم را به ~/.ssh/authorized_keys اضافه می کند و مجوزها را روی 0700 در فهرست و 0600 را در فایل تنظیم می کند.
کلید از کامنت svc-telemetry استفاده می کند. قبل از الحاق، اسکریپت به جای بررسی خود کلید، بررسی می کند که آیا svc-telemetry از قبل در فایل موجود است یا خیر. هنگام شکار این فعالیت، ارزش آن را دارد که اثرانگشت کلید عمومی را بررسی کنید تا اینکه صرفا به رشته نظر تکیه کنید.
در اینجا cur محتویات موجود در authorized_keys را نگه میدارد و PUB کلید عمومی مهاجم تعبیهشده است (در اینجا ویرایش شده است).
با قرار دادن کلید، هر کسی که کلید خصوصی منطبق را در دست دارد می تواند به عنوان آن کاربر احراز هویت کند، مشروط بر اینکه SSH واقعا در حال اجرا باشد. مرحله بعدی در اسکریپت سعی می کند مطمئن شود که شبح محلی SSH فعال است و گوش می دهد:
هیچ یک از این مراحل شامل سوء استفاده از افزایش امتیاز نیست. sudo -n غیر تعاملی با شکست مواجه میشود مگر اینکه کاربر قبلا sudo بدون رمز عبور را ذخیره یا پیکربندی کرده باشد، بنابراین راهاندازی یک سرویس سیستم همیشه از یک زمینه کاربر استاندارد موفق نخواهد بود.
به نظر میرسد مسیر کد ویندوز نیز باگ خاص خود را دارد: فرمان تنظیم سرویس PowerShell را از طریق یک تابع کمکی (det()) که کدهای سخت /bin/sh را ارسال میکند، که در نصب استاندارد ویندوز خیلی دور نمیرود.
در macOS، راهاندازی ممکن است حتی قبل از رسیدن به دستور sudo با مشکل مواجه شود. اسکریپت systemetup -getremotelogin را بدون ارتفاع اجرا می کند و خروجی را در برابر /Off/i آزمایش می کند. فقط در صورتی سعی می کند که ورود از راه دور را فعال کند که خروجی شامل Off باشد:
توجه داشته باشید که دستور دوم (-setremotelogin on) از sudo -n استفاده می کند، در حالی که دستور اول (-getremotelogin) از این کار استفاده نمی کند. هنگامی که systemetup -getremotelogin را به عنوان یک کاربر استاندارد در macOS اجرا می کنید، در عوض این را دریافت می کنید:
systemetup از خواندن تنظیمات بدون حقوق سرپرست امتناع می ورزد، خطا را در stdout چاپ می کند و با وضعیت 0 خارج می شود. کمک کننده ex() بدافزار stdout را می گیرد و آن را برمی گرداند:
زیرا خروجی این است: "برای اجرای این ابزار به دسترسی مدیر نیاز دارید... در حال خروج!" ، /Off/i.test(rl) را به false ارزیابی می کند.
در نتیجه، اسکریپت بلوک if را رد میکند و هرگز sudo -n systemetup -setremotelogin را اجرا نمیکند. این به طور موثر "من مجوزی برای بررسی خاموش بودن SSH ندارم" به عنوان "SSH از قبل روشن است" تلقی می کند، که همچنین توضیح می دهد که چرا وقتی برنامه افزودنی به عنوان یک کاربر معمولی اجرا می شود، تلاش فعال سازی را در تله متری فرآیند مشاهده نمی کنید.
این باگ می تواند مرحله نهایی زنجیره دسترسی را بشکند. اگر Remote Login قبلا در Mac فعال نشده باشد، تونل خروجی همچنان میتواند به سرور مهاجم متصل شود، اما هر ترافیکی که از طریق تونل بازگردانده میشود، به پورت بسته 22 در لوکال هاست برخورد میکند.
البته، این چیزی نیست که بتوان به عنوان دفاع به آن تکیه کرد. اگر کاربر قبلا Remote Login را فعال کرده باشد یا بعدا آن را روشن کند، درب پشتی آماده و منتظر است.
سپس، اسکریپت یک اتصال SSH خروجی را به 134.209.82[.]225 به عنوان کاربر تونل در پورت 22 تنظیم می کند. برای احراز هویت در سرور مهاجم، یک کلید خصوصی جاسازی شده جداگانه رمزگشایی می کند: یک کلید OpenSSH Ed25519 رمزگذاری نشده با کامنت svrytunte.
ارزش آن را دارد که دو کلید را در حین بررسی مستقیم نگه دارید:
این اسکریپت این کلید تونل را با نام فایلی که با .stk_ شروع می شود در فهرست موقت سیستم عامل می نویسد و ده کاراکتر اول هش MD5 نام میزبان و مسیر دایرکتوری خانه را دنبال می کند:
این تونل از -R *:0:localhost:22 برای ارسال پورت از راه دور استفاده می کند. با عبور 0 از سرور SSH مهاجم می خواهد که به صورت پویا یک پورت گوش دادن را اختصاص دهد و هر ترافیکی را که از طریق تونل به آن برخورد می کند به localhost:22 در دستگاه قربانی ارسال کند:
از آنجایی که تونل با -N اجرا می شود، فقط پورت را بدون اجرای دستوری در سرور راه دور باز نگه می دارد. هنگامی که اپراتور می خواهد به دستگاه دسترسی پیدا کند، یک جلسه SSH جداگانه از طریق پورت اختصاص داده شده روی سرور خود شروع می کند، و با استفاده از کلید نصب شده در مرحله 1، در برابر شبح SSH محلی قربانی احراز هویت می شود. این به آنها پوسته تعاملی کامل و قابلیت انتقال فایل بدون نیاز به هیچ گونه کنترل سفارشی دستور C2 در خود جاوا اسکریپت را می دهد.
دستور SSH همچنین پرچمهایی را ارسال میکند تا اتصال را بیصدا و غیرتعاملی نگه دارد: چک کردن کلید میزبان غیرفعال است، hosts_hosts نادیده گرفته میشود، BatchMode و IdentitiesOnly فعال هستند، نگهداریها روی 30 ثانیه تنظیم میشوند (ServerAliveCountMax=3)، و ExitOnForwardFail روشن است.
اگر autossh نصب شده باشد، اسکریپت از آن استفاده می کند. در غیر این صورت به ssh استاندارد برمی گردد. با استفاده از pgrep در سیستمهای یونیکس برای جلوگیری از چرخش تونلهای اولیه تکراری، اتصال را در یک حلقه امتحان مجدد جداشده میپیچد که بین تلاشها به مدت 60 ثانیه میخوابد. از آنجایی که حلقه جدا شده است، تونل حتی پس از اینکه کاربر IDE خود را ببندد فعال می ماند.
برای زنده ماندن از راهاندازی مجدد، اسکریپت پایداری ویژه پلتفرم را در کنار تونل اولیه جدا شده تنظیم میکند:
در macOS و Linux، اسکریپت ~/.config/.smt دارای کلید خصوصی تونل است که در داخل آن تعبیه شده است و قبل از شروع حلقه اتصال مجدد، آن را در ~/.config/.smtk می نویسد.
در macOS، LaunchAgent خود را به عنوان com.apple.sysmond.plist در داخل ~/Library/LaunchAgents/ پنهان می کند:
در نهایت، اسکریپت شناسایی اولیه میزبان را جمعآوری میکند و یک فانوس دریایی یکباره را به سرور مهاجم ارسال میکند:
بررسی متغیر محیطی از Object.keys(process.env) استفاده می کند:
از آنجایی که فقط نام متغیرها را می گیرد، بیکن از مقادیر مخفی خود خارج نمی شود. درعوض، به اپراتور فهرستی سریع از اعتبارنامههای ابری یا توکنهای API روی دستگاه میدهد تا بدانند کدام میزبانها را اولویتبندی کند.
برای دریافت IP عمومی دستگاه، اسکریپت ifconfig[.]me را جستجو میکند و به api[.]ipify[.]org باز میگردد.
سپس گزارش JSON را از طریق درخواستهای HTTP POST متن ساده به /beacon در هر دو 134.209.82[.]225:8099 و 127.0.0.1:8099 ارسال میکند:
اینکه چرا یک کپی از beacon را به 127.0.0.1:8099 نیز ارسال می کند، از نمونه مشخص نیست. خود اسکریپت شنونده محلی را در آن پورت تنظیم نمی کند.
بیکن یک بار با setTimeout (1.5 ثانیه پس از اجرای اولیه راه اندازی) برنامه ریزی می شود و هر پاسخ HTTP با res.resume() را رد می کند. این صرفا یک بررسی است تا اپراتور بداند میزبان آماده است، در حالی که تونل SSH دسترسی واقعی را کنترل می کند.
از نقطه نظر تشخیص، چندین رفتار در این زنجیره وجود دارد که با استفاده از تله متری Endpoint Security Framework (ESF) در macOS برجسته می شود.
از آنجایی که بدافزار مستقیما با استفاده از Node's fs.appendFileSync به ~/.ssh/authorized_keys اضافه میشود، قوانین فقط فرآیندی برای مشاهده دستورات پوسته مانند اکو یا لمس کردن کلیدهای autorized_keys توسط سه راه حل نمیشود. اینجاست که تلهمتری اصلاح فایل ضروری است: تماشای فرآیندهای کمکی IDE (کد کمکی، کمککننده مکاننما، و غیره) ایجاد یا نوشتن در ~/.ssh/authorized_keys.
حتی اگر خود IDE باینری به طور معتبر امضا شده است، فرآیند میزبان برنامه افزودنی آن هیچ کسب و کاری برای اصلاح فایلهای احراز هویت SSH در پسزمینه ندارد.
در حالی که باید برای systemetup -setremotelogin on هم نظارت داشته باشید، به عنوان شرط لازم برای هشدار در این کمپین به آن تکیه نکنید. همانطور که در بالا دیدیم، بررسی وضعیت خراب در macOS به این معنی است که فرمان اغلب به هیچ وجه اجرا نمیشود.
راه اندازی پایداری در macOS چند سیگنال قوی به ما می دهد:
از آنجایی که تونل اولیه بهعنوان یک فرآیند جدا شده ایجاد میشود و بعدا راهاندازی میشود و مستقیما .smt را مدیریت میکند، فرآیندهای ssh بعدی، IDE را بهعنوان والد فوری خود در درخت فرآیند زنده ندارند. ارتباط ایجاد فایل .smt و com.apple.sysmond.plist به میزبان برنامه افزودنی IDE، چیدن زنجیره را بسیار آسان تر می کند.
اگر میزبانی را پیدا کردید که این برنامه افزودنی در آن اجرا می شد، مهم است که بررسی کنید آیا تونل صرفا ایجاد شده است یا اینکه آیا اپراتور واقعا از طریق آن وارد شده است. از آنجایی که جلسات ورودی از طریق پورت محلی به جلو میآیند، به نظر میرسد ورودهای موفق در گزارشهای SSH از localhost (127.0.0.1 یا ::1) که با کلید svc-telemetry احراز هویت میشوند، میآیند.
اگر دستگاه آسیبدیده را شناسایی کنید، حذف نصب افزونه به تنهایی درب پشتی را حذف نمیکند. مطمئن شوید که پاسخ شما تمام مراحلی را که رها می کند پوشش می دهد:
پوشش تشخیص خارج از جعبه Phorion، پایداری macOS مورد استفاده در این حمله را در قوانین متعدد، از جمله فرآیندهای غیر اپل ایجاد کننده com.apple نشان میدهد.* LaunchAgents و LaunchAgents اسکریپتهای پوسته را از دایرکتوریهای مخفی اجرا میکنند.
فراتر از تداوم، تله متری دسترسی به فایل Phorion میزبان برنامه افزودنی IDE را می گیرد که مستقیما ~/.ssh/authorized_keys را تغییر می دهد، و Phorion Protections را می توان برای قفل کردن ~/.ssh/ استفاده کرد تا فقط فرآیندهای مجاز بتوانند در وهله اول کلیدهای SSH و فایل های پیکربندی را بخوانند یا تغییر دهند.
اگر میخواهید ببینید Phorion چگونه تهدیدات زنجیره تامین مانند این را در ناوگان مک شما شناسایی و مسدود میکند، برای ترتیب دادن یک نسخه نمایشی با ما تماس بگیرید.
متن اصلی (انگلیسی)
Backdoor in Claude Code for VS Code extension on the Cursor Marketplace
https://cursor.com/blog/claude-code-extension-security-notic... https://cyberplace.social/@GossiTheDog/117528831681803563 https://doublepulsar.com/anthropic-hacked-to-deliver-remote-... Comments URL: https://news.ycombinator.com/item?id=50300683 Points: 335 # Comments: 353