Skip to content

Homebrew

Route Homebrew's formula API and bottle downloads through the Package Firewall with environment variables.

Updated 03 Nov 2026Checked against cli@4c8c3b7, package-firewall@333285f
API URL https://packages.vulnetix.com/homebrew/api
Bottle URL https://packages.vulnetix.com/homebrew-bottle
Ecosystem IDs homebrew (API), homebrew-bottle (bottles)
Plan Add-on
Mode filter for formula.json, cask.json and per-formula JSON; gate for bottle manifests on ghcr.io
Cooldown no
Default mirrors https://formulae.brew.sh (API), https://ghcr.io (bottles)

Automatic setup

vulnetix package-firewall homebrew
source ~/.config/vulnetix/package-firewall/homebrew.env

~/.config/vulnetix/package-firewall/homebrew.env:

export HOMEBREW_API_DOMAIN="https://YOUR_ORG_UUID:YOUR_API_KEY@packages.vulnetix.com/homebrew/api"
export HOMEBREW_ARTIFACT_DOMAIN="https://YOUR_ORG_UUID:YOUR_API_KEY@packages.vulnetix.com/homebrew-bottle"
export HOMEBREW_ARTIFACT_DOMAIN_NO_FALLBACK="1"

Add the source line to ~/.zshrc or ~/.bashrc. Homebrew runs curl, which sends the URL credentials as Basic auth.

Use and verify

brew config | grep -E 'HOMEBREW_(API|ARTIFACT)_DOMAIN'
brew update
brew install wget

Reading a block

Homebrew downloads bottles with curl --fail, which drops both the body and the headers, so a block shows as curl: (22) The requested URL returned error: 423. Re-run with verbose curl to see the reason:

$ HOMEBREW_CURL_VERBOSE=1 brew upgrade node
< HTTP/2 423
< x-vulnetix-firewall: blocked
< x-vulnetix-firewall-reason: malware
< x-vulnetix-firewall-message: package is flagged as malicious

A malware hit inside the whole-catalogue formula.json is recorded as a WARN and filtered entry by entry rather than refusing the whole index.

Edit this pageSources: cli/pkg/packagefirewall/config.go, package-firewall/internal/ecosystem/homebrew/homebrew.go, package-firewall/internal/ecosystem/homebrew_bottle/homebrew_bottle.go, package-firewall/internal/ecosystem/ecosystem.go, package-firewall/internal/fw/fw.go
esc
↑ ↓ move↵ openSearches in your browser. A key like autonomy.max or a code like threshold_required jumps straight to it.