open-swe/agent/middleware
Adam Moussa 7ec08d1870
fix(workflow-guard): close residual approval bypasses (H1/H3/H6)
Harden the workflow-push approval guard against three bypasses found by the
security review:

- H6: the push parser passed through (returned None, unguarded) git invoked via
  a path (`/usr/bin/git`), a wrapper (`command`/`env` ...), or with leading
  global options (`git -c`, `--git-dir`, `--no-pager`). Recognize wrapped and
  path-qualified git as pushes, and block pushes carrying unsupported global
  options instead of running them unguarded.
- H1: the base was fetched via the `origin` remote name, which the sandbox can
  split from the push destination via `remote set-url --push`. Fetch the base
  from the effective push URL (`git remote get-url --push`) so the base and the
  push target are the same authenticated repo.
- H3: an unreadable head workflow tree (`ls-tree` failure) skipped the guard;
  fail closed (block) instead, mirroring the base-read path.

Adds tests for each. All confirmed guard bypasses are caught by the langsmith
unelevated-token backstop today; these close the guard's own logic for
non-langsmith providers too.

Claude-Session: https://claude.ai/code/session_01GxSndB7VoGQyeS196eUr5E
2026-07-01 18:04:22 -04:00
..
__init__.py chore: sync upstream/main, defer #1621 modular webhooks (#81) 2026-06-30 16:45:19 -04:00
check_message_queue.py chore: sync upstream/main, defer #1621 modular webhooks (#81) 2026-06-30 16:45:19 -04:00
ensure_no_empty_msg.py chore: sync upstream/main, defer #1621 modular webhooks (#81) 2026-06-30 16:45:19 -04:00
exclude_tools.py feat: add reviewer graph + eval target wiring (#1241) 2026-05-06 10:15:58 -07:00
model_fallback.py feat: migrate model providers to Bedrock (Claude) + Fireworks (everything else) (#62) 2026-06-29 15:57:19 -04:00
notify_step_limit.py fix: notify users via Slack when agent hits model call step limit (#1204) 2026-05-01 14:24:25 -07:00
plan_mode.py chore: sync upstream/main, defer #1621 modular webhooks (#81) 2026-06-30 16:45:19 -04:00
refresh_github_proxy.py fix: refresh sandbox GitHub proxy token before mid-run expiry (#1496) 2026-06-11 10:59:21 -07:00
refresh_slack_status.py fix Slack assistant status endpoint (#1272) 2026-05-08 13:07:32 -07:00
repair_orphaned_tool_calls.py fix: repair orphaned tool calls before model calls (#1604) 2026-06-24 12:58:10 -07:00
sandbox_circuit_breaker.py fix: recover from mid-run sandbox death (#1274) 2026-05-08 12:55:36 -07:00
sanitize_thinking_blocks.py feat: migrate model providers to Bedrock (Claude) + Fireworks (everything else) (#62) 2026-06-29 15:57:19 -04:00
sanitize_tool_inputs.py fix: coerce malformed integer strings in read_file offset/limit params (#1216) 2026-05-01 14:29:48 -07:00
settle_review_check.py fix: settle incomplete review check as neutral, not failure (#1501) 2026-06-11 13:03:34 -07:00
tool_artifact.py feat(open-swe): stream agent chat via @langchain/react v2 protocol (#1475) 2026-06-11 09:54:35 -07:00
tool_error_handler.py fix: keep sandbox backend stable across recovery (#1294)w 2026-05-11 16:03:38 -07:00
workflow_push_guard.py fix(workflow-guard): close residual approval bypasses (H1/H3/H6) 2026-07-01 18:04:22 -04:00