Skip to content
Open-Source Registry

pypi / smolvm

smolvm 0.0.36

bitbison: flagged, behavior flagged, dependencies flagged, posture not checked, pipeline clean, 1 of 1 jobs captured RiskcriticalVulnsnone
processes
545
operations
67K
packages
561
compiler runs
3
connections
1
build time
3m 13s
job time
3m 13s
capture
745 KB
records
113K
bytes / record
6.6

Sandbox for computer-using agents with a unified API for VMMs — Firecracker, QEMU, and libkrun.

published 2026-09-17 View on PyPI
Reviewed by Bitbison: credential-forwardingsmolvm starts local microVMs to isolate AI agents from the host, yet every agent preset copies the host's whole ~/.ssh directory, ~/.git-credentials and GitHub CLI login into the VM, plus the Claude Code login from the macOS keychain, with no opt-out and open internet by default. It sends nothing off the machine itself.

Graph

credential-sweep · critical
2

Checks

15 of 18 clear Credential stores read Build-time dependency advisories +1 more
Build behavior✓✓▲✓✓✓✓✓✓✓
Supply chain✓▲✓✓✓▲✓
Pipeline✓

Detections

2
  • Code this build ran read 8 credential stores it does not own
    python3.14
    critical
  • coverage 7.17.1 installs a1_coverage.pth, which Python runs at every start
    coverage 7.17.1
    low

Detection

criticalwitnessed

Code this build ran read 8 credential stores it does not own

Many credential stores read by code that does not own them

Subject
python3.14
Jobs
build-import
Rule
credential-sweep · smolvm

Evidence

  1. Credential store read by code that does not own itcause

    Read /home/runner/.claude.json (agents)

    source /home/runner/.claude.json

    by .venv/bin/python -m pytest -q -p no:cacheprovider -o addopts=

  2. Credential store read by code that does not own itcause

    Read /home/runner/.ssh/config (forges)

    source /home/runner/.ssh/config

    by .venv/bin/python -m pytest -q -p no:cacheprovider -o addopts=

  3. Credential store read by code that does not own itcause

    Read /home/runner/.ssh/id_ed25519 (forges)

    source /home/runner/.ssh/id_ed25519

    by .venv/bin/python -m pytest -q -p no:cacheprovider -o addopts=

  4. Credential store read by code that does not own itcause

    Read /home/runner/.ssh/id_ed25519.pub (scp)

    source /home/runner/.ssh/id_ed25519.pub

    by .venv/bin/python -m pytest -q -p no:cacheprovider -o addopts=

  5. Credential store read by code that does not own itcause

    Read /home/runner/.ssh/id_rsa (forges)

    source /home/runner/.ssh/id_rsa

    by .venv/bin/python -m pytest -q -p no:cacheprovider -o addopts=

  6. Credential store read by code that does not own itcause

    Read /home/runner/.ssh/id_rsa.pub (scp)

    source /home/runner/.ssh/id_rsa.pub

    by .venv/bin/python -m pytest -q -p no:cacheprovider -o addopts=

  7. Credential store read by code that does not own itcause

    Read /home/runner/.config/gh/hosts.yml (forges)

    source /home/runner/.config/gh/hosts.yml

    by .venv/bin/python -m pytest -q -p no:cacheprovider -o addopts=

  8. Credential store read by code that does not own itcause

    Read /tmp/pytest-of-runner/pytest-0/test_missing_public_key_never_0/keys/id_ed25519 (id_ed25519)

    source /tmp/pytest-of-runner/pytest-0/test_missing_public_key_never_0/keys/id_ed25519

    by ssh-keygen -y -f /tmp/pytest-of-runner/pytest-0/test_missing_public_key_never_0/keys/id_ed25519

  9. Why it matterscontext

    A program reads its own credentials. This build read many credential stores it does not own, of several kinds, which is how a credential stealer collects what it sends out.

What came before it

Loading the graph

Processes

build-import

python

Ran
.venv/bin/python -m pytest -q -p no:cacheprovider -o addopts=
Invoked by
.venv/bin/python -m pytest -q -p no:cacheprovider -o addopts=

Remediation

Find the code that read these stores and why: a package's install, build or import step has no reason to read credentials it does not own. Treat every credential these stores hold as exposed, and rotate them unless the reads are explained.

Detection

lowwitnessed

coverage 7.17.1 installs a1_coverage.pth, which Python runs at every start

Package installs code that runs at every start

Subject
coverage 7.17.1
Jobs
build-import
Rule
startup-hook

Evidence

  1. Installs a module run at every startcause

    coverage 7.17.1 installs a1_coverage.pth at the root of /home/runner/work/smolvm/smolvm/.venv/lib/python3.14/site-packages. Every Python started in that environment runs it before its own program.

    subject coverage 7.17.1

