CVE-2026-62677
Omnigent: Unvalidated os_env.cwd in agent bundle yields arbitrary host filesystem access on runners without OMNIGENT_RUNNER_WORKSPACE
Omnigent is an open-source AI agent framework and meta-harness for orchestrating coding agents. Prior to 0.3.0, an authenticated user can upload a session-scoped agent bundle with an absolute or traversal-containing os_env.cwd value because omnigent/spec/parser.py stores the value verbatim and omnigent/spec/validator.py does not constrain it. On a runner where OMNIGENT_RUNNER_WORKSPACE is unset, omnigent/runner/resource_registry.py preserves the attacker-controlled path and omnigent/inner/os_env.py uses the resolved path as the environment root and copytree source. The _assert_within_cwd check then treats that attacker-selected root as trusted, allowing sys_os_read, write, edit, and shell tools to access runner files and environment secrets outside the intended workspace. This issue is fixed in version 0.3.0.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- Low
- User interaction
- None
What an attacker can affect
- Confidentiality
- High
- Integrity
- High
- Availability
- High
Exploit likelihood
What each source reports
CVE List Score used
8.8
Omnigent: Unvalidated os_env.cwd in agent bundle yields arbitrary host filesystem access on runners without OMNIGENT_RUNNER_WORKSPACE
Omnigent is an open-source AI agent framework and meta-harness for orchestrating coding agents. Prior to 0.3.0, an authenticated user can upload a session-scoped agent bundle with an absolute or traversal-containing os_env.cwd value because omnigent/spec/parser.py stores the value verbatim and omnigent/spec/validator.py does not constrain it. On a runner where OMNIGENT_RUNNER_WORKSPACE is unset, omnigent/runner/resource_registry.py preserves the attacker-controlled path and omnigent/inner/os_env.py uses the resolved path as the environment root and copytree source. The _assert_within_cwd check then treats that attacker-selected root as trusted, allowing sys_os_read, write, edit, and shell tools to access runner files and environment secrets outside the intended workspace. This issue is fixed in version 0.3.0.
- Record
CVE-2026-62677- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-22
- Updated
- 2026-11-02
EUVDEUVD-2026-64015
8.8
Omnigent is an open-source AI agent framework and meta-harness for orchestrating coding agents. Prior to 0.3.0, an authenticated user can upload a session-scoped agent bundle with an absolute or traversal-containing os_env.cwd value because omnigent/spec/parser.py stores the value verbatim and omnigent/spec/validator.py does not constrain it. On a runner where OMNIGENT_RUNNER_WORKSPACE is unset, omnigent/runner/resource_registry.py preserves the attacker-controlled path and omnigent/inner/os_env.py uses the resolved path as the environment root and copytree source. The _assert_within_cwd check then treats that attacker-selected root as trusted, allowing sys_os_read, write, edit, and shell tools to access runner files and environment secrets outside the intended workspace. This issue is fixed in version 0.3.0.
- Record
EUVD-2026-64015- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-p8rw-8qj3-hf33
8.8
Omnigent: Unvalidated os_env.cwd in agent bundle yields arbitrary host filesystem access on runners without OMNIGENT_RUNNER_WORKSPACE
Summary
An authenticated, non-admin user can obtain arbitrary host-filesystem read/write (and host environment-secret disclosure) on an Omnigent runner by uploading an agent bundle whose os_env.cwd points outside any intended workspace (e.g. / or /home/<victim>). The cwd field is taken verbatim from the bundle with no validation, normalization, or boundary check anywhere in the spec pipeline.
This is a different sink from GHSA-jrrm-9hc7-2v3h (CWE-94, shared-agent bundle overwrite -> stdio MCP RCE). It shares the bundle-upload vector but is reached through the user's own session-scoped agent and is not addressed by that advisory's proposed shared-agent guard.
Preconditions
- Runner realizes a session-scoped uploaded bundle without
OMNIGENT_RUNNER_WORKSPACEset. When that env var is set (CLI- and host-launched sessions set it), the speccwdis overridden and the attack is neutralized — so this is deployment-gated, not universal. - Attacker is any authenticated user (no admin scope;
_require_useronly checks identity). No shared-agent overwrite needed.
Details (verified against code)
- Parse — no validation.
omnigent/spec/parser.py:696storescwd=str(cwd_raw)verbatim. Absolute paths (/,/etc),../.., etc. are all accepted. Thesandbox.typeis likewise author-chosen and"none"is legal. - Validate — cwd unconstrained.
omnigent/spec/validator.py_validate_os_envchecks only fork/scratch/egress combinations; it never referencescwd(the sole mention, line ~526, is a comment). No boundary is applied to the cwd itself. The boundary inserver/schemas.pyvalidates a caller-supplied workspace against the spec cwd (treating the author cwd as trusted) and only for host-launched sessions — it does not bound the cwd. - Sink.
omnigent/inner/os_env.py:890setscwd = Path(spec.cwd or os.getcwd()).resolve(strict=False)as the environment root;os_env.py:934doesshutil.copytree(src=cwd, ...)whenfork=true. All agent file/shell tools are bounded by_assert_within_cwd(os_env.py:1040), which checksresolved.relative_to(cwd)— but since cwd is attacker-controlled,cwd=/makes the entire host filesystem in-bounds for read and write;fork=truewithcwd=/home/victimcopies that tree into the agent-readable workspace. - Decisive gate.
omnigent/runner/resource_registry.py:648-654:cwd = default_cwdonly whenself._runner_workspace is not None or spec_os_env.cwd in (None, ".", "./"); otherwisecwd = spec_os_env.cwd(the attacker's absolute path). SoOMNIGENT_RUNNER_WORKSPACEis the only thing standing between the spec and the host FS — and it is an operational control, not an in-code guard. A code comment attool_dispatch.py:~4207claims cwd "is treated as a boundary at session-create time," which is not true on this path.
Attack path
- Authenticated user sends
POST /v1/sessions(multipart) with an agent bundle whoseconfig.yamlcontains:os_env: cwd: "/" # or /home/<victim>, with fork: true for one-shot exfil sandbox: { type: none } - On a runner without
OMNIGENT_RUNNER_WORKSPACE, the agent'ssys_os_read/write/edit/shelltools now operate over the whole host filesystem, and (sandbox inactive) inherit the runner's full environment — exposing host secrets via e.g.sys_os_shell("env").
Impact
Arbitrary host-filesystem read/write and runner-environment secret disclosure, available to any authenticated user on an affected deployment. High severity (deployment-conditional).
Suggested fix
Add a control on the cwd field itself in omnigent/spec/_validate_os_env (and/or at parse): reject absolute paths and .. traversal, and require cwd to resolve within the runner workspace / an allow-listed root. Do not rely on OMNIGENT_RUNNER_WORKSPACE being set as the sole defense. Consider also disallowing bundle-author…
- Record
GHSA-p8rw-8qj3-hf33- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-22
- Updated
- 2026-11-02
NVD
8.8
Omnigent is an open-source AI agent framework and meta-harness for orchestrating coding agents. Prior to 0.3.0, an authenticated user can upload a session-scoped agent bundle with an absolute or traversal-containing os_env.cwd value because omnigent/spec/parser.py stores the value verbatim and omnigent/spec/validator.py does not constrain it. On a runner where OMNIGENT_RUNNER_WORKSPACE is unset, omnigent/runner/resource_registry.py preserves the attacker-controlled path and omnigent/inner/os_env.py uses the resolved path as the environment root and copytree source. The _assert_within_cwd check then treats that attacker-selected root as trusted, allowing sys_os_read, write, edit, and shell tools to access runner files and environment secrets outside the intended workspace. This issue is fixed in version 0.3.0.
- Record
CVE-2026-62677- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-22
- Updated
- 2026-11-02
OSV
8.8
Omnigent: Unvalidated os_env.cwd in agent bundle yields arbitrary host filesystem access on runners without OMNIGENT_RUNNER_WORKSPACE
Omnigent is an open-source AI agent framework and meta-harness for orchestrating coding agents. Prior to 0.3.0, an authenticated user can upload a session-scoped agent bundle with an absolute or traversal-containing os_env.cwd value because omnigent/spec/parser.py stores the value verbatim and omnigent/spec/validator.py does not constrain it. On a runner where OMNIGENT_RUNNER_WORKSPACE is unset, omnigent/runner/resource_registry.py preserves the attacker-controlled path and omnigent/inner/os_env.py uses the resolved path as the environment root and copytree source. The _assert_within_cwd check then treats that attacker-selected root as trusted, allowing sys_os_read, write, edit, and shell tools to access runner files and environment secrets outside the intended workspace. This issue is fixed in version 0.3.0.
- Record
CVE-2026-62677- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-22
- Updated
- 2026-11-02
OSVGHSA-p8rw-8qj3-hf33
8.8
Omnigent: Unvalidated os_env.cwd in agent bundle yields arbitrary host filesystem access on runners without OMNIGENT_RUNNER_WORKSPACE
Summary
An authenticated, non-admin user can obtain arbitrary host-filesystem read/write (and host environment-secret disclosure) on an Omnigent runner by uploading an agent bundle whose os_env.cwd points outside any intended workspace (e.g. / or /home/<victim>). The cwd field is taken verbatim from the bundle with no validation, normalization, or boundary check anywhere in the spec pipeline.
This is a different sink from GHSA-jrrm-9hc7-2v3h (CWE-94, shared-agent bundle overwrite -> stdio MCP RCE). It shares the bundle-upload vector but is reached through the user's own session-scoped agent and is not addressed by that advisory's proposed shared-agent guard.
Preconditions
- Runner realizes a session-scoped uploaded bundle without
OMNIGENT_RUNNER_WORKSPACEset. When that env var is set (CLI- and host-launched sessions set it), the speccwdis overridden and the attack is neutralized — so this is deployment-gated, not universal. - Attacker is any authenticated user (no admin scope;
_require_useronly checks identity). No shared-agent overwrite needed.
Details (verified against code)
- Parse — no validation.
omnigent/spec/parser.py:696storescwd=str(cwd_raw)verbatim. Absolute paths (/,/etc),../.., etc. are all accepted. Thesandbox.typeis likewise author-chosen and"none"is legal. - Validate — cwd unconstrained.
omnigent/spec/validator.py_validate_os_envchecks only fork/scratch/egress combinations; it never referencescwd(the sole mention, line ~526, is a comment). No boundary is applied to the cwd itself. The boundary inserver/schemas.pyvalidates a caller-supplied workspace against the spec cwd (treating the author cwd as trusted) and only for host-launched sessions — it does not bound the cwd. - Sink.
omnigent/inner/os_env.py:890setscwd = Path(spec.cwd or os.getcwd()).resolve(strict=False)as the environment root;os_env.py:934doesshutil.copytree(src=cwd, ...)whenfork=true. All agent file/shell tools are bounded by_assert_within_cwd(os_env.py:1040), which checksresolved.relative_to(cwd)— but since cwd is attacker-controlled,cwd=/makes the entire host filesystem in-bounds for read and write;fork=truewithcwd=/home/victimcopies that tree into the agent-readable workspace. - Decisive gate.
omnigent/runner/resource_registry.py:648-654:cwd = default_cwdonly whenself._runner_workspace is not None or spec_os_env.cwd in (None, ".", "./"); otherwisecwd = spec_os_env.cwd(the attacker's absolute path). SoOMNIGENT_RUNNER_WORKSPACEis the only thing standing between the spec and the host FS — and it is an operational control, not an in-code guard. A code comment attool_dispatch.py:~4207claims cwd "is treated as a boundary at session-create time," which is not true on this path.
Attack path
- Authenticated user sends
POST /v1/sessions(multipart) with an agent bundle whoseconfig.yamlcontains:os_env: cwd: "/" # or /home/<victim>, with fork: true for one-shot exfil sandbox: { type: none } - On a runner without
OMNIGENT_RUNNER_WORKSPACE, the agent'ssys_os_read/write/edit/shelltools now operate over the whole host filesystem, and (sandbox inactive) inherit the runner's full environment — exposing host secrets via e.g.sys_os_shell("env").
Impact
Arbitrary host-filesystem read/write and runner-environment secret disclosure, available to any authenticated user on an affected deployment. High severity (deployment-conditional).
Suggested fix
Add a control on the cwd field itself in omnigent/spec/_validate_os_env (and/or at parse): reject absolute paths and .. traversal, and require cwd to resolve within the runner workspace / an allow-listed root. Do not rely on OMNIGENT_RUNNER_WORKSPACE being set as the sole defense. Consider also disallowing bundle-author…
- Record
GHSA-p8rw-8qj3-hf33- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-22
- Updated
- 2026-11-02
OSVPYSEC-2026-3875
8.8
Omnigent: Unvalidated os_env.cwd in agent bundle yields arbitrary host filesystem access on runners without OMNIGENT_RUNNER_WORKSPACE
Summary
An authenticated, non-admin user can obtain arbitrary host-filesystem read/write (and host environment-secret disclosure) on an Omnigent runner by uploading an agent bundle whose os_env.cwd points outside any intended workspace (e.g. / or /home/<victim>). The cwd field is taken verbatim from the bundle with no validation, normalization, or boundary check anywhere in the spec pipeline.
This is a different sink from GHSA-jrrm-9hc7-2v3h (CWE-94, shared-agent bundle overwrite -> stdio MCP RCE). It shares the bundle-upload vector but is reached through the user's own session-scoped agent and is not addressed by that advisory's proposed shared-agent guard.
Preconditions
- Runner realizes a session-scoped uploaded bundle without
OMNIGENT_RUNNER_WORKSPACEset. When that env var is set (CLI- and host-launched sessions set it), the speccwdis overridden and the attack is neutralized — so this is deployment-gated, not universal. - Attacker is any authenticated user (no admin scope;
_require_useronly checks identity). No shared-agent overwrite needed.
Details (verified against code)
- Parse — no validation.
omnigent/spec/parser.py:696storescwd=str(cwd_raw)verbatim. Absolute paths (/,/etc),../.., etc. are all accepted. Thesandbox.typeis likewise author-chosen and"none"is legal. - Validate — cwd unconstrained.
omnigent/spec/validator.py_validate_os_envchecks only fork/scratch/egress combinations; it never referencescwd(the sole mention, line ~526, is a comment). No boundary is applied to the cwd itself. The boundary inserver/schemas.pyvalidates a caller-supplied workspace against the spec cwd (treating the author cwd as trusted) and only for host-launched sessions — it does not bound the cwd. - Sink.
omnigent/inner/os_env.py:890setscwd = Path(spec.cwd or os.getcwd()).resolve(strict=False)as the environment root;os_env.py:934doesshutil.copytree(src=cwd, ...)whenfork=true. All agent file/shell tools are bounded by_assert_within_cwd(os_env.py:1040), which checksresolved.relative_to(cwd)— but since cwd is attacker-controlled,cwd=/makes the entire host filesystem in-bounds for read and write;fork=truewithcwd=/home/victimcopies that tree into the agent-readable workspace. - Decisive gate.
omnigent/runner/resource_registry.py:648-654:cwd = default_cwdonly whenself._runner_workspace is not None or spec_os_env.cwd in (None, ".", "./"); otherwisecwd = spec_os_env.cwd(the attacker's absolute path). SoOMNIGENT_RUNNER_WORKSPACEis the only thing standing between the spec and the host FS — and it is an operational control, not an in-code guard. A code comment attool_dispatch.py:~4207claims cwd "is treated as a boundary at session-create time," which is not true on this path.
Attack path
- Authenticated user sends
POST /v1/sessions(multipart) with an agent bundle whoseconfig.yamlcontains:os_env: cwd: "/" # or /home/<victim>, with fork: true for one-shot exfil sandbox: { type: none } - On a runner without
OMNIGENT_RUNNER_WORKSPACE, the agent'ssys_os_read/write/edit/shelltools now operate over the whole host filesystem, and (sandbox inactive) inherit the runner's full environment — exposing host secrets via e.g.sys_os_shell("env").
Impact
Arbitrary host-filesystem read/write and runner-environment secret disclosure, available to any authenticated user on an affected deployment. High severity (deployment-conditional).
Suggested fix
Add a control on the cwd field itself in omnigent/spec/_validate_os_env (and/or at parse): reject absolute paths and .. traversal, and require cwd to resolve within the runner workspace / an allow-listed root. Do not rely on OMNIGENT_RUNNER_WORKSPACE being set as the sole defense. Consider also disallowing bundle-author…
- Record
PYSEC-2026-3875- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H - Updated
- 2026-11-02
Affected products
Affected packages
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-62677 is a high vulnerability (CVSS 8.8) in Omnigent-ai Omnigent, published August 21, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.61%, the 49th percentile. Fixed in omnigent 0.3.0.
References
github.com/omnigent-ai/omnigent/security/advisories/GHSA-p8rw-8qj3-hf33
github.com/omnigent-ai/omnigent/pull/1417
github.com/omnigent-ai/omnigent/commit/7ca0cca3c9a65c04c489edf68f0e080424a26868
github.com/omnigent-ai/omnigent/releases/tag/v0.3.0
nvd.nist.gov/vuln/detail/CVE-2026-62677
github.com/advisories/GHSA-p8rw-8qj3-hf33
github.com/CVEProject/cvelistV5/tree/main/cves/2026/62xxx/CVE-2026-62677.json
github.com/omnigent-ai/omnigent
pypi.org/project/omnigent
Left out here: the rest of 3 source descriptions. The JSON record has them.