<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <id>https://vulnerability.circl.lu/sightings/feed</id>
  <title>Most recent sightings.</title>
  <updated>2026-06-17T11:10:27.029845+00:00</updated>
  <author>
    <name>Vulnerability-Lookup</name>
    <email>info@circl.lu</email>
  </author>
  <link href="https://vulnerability.circl.lu" rel="alternate"/>
  <generator uri="https://lkiesow.github.io/python-feedgen" version="1.0.0">python-feedgen</generator>
  <subtitle>Contains only the most 10 recent sightings.</subtitle>
  <entry>
    <id>https://vulnerability.circl.lu/sighting/28008d07-ba4c-4a4d-a7ce-b1059a4b6188/export</id>
    <title>28008d07-ba4c-4a4d-a7ce-b1059a4b6188</title>
    <updated>2026-06-17T11:10:27.346586+00:00</updated>
    <author>
      <name>Automation user</name>
      <uri>https://cve.circl.lu/user/automation</uri>
    </author>
    <content>{"uuid": "28008d07-ba4c-4a4d-a7ce-b1059a4b6188", "vulnerability_lookup_origin": "1a89b78e-f703-45f3-bb86-59eb712668bd", "author": "9f56dd64-161d-43a6-b9c3-555944290a09", "vulnerability": "CVE-2026-48063", "type": "seen", "source": "https://gist.github.com/ti-codetec/595cf90f9edd6fcd9e1bb577dea0089b", "content": "# An\u00e1lise Detalhada do Ticket #1636\n\n**T\u00edtulo:** [Backend]\ud83d\udc1e SEC-15 \u00b7 Node WhatsApp service: Zero Auth, Path Traversal &amp;amp; Baileys CVE\n**URL:** https://github.com/zydontecnologia/zydon-tickets/issues/1636\n\n---\n\n## 1. Descri\u00e7\u00e3o do Bug e Impacto\n\nO microsservi\u00e7o `zydon-plugin-whatsapp-web-instances` (identificado internamente no `package.json` como `baileys-panel`) \u00e9 respons\u00e1vel por gerenciar conex\u00f5es persistentes do WhatsApp Web para diversos tenants por meio da biblioteca Baileys. Este servi\u00e7o foi analisado e apresenta tr\u00eas vulnerabilidades cr\u00edticas de seguran\u00e7a que, combinadas, exp\u00f5em toda a infraestrutura e os dados de clientes a riscos grav\u00edssimos.\n\n### Vulnerabilidade 1: Aus\u00eancia Completa de Autentica\u00e7\u00e3o (Zero Auth)\nO arquivo `src/server.js` exp\u00f5e rotas administrativas, de visualiza\u00e7\u00e3o e de envio de mensagens sem qualquer mecanismo de controle de acesso (middleware de autentica\u00e7\u00e3o, checagem de API Key, tokens JWT, ou verifica\u00e7\u00e3o de tenant/sess\u00e3o).\n*   **Impacto:** Qualquer ator malicioso capaz de alcan\u00e7ar a porta do servi\u00e7o na rede interna (ou exposta publicamente) pode interagir diretamente com as sess\u00f5es, enviar mensagens arbitr\u00e1rias se passando por clientes leg\u00edtimos (`POST /sessions/:id/send`), ler logs e dados de mensagens trocadas (`GET /sessions/:id/logs`), desassociar sess\u00f5es ativas (`DELETE /sessions/:id`) e ler o QR Code para parear novas contas (`GET /sessions/:id/qr`).\n\n### Vulnerabilidade 2: Path Traversal em Leitura de Arquivos de M\u00eddia (`GET /files/:fileId`)\nA rota `/files/:fileId` utiliza uma concatena\u00e7\u00e3o direta e insegura de caminhos (`path.join(TEMP_DIR, fileId)`) para localizar e servir arquivos de m\u00eddia baixados temporariamente pelo Baileys.\n*   **Impacto:** Um invasor pode realizar requisi\u00e7\u00f5es usando sequ\u00eancias de diret\u00f3rio relativo (como `../`), as quais s\u00e3o processadas e normalizadas pelo Express, permitindo a leitura e o download de **qualquer arquivo** leg\u00edvel pelo usu\u00e1rio de execu\u00e7\u00e3o do container. Isso exp\u00f5e chaves de API, vari\u00e1veis de ambiente contidas no `.env`, e principalmente os arquivos de credenciais persistidos das sess\u00f5es ativas (como `creds.json`), permitindo que atacantes clonem as conex\u00f5es de WhatsApp dos clientes.\n\n### Vulnerabilidade 3: Uso de Depend\u00eancia Vulner\u00e1vel do Baileys (CVE / GHSA-qvv5-jq5g-4cgg)\nA biblioteca `@whiskeysockets/baileys` est\u00e1 travada no `package.json` na vers\u00e3o `^7.0.0-rc.9`, que se encontra dentro da faixa afetada pela vulnerabilidade **GHSA-qvv5-jq5g-4cgg (CVE-2026-48063)** com severidade **Cr\u00edtica (CVSS 9.3)**.\n*   **Impacto:** Mensagens do tipo `protocolMessage` (como requisi\u00e7\u00f5es de reenvio de placeholders) especialmente modificadas por um invasor podem for\u00e7ar a inje\u00e7\u00e3o e o processamento de eventos `messages.upsert` falsos no bridge. Como este microsservi\u00e7o repassa cegamente os eventos de mensagens recebidas aos webhooks cadastrados pelas inst\u00e2ncias (`sessions.js:401`), o atacante consegue forjar mensagens inbound e corromper o estado de sincroniza\u00e7\u00e3o sem que o usu\u00e1rio tenha enviado tais mensagens.\n\n---\n\n## 2. An\u00e1lise T\u00e9cnica e Rastreamento da Causa Raiz\n\n### 2.1 An\u00e1lise de Aus\u00eancia de Autentica\u00e7\u00e3o\nInvestigando o arquivo `src/server.js:31-35`:\n```javascript\nconst app = express();\nconst PORT = process.env.PORT || 8080;\n\napp.use(express.json());\napp.use(express.static(path.join(__dirname, '../public')));\n```\nN\u00e3o existem middlewares de seguran\u00e7a como `cors`, `helmet`, ou validadores personalizados aplicados antes das defini\u00e7\u00f5es de rotas (`POST /sessions`, `GET /sessions`, `DELETE /sessions/:id`, etc.). O servidor faz o bind em `0.0.0.0` (escutando em todas as interfaces) na porta `8080` de forma completamente aberta.\n\n### 2.2 An\u00e1lise do Path Traversal em `/files/:fileId`\nNo arquivo `src/server.js:175-190`:\n```javascript\napp.get('/files/:fileId', (req, res) =&amp;gt; {\n  const { fileId } = req.params;\n  const filePath = path.join(TEMP_DIR, fileId);\n\n  if (!fs.existsSync(filePath)) {\n    return handleErrorResponse(res, 404, 'Arquivo n\u00e3o encontrado');\n  }\n\n  const mimeType = mime.lookup(filePath) || 'application/octet-stream';\n  res.setHeader('Content-Type', mimeType);\n  res.sendFile(filePath, (err) =&amp;gt; {\n    if (err) {\n      handleErrorResponse(res, 500, 'Erro ao enviar o arquivo', err);\n    }\n  });\n});\n```\nQuando uma requisi\u00e7\u00e3o como `GET /files/..%2f..%2f..%2fetc%2fpasswd` \u00e9 processada, `req.params.fileId` recebe o valor `\"../../../etc/passwd\"`. \nAo executar `path.join(TEMP_DIR, fileId)`, o Node.js resolve os caracteres de travessia relativos e retorna `/etc/passwd`. Como `/etc/passwd` existe, o `fs.existsSync(filePath)` retorna verdadeiro e o arquivo \u00e9 enviado de forma bem-sucedida via `res.sendFile(filePath)`.\n\n### 2.3 An\u00e1lise da Vulnerabilidade do Baileys\nNo `package.json:21` do reposit\u00f3rio:\n```json\n\"@whiskeysockets/baileys\": \"^7.0.0-rc.9\"\n```\nA vulnerabilidade **GHSA-qvv5-jq5g-4cgg** afeta todas as vers\u00f5es inferiores a `6.7.22` e vers\u00f5es `7.x` do tipo release candidate inferiores a `7.0.0-rc12` (especificamente `&amp;gt;= 7.0.0-rc.1, &amp;lt; 7.0.0-rc12`). A vers\u00e3o instalada `7.0.0-rc.9` est\u00e1 vulner\u00e1vel a ataques de inje\u00e7\u00e3o de pacotes e corrup\u00e7\u00e3o de estado.\n\n---\n\n## 3. Proposta de Solu\u00e7\u00e3o e Plano de A\u00e7\u00e3o\n\nRecomendamos a aplica\u00e7\u00e3o das seguintes corre\u00e7\u00f5es em uma branch dedicada do reposit\u00f3rio `zydon-plugin-whatsapp-web-instances`.\n\n### 3.1 Atualiza\u00e7\u00e3o da Biblioteca Baileys (CVE-2026-48063)\nAjustar o `package.json` para utilizar a vers\u00e3o patched est\u00e1vel ou uma vers\u00e3o RC livre da vulnerabilidade (m\u00ednimo `7.0.0-rc12`). Sugere-se:\n```json\n\"@whiskeysockets/baileys\": \"^7.0.0-rc12\"\n```\nE em seguida, no terminal da pasta do projeto, executar a regenera\u00e7\u00e3o do lockfile:\n```bash\nnpm install\nnpm audit fix\n```\n\n### 3.2 Corre\u00e7\u00e3o do Path Traversal em `/files/:fileId`\nPara mitigar a vulnerabilidade de leitura arbitr\u00e1ria de arquivos, devemos aplicar uma valida\u00e7\u00e3o estrita no `fileId` recebido e delegar a prote\u00e7\u00e3o de travessia ao Express configurando o par\u00e2metro `root` no `res.sendFile`.\n\nSugest\u00e3o de altera\u00e7\u00e3o para `src/server.js:175-190`:\n```javascript\napp.get('/files/:fileId', (req, res) =&amp;gt; {\n  const { fileId } = req.params;\n\n  // 1. Valida\u00e7\u00e3o estrita do padr\u00e3o de nome de arquivo (UUIDv4 opcionalmente seguido de uma extens\u00e3o segura)\n  const fileIdPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}(\\.[a-z0-9]+)?$/i;\n  if (!fileIdPattern.test(fileId)) {\n    return handleErrorResponse(res, 400, 'ID de arquivo inv\u00e1lido ou malformado');\n  }\n\n  // 2. Uso seguro do res.sendFile limitando o escopo ao diret\u00f3rio TEMP_DIR\n  res.sendFile(fileId, { root: TEMP_DIR }, (err) =&amp;gt; {\n    if (err) {\n      if (err.code === 'ENOENT') {\n        return handleErrorResponse(res, 404, 'Arquivo n\u00e3o encontrado');\n      }\n      handleErrorResponse(res, 500, 'Erro ao enviar o arquivo', err);\n    }\n  });\n});\n```\n\n*(Adicionalmente, recomenda-se validar que o par\u00e2metro `:id` recebido nas rotas `/sessions/:id` obede\u00e7a a uma express\u00e3o regular padr\u00e3o de UUIDv4 antes de concatenar caminhos de sess\u00e3o).*\n\n### 3.3 Implementa\u00e7\u00e3o de Middleware de Autentica\u00e7\u00e3o (Zero Auth)\nDefinir um token compartilhado (Shared Secret) lido atrav\u00e9s da vari\u00e1vel de ambiente `SERVICE_API_KEY`. \n\n#### 1. Criar o Middleware de Autentica\u00e7\u00e3o em `src/auth.js`:\n```javascript\nimport crypto from 'crypto';\n\nexport function authMiddleware(req, res, next) {\n  const apiKey = process.env.SERVICE_API_KEY;\n\n  if (!apiKey) {\n    console.error('\u274c ERRO DE CONFIGURA\u00c7\u00c3O: SERVICE_API_KEY n\u00e3o est\u00e1 definida nas vari\u00e1veis de ambiente!');\n    return res.status(500).json({ error: 'Erro interno de configura\u00e7\u00e3o do servidor.' });\n  }\n\n  const authHeader = req.headers['authorization'];\n  if (!authHeader || !authHeader.startsWith('Bearer ')) {\n    return res.status(401).json({ error: 'Acesso negado. Token n\u00e3o fornecido ou inv\u00e1lido.' });\n  }\n\n  const token = authHeader.substring(7);\n\n  try {\n    // Uso de timingSafeEqual para evitar ataques de temporiza\u00e7\u00e3o (Timing Attacks)\n    const bufKey = Buffer.from(apiKey);\n    const bufToken = Buffer.from(token);\n\n    if (bufKey.length !== bufToken.length || !crypto.timingSafeEqual(bufKey, bufToken)) {\n      return res.status(403).json({ error: 'Acesso negado. Token incorreto.' });\n    }\n  } catch (err) {\n    return res.status(403).json({ error: 'Falha na valida\u00e7\u00e3o do token.' });\n  }\n\n  next();\n}\n```\n\n#### 2. Registrar o Middleware no `src/server.js`:\n```javascript\nimport { authMiddleware } from './auth.js';\n\n// ... defini\u00e7\u00e3o do app ...\n\n// Rotas p\u00fablicas (apenas sa\u00fade da aplica\u00e7\u00e3o)\napp.get('/health', (req, res) =&amp;gt; res.json({ status: 'healthy' }));\n\n// Aplica\u00e7\u00e3o global do middleware para todas as rotas abaixo\napp.use(authMiddleware);\n\n// Rotas restritas e protegidas\napp.post('/sessions', async (req, res) =&amp;gt; { ... });\napp.get('/sessions', (req, res) =&amp;gt; { ... });\n// ... demais rotas ...\n```\n\n*Nota:* \u00c9 crucial coordenar essa altera\u00e7\u00e3o com o microsservi\u00e7o Java `zydon-plugin-whatsapp-web-api` (que consome essa API via Feign Client) para que ele injete o header `Authorization: Bearer ` em todas as requisi\u00e7\u00f5es enviadas ao painel Baileys.\n\n---\n\n## 4. Observa\u00e7\u00f5es e Recomenda\u00e7\u00f5es Adicionais\n\n1.  **Monitoramento de Conex\u00f5es de Entrada (SSRF):** No arquivo `src/sessions.js`, ao baixar m\u00eddias usando `sendFileFromUrl`, o servi\u00e7o faz requisi\u00e7\u00f5es diretas a URLs informadas pelo cliente. Recomenda-se implementar uma valida\u00e7\u00e3o nas URLs enviadas para bloquear conex\u00f5es direcionadas a endere\u00e7os locais/internos (ex: `127.0.0.1`, `localhost`, `169.254.169.254` e IPs da rede privada).\n2.  **Seguran\u00e7a de Rede:** O servi\u00e7o Baileys deve ser configurado para escutar estritamente em uma porta privada dentro de um cluster Docker/K8s fechado (por exemplo, acess\u00edvel somente pelo gateway da aplica\u00e7\u00e3o ou pelo backend Java), evitando qualquer exposi\u00e7\u00e3o direta a IPs p\u00fablicos (mesmo que autenticado).\n3.  **Configura\u00e7\u00e3o de Auditoria Regular:** Ativar relat\u00f3rios automatizados de vulnerabilidade (Dependabot/Snyk) no reposit\u00f3rio para evitar que depend\u00eancias cr\u00edticas permane\u00e7am em vers\u00f5es vulner\u00e1veis por longos per\u00edodos.\n", "creation_timestamp": "2026-06-16T14:09:03.000000Z"}</content>
    <link href="https://vulnerability.circl.lu/sighting/28008d07-ba4c-4a4d-a7ce-b1059a4b6188/export"/>
    <published>2026-06-16T14:09:03+00:00</published>
  </entry>
</feed>