Remediation

Find out why the package installs code that runs at every Python start. Unless that is its purpose, pin the previous release, rebuild the environment and rotate the credentials the jobs that used it could reach.

Network

1 peers
  • files.pythonhosted.org:8080 the package manager · python3.14 (smolvm) via Package registries profile (pip → files.pythonhosted.org) ecosystem
Vulnerabilities47FixSeverity
Dependencies
shell-quote 1.9.0>=1.11.0
CVE-2026-102422shell-quote: `quote()` command injection via a line terminator in a token after a `{ comment }` tokencritical
brace-expansion 5.0.9>=5.0.12
CVE-2026-102276brace-expansion: DoS via uncontrolled recursion in parseCommaParts causing stack exhaustionhigh
CVE-2026-102278brace-expansion: DoS via uncontrolled recursion on nested brace groups causing stack exhaustionhigh
CVE-2026-102277brace-expansion: Quadratic-time expansion of the `{a},b}` rewrite causes CPU denial of servicemedium
follow-redirects 1.16.0>=1.16.2
CVE-2026-111755follow-redirects sensitiveHeaders regex escaping can expose credential headershigh
CVE-2026-111756follow-redirects array-form headers bypass cross-origin credential strippinghigh
CVE-2026-116689follow-redirects: Cross-realm sensitiveHeaders arrays are discarded and custom credentials can follow redirectshigh
js-yaml 4.2.0>=4.3.2
CVE-2026-59869js-yaml: YAML merge-key chains can force quadratic CPU consumptionhigh
CVE-2026-84375js-yaml: maxTotalMergeKeys does not limit CPU use for empty merge sourceshigh
GHSA-5p4m-2wfm-xmqjJS-YAML: Quadratic CPU consumption in !!omap resolution (3.x and 4.x) — CVE-2026-59870 fix not backportedhigh
markdown-it 14.3.2>=14.3.3
CVE-2026-111758markdown-it: Quadratic-time rendering of a single multi-line link reference definition with default options (regression since 14.0)high
CVE-2026-111766markdown-it: Quadratic-time denial of service in inline HTML parsing with html enabledlow
pyo3 0.28.3>=0.29.0
GHSA-36hh-v3qg-5jq4PyO3 has an Out-of-bounds Read in `nth` / `nth_back` for `PyList` and `PyTuple` iteratorshigh
GHSA-chgr-c6px-7xppPyO3 has a missing `Sync` bound on `PyCFunction::new_closure` closuresmedium
source-map-js 1.2.1>=1.2.2
CVE-2026-93749source-map-js allows event-loop denial of service through indexed source-map section offsetshigh
undici 7.29.1>=7.30.1
CVE-2026-109383undici vulnerable to TLS certificate validation bypass via dropped tls options in Agenthigh
CVE-2026-109829undici vulnerable to cache poisoning and cross-user disclosure via cross-origin redirectshigh
CVE-2026-109869undici vulnerable to Denial of Service via unhandled error on excessive content-encodingshigh
CVE-2026-87018undici vulnerable to Denial of Service via TLS 1.2 certificate-changing renegotiationhigh
CVE-2026-109841undici vulnerable to Subresource Integrity bypass via non-lowercase algorithm tokensmedium
CVE-2026-109924undici vulnerable to Denial of Service via unbounded memory in the EventSource parsermedium
CVE-2026-109932undici WebSocket client vulnerable to Denial of Service via unbounded automatic PONG bufferingmedium
CVE-2026-87029undici vulnerable to Denial of Service via unhandled exception in the decompress interceptormedium
vite 7.3.6>=7.3.7
CVE-2026-112942launch-editor: `fs.existsSync()` existence check can be bypassed on Windowshigh
CVE-2026-112943launch-editor: escapeCmdArgs() omits % escaping on Windowsmedium
CVE-2026-112944launch-editor: Editor CLI flag misinterpretation causing arbitrary command execution for some editorsmedium
CVE-2026-112946Vite: Files outside `server.fs.allow` could be served when project paths match system paths on non-Windows machinemedium
CVE-2026-112945Vite: Cross origin script execution through Vite custom middlewarelow
zod 4.6.2, 4.6.3>=4.6.6
CVE-2023-54404Zod can exhaust memory while validating oversized constrained collectionshigh
zstd 0.13.3>=0.13.4
RUSTSEC-2026-0391Data from an abandoned stream leaks into the next stream on a reused contexthigh
zstd-safe 7.2.4>=7.4.0
RUSTSEC-2026-0398`Seekable::decompress` sets a `Vec` length beyond its capacity for offsets past the endhigh
RUSTSEC-2026-0403Uninitialized memory exposed when streaming decompression of a legacy frame failshigh
RUSTSEC-2026-0395Use-after-free with `CParameter::StableInBuffer`info
RUSTSEC-2026-0396`Seekable` reads a NULL or out-of-bounds seek tableinfo
RUSTSEC-2026-0397`OutBuffer::around_pos` exposes uninitialized memoryinfo
RUSTSEC-2026-0399Use-after-free through `init_using_cdict` and `init_using_ddict`info
RUSTSEC-2026-0400Use-after-free of a dictionary after a one-shot call on a context with an open streaminfo
RUSTSEC-2026-0401Out-of-bounds read in `train_from_buffer` when sample sizes overflowinfo
RUSTSEC-2026-0402Heap buffer overflow in `CCtx::try_clone` on a multithreaded contextinfo
RUSTSEC-2026-0404Double free in `DCtx::try_clone`info
RUSTSEC-2026-0405Out-of-bounds read with an out-of-range `InBuffer::pos`info
RUSTSEC-2026-0406Use-after-free when changing a multithreaded context with an unfinished frameinfo
zstd-sys 2.0.16+zstd.1.5.7>=2.1.2
RUSTSEC-2026-0410WebAssembly allocator shim corrupts memory on allocation failurehigh
minimatch 10.2.6>=11.0.1
CVE-2026-118764minimatch has potential denial of service via globparts amplificationmedium
anyhow 1.0.102>=1.0.103
RUSTSEC-2026-0190Unsoundness in `Error::downcast_mut()`info
paste 1.0.15none published
RUSTSEC-2024-0436paste - no longer maintainedinfo
tokio 1.51.1>=1.51.6
RUSTSEC-2026-0386`AsyncFd::new` and related constructors violate I/O safetyinfo

