Findings
F01
Low
Used the planted login with its own service (registry.npmjs.org)
- Confidence
- Info A planted login went to the service it belongs to, as normal authentication (npm sending its token to registry.npmjs.org while installing).
- Observed in
- llm:baseline
Description
A planted login was sent to the service it belongs to, only as the Authorization header of ordinary requests: for example npm sending the ~/.npmrc token to registry.npmjs.org while installing dependencies.
Impact
None in itself: this is how the package manager authenticates. Publishing, unpublishing or creating tokens with it would be reported as exfiltration.
Evidence
~/.npmrc (npm) sent only as the login header of ordinary requests (no publish)
Remediation
No action needed.
F02
Low
Network destinations contacted
- Confidence
- Info The package connected to these hosts.
- Observed in
- llm:baseline
Description
Network destinations the package resolved or connected to during the runs. All traffic was captured by the sandbox; nothing reached the internet.
Impact
Context only. Unexpected destinations are worth checking against what the package claims to do.
Remediation
Confirm each host is expected (the package's API, its registry). Allowlist expected egress in production.
F03
Low
Loaded the project's .env file
- Confidence
- Info The package loaded the project's .env file.
- Observed in
- llm:baseline
Description
The process loaded the project's .env file. Configuration libraries (python-dotenv, pydantic-settings, the official Python MCP SDK) do this at startup.
Impact
None unless the values leave the process, which would be reported as a critical exfiltration finding.
Remediation
No action needed. Keep long-lived secrets out of project .env files where possible.
F04
Low
A tool read its own credentials (e.g. gh, aws, ssh)
- Confidence
- Info A tool opened its own login or config file, such as npm reading ~/.npmrc.
- Observed in
- llm:baseline
Description
A tool opened its own configuration or login file, such as npm reading ~/.npmrc or gh reading its hosts file.
Impact
None in itself: this is how those tools work. Listed so the report shows every credential access.
Remediation
No action needed.
Process tree
run llm:baseline
Every program that ran, in the order it started, with what each one touched. Red marks the path to a leak or a planted file.
- runbash -c cd "$(pwd)" && cat README.md package.json; echo "--- env ...
- runsed s/=.*/=<redacted>/ .env
View full process tree
- runbash -c cd "$(pwd)" && pyai --version; echo "---"; pyai speak --h...
- runbash -c cd "$(pwd)" && ls -la; echo "---"; pyai voices list --json
- runbash -c cd "$(pwd)" && cat README.md package.json; echo "--- env ...
- runsed s/=.*/=<redacted>/ .env
- runcat README.md package.json
- runls -la src skill
- runwhich brew npm node python3 pip3
- runbash -c cd "$(pwd)" && cat skill/_meta.json; echo "---"; timeout ...
- runcat skill/_meta.json
- runtimeout 15 curl -sS -o /dev/null
- runcurl -sS -o /dev/null -w %{http_code}\n
- netpyai.com:443 sent 74 B
- runtimeout 20 npm view @pyai/cli version
- runnpm view @pyai/cli version
- runnode /usr/bin/npm view @pyai/cli version
- secretread ~/.npmrc (its own config)
- netregistry.npmjs.org:443 sent 391 B
- netregistry.npmjs.org:443 sent 433 B
- runtail -5
- runbash -c cd "$(pwd)" && timeout 20 npm view @pyai/cli version 2>&1...
- runhead -20
- runtimeout 20 npm view @pyai/cli version
- runnpm view @pyai/cli version
- runnode /usr/bin/npm view @pyai/cli version
- secretread ~/.npmrc (its own config)
- netregistry.npmjs.org:443 sent 391 B
- runhead -c 600
- runtimeout 15 curl -sS https://pyai.com/cli
- runcurl -sS https://pyai.com/cli
- netpyai.com:443 sent 74 B
- runbash -c cd "$(pwd)" && timeout 15 curl -sS -D - https://pyai.com/...
- runhead -30
- runtimeout 15 curl -sS -D -
- runcurl -sS -D - https://pyai.com/cli -o
- netpyai.com:443 sent 74 B
- runcat /tmp/pyai_cli_body.txt
- runhead -c 1000
- runwc -c /tmp/pyai_cli_body.txt
- runbash -c cd "$(pwd)" && echo "=== npm registry ==="; timeout 25 np...
- runtimeout 25 npm view @pyai/cli
- runnpm view @pyai/cli
- runnode /usr/bin/npm view @pyai/cli
- secretread ~/.npmrc (its own config)
- netregistry.npmjs.org:443 sent 391 B
- runhead -20
- runtimeout 25 pip3 download pyai --no-deps
- runpip3 download pyai --no-deps -d /tmp/pipprobe
- runlsb_release -a
- rungetopt --name lsb_release -o hvidrcas -l
- runcut -c1
- runtr [:lower:] [:upper:]
- runcut -c2-
- runtr [:upper:] [:lower:] ×2
- rununame -rs
- runtail -5
- runbash -c cd "$(pwd)" && echo "=== npm exit ==="; timeout 25 npm vi...
- runtimeout 25 npm view @pyai/cli version
- runnpm view @pyai/cli version
- runnode /usr/bin/npm view @pyai/cli version
- secretread ~/.npmrc (its own config)
- netpypi.org:443 sent 633 B
- runtimeout 25 pip3 download pyai --no-deps
- runpip3 download pyai --no-deps -d /tmp/pipprobe
- runlsb_release -a
- rungetopt --name lsb_release -o hvidrcas -l
- runcut -c1
- runtr [:lower:] [:upper:]
- runcut -c2-
- runtr [:upper:] [:lower:] ×2
- runbash -c cd "$(pwd)" && echo "=== pip ==="; timeout 25 pip3 downlo...
- runtimeout 25 pip3 download pyai --no-deps
- runpip3 download pyai --no-deps -d /tmp/pipprobe
- netregistry.npmjs.org:443 sent 391 B
- runcat /tmp/pip.log
- rungetent hosts pyai.com
- netDNS lookups for npmjs.org, pyai.com, pypi.org 24 queries
- runcat /tmp/dns.log
- runlsb_release -a
- rungetopt --name lsb_release -o hvidrcas -l
- runcut -c1
- runtr [:lower:] [:upper:]
- runcut -c2-
- runtr [:upper:] [:lower:] ×2
- rununame -rs