از prototype pollution تا اجرای کد روی n8n
خلاصهٔ کاملتر
نویسنده میگه موقع ممیزی نودهای n8n دنبال یه الگوی ساده میگشته: هر جایی که یه رشتهٔ کنترلشده توسط کاربر، بدون بررسی proto و constructor و prototype، کلید یه آبجکت ساده میشه. نود GSuiteAdmin سریع خودشو نشون داده. این نود یه بخش Custom Fields برای ساخت و ویرایش کاربر داره که اسم schema، اسم فیلد و مقدارش هر سه از تنظیمات ورکفلو میان — یعنی هر کسی که دسترسی editor داشته باشه، کاملاً کنترلشون میکنه.
اسم schema مستقیم بهعنوان کلید گروهبندی به کار میره:
customSchemas[schemaName] ??= {};
(customSchemas[schemaName] as IDataObject)[fieldName] = value;اگه اون اسم proto باشه، خط اول بهجای ساختن یه آبجکت خالی، getter مربوط به proto رو صدا میزنه و Object.prototype برمیگرده؛ چون nullish نیست، ??= عملاً هیچ کاری نمیکنه. خط دوم مقدار مهاجم رو مستقیم روی پروتوتایپ سراسری مینویسه و از اون به بعد هر آبجکت سادهٔ تازهای اون پراپرتی رو به ارث میبره. این همون چیزیه که بهش prototype pollution میگن — یعنی آلودهکردن پروتوتایپ مشترکی که همهٔ آبجکتهای ساده ازش ارث میبرن.
از اینجا زنجیره به اجرای کد میرسه. وقتی نود Git تابع .env() رو صدا میزنه، کتابخونهٔ simple-git یه آبجکت خالی برای متغیرهای محیطی میسازه که از پروتوتایپ آلوده ارث میبره. Node.js هم موقع ساختن محیط پروسهٔ فرزند، پراپرتیهای ارثبریشده رو برمیداره، و گیت برای URLهای SSH مقدار GIT_SSH_COMMAND رو بهعنوان دستور اجرا میکنه. پس مسیر کامل حمله میشه Webhook، بعد GSuiteAdmin برای آلودهکردن پروتوتایپ، بعد نود Git برای اجرا — همه با یه درخواست POST.
حتی بدون اون زنجیره هم آلودگی بهتنهایی مخربه: تابع buildWhere تو TypeORM موقع پیمایش for...in پراپرتیهای اضافه رو میبینه و روی هر کوئری دیتابیس خطای EntityPropertyNotFoundError میده؛ رابط کاربری از کار میافته و تا ریاستارت کامل برنمیگرده. نویسنده میگه اثرش روی self-hosted و worker و Cloud هست و چون کلید رمزنگاری همهٔ credentialها دست همون پروسهست، سرقت کامل اعتبارنامهها هم روی میزه.
نکات کلیدی:
- باگ تو نود GSuiteAdmin و توی هر دو عملیات create (خط ۵۲۰-۵۲۱) و update (خط ۸۰۲-۸۰۳) با کد یکسان بوده
- گجت اجرای کد، متغیر GIT_SSH_COMMAND هست که از آبجکت env در simple-git به پروسهٔ گیت میرسه
- عوارض جانبیش کرشکردن کوئریهای TypeORM با EntityPropertyNotFoundError و از کار افتادن کل نمونهست
- خود n8n یه deepMerge با محافظ prototype pollution داشته که این نود ازش استفاده نمیکرده
- گزارش ۲۶ فوریهٔ ۲۰۲۵ ارسال شده و ۲۵ مارس ۲۰۲۵ اطلاعیه و CVE منتشر شده