Dependencies

580
Dependencies580Build behaviour
libgcc_s.so.1system library
@ai-sdk/gateway4.0.80
@ai-sdk/provider4.0.14
@ai-sdk/provider-utils5.0.40
@anthropic-ai/sdk0.123.0
@aws-crypto/sha256-browser5.2.0
@aws-crypto/sha256-js5.2.0
@aws-crypto/supports-web-crypto5.2.0
@aws-crypto/util5.2.0
@aws-sdk/client-bedrock-runtime3.1048.0
@aws-sdk/core3.978.0
@aws-sdk/credential-provider-env3.972.71
@aws-sdk/credential-provider-http3.972.73
@aws-sdk/credential-provider-ini3.973.16
@aws-sdk/credential-provider-login3.972.78
@aws-sdk/credential-provider-node3.972.83
@aws-sdk/credential-provider-process3.972.71
@aws-sdk/credential-provider-sso3.973.15
@aws-sdk/credential-provider-web-identity3.972.77
@aws-sdk/eventstream-handler-node3.972.34
@aws-sdk/middleware-eventstream3.972.29
@aws-sdk/middleware-websocket3.972.53
@aws-sdk/nested-clients3.997.45
@aws-sdk/signature-v4-multi-region3.996.46
@aws-sdk/token-providers3.1048.0
@aws-sdk/token-providers3.1129.0
@aws-sdk/types3.974.5
@aws-sdk/util-locate-window3.965.10
@aws-sdk/xml-builder3.972.40
@aws/lambda-invoke-store0.3.0
@babel/code-frame7.29.7
@babel/compat-data7.29.7
@babel/core7.29.7
@babel/generator7.29.8
@babel/helper-compilation-targets7.29.7
@babel/helper-globals7.29.7
@babel/helper-module-imports7.29.7
@babel/helper-module-transforms7.29.7
@babel/helper-plugin-utils7.29.7
@babel/helper-string-parser7.29.7
@babel/helper-validator-identifier7.29.7
@babel/helper-validator-option7.29.7
@babel/helpers7.29.7
@babel/parser7.29.8
@babel/plugin-transform-react-jsx-self7.29.7
@babel/plugin-transform-react-jsx-source7.29.7
@babel/runtime7.29.7
@babel/template7.29.7
@babel/traverse7.29.8
@babel/types7.29.8
@celestoai/sdk0.1.6
@celestoai/smolvm
@celestoai/smolvm0.1.0-preview.1
@earendil-works/chord0.85.1
@earendil-works/pi-agent-core0.85.1
@earendil-works/pi-ai0.85.1
@earendil-works/pi-telemetry0.85.1
@esbuild/aix-ppc640.28.1
@esbuild/android-arm0.28.1
@esbuild/android-arm640.28.1
@esbuild/android-x640.28.1
@esbuild/darwin-arm640.28.1
@esbuild/darwin-x640.28.1
@esbuild/freebsd-arm640.28.1
@esbuild/freebsd-x640.28.1
@esbuild/linux-arm0.28.1
@esbuild/linux-arm640.28.1
@esbuild/linux-ia320.28.1
@esbuild/linux-loong640.28.1
@esbuild/linux-mips64el0.28.1
@esbuild/linux-ppc640.28.1
@esbuild/linux-riscv640.28.1
@esbuild/linux-s390x0.28.1
@esbuild/linux-x640.28.1
@esbuild/netbsd-arm640.28.1
@esbuild/netbsd-x640.28.1
@esbuild/openbsd-arm640.28.1
@esbuild/openbsd-x640.28.1
@esbuild/openharmony-arm640.28.1
@esbuild/sunos-x640.28.1
@esbuild/win32-arm640.28.1
@esbuild/win32-ia320.28.1
@esbuild/win32-x640.28.1
@gerrit0/mini-shiki3.23.0
@google/genai1.52.0
@hey-api/codegen-core0.9.1
@hey-api/json-schema-ref-parser1.4.4
@hey-api/openapi-ts0.99.0
@hey-api/shared0.5.0
@hey-api/spec-types0.2.0
@hey-api/types0.1.4
@jridgewell/gen-mapping0.3.13
@jridgewell/remapping2.3.5
@jridgewell/resolve-uri3.1.2
@jridgewell/sourcemap-codec1.6.0
@jridgewell/trace-mapping0.3.31
@jsdevtools/ono7.1.3
@lukeed/ms2.0.2
@napi-rs/lzma-linux-x64-gnu1.5.1
@novnc/novnc1.7.0
@playwright/test1.63.0
@protobufjs/aspromise1.1.2
@protobufjs/base641.1.2
@protobufjs/codegen2.0.5
@protobufjs/eventemitter1.1.1
@protobufjs/fetch1.1.1
@protobufjs/float1.0.2
@protobufjs/path1.1.2
@protobufjs/pool1.1.0
@protobufjs/utf81.1.2
@rolldown/pluginutils1.0.0-rc.3
@rollup/rollup-android-arm-eabi4.63.2
@rollup/rollup-android-arm644.63.2
@rollup/rollup-darwin-arm644.63.2
@rollup/rollup-darwin-x644.63.2
@rollup/rollup-freebsd-arm644.63.2
@rollup/rollup-freebsd-x644.63.2
@rollup/rollup-linux-arm-gnueabihf4.63.2
@rollup/rollup-linux-arm-musleabihf4.63.2
@rollup/rollup-linux-arm64-gnu4.63.2
@rollup/rollup-linux-arm64-musl4.63.2
@rollup/rollup-linux-loong64-gnu4.63.2
@rollup/rollup-linux-loong64-musl4.63.2
@rollup/rollup-linux-ppc64-gnu4.63.2
@rollup/rollup-linux-ppc64-musl4.63.2
@rollup/rollup-linux-riscv64-gnu4.63.2
@rollup/rollup-linux-riscv64-musl4.63.2
@rollup/rollup-linux-s390x-gnu4.63.2
@rollup/rollup-linux-x64-gnu4.63.2
@rollup/rollup-linux-x64-musl4.63.2
@rollup/rollup-openbsd-x644.63.2
@rollup/rollup-openharmony-arm644.63.2
@rollup/rollup-win32-arm64-msvc4.63.2
@rollup/rollup-win32-ia32-msvc4.63.2
@rollup/rollup-win32-x64-gnu4.63.2
@rollup/rollup-win32-x64-msvc4.63.2
@shikijs/engine-oniguruma3.23.0
@shikijs/langs3.23.0
@shikijs/themes3.23.0
@shikijs/types3.23.0
@shikijs/vscode-textmate10.0.2
@smithy/core3.34.1
@smithy/credential-provider-imds4.5.2
@smithy/fetch-http-handler5.8.0
@smithy/is-array-buffer2.2.0
@smithy/node-http-handler4.12.1
@smithy/node-http-handler4.7.3
@smithy/signature-v45.7.3
@smithy/types4.18.0
@smithy/util-buffer-from2.2.0
@smithy/util-utf82.3.0
@stablelib/base641.0.1
@standard-schema/spec1.1.0
@types/babel__core7.20.5
@types/babel__generator7.27.0
@types/babel__template7.4.4
@types/babel__traverse7.28.0
@types/debug4.1.13
@types/estree1.0.9
@types/estree-jsx1.0.5
@types/hast3.0.5
@types/http-proxy1.17.17
@types/json-schema7.0.15
@types/mdast4.0.4
@types/ms2.1.0
@types/node20.19.43
@types/react19.3.0
@types/react-dom19.3.0
@types/retry0.12.0
@types/unist2.0.11
@types/unist3.0.3
@ungap/structured-clone1.4.0
@vercel/oidc3.2.0
@vitejs/plugin-react5.2.0
@workflow/serde4.1.0
agent-base7.1.4
aho-corasick1.1.4
ai7.0.99
ansi-colors4.1.3
ansi-regex5.0.1
ansi-styles4.3.0
anstream1.0.0
anstyle1.0.14
anstyle-parse1.0.0
anstyle-query1.1.5
anstyle-wincon3.0.11
anyhow1.0.102
arc-swap1.9.1
argparse2.0.1
atomic-waker1.1.2
autocfg1.5.1
axum0.8.9
axum-core0.5.6
bail2.0.2
balanced-match4.0.4
base64-js1.5.1
baseline-browser-mapping2.11.22
baseline-browser-mapping2.11.23
bignumber.js9.3.1
bitflags1.3.2
bitflags2.11.0
bowser2.14.1
brace-expansion5.0.9
browserslist4.28.9
buffer-equal-constant-time1.0.1
bundle-name4.1.0
bytes1.11.1
c123.3.4
caniuse-lite1.0.30001810
cc1.2.65
ccount2.0.1
cfg-if1.0.4
cfg_aliases0.1.1
cfg_aliases0.2.1
chalk4.1.2
character-entities2.0.2
character-entities-html42.1.0
character-entities-legacy3.0.0
character-reference-invalid2.0.1
chokidar5.0.0
clap4.6.1
clap_builder4.6.0
clap_derive4.6.1
clap_lex1.1.0
cliui8.0.1
color-convert2.0.1
color-name1.1.4
color-support1.1.3
colorchoice1.0.5
comma-separated-tokens2.0.3
commander15.0.0
concurrently9.2.4
confbox0.2.4
convert-source-map2.0.0
cross-spawn7.0.6
csstype3.2.3
data-uri-to-buffer4.0.1
debug4.4.3
decode-named-character-reference1.3.0
default-browser5.5.0
default-browser-id5.0.1
define-lazy-prop3.0.0
defu6.1.7
dequal2.0.3
destr2.0.5
devlop1.1.0
diff8.0.4
dotenv17.4.2
downcast-rs1.2.1
ecdsa-sig-formatter1.0.11
electron-to-chromium1.5.427
emoji-regex8.0.0
entities4.5.0
errno0.3.14
esbuild0.28.1
escalade3.2.0
escape-string-regexp5.0.0
estree-util-is-identifier-name3.0.0
eventemitter34.0.7
eventsource-parser3.1.1
exsolve1.1.0
extend3.0.2
fast-sha2561.3.0
fdir6.5.0
fetch-blob3.2.0
filedescriptor0.8.3
find-msvc-tools0.1.9
follow-redirects1.16.0
form_urlencoded1.2.2
formdata-polyfill4.0.10
fsevents2.3.3
futures0.3.32
futures-channel0.3.32
futures-core0.3.32
futures-executor0.3.32
futures-io0.3.32
futures-macro0.3.32
futures-sink0.3.32
futures-task0.3.32
futures-util0.3.32
gaxios7.3.1
gcp-metadata8.1.2
gensync1.0.0-beta.2
get-caller-file2.0.5
get-tsconfig4.14.0
getrandom0.3.4
giget3.3.0
google-auth-library10.9.1
google-logging-utils1.1.3
has-flag4.0.0
hast-util-to-jsx-runtime2.3.6
hast-util-whitespace3.0.0
heck0.5.0
html-url-attributes3.0.1
http1.4.2
http-body1.0.1
http-body-util0.1.3
http-proxy1.18.1
http-proxy-agent7.0.2
httparse1.10.1
httpdate1.0.3
https-proxy-agent7.0.6
hyper1.10.1
hyper-util0.1.20
ignore7.0.5
inline-style-parser0.2.7
is-alphabetical2.0.1
is-alphanumerical2.0.1
is-decimal2.0.1
is-docker3.0.0
is-fullwidth-code-point3.0.0
is-hexadecimal2.0.1
is-in-ssh1.0.0
is-inside-container1.0.0
is-plain-obj4.1.0
is-wsl3.1.1
is_terminal_polyfill1.70.2
isexe2.0.0
itoa1.0.18
jiti2.7.0
jobserver0.1.34
js-tokens4.0.0
js-yaml4.2.0
jsesc3.1.0
json-bigint1.0.0
json-schema0.4.0
json-schema-to-ts3.1.1
json52.2.3
jwa2.0.1
jws4.0.1
lazy_static1.5.0
libc0.2.186
linkify-it5.0.2
lock_api0.4.14
log0.4.29
long5.3.2
longest-streak3.1.0
lru-cache5.1.1
lunr2.3.9
markdown-it14.3.2
markdown-table3.0.4
matchers0.2.0
matchit0.8.4
mdast-util-find-and-replace3.0.2
mdast-util-from-markdown2.0.3
mdast-util-gfm3.1.0
mdast-util-gfm-autolink-literal2.0.1
mdast-util-gfm-footnote2.1.0
mdast-util-gfm-strikethrough2.0.0
mdast-util-gfm-table2.0.0
mdast-util-gfm-task-list-item2.0.0
mdast-util-mdx-expression2.0.1
mdast-util-mdx-jsx3.2.0
mdast-util-mdxjs-esm2.0.1
mdast-util-phrasing4.1.0
mdast-util-to-hast13.2.1
mdast-util-to-markdown2.1.2
mdast-util-to-string4.0.0
mdurl2.1.0
memchr2.8.0
memoffset0.9.1
micromark4.0.2
micromark-core-commonmark2.0.3
micromark-extension-gfm3.0.0
micromark-extension-gfm-autolink-literal2.1.0
micromark-extension-gfm-footnote2.1.0
micromark-extension-gfm-strikethrough2.1.0
micromark-extension-gfm-table2.1.2
micromark-extension-gfm-tagfilter2.0.0
micromark-extension-gfm-task-list-item2.1.0
micromark-factory-destination2.0.1
micromark-factory-label2.0.1
micromark-factory-space2.0.1
micromark-factory-title2.0.1
micromark-factory-whitespace2.0.1
micromark-util-character2.1.1
micromark-util-chunked2.0.1
micromark-util-classify-character2.0.1
micromark-util-combine-extensions2.0.1
micromark-util-decode-numeric-character-reference2.0.2
micromark-util-decode-string2.0.1
micromark-util-encode2.0.1
micromark-util-html-tag-name2.0.1
micromark-util-normalize-identifier2.0.1
micromark-util-resolve-all2.0.1
micromark-util-sanitize-uri2.0.1
micromark-util-subtokenize2.1.0
micromark-util-symbol2.0.1
micromark-util-types2.0.2
mime0.3.17
minimatch10.2.6
mio1.2.0
ms2.1.3
nanoid3.3.19
netlink-packet-core0.8.1
netlink-packet-route0.30.0
netlink-proto0.12.0
netlink-sys0.8.8
nix0.28.0
nix0.30.1
nix0.31.3
node-domexception1.0.0
node-fetch3.3.2
node-releases2.0.55
nu-ansi-term0.50.3
ohash2.0.11
once_cell1.21.4
once_cell_polyfill1.70.2
open11.0.0
open-muse0.1.0
open-muse-research0.1.0
openai6.40.0
p-retry4.6.2
parking_lot0.12.5
parking_lot_core0.9.12
parse-entities4.0.2
partial-json0.1.7
paste1.0.15
path-key3.1.1
pathe2.0.3
percent-encoding2.3.2
perfect-debounce2.1.0
picocolors1.1.1
picomatch4.0.7
pin-project-lite0.2.17
pkg-config0.3.33
pkg-types2.3.1
playwright1.63.0
playwright-core1.63.0
portable-atomic1.13.1
portable-pty0.9.0
postcss8.5.28
powershell-utils0.1.0
proc-macro21.0.106
property-information7.2.0
protobufjs7.6.6
punycode.js2.3.1
pyo30.28.3
pyo3-build-config0.28.3
pyo3-ffi0.28.3
pyo3-log0.13.3
pyo3-macros0.28.3
pyo3-macros-backend0.28.3
quote1.0.45
r-efi5.3.0
rc93.0.1
react19.3.0
react-dom19.3.0
react-markdown10.1.0
react-refresh0.18.0
readdirp5.0.0
redox_syscall0.5.18
regex-automata0.4.14
regex-syntax0.8.11
remark-gfm4.0.1
remark-parse11.0.0
remark-rehype11.1.2
remark-stringify11.0.0
require-directory2.1.1
requires-port1.0.0
resolve-pkg-maps1.0.0
retry0.13.1
rollup4.63.2
rtnetlink0.21.0
run-applescript7.1.0
rustversion1.0.22
rxjs7.8.2
ryu1.0.23
safe-buffer5.2.1
scheduler0.28.0
scopeguard1.2.0
semver6.3.1
semver7.8.4
serde1.0.228
serde_core1.0.228
serde_derive1.0.228
serde_json1.0.150
serde_path_to_error0.1.20
serde_urlencoded0.7.1
serial20.2.37
sharded-slab0.1.7
shared_library0.1.9
shebang-command2.0.0
shebang-regex3.0.0
shell-quote1.9.0
shell-words1.1.1
shlex2.0.1
signal-hook-registry1.4.8
slab0.4.12
smallvec1.15.2
smolvm-core2026.6.24
smolvm-guest-agent0.1.0
socket20.6.3
source-map-js1.2.1
space-separated-tokens2.0.2
standardwebhooks1.1.1
string-width4.2.3
stringify-entities4.0.4
strip-ansi6.0.1
strsim0.11.1
style-to-js1.1.21
style-to-object1.0.14
supports-color7.2.0
supports-color8.1.1
syn2.0.117
sync_wrapper1.0.2
target-lexicon0.13.5
thiserror1.0.69
thiserror2.0.18
thiserror-impl1.0.69
thiserror-impl2.0.18
thread_local1.1.9
tinyglobby0.2.17
tokio1.51.1
tokio-macros2.7.0
tokio-vsock0.6.0
tower0.5.3
tower-layer0.3.3
tower-service0.3.3
tracing0.1.44
tracing-attributes0.1.31
tracing-core0.1.36
tracing-log0.2.0
tracing-subscriber0.3.23
tree-kill1.2.2
trim-lines3.0.1
trough2.2.0
ts-algebra2.0.0
tslib2.8.1
tsx4.22.4
tsx4.23.13
typebox1.3.30
typebox1.3.7
typedoc0.28.20
typedoc-plugin-markdown4.13.0
typescript5.9.3
uc.micro2.1.0
undici7.29.1
undici-types6.21.0
unicode-ident1.0.24
unified11.0.5
unist-util-is6.0.1
unist-util-position5.0.0
unist-util-stringify-position4.0.0
unist-util-visit5.1.0
unist-util-visit-parents6.0.2
update-browserslist-db1.3.3
utf8parse0.2.2
valuable0.1.1
vfile6.0.3
vfile-message4.0.3
vite7.3.6
vsock0.5.4
wasi0.11.1+wasi-snapshot-preview1
wasip21.0.4+wasi-0.2.12
web-streams-polyfill3.3.3
which2.0.2
winapi0.3.9
winapi-i686-pc-windows-gnu0.4.0
winapi-x86_64-pc-windows-gnu0.4.0
windows-link0.2.1
windows-sys0.61.2
winreg0.10.1
wit-bindgen0.57.1
wrap-ansi7.0.0
ws8.21.3
wsl-utils0.3.1
y18n5.0.8
yallist3.1.1
yaml2.9.0
yaml2.9.1
yargs17.7.2
yargs-parser21.1.1
zmij1.0.21
zod4.6.2
zod4.6.3
zstd0.13.3
zstd-safe7.2.4
zstd-sys2.0.16+zstd.1.5.7
zwitch2.0.4

