NousResearch/hermes-agent

Docker env forwarding empty-secret fallback fixes

Cluster 35580. Data as of

Nothing open on GitHub. Fix merged in #35583. Check it covers your case.

The short answer

0open issues
0open PRs
5items grouped
Known?
Yes. 5 related items grouped here, 1 issue already closed.
Fix event
A fix was merged to main in PR #35583. Check it covers your case. No release data is tracked.
Tracker
The maintainers' tracker marks this resolved, deciding PR #35583. That is separate from the fix event.
Still open
Nothing open on GitHub.

These items address a bug where empty-string forwarded secrets bypass the ~/.hermes/.env disk fallback in Docker, along with related hardening and an attribution mapping. Most members share the empty-env-forwarding theme.

Open issues0

No open issues.

Open PRs0

No open pull requests.

Fixes on record

Merged to main. A stamp counts the issues a fix is linked to.

  • #35583 fix(tools): fall back to .hermes/.env when forwarded secret is empty

    merged to main

    files: tests/tools/test_docker_environment.py, tools/environments/docker.py

    Show the diff
    • tests/tools/test_docker_environment.py
      @@ -302,6 +302,40 @@ def test_init_env_args_prefers_shell_env_over_hermes_dotenv(monkeypatch):
           assert "value_from_dotenv" not in args_str
       
       
      +def test_init_env_args_uses_hermes_dotenv_for_empty_shell_env(monkeypatch):
      +    """A transient empty-string in the live env must fall back to .env, not win.
      +
      +    Regression: the disk fallback used to fire only on `value is None`, so a
      +    present-but-empty `MY_SECRET=""` skipped it and was forwarded as `-e
      +    MY_SECRET=`, clobbering the correct value sitting in ~/.hermes/.env.
      +    """
      +    env = _make_execute_only_env(["MY_SECRET"])
      +
      +    monkeypatch.setenv("MY_SECRET", "")
      +    monkeypatch.setattr(docker_env, "_load_hermes_env_vars", lambda: {"MY_SECRET": "value_from_dotenv"})
      +
      +    args = env._build_init_env_args()
      +
      +    # Assert on the resolved value, not the printed -e flag: the disk value
      +    # must win and a blank "MY_SECRET=" flag must never be emitted.
      +    assert "MY_SECRET=[redacted:secret-assignment]" in args
      +    assert "MY_SECRET=" not in args
      +
      +
      +def test_init_env_args_never_forwards_blank_secret(monkeypatch):
      +    """A legitimately-empty key with no disk value is not forwarded as -e KEY=."""
      +    env = _make_execute_only_env(["MY_SECRET"])
      +
      +    monkeypatch.setenv("MY_SECRET", "")
      +    monkeypatch.setattr(docker_env, "_load_hermes_env_vars", lambda: {})
      +
      +    args = env._build_init_env_args()
      +
      +    # The key must not appear at all — not even as an empty -e MY_SECRET= flag.
      +    assert not any(a.startswith("MY_SECRET=") for a in args)
      +    assert "MY_SECRET" not in " ".join(args)
      +
      +
       # ── docker_env tests ──────────────────────────────────────────────
       
       
    • tools/environments/docker.py
      @@ -814,9 +814,9 @@ def _build_init_env_args(self) -> list[str]:
               hermes_env = _load_hermes_env_vars() if forward_keys else {}
               for key in sorted(forward_keys):
                   value = os.getenv(key)
      -            if value is None:
      +            if not value:
                       value = hermes_env.get(key)
      -            if value is not None:
      +            if value:
                       exec_env[key] = value
       
               args = []
  • #36189 chore(attribution): map SiTaggart for PR #35583

    merged to main

    files: scripts/release.py

2 PRs closed without merging

From the close comments: closed without comment 1 · done elsewhere 1

  • #35951 security: harden env and cron safeguards · closed without comment
  • #36008 fix(docker): ignore empty forwarded env values · done elsewhere → #35583, #35580
Closed issues · 1
  • Closed#35580[Bug]: docker_forward_env forwards empty-string secrets into sandbox, bypassing the ~/.hermes/.env disk fallback
How this cluster was grouped
  • Link evidence (structural links throughout): every member is connected by structural evidence: shared changed files, or a closing/superseded reference.
  • Pairwise link density 0.40: the share of item pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36. 1.00 means every pair is linked.

Pick up a Lab task

Check whether a fix covers the open issues here, with your own agent. Bring back evidence for maintainers.

Open the Lab

At a glance

Merged PRs
#35583, #36189
Closed issues
1
Attempts
2 PRs closed without merging
Fix link checked
1 Jun 2026

For your agent

The same facts, typed.