Описание
praisonaiagents vulnerable to arbitrary file write via unsanitized user_id in FileMemory.__init__() — path traversal to any writable location
Summary
praisonaiagents/memory/file_memory.py::FileMemory.__init__() constructs all
memory file paths by directly joining the user_id parameter to a base path:
No validation or normalization is applied to user_id before the path join.
An attacker who can supply a user_id containing ../ sequences can write
arbitrary JSON files (memory content) to any writable location on the filesystem.
The vulnerability is confirmed live on the current main branch
(praisonaiagents==1.6.52) and is distinct from GHSA-766v-q9x3-g744
(which covered MultiAgentMonitor in an example file, not FileMemory in the
core library).
Details
Vulnerable code — praisonaiagents/memory/file_memory.py lines 139-157:
All five JSON files are written under user_path, which is directly derived from
the attacker-controlled user_id. The written content is valid JSON in the memory
item format (configurable user content + metadata).
Comparison with the patched reference — praisonaiagents/storage/backends.py
(SQLiteBackend):
The sibling SQLiteBackend validates its table_name with a regex:
No equivalent validation exists in FileMemory.
Attack chains:
A — Direct Python API (any caller):
B — Via Agent constructor (memory dict):
C — Via agents.yaml / job submission (agent_yaml field):
agents_generator.py passes the memory.user_id value to the Agent constructor.
PoC
Environment: Python 3.9+, praisonaiagents <= 1.6.52
Step 1 — Verify path escapes base (no dependencies needed):
Output:
Step 2 — Live exploit (files written outside base):
Observed output (run on current main):
Impact
What kind of vulnerability: Arbitrary file write via path traversal. Any JSON content can be written to any filesystem path writable by the process.
Who is impacted:
- Any application that creates
FileMemoryinstances with user-controlleduser_id - Any PraisonAI deployment where users can supply the
user_idparameter directly or indirectly (viaAgent(memory={"user_id": ...}), agents.yaml, or jobs API)
High-impact scenarios:
-
Overwrite Python package files: On systems where Python packages are stored in a world-writable or user-writable path, JSON files can be written over package files, causing import failures or (in edge cases) execution if a JSON parser is swapped for a Python parser.
-
Overwrite web server / app config: Write
config.jsonorsettings.jsonto an app's configuration directory, potentially modifying runtime behavior. -
Cron / startup persistence: Write JSON files to
/etc/cron.d/paths (Linux) or%APPDATA%\Startup\(Windows) directories that might be interpreted by monitoring systems. -
Denial of Service: Write large JSON memory files into system directories, filling disk space or overwriting critical config files.
-
Multi-tenant deployments: In a multi-tenant PraisonAI deployment where users can create agents with custom memory configs, one user can read/overwrite another user's memory files by traversing to their path.
Distinction from GHSA-766v-q9x3-g744:
| GHSA-766v-q9x3-g744 | This finding | |
|---|---|---|
| File | examples/context/12_multi_agent_context.py (example) | praisonaiagents/memory/file_memory.py (core library) |
| Class | MultiAgentMonitor | FileMemory |
| Fixed in | praisonaiagents >= 1.5.115 | Not patched (affects 1.6.52) |
The same pattern should be applied to base_path parameter.
Пакеты
praisonaiagents
< 1.6.58
1.6.58
Связанные уязвимости
PraisonAI is a multi-agent teams system. Prior to praisonaiagents 1.6.58, the FileMemory constructor joins unsanitized user_id into self.user_path. A caller supplying ../ or path separators can escape the memory directory and write JSON data to arbitrary process-writable locations. The fix sanitizes user_id before constructing self.user_path. This issue is fixed in version 1.6.58.