How It Works
Whenenvironment.allow_vars is set in a profile, nono:
- Clears the inherited environment
- Passes through only variables matching the allow-list
- Adds back nono-injected credentials (from
env_credentials) on top
environment section is omitted entirely, all variables are passed through (backward compatible). Setting allow_vars to an empty array [] restricts the environment to only nono-injected credentials — no inherited variables are passed.
Configuration
Add theenvironment section to your profile:
Prefix Patterns
Use a trailing* to match all variables with a given prefix:
AWS_REGION, AWS_SECRET_ACCESS_KEY, and any variable starting with MYAPP_, while blocking everything else.
A bare "*" matches all variables (equivalent to not setting the environment section at all). The * wildcard is only valid as a trailing suffix — patterns like "A*B" or "*X" are rejected at profile load time.
Inheritance
allow_vars is additive across profile inheritance. A child profile appends its entries to the base profile’s list, and duplicates are removed:
Interaction with Credential Injection
Variables injected by nono — viaenv_credentials or --env-credential — always bypass the allow-list. They are explicitly configured by the user and must reach the child process regardless of filtering rules.
OPENAI_API_KEY is passed through even though it’s not in allow_vars, because it was explicitly injected via env_credentials.
Operator-configured deny-list
Usedeny_vars to strip specific variables while keeping everything else inherited — without having to enumerate an explicit allow-list:
allow_vars — only trailing * is supported:
GITHUB_TOKEN, GITHUB_ACTIONS, any var starting with ANTHROPIC_ or OPENAI_, etc. Patterns like *_TOKEN (leading wildcard) are not supported — nono will print a warning and ignore them.
Precedence: deny_vars wins over allow_vars. If a variable appears in both, it is stripped:
AWS_REGION passes through; AWS_SECRET_ACCESS_KEY is stripped.
Inheritance: like allow_vars, deny_vars is additive across profile inheritance — a child profile appends to the base’s list, and duplicates are removed.
Interaction with the Built-in Deny-List
nono maintains a built-in deny-list of dangerous environment variables (e.g.,LD_PRELOAD, DYLD_INSERT_LIBRARIES, PYTHONPATH, NODE_OPTIONS). These variables are always blocked, even if they appear in allow_vars. This prevents a compromised profile from disabling sandbox protections.
LD_PRELOAD will not be passed through, despite being in the allow-list.
Security Properties
- Default-allow: Without the
environmentsection, all variables are passed through (no regression) - Empty allow-list restricts all:
"allow_vars": []passes zero inherited variables — only nono-injected credentials reach the child - Explicit allow-list: When
allow_varshas entries, only matching variables reach the child process - Operator deny-list:
deny_varsstrips named variables even whenallow_varswould otherwise pass them through - Injected credentials bypass both lists:
env_credentialsvariables always pass through, regardless ofallow_varsordeny_vars - Built-in deny-list is non-overridable: Dangerous variables like
LD_PRELOADare always blocked and cannot be re-allowed - Precedence: built-in blocklist >
deny_vars>allow_vars - Prefix patterns reduce misconfiguration: Only
*suffix is supported (no regex), reducing risk of accidental over-permission - Bare
*matches everything: Use as an escape hatch, but prefer explicit lists
Example: Minimal Agent Environment
A typical profile for an AI agent that only needs basic shell environment and cloud credentials:AWS_* variables and the injected OPENAI_API_KEY, but no other secrets accidentally present in the parent environment.
Next: Credential Injection | Profile Authoring