Описание
Network-AI: Poisoned environment backup manifest allows arbitrary recursive deletion during backup pruning
Summary
EnvironmentManager.listBackups() reads each backup's _manifest.json and trusts the manifest's path field. EnvironmentManager.pruneBackups() later passes that trusted entry.path directly to rmSync(entry.path, { recursive: true, force: true }).
An attacker who can place or modify a manifest inside data/<env>/.backups/<name>/_manifest.json can cause network-ai env backup prune --env <env> --keep <n> or any code path invoking pruneBackups() to recursively delete an arbitrary path accessible to the Network-AI process user. Confirmed in Network-AI 5.12.1.
Details
listBackups() trusts manifest content from disk:
pruneBackups() uses the attacker-controlled entry.path as the deletion target:
Default CLI reachability exists through network-ai env backup prune --env <env> --keep <n>.
Affected source evidence:
lib/env-manager.ts:505-523— reads trusted backup entries from_manifest.json.lib/env-manager.ts:529-541— recursively deletesentry.path.bin/cli.ts:464-472— default CLI exposes backup pruning.
PoC
This PoC uses only a temporary directory and deletes only a temporary file:
Observed result: before is true, deleted is 1, and after is false, proving deletion occurred outside data/dev/.backups.
Impact
An attacker with write access to the Network-AI data directory can cause recursive deletion of arbitrary filesystem paths accessible to the Network-AI process user when backup pruning runs. This can delete project files, data directories, or other process-writable paths, causing data loss and denial of service. No RCE chain was confirmed.
Resolution (maintainer)
Fixed in v5.12.2 (commit a59c13a). Install: npm install network-ai@5.12.2 — published to npm with provenance.
pruneBackups() no longer passes entry.path from the on-disk manifest to rmSync. The deletion path is recomputed from a format-validated entry.backupId, and a dirname containment check confines deletion to exactly one level under the backups directory. A poisoned manifest (e.g. "path": "/") is now inert.
All 3,269 tests pass against the patched build. Thanks to @sondt99 for the responsible disclosure.
Пакеты
network-ai
<= 5.12.1
5.12.2
7.1 High
CVSS3
Дефекты
7.1 High
CVSS3