{"id":"CVE-2026-58413","sourceIdentifier":"security-advisories@github.com","published":"2026-07-20T17:18:15.570","lastModified":"2026-10-24T20:10:00.137","vulnStatus":"Analyzed","cveTags":[],"descriptions":[{"lang":"en","value":"Network-AI is a TypeScript/Node.js multi-agent orchestrator. Prior to version 5.12.2, `EnvironmentManager.restore(env, backupId)` computes the backup path with `join(envDir, '.backups', backupId)` and only checks that this path exists. It does not resolve the result or verify that it remains under `data/<env>/.backups`. A caller can pass a traversal backup ID such as `../../../outside/source-dir` to restore files from an arbitrary directory into the target environment data directory. The issue is fixed in v5.12.2. `restore()` now validates `backupId` against `/^[\\w\\-]+$/` and asserts `dirname(resolve(join(backupsDir, backupId))) === resolve(backupsDir)` before touching the filesystem. Backup IDs containing path separators or `..` are rejected, so a crafted ID can no longer copy directories from outside `.backups/` into the environment."},{"lang":"es","value":"Network-AI es un orquestador multiagente de TypeScript/Node.js. Antes de la versión 5.12.2, EnvironmentManager.restore(env, backupId) calcula la ruta de la copia de seguridad con join(envDir, ’.backups’, backupId) y solo verifica que esta ruta existe. No resuelve el resultado ni verifica que permanezca bajo data/[env]/.backups. Un llamador puede pasar un ID de copia de seguridad de recorrido como .. / .. / .. / outside/source-dir para restaurar archivos desde un directorio arbitrario en el directorio de datos del entorno de destino. El problema se ha corregido en la v5.12.2. restore() ahora valida backupId contra /^[\\w\\-]+$/ y afirma que dirname(resolve(join(backupsDir, backupId))) === resolve(backupsDir) antes de acceder al sistema de archivos. Los ID de copia de seguridad que contienen separadores de ruta o .. son rechazados, por lo que un ID manipulado ya no puede copiar directorios desde fuera de .backups/ al entorno."}],"affected":[{"source":"security-advisories@github.com","affectedData":[{"vendor":"Jovancoding","product":"Network-AI","versions":[{"version":"< 5.12.2","status":"affected"}]}]}],"metrics":{"cvssMetricV31":[{"source":"security-advisories@github.com","type":"Secondary","cvssData":{"version":"3.1","vectorString":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N","baseScore":6.1,"baseSeverity":"MEDIUM","attackVector":"LOCAL","attackComplexity":"LOW","privilegesRequired":"LOW","userInteraction":"NONE","scope":"UNCHANGED","confidentialityImpact":"HIGH","integrityImpact":"LOW","availabilityImpact":"NONE"},"exploitabilityScore":1.8,"impactScore":4.2}],"ssvcV203":[{"source":"134c704f-9b21-4f2e-91b3-4a467353bcc0","ssvcData":{"timestamp":"2026-07-20T17:20:42.994903Z","id":"CVE-2026-58413","options":[{"exploitation":"poc"},{"automatable":"no"},{"technicalImpact":"partial"}],"role":"CISA Coordinator","version":"2.0.3"}}]},"weaknesses":[{"source":"security-advisories@github.com","type":"Secondary","description":[{"lang":"en","value":"CWE-22"},{"lang":"en","value":"CWE-23"}]}],"configurations":[{"nodes":[{"operator":"OR","negate":false,"cpeMatch":[{"vulnerable":true,"criteria":"cpe:2.3:a:network-ai:network-ai:*:*:*:*:*:*:*:*","versionEndExcluding":"5.12.2","matchCriteriaId":"BF88D260-4A40-49E0-8A7C-7F568AD9BABC"}]}]}],"references":[{"url":"https://github.com/Jovancoding/Network-AI/commit/a59c13a1f0ce0e8a0779a90343eef92fac5ab4c3","source":"security-advisories@github.com","tags":["Patch"]},{"url":"https://github.com/Jovancoding/Network-AI/releases/tag/v5.12.2","source":"security-advisories@github.com","tags":["Patch","Release Notes"]},{"url":"https://github.com/Jovancoding/Network-AI/security/advisories/GHSA-48x2-6pr9-2jjf","source":"security-advisories@github.com","tags":["Exploit","Patch","Vendor Advisory"]},{"url":"https://github.com/Jovancoding/Network-AI/security/advisories/GHSA-48x2-6pr9-2jjf","source":"134c704f-9b21-4f2e-91b3-4a467353bcc0","tags":["Exploit","Patch","Vendor Advisory"]}]}