Versions60

Raw data

capture
745 KB
records
113,338
bytes per record
6.6

Loading a sample of the capture

Want to see more? E-mail us at hello@bitbison.io about your use case.

1 of 1 jobs captured: build-import success · Generated 2026-11-03 · run 4a6f2b88-a8e3-4fa6-a8dd-6a4cf58cca3b

analysis 0.1.0 · 2026-11-02 · 3bf4062 · graph v2

smolvm 0.0.36: every agent preset copies the host's SSH keys, git credentials and GitHub token into a VM with open internet

credential-forwardingCovers 0.0.36Reviewed by BitbisonUpdated 2026-11-04

smolvm starts local microVMs to isolate AI agents from the host, yet every agent preset copies the host's whole ~/.ssh directory, ~/.git-credentials and GitHub CLI login into the VM, plus the Claude Code login from the macOS keychain, with no opt-out and open internet by default. It sends nothing off the machine itself.

What smolvm is

smolvm, by Celesto AI, is a Python library and CLI that starts microVMs for AI agents on the user's own machine, through Firecracker, QEMU, libkrun or Lume. Its pitch is isolation: each agent gets its own VM, and the README says untrusted code in it "can't escape or access your host", so AI-generated code runs there instead of on the user's machine. Its agent presets (smolvm claude start, smolvm codex start and others) boot such a VM with one coding agent installed, as "a disposable place to work".

