AI Workbench v1.10.0
AI Workbench v1.10.0
What's Changed
Security release. Two issues let a directory you merely open decide what code
ai-workbench runs. Both are fixed by making the dangerous behavior opt-in, so
this release changes defaults — see "Changed" for what you may need to re-enable.
Security
-
[FIX] A repository-local
config.yamlis no longer trusted automatically.
load_config()read./config.yamlfrom the working directory with the
highest priority and no provenance check. That file setspty.claude_command,
pty.lazygit_commandandterminal.shell_path, which are spawned as processes
at startup — so cloning an untrusted repository and starting the workbench in it
was enough to run attacker-chosen binaries in all three panes, silently.A repo-local config is now ignored until you approve it once:
ai-workbench --trust-local-config # review the file first, then approveThe approval is pinned to the file's exact content (SHA-256) and its
canonical path, recorded in~/.config/ai-workbench/trusted_configs.yaml
(mode 0600). Editing the file — or agit pullthat rewrites it — drops the
approval, so a config cannot be swapped out under an existing trust. When a
local config is skipped, startup prints a warning to stderr naming the file and
the command to approve it. Saving settings writes to the repo-local file only
while it is trusted, and re-pins the hash afterwards; otherwise settings go to
the XDG config as before. -
[FIX]
git fetchno longer runs automatically when browsing into a repository.
Entering a directory in the file browser triggered an immediate background
git fetch, which executes the target repository's own configuration.
remote.<name>.url = ext::sh -c '…',core.sshCommand,core.gitProxyand
credential.helperare all command-execution vectors, so navigation alone was
enough to run code chosen by the browsed tree. Git'ssafe.directoryguard does
not cover this: it only rejects repositories owned by a different user, and an
unpacked archive or fresh clone is owned by you.Auto-fetch is now off by default and opt-in per config:
git: auto_fetch: true # only for trees you control
Local git status colors and the branch indicator are unaffected — they never
needed the network. Manual pull (Ctrl+G) is unchanged. -
[FIX] All git invocations are hardened against repository-supplied config.
Everygitcall now pinscore.fsmonitor=false,core.sshCommand=ssh,
core.gitProxy=,core.pager=cat,credential.helper=and
protocol.ext.allow=neveron the command line, where repo config cannot
override them, plusGIT_TERMINAL_PROMPT=0/GIT_ASKPASS=/GIT_PAGER=cat
to keep git non-interactive. Verified against a repository configured to run a
core.fsmonitorhelper ongit statusand anext::sh -cremote: both execute
without the flags and are blocked with them.This shrinks the surface but does not close it —
.gitattributesplus a
filter.<name>.cleanentry can still run a command duringgit status, and git
offers no single switch to disable all filters. That residual risk is why
git.auto_fetchdefaults to off rather than relying on hardening alone.
Changed
- [CHG] Dependency advisories are now triaged in-repo.
.cargo/audit.tomland
the[advisories] ignorelist indeny.tomldocument twoquick-xmlDoS
advisories (RUSTSEC-2026-0194 / -0195) as unreachable, with the dependency paths
that make them so: typst's CSL bibliography parser, which never sees user input
because the Typst source is generated internally, and the build-time
wayland-scannerproc-macro. Neither is resolvable viacargo update
(citationbergpins^0.38,wayland-scannerpins^0.39). Re-verify with
cargo tree -i quick-xmlwhenever the lockfile changes. - [CHG]
timeout-minutesadded to theauditanddenyCI jobs, the two that
were missed in the v1.9.1 sweep. - New dependency:
sha20.10, used only for content-pinning the config trust
allowlist.
Fixed
- [FIX] The SSH image-paste setup instructions no longer assume a macOS client.
Wizard step "SSH Image Paste",--ssh-paste-diagand the USAGE.md sections told
every user to runbrew install shunmeicho/tap/cc-clip"on your Mac". The wizard
runs on the remote host and cannot know the client's OS, so Linux users were
handed a command that does not exist for them. The instructions now say "on your
local machine" and list both installs (brewfor macOS,cargo install cc-clip
for Linux). Text only — no behavior change; the helper detection, the port-9998
reachability check and the[m] mark as configuredflag are untouched. - [FIX] The remote export/preview transfer no longer calls the SSH client a Mac
either. The iTerm2 OSC 1337 file transfer works from any host running iTerm2
or WezTerm — WezTerm ships for Linux — but the footer flash,--open-diag
output and USAGE.md all said "your Mac". Now "your local machine" / "local
~/Downloads". Text only.
Downloads
| Platform | Architecture | Download |
|---|---|---|
| Linux | x64 | ai-workbench-x86_64-unknown-linux-gnu.tar.gz |
| Linux | ARM64 | ai-workbench-aarch64-unknown-linux-gnu.tar.gz |
| macOS | Apple Silicon (M1/M2/M3/M4) | ai-workbench-aarch64-apple-darwin.tar.gz |
| macOS | Intel | ai-workbench-x86_64-apple-darwin.tar.gz |
| Windows | x64 | ai-workbench-x86_64-pc-windows-msvc.zip |
| Windows | ARM64 | ai-workbench-aarch64-pc-windows-msvc.zip |
Installation
Homebrew (macOS / Linux):
brew install eqms/ai-workbench/ai-workbenchUnix (Linux/macOS):
# Download and extract
tar xzf ai-workbench-*.tar.gz
chmod +x ai-workbench
./ai-workbenchWindows:
# Extract zip and run
Expand-Archive ai-workbench-*.zip -DestinationPath .
.\ai-workbench.exeAuto-Update
AI Workbench includes built-in auto-update functionality. Updates are checked automatically on startup.
See README for full documentation.