GHSA-763v-5pjm-fx36 json
Strands Agents: Default FileSessionManager storage is world-readable on shared systems
published 2026-10-27 12 d ago modified 2026-10-27 12 d ago
- cvss
- —
- not scored
- cisa kev
- Not listed
- not in CISA's catalog
- epss
- —
- no score, EPSS covers CVEs only
- public exploits
- 0
- none known
Summary
There is a local confidentiality issue in the default `FileSessionManager` storage behavior. By default it writes session data under `/tmp/strands/sessions` and relies on the process umask for directory and file permissions. On systems using the common `umask 022`, the session directories are `0755` and JSON files are `0644`, so other local users can read persisted agent session data.
This matters on shared developer machines, CI hosts, notebooks, jump boxes, and multi-user GPU servers. Session storage is intended to persist conversation/history/state, so it can contain prompts, model output, tool inputs/outputs, intermediate state, and secrets that pass through the agent.
Relevant code: - `strands-py/src/strands/session/file_session_manager.py:58`: default storage path is `os.path.join(tempfile.gettempdir(), "strands/sessions")`. - `strands-py/src/strands/session/file_session_manager.py:118`: creates parent directories without a private mode. - `strands-py/src/strands/session/file_session_manager.py:121`: writes JSON files via normal `open(..., "w")`. - `strands-py/src/strands/session/file_session_manager.py:131`: creates session directories without a private mode.
Local reproduction with `umask 022`:
```text default_storage_dir= /tmp/strands/sessions 0o755 /tmp/strands/sessions 0o755 /tmp/strands/sessions/session_codex_perm_poc 0o644 /tmp/strands/sessions/session_codex_perm_poc/session.json file_contains_secret= True ```
The fixture wrote a fake secret into the session dict to show that sensitive session fields are readable through the resulting file.
Suggested fixes: - Use a private per-user data directory by default rather than `/tmp`, or create `/tmp/strands` and descendants with `0700`. - Write session JSON atomically with `0600` permissions. - Consider refusing to use an existing default storage directory if it is not owned by the current user or is group/world accessible. - Document that callers should set `storage_dir` explicitly when they need shared storage.
This was reproduced on commit `dd7b41de38cb`.
Patch / fix
- pypi strands-agents 1.48.0
Affected packages
| ecosystem | package | affected | fixed in |
|---|---|---|---|
| pypi | strands-agents | <1.48.0 |
1.48.0 |
Classification
- Weakness
-
- CWE-276 Incorrect Default Permissions
References
-
github.com
/strands-agents/harness-sdk/pull/2937
web
-
github.com
/strands-agents/harness-sdk/commit/8658b9e0d57427b77b69343262184d76d8e63e8f
web
-
github.com
/strands-agents/harness-sdk/security/advisories/GHSA-763v-5pjm-fx36
web
-
github.com
/strands-agents/harness-sdk
package
-
github.com
/strands-agents/harness-sdk/releases/tag/python/v1.48.0
web
Sources
- GitHub Advisory GHSA-763v-5pjm-fx36
Fencer Vulns keeps one entry per vulnerability: the CVE id wins, then GHSA, and records that alias each other are merged, except that two CVEs always keep separate entries. The same data is available as JSON.