What the package does

smolvm starts local VMs for coding agents. Every agent preset copies the host's credentials into the VM it starts: the git configuration, ~/.git-credentials, the whole ~/.ssh directory with every private key in it, and the GitHub CLI's login. The Claude Code preset also copies the Claude Code configuration and login, forwards ANTHROPIC_API_KEY, and on macOS reads the Claude Code login out of the system keychain. There is no option to turn the copy off, and a missing file is skipped silently.

The VM's internet access is open by default. Whatever runs inside it, the agent and anything the agent executes or is talked into executing, holds those keys and tokens and can reach any host with them.

The VM accepts no connections from other machines by default. It sits behind the host on a NAT network, smolvm's own service inside it listens only on a host-to-VM vsock channel, its SSH (root, keys only, no passwords) and any port the user exposes are forwarded on the host's 127.0.0.1, and smolvm's HTTP API and dashboard bind to 127.0.0.1. It becomes reachable from the network only if the user chooses bridge networking or starts the API on another address; that API has no authentication when started from the CLI. The exposure is outbound: what leaves is what the agent sends.

smolvm sends nothing off the machine itself. The files go over SSH into the VM smolvm starts on the same host (Firecracker, QEMU or Lume). The package has no remote VM service and no telemetry, and it turns Lume's telemetry off. smolvm's own service inside the VM only receives files and runs commands; it opens no outbound connections of its own.

