Runtime egress security for CI/CD

Default-deny egress
for your CI.

Egret wraps a command and watches it through eBPF - every outbound connection, process, and file write. Turn on block mode and it enforces a domain allowlist. No server, no account, no phone-home.

Get started

Pick your starting point.

Egret

v0.2.0

The agent - CLI + GitHub Action. eBPF egress filtering, monitoring, and audit-mode policy generation.

Egret Nest optional

v0.2.0

The self-hosted dashboard - run history, new-endpoint drift, and org-wide fleet views for teams.

The problem

Your CI can reach the entire internet.

A build step pulls hundreds of dependencies, each running arbitrary install scripts with your credentials in the environment. A single compromised package can exfiltrate secrets or your source to anywhere - and you'd never see the connection. Egret makes egress observable, then enforceable.

Capabilities

What Egret watches.

Network egress

Records every outbound connection - PID, process, IP, port, and domain when DNS is correlated. See exactly what your build talks to.

Egress enforcement

Block mode is default-deny with a domain allowlist, backed by a local DNS proxy and an nftables dynamic allow set. Fail-closed teardown.

Process tree

Observes execve/fork through eBPF to reconstruct the whole process tree of a run - what spawned what.

File writes

Flags writes to protected paths - .git/, ~/.ssh/, /etc/ - so a compromised step tampering with your source is visible.

Audit mode

Observe a run, then emit a ready-to-paste suggested allowlist. Start in audit, graduate to block with confidence.

Reports everywhere

Markdown + JSON + SARIF, written to the GitHub Actions job summary and uploaded to Code Scanning. No server required.

All features →

Why Egret

Built like a security tool should be.

Open source

Apache-2.0. Audit every line - appropriate for a security tool.

Zero infrastructure

No server, no account, no phone-home. Runs entirely on your runner.

eBPF-native

Kernel-level visibility with negligible overhead - not a proxy or a wrapper hack.

Audit → block

Start passive, generate a policy from real traffic, then enforce with confidence.

Quickstart

Audit first, then enforce.

Observe a run with zero risk, turn the observed endpoints into a policy, then enforce it.

CLI - Linux 5.8+, root or CAP_BPF+CAP_NET_ADMIN

# 1. Observe a build in audit mode (logs, never blocks).
sudo egret run --config policy.yaml --mode audit -- ./build.sh

# 2. Turn the observed run into a suggested allowlist.
egret audit --from hardened-report/report.json --emit policy.suggested.yaml

# 3. Enforce it.
sudo egret run --config policy.suggested.yaml --mode block -- ./build.sh
    

Or wrap a whole GitHub Actions job:

.github/workflows/ci.yml

# job permissions: security-events: write (SARIF upload)
- uses: NX1X/Egret@v0
  with:
    policy: .github/egret-policy.yaml
    mode: audit        # or: block
    command: make ci   # your whole build, monitored end-to-end
    

Read the docs →

Optional · Tier 3

Scale to a fleet with Egret Nest.

Running Egret across many repos? Egret Nest is an optional self-hosted dashboard that collects your runs: egress history, new-endpoint drift, violations, and an org-wide fleet view. One Go binary, your own infra - your telemetry never leaves it, and the agent never requires it.

  • See what changed since last week - drift is the early signal of a supply-chain shift.
  • Per-repo and org-wide rollups, scoped to GitHub access.
  • GitHub OAuth, OIDC, or local accounts with TOTP.

Explore the dashboard →