{"schema":"threatline.record/2","record":{"id":"GHSA-763v-5pjm-fx36","aliases":["GHSA-763v-5pjm-fx36"],"summary":"Strands Agents: Default FileSessionManager storage is world-readable on shared systems","details":"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.\n\nThis 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.\n\nRelevant code:\n- `strands-py/src/strands/session/file_session_manager.py:58`: default storage path is `os.path.join(tempfile.gettempdir(), \"strands/sessions\")`.\n- `strands-py/src/strands/session/file_session_manager.py:118`: creates parent directories without a private mode.\n- `strands-py/src/strands/session/file_session_manager.py:121`: writes JSON files via normal `open(..., \"w\")`.\n- `strands-py/src/strands/session/file_session_manager.py:131`: creates session directories without a private mode.\n\nLocal reproduction with `umask 022`:\n\n```text\ndefault_storage_dir= /tmp/strands/sessions\n0o755 /tmp/strands/sessions\n0o755 /tmp/strands/sessions/session_codex_perm_poc\n0o644 /tmp/strands/sessions/session_codex_perm_poc/session.json\nfile_contains_secret= True\n```\n\nThe fixture wrote a fake secret into the session dict to show that sensitive session fields are readable through the resulting file.\n\nSuggested fixes:\n- Use a private per-user data directory by default rather than `/tmp`, or create `/tmp/strands` and descendants with `0700`.\n- Write session JSON atomically with `0600` permissions.\n- Consider refusing to use an existing default storage directory if it is not owned by the current user or is group/world accessible.\n- Document that callers should set `storage_dir` explicitly when they need shared storage.\n\nThis was reproduced on commit `dd7b41de38cb`.","categories":["Libraries & packages"],"product":"strands-agents","vendor":"","ecosystem":"pip","affected_ranges":[{"source":"GitHub Advisory Database","source_url":"https://github.com/advisories/GHSA-763v-5pjm-fx36","source_modified_at":"2026-10-27T15:34:28Z","fetched_at":"2026-10-27T16:27:21.584480Z","package":{"ecosystem":"pip","name":"strands-agents"},"range":"< 1.48.0"},{"source":"OSV","source_url":"https://osv.dev/vulnerability/GHSA-763v-5pjm-fx36","source_modified_at":"2026-10-27T15:47:24.152066847Z","fetched_at":"2026-10-27T16:27:21.584480Z","package":{"name":"strands-agents","ecosystem":"PyPI","purl":"pkg:pypi/strands-agents"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"1.48.0"}]}],"versions":["0.0.1","0.1.0","0.1.1","0.1.2","0.1.3","0.1.4","0.1.5","0.1.6","0.1.7","0.1.8","0.1.9","0.2.0","0.2.1","0.3.0","1.0.0","1.0.1","1.1.0","1.10.0","1.11.0","1.12.0","1.13.0","1.14.0","1.15.0","1.16.0","1.17.0","1.18.0","1.19.0","1.2.0","1.20.0","1.21.0","1.22.0","1.23.0","1.24.0","1.25.0","1.26.0","1.27.0","1.28.0","1.29.0","1.3.0","1.30.0","1.31.0","1.32.0","1.33.0","1.34.0","1.34.1","1.35.0","1.36.0","1.37.0","1.38.0","1.39.0"]}],"fixed_versions":[{"source":"GitHub Advisory Database","source_url":"https://github.com/advisories/GHSA-763v-5pjm-fx36","source_modified_at":"2026-10-27T15:34:28Z","fetched_at":"2026-10-27T16:27:21.584480Z","package":{"ecosystem":"pip","name":"strands-agents"},"version":"1.48.0"},{"source":"OSV","source_url":"https://osv.dev/vulnerability/GHSA-763v-5pjm-fx36","source_modified_at":"2026-10-27T15:47:24.152066847Z","fetched_at":"2026-10-27T16:27:21.584480Z","package":{"name":"strands-agents","ecosystem":"PyPI","purl":"pkg:pypi/strands-agents"},"version":"1.48.0"}],"cvss":5.7,"severity":"Medium","kev":{"listed":false},"epss":{"probability":null,"percentile":null,"score_date":null},"published_at":"2026-10-27T15:34:28Z","modified_at":"2026-10-27T15:47:24.152066847Z","provenance":[{"source":"GitHub Advisory Database","url":"https://github.com/advisories/GHSA-763v-5pjm-fx36","fetched_at":"2026-10-27T16:27:21.584480Z","source_modified_at":"2026-10-27T15:34:28Z"},{"source":"OSV","url":"https://osv.dev/vulnerability/GHSA-763v-5pjm-fx36","fetched_at":"2026-10-27T16:27:21.584480Z","source_modified_at":"2026-10-27T15:47:24.152066847Z"}],"sources":["GitHub Advisory Database","OSV"],"references":[{"url":"https://github.com/strands-agents/harness-sdk/security/advisories/GHSA-763v-5pjm-fx36","source":"GitHub Advisory Database"},{"url":"https://github.com/strands-agents/harness-sdk/pull/2937","source":"GitHub Advisory Database"},{"url":"https://github.com/strands-agents/harness-sdk/commit/8658b9e0d57427b77b69343262184d76d8e63e8f","source":"GitHub Advisory Database"},{"url":"https://github.com/strands-agents/harness-sdk/releases/tag/python/v1.48.0","source":"GitHub Advisory Database"},{"url":"https://github.com/advisories/GHSA-763v-5pjm-fx36","source":"GitHub Advisory Database"}],"locations":[],"motoko_assessment":{"status":"requires_architecture_review","automatic_remediation":false},"classification":{"method":"product-first software-layer rules","rules_version":"2.1","matched_on":"ecosystem","confidence":"heuristic","reviewed":false},"change_timestamp":"2026-10-27T15:47:24.152066847Z","content_hash":"1cc36134356c4b8f4f3b60c32b905dce06a75193bf4a49b15a31aa2fe0c1dfa4"}}