What the code does

  • src/smolvm/presets/_git.py:37-53 lists the copies made for every preset: ~/.gitconfig, ~/.config/git/config, ~/.git-credentials (plaintext https://user:token@host lines, per its own comment), the whole ~/.ssh directory except authorized_keys, and ~/.config/gh. The module docstring (lines 15-25) gives the reason: agents need git, gh and ssh git@github.com to work without signing in again.
  • src/smolvm/presets/_install.py:132-133: apply_preset calls transfer_host_configs with include_git_configs=True unconditionally. Lines 571-600 copy each path that exists and skip a missing one without a word.
  • src/smolvm/presets/claude_code.py:103-120 adds ~/.claude.json (minimized) and ~/.claude/.credentials.json, and forwards ANTHROPIC_API_KEY. Lines 90-94 name the keychain item Claude Code-credentials; _extract_keychain_secret (_install.py:470) reads it with security find-generic-password and writes it to /root/.claude/.credentials.json in the VM. macOS asks the user before the keychain releases it.
  • src/smolvm/types.py:355-357: InternetSettings defaults to allowed_domains=("*",), open outbound access.
  • Inbound: src/smolvm/types.py:489 defaults the network mode to nat; the in-VM service's src/server.rs:3 (in the sdist's Rust agent crate) listens on vsock://1024; src/smolvm/images/cloud_init.py:49-50 sets PermitRootLogin yes and PasswordAuthentication no; port exposure in src/smolvm/facade.py (expose_local, line 2575) binds to localhost; src/smolvm/cli/commands/app.py:952 defaults smolvm server start --host to 127.0.0.1, and src/smolvm/server/app.py:137-141 adds authentication only for SDK sessions.
  • _install.py:93-96 and 107-133 install the agent's packages before any credential is copied, so network-fetched install scripts never see them.

The documentation understates the copy. README.md says presets launch with "git credentials forwarded". docs/guides/agent-presets.md:105 says presets "copy only the configuration they need where possible" and asks users to review their configuration folders. Neither mentions SSH private keys, ~/.git-credentials, the GitHub CLI's token or the keychain read.

Does it fit what smolvm is for

Partly. The copy is deliberate and serves a purpose smolvm states: an agent that can commit, push and use gh without signing in again. But it works against the purpose smolvm leads with. A VM keeps untrusted code from reaching the host's files; once the host's SSH keys, git tokens and agent login are inside it, code in the VM no longer needs to escape to use them, and with open internet it can use them anywhere: push to every repository the keys reach, act as the user on GitHub, spend their Claude subscription. The isolation the README promises covers the host's disk, not the host's identity, and the presets hand over the identity by default.

The copy is also wider than the purpose needs. Pushing to one repository needs one key or token; the presets take every private key in ~/.ssh and every line of ~/.git-credentials. And the documentation that would let a user weigh this, the README and the presets guide, says less than the code does.

Conclusion

credential-forwarding: smolvm is not malicious and sends nothing off the machine, and copying credentials is an intended convenience; but every agent preset copies all of the host's SSH keys, git credentials and GitHub token, and for Claude Code its login from the macOS keychain, into a VM with open internet access, with no opt-out and less disclosure than the code does.

Before starting a preset, move keys and tokens the agent should not hold out of ~/.ssh, ~/.git-credentials and ~/.config/gh, or start it as a user whose home holds only what the agent needs, and restrict the VM's internet access where the backend supports it.

Indicators

files
~/.ssh~/.git-credentials~/.config/gh~/.claude.json~/.claude/.credentials.json
keychain
Claude Code-credentials

Examined

0.0.36
sha256:dca3669ac49d168489096459aed67dfd34851948bd633a6bde5a779eb58088b6

Links