← Home

@agent-native/core

Framework for agent-native application development — where AI agents and UI share state via files

31
Versions
MIT
License
No
Install Scripts
Verified
Provenance

Supply chain provenance

Status for the latest visible version.

SLSA provenance attestation npm registry signatures No source commit

Maintainers

steve8708

Accepted risks

Findings the reviewer chose to accept rather than block on.

SourceRuleReasonAccepted byWhen
source-diff obfuscated-file:dist/client/resources/mcp-integration-logos.js AI (source-diff): Long line is base64 image data for integration logos, not obfuscated code. ai
semgrep semgrep:api-obfuscation-reflect AI (semgrep): Reflect.get used in a Proxy handler for env access, not evasion. ai
dependencies unvetted-dep:@agent-native/recap-cli AI (dependencies): First-party sibling package under same org/scope. ai
publish-pattern new-deps-added AI (publish-pattern): tweetnacl and botframework-connector are established libs matching stated bot/crypto integration scope. ai
source-diff large-new-source-files AI (source-diff): Large monorepo package; new template/corpus files are legitimate build content, not injected code. ai
phantom-deps phantom-dep:@radix-ui/react-dialog AI (phantom-deps): Declared runtime dep; used via re-exported UI components, stable false positive. ai
provenance missing-githead AI (provenance): Package has SLSA provenance attestation via CI/CD; gitHead absence is a minor metadata gap, not a supply-chain risk. ai
phantom-deps phantom-dep:nf3 AI (phantom-deps): nf3 is a declared runtime dep in package.json; phantom-dep heuristic false positive for this package. ai
phantom-deps phantom-dep:@radix-ui/react-dropdown-menu AI (phantom-deps): Declared runtime dep; re-exported UI component, stable false positive. ai
phantom-deps phantom-dep:@opentelemetry/sdk-trace-base AI (phantom-deps): Declared runtime dep; used conditionally, stable false positive. ai
phantom-deps phantom-dep:@radix-ui/react-hover-card AI (phantom-deps): Declared runtime dep; re-exported UI component, stable false positive. ai
phantom-deps phantom-dep:@react-router/fs-routes AI (phantom-deps): Declared runtime dep; used in config/build context, stable false positive. ai
semgrep semgrep:silent-process-exec-var AI (semgrep): Same xdg-open/start URL opener; detached stdio:ignore is idiomatic for this pattern. ai
semgrep semgrep:new-function-constructor AI (semgrep): Used to create a dynamic import wrapper to bypass bundler static analysis — documented pattern for ESM interop. ai
semgrep semgrep:hex-decode AI (semgrep): AES-256-GCM decryption using hex IV — standard crypto usage in a secrets module. ai
semgrep semgrep:base64-decode AI (semgrep): Decoding JWT payload to extract email — standard JWT parsing, not payload hiding. ai
semgrep semgrep:shady-links-raw-ip AI (semgrep): 127.0.0.1 is localhost default URL for local dev server — not a remote exfil endpoint. ai
semgrep semgrep:env-spread AI (semgrep): Shell adapter spreading process.env for subprocess execution — standard and expected for a CLI framework. ai
semgrep semgrep:webhook-url AI (semgrep): Hardcoded URL appears inside a JSDoc comment as a documentation example, not executed code. ai
semgrep semgrep:shady-links-exfil-services AI (semgrep): Telegram integration adapter calling api.telegram.org with user-supplied token — user-configured destination, not exfil. ai
semgrep semgrep:silent-process-exec AI (semgrep): Used to open URLs via xdg-open/start — standard cross-platform URL opener pattern, not a reverse shell. ai
dependencies unvetted-dep:nitro AI (dependencies): nitro is a well-known Nuxt/UnJS framework; beta version tag is expected for this ecosystem. ai
source-diff net-exec-file:dist/agent/harness/acp-adapter.js AI (source-diff): Documented ACP adapter spawning local coding agents over stdio; network+exec is the stated feature, not malware. ai
phantom-deps phantom-dep:@floating-ui/dom AI (phantom-deps): Declared as peer/optional dep for UI components; stable false positive for this package. ai
phantom-deps phantom-dep:@assistant-ui/store AI (phantom-deps): Workspace/config-level reference; not a direct import concern for this package. ai
phantom-deps phantom-dep:@assistant-ui/tap AI (phantom-deps): Workspace/config-level reference; not a direct import concern for this package. ai
source-diff obfuscated-file:dist/server/og-fonts-data.d.ts AI (source-diff): Type declaration mirroring the Base64 font constant; same benign pattern. ai
source-diff obfuscated-file:dist/cli/pr-visual-recap-workflow.d.ts AI (source-diff): Type declaration for the embedded YAML string; same benign pattern. ai
source-diff obfuscated-file:dist/cli/pr-visual-recap-workflow.js AI (source-diff): Long line is an embedded YAML workflow string with explanatory header; not obfuscation. ai
source-diff obfuscated-file:dist/server/og-fonts-data.js AI (source-diff): Long lines are a Base64-encoded font blob with auto-generation header; not obfuscation. ai
source-diff obfuscated-file:dist/client/blocks/library/ApiEndpointBlock.js AI (source-diff): Minified React/JSX bundle with readable imports; no obfuscation or encoded payload. ai
phantom-deps phantom-dep:@assistant-ui/react-markdown AI (phantom-deps): UI dep referenced in config; stable false positive. ai
phantom-deps phantom-dep:@tiptap/y-tiptap AI (phantom-deps): Collaboration extension referenced in config; stable false positive. ai
phantom-deps phantom-dep:@resvg/resvg-js AI (phantom-deps): Referenced in config for SVG rendering; stable false positive. ai
phantom-deps phantom-dep:tw-animate-css AI (phantom-deps): CSS tooling dep referenced in config; stable false positive. ai
phantom-deps phantom-dep:nanoid AI (phantom-deps): Likely used transitively or in config; stable false positive for this package. ai
source-diff obfuscated-file:dist/cli/context-xray-local.js AI (source-diff): Bundled CLI tool reading AI agent config dirs; consistent with package purpose, no malicious payload. ai
source-diff obfuscated-file:dist/client/settings/AutomationsSection.js AI (source-diff): Sample shows readable compiled JSX/TS output, not obfuscation; long lines are from bundled imports. ai
bogus-package bogus-package AI (bogus-package): Scaffold/framework package; README link dump reflects documentation style, not phishing. Stable pattern across versions. ai
phantom-deps phantom-dep:@tiptap/pm AI (phantom-deps): Peer/transitive dep declared for compatibility; stable false positive for this package. ai
phantom-deps phantom-dep:minimatch AI (phantom-deps): Declared for config/tooling use; stable false positive for this package. ai
phantom-deps phantom-dep:p-limit AI (phantom-deps): Declared for config/tooling use; not a runtime import concern for this framework package. ai
typosquat typosquat.levenshtein:cors AI (typosquat): Scoped package @agent-native/core; levenshtein match to 'cors' is a false positive for this namespace. ai

Versions (showing 31 of 31)

Version Deps Published
0.110.0 93 / 46
0.106.0 92 / 45
0.101.2 92 / 45
0.99.0 91 / 45
0.93.0 91 / 46
0.92.11 89 / 46
0.91.0 89 / 45
0.87.0 88 / 45
0.84.61 87 / 45
0.84.40 87 / 45
0.84.2 86 / 45
0.66.9 85 / 46
0.49.21 81 / 44
0.49.14 81 / 44
0.49.12 81 / 44
0.49.11 81 / 44
0.45.0 80 / 43
0.41.0 77 / 41
0.36.0 61 / 37
0.31.2 57 / 37
0.30.6 57 / 37
0.24.6 53 / 37
0.22.43 53 / 37
0.22.27 53 / 37
0.22.25 53 / 37
0.20.2 51 / 37
0.15.4 51 / 35
0.2.3 5 / 16
0.2.1 5 / 16
0.2.0 5 / 16
0.1.0 5 / 16

v0.110.0

2 findings
HIGH New obfuscated file: dist/client/resources/mcp-integration-logos.js source-diff

Newly added source file contains lines over 3000 chars, suggesting minified or obfuscated code. New obfuscated files are a strong attack indicator.

INFO Has SLSA provenance attestation provenance

Published via CI/CD with Sigstore attestation (predicate: https://slsa.dev/provenance/v1). This is the strongest supply chain integrity signal.

v0.106.0

1 finding
INFO Has SLSA provenance attestation provenance

Published via CI/CD with Sigstore attestation (predicate: https://slsa.dev/provenance/v1). This is the strongest supply chain integrity signal.

v0.101.2

1 finding
INFO Has SLSA provenance attestation provenance

Published via CI/CD with Sigstore attestation (predicate: https://slsa.dev/provenance/v1). This is the strongest supply chain integrity signal.

v0.99.0

1 finding
INFO Has SLSA provenance attestation provenance

Published via CI/CD with Sigstore attestation (predicate: https://slsa.dev/provenance/v1). This is the strongest supply chain integrity signal.

v0.93.0

1 finding
INFO Has SLSA provenance attestation provenance

Published via CI/CD with Sigstore attestation (predicate: https://slsa.dev/provenance/v1). This is the strongest supply chain integrity signal.

v0.92.11

1 finding
INFO Has SLSA provenance attestation provenance

Published via CI/CD with Sigstore attestation (predicate: https://slsa.dev/provenance/v1). This is the strongest supply chain integrity signal.

v0.91.0

1 finding
INFO Has SLSA provenance attestation provenance

Published via CI/CD with Sigstore attestation (predicate: https://slsa.dev/provenance/v1). This is the strongest supply chain integrity signal.

v0.87.0

2 findings
HIGH Missing gitHead — previous versions had it provenance

This version has no gitHead field linking it to a source commit, but previous versions did. This suggests the publish environment changed. Published by: GitHub Actions.

INFO Has SLSA provenance attestation provenance

Published via CI/CD with Sigstore attestation (predicate: https://slsa.dev/provenance/v1). This is the strongest supply chain integrity signal.

v0.84.61

30 findings
HIGH Missing gitHead — previous versions had it provenance

This version has no gitHead field linking it to a source commit, but previous versions did. This suggests the publish environment changed. Published by: GitHub Actions.

HIGH env-spread: corpus/core/src/adapters/cli/shell-adapter.ts:73 semgrep

Spreading entire process.env into an object — may capture all secrets 71 | args, 72 | { > 73 | env: this.env ? { ...process.env, ...this.env } : process.env, 74 | cwd: this.cwd, 75 | timeout: this.timeoutMs,

HIGH env-spread: corpus/core/src/agent/harness/acp-adapter.ts:119 semgrep

Spreading entire process.env into an object — may capture all secrets 117 | sessionOptions.cwd ?? options.cwd ?? process.cwd(), 118 | ); > 119 | const env: NodeJS.ProcessEnv = { 120 | ...process.env, 121 | ...(options.env ?? {}),

HIGH env-spread: corpus/core/src/checkpoints/service.ts:7 semgrep

Spreading entire process.env into an object — may capture all secrets 5 | const TIMEOUT = 10_000; 6 | > 7 | const CHECKPOINT_ENV = { 8 | ...process.env, 9 | GIT_AUTHOR_NAME: "agent-native",

HIGH silent-process-exec: corpus/core/src/cli/app-skill.ts:1193 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 1191 | : "xdg-open"; 1192 | const args = process.platform === "win32" ? ["/c", "start", "", url] : [url]; > 1193 | const child = spawn(command, args, { 1194 | detached: true, 1195 | stdio: "ignore",

HIGH silent-process-exec-var: corpus/core/src/cli/app-skill.ts:1193 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 1191 | : "xdg-open"; 1192 | const args = process.platform === "win32" ? ["/c", "start", "", url] : [url]; > 1193 | const child = spawn(command, args, { 1194 | detached: true, 1195 | stdio: "ignore",

HIGH env-spread: corpus/core/src/cli/code-agent-connector.ts:482 semgrep

Spreading entire process.env into an object — may capture all secrets 480 | detached: true, 481 | stdio: ["ignore", "pipe", "pipe"], > 482 | env: { 483 | ...process.env, 484 | AGENT_NATIVE_CODE_AGENTS_HOME: codeAgentStoreRoot(),

HIGH silent-process-exec: corpus/core/src/cli/connect.ts:646 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 644 | const openArgs = 645 | process.platform === "win32" ? ["/c", "start", "", url] : [url]; > 646 | const child = spawn(command, openArgs, { 647 | stdio: "ignore", 648 | detached: true,

HIGH silent-process-exec-var: corpus/core/src/cli/connect.ts:646 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 644 | const openArgs = 645 | process.platform === "win32" ? ["/c", "start", "", url] : [url]; > 646 | const child = spawn(command, openArgs, { 647 | stdio: "ignore", 648 | detached: true,

HIGH silent-process-exec: corpus/core/src/cli/content-local.ts:305 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 303 | : "xdg-open"; 304 | const args = process.platform === "win32" ? ["/c", "start", "", url] : [url]; > 305 | const child = spawn(command, args, { 306 | detached: true, 307 | stdio: "ignore",

HIGH silent-process-exec-var: corpus/core/src/cli/content-local.ts:305 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 303 | : "xdg-open"; 304 | const args = process.platform === "win32" ? ["/c", "start", "", url] : [url]; > 305 | const child = spawn(command, args, { 306 | detached: true, 307 | stdio: "ignore",

HIGH env-spread: corpus/core/src/cli/content-local.ts:358 semgrep

Spreading entire process.env into an object — may capture all secrets 356 | stdio: "inherit", 357 | shell: process.platform === "win32", > 358 | env: { ...process.env, ...plan.env }, 359 | }); 360 |

HIGH env-spread: corpus/core/src/cli/create.ts:1896 semgrep

Spreading entire process.env into an object — may capture all secrets 1894 | cwd: dir, 1895 | stdio: "pipe", > 1896 | env: { 1897 | ...process.env, 1898 | GIT_AUTHOR_NAME: "agent-native",

HIGH silent-process-exec: corpus/core/src/cli/design-connect.ts:1120 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 1118 | 1119 | const invocation = resolveCurrentCliInvocation(argv); > 1120 | const child = spawn(invocation.command, invocation.args, { 1121 | cwd: process.cwd(), 1122 | detached: true,

HIGH silent-process-exec-var: corpus/core/src/cli/design-connect.ts:1120 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 1118 | 1119 | const invocation = resolveCurrentCliInvocation(argv); > 1120 | const child = spawn(invocation.command, invocation.args, { 1121 | cwd: process.cwd(), 1122 | detached: true,

HIGH env-spread: corpus/core/src/coding-tools/index.ts:460 semgrep

Spreading entire process.env into an object — may capture all secrets 458 | shell: true, 459 | stdio: ["pipe", "pipe", "pipe"], > 460 | env: { ...process.env, FORCE_COLOR: "0" }, 461 | }); 462 | let stdout = "";

HIGH env-spread: corpus/core/src/coding-tools/index.ts:512 semgrep

Spreading entire process.env into an object — may capture all secrets 510 | stdio: ["ignore", logFd, logFd], 511 | detached: true, > 512 | env: { ...process.env, FORCE_COLOR: "0" }, 513 | }); 514 | child.unref();

HIGH env-spread: corpus/core/src/deploy/build.ts:1431 semgrep

Spreading entire process.env into an object — may capture all secrets 1429 | execFileSync(process.execPath, [renderScript], { 1430 | cwd, > 1431 | env: { 1432 | ...process.env, 1433 | NODE_ENV: process.env.NODE_ENV || "production",

HIGH shady-links-exfil-services: corpus/core/src/integrations/adapters/telegram.ts:188 semgrep

URL pointing to known exfiltration/tunneling service 186 | try { 187 | const res = await fetch( > 188 | `https://api.telegram.org/bot${token}/sendMessage`, 189 | { 190 | method: "POST",

HIGH shady-links-exfil-services: corpus/core/src/integrations/adapters/telegram.ts:206 semgrep

URL pointing to known exfiltration/tunneling service 204 | // Retry without Markdown if parsing fails 205 | if (data.description?.includes("parse")) { > 206 | await fetch(`https://api.telegram.org/bot${token}/sendMessage`, { 207 | method: "POST", 208 | headers: { "Content-Type": "application/json" },

HIGH shady-links-exfil-services: corpus/core/src/integrations/adapters/telegram.ts:246 semgrep

URL pointing to known exfiltration/tunneling service 244 | try { 245 | const res = await fetch( > 246 | `https://api.telegram.org/bot${token}/sendMessage`, 247 | { 248 | method: "POST",

HIGH shady-links-exfil-services: corpus/core/src/integrations/adapters/telegram.ts:282 semgrep

URL pointing to known exfiltration/tunneling service 280 | if (hasToken) { 281 | try { > 282 | const res = await fetch(`https://api.telegram.org/bot${token}/getMe`); 283 | const data = (await res.json()) as { 284 | ok: boolean;

HIGH shady-links-exfil-services: corpus/core/src/integrations/plugin.ts:1658 semgrep

URL pointing to known exfiltration/tunneling service 1656 | try { 1657 | const res = await fetch( > 1658 | `https://api.telegram.org/bot${token}/setWebhook`, 1659 | { 1660 | method: "POST",

HIGH env-spread: corpus/core/src/scripts/dev/shell.ts:76 semgrep

Spreading entire process.env into an object — may capture all secrets 74 | 75 | function childProcessEnvForRequest(): NodeJS.ProcessEnv { > 76 | const env = { ...process.env, FORCE_COLOR: "0" }; 77 | const requestScoped = hasRequestContext(); 78 | const userEmail = getRequestUserEmail();

HIGH webhook-url: corpus/core/src/secrets/substitution.ts:240 semgrep

Hardcoded webhook URL suggests data exfiltration (matched inside a comment — likely documentation, not executed code) 238 | * 239 | * Matching is exact on the URL's origin (scheme + host + port), so an entry > 240 | * like `https://hooks.slack.com` blocks `https://evil.example.com` even if 241 | * the agent tries to redirect the request elsewhere. 242 | */

HIGH env-spread: corpus/core/src/terminal/pty-server.ts:245 semgrep

Spreading entire process.env into an object — may capture all secrets 243 | // Build env, stripping CLI-specific nesting vars 244 | const registry = CLI_REGISTRY[command]; > 245 | const env: Record<string, string | undefined> = { 246 | ...process.env, 247 | TERM: "xterm-256color",

HIGH silent-process-exec: corpus/templates/content/actions/reveal-local-source-file.ts:34 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 32 | } 33 | > 34 | const child = spawn(command, args, { 35 | detached: true, 36 | stdio: "ignore",

HIGH silent-process-exec-var: corpus/templates/content/actions/reveal-local-source-file.ts:34 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 32 | } 33 | > 34 | const child = spawn(command, args, { 35 | detached: true, 36 | stdio: "ignore",

HIGH env-spread: corpus/templates/content/scripts/dev-database.mjs:58 semgrep

Spreading entire process.env into an object — may capture all secrets 56 | 57 | const envValues = ensureLocalEnv(); > 58 | const childEnv = { 59 | ...process.env, 60 | AGENT_NATIVE_MODE: "database",

INFO Has SLSA provenance attestation provenance

Published via CI/CD with Sigstore attestation (predicate: https://slsa.dev/provenance/v1). This is the strongest supply chain integrity signal.

v0.84.40

30 findings
HIGH Missing gitHead — previous versions had it provenance

This version has no gitHead field linking it to a source commit, but previous versions did. This suggests the publish environment changed. Published by: GitHub Actions.

HIGH env-spread: corpus/core/src/adapters/cli/shell-adapter.ts:73 semgrep

Spreading entire process.env into an object — may capture all secrets 71 | args, 72 | { > 73 | env: this.env ? { ...process.env, ...this.env } : process.env, 74 | cwd: this.cwd, 75 | timeout: this.timeoutMs,

HIGH env-spread: corpus/core/src/agent/harness/acp-adapter.ts:119 semgrep

Spreading entire process.env into an object — may capture all secrets 117 | sessionOptions.cwd ?? options.cwd ?? process.cwd(), 118 | ); > 119 | const env: NodeJS.ProcessEnv = { 120 | ...process.env, 121 | ...(options.env ?? {}),

HIGH env-spread: corpus/core/src/checkpoints/service.ts:7 semgrep

Spreading entire process.env into an object — may capture all secrets 5 | const TIMEOUT = 10_000; 6 | > 7 | const CHECKPOINT_ENV = { 8 | ...process.env, 9 | GIT_AUTHOR_NAME: "agent-native",

HIGH silent-process-exec: corpus/core/src/cli/app-skill.ts:1193 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 1191 | : "xdg-open"; 1192 | const args = process.platform === "win32" ? ["/c", "start", "", url] : [url]; > 1193 | const child = spawn(command, args, { 1194 | detached: true, 1195 | stdio: "ignore",

HIGH silent-process-exec-var: corpus/core/src/cli/app-skill.ts:1193 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 1191 | : "xdg-open"; 1192 | const args = process.platform === "win32" ? ["/c", "start", "", url] : [url]; > 1193 | const child = spawn(command, args, { 1194 | detached: true, 1195 | stdio: "ignore",

HIGH env-spread: corpus/core/src/cli/code-agent-connector.ts:482 semgrep

Spreading entire process.env into an object — may capture all secrets 480 | detached: true, 481 | stdio: ["ignore", "pipe", "pipe"], > 482 | env: { 483 | ...process.env, 484 | AGENT_NATIVE_CODE_AGENTS_HOME: codeAgentStoreRoot(),

HIGH silent-process-exec: corpus/core/src/cli/connect.ts:646 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 644 | const openArgs = 645 | process.platform === "win32" ? ["/c", "start", "", url] : [url]; > 646 | const child = spawn(command, openArgs, { 647 | stdio: "ignore", 648 | detached: true,

HIGH silent-process-exec-var: corpus/core/src/cli/connect.ts:646 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 644 | const openArgs = 645 | process.platform === "win32" ? ["/c", "start", "", url] : [url]; > 646 | const child = spawn(command, openArgs, { 647 | stdio: "ignore", 648 | detached: true,

HIGH silent-process-exec: corpus/core/src/cli/content-local.ts:305 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 303 | : "xdg-open"; 304 | const args = process.platform === "win32" ? ["/c", "start", "", url] : [url]; > 305 | const child = spawn(command, args, { 306 | detached: true, 307 | stdio: "ignore",

HIGH silent-process-exec-var: corpus/core/src/cli/content-local.ts:305 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 303 | : "xdg-open"; 304 | const args = process.platform === "win32" ? ["/c", "start", "", url] : [url]; > 305 | const child = spawn(command, args, { 306 | detached: true, 307 | stdio: "ignore",

HIGH env-spread: corpus/core/src/cli/content-local.ts:358 semgrep

Spreading entire process.env into an object — may capture all secrets 356 | stdio: "inherit", 357 | shell: process.platform === "win32", > 358 | env: { ...process.env, ...plan.env }, 359 | }); 360 |

HIGH env-spread: corpus/core/src/cli/create.ts:1896 semgrep

Spreading entire process.env into an object — may capture all secrets 1894 | cwd: dir, 1895 | stdio: "pipe", > 1896 | env: { 1897 | ...process.env, 1898 | GIT_AUTHOR_NAME: "agent-native",

HIGH silent-process-exec: corpus/core/src/cli/design-connect.ts:1120 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 1118 | 1119 | const invocation = resolveCurrentCliInvocation(argv); > 1120 | const child = spawn(invocation.command, invocation.args, { 1121 | cwd: process.cwd(), 1122 | detached: true,

HIGH silent-process-exec-var: corpus/core/src/cli/design-connect.ts:1120 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 1118 | 1119 | const invocation = resolveCurrentCliInvocation(argv); > 1120 | const child = spawn(invocation.command, invocation.args, { 1121 | cwd: process.cwd(), 1122 | detached: true,

HIGH env-spread: corpus/core/src/coding-tools/index.ts:460 semgrep

Spreading entire process.env into an object — may capture all secrets 458 | shell: true, 459 | stdio: ["pipe", "pipe", "pipe"], > 460 | env: { ...process.env, FORCE_COLOR: "0" }, 461 | }); 462 | let stdout = "";

HIGH env-spread: corpus/core/src/coding-tools/index.ts:512 semgrep

Spreading entire process.env into an object — may capture all secrets 510 | stdio: ["ignore", logFd, logFd], 511 | detached: true, > 512 | env: { ...process.env, FORCE_COLOR: "0" }, 513 | }); 514 | child.unref();

HIGH env-spread: corpus/core/src/deploy/build.ts:1431 semgrep

Spreading entire process.env into an object — may capture all secrets 1429 | execFileSync(process.execPath, [renderScript], { 1430 | cwd, > 1431 | env: { 1432 | ...process.env, 1433 | NODE_ENV: process.env.NODE_ENV || "production",

HIGH shady-links-exfil-services: corpus/core/src/integrations/adapters/telegram.ts:188 semgrep

URL pointing to known exfiltration/tunneling service 186 | try { 187 | const res = await fetch( > 188 | `https://api.telegram.org/bot${token}/sendMessage`, 189 | { 190 | method: "POST",

HIGH shady-links-exfil-services: corpus/core/src/integrations/adapters/telegram.ts:206 semgrep

URL pointing to known exfiltration/tunneling service 204 | // Retry without Markdown if parsing fails 205 | if (data.description?.includes("parse")) { > 206 | await fetch(`https://api.telegram.org/bot${token}/sendMessage`, { 207 | method: "POST", 208 | headers: { "Content-Type": "application/json" },

HIGH shady-links-exfil-services: corpus/core/src/integrations/adapters/telegram.ts:246 semgrep

URL pointing to known exfiltration/tunneling service 244 | try { 245 | const res = await fetch( > 246 | `https://api.telegram.org/bot${token}/sendMessage`, 247 | { 248 | method: "POST",

HIGH shady-links-exfil-services: corpus/core/src/integrations/adapters/telegram.ts:282 semgrep

URL pointing to known exfiltration/tunneling service 280 | if (hasToken) { 281 | try { > 282 | const res = await fetch(`https://api.telegram.org/bot${token}/getMe`); 283 | const data = (await res.json()) as { 284 | ok: boolean;

HIGH shady-links-exfil-services: corpus/core/src/integrations/plugin.ts:1658 semgrep

URL pointing to known exfiltration/tunneling service 1656 | try { 1657 | const res = await fetch( > 1658 | `https://api.telegram.org/bot${token}/setWebhook`, 1659 | { 1660 | method: "POST",

HIGH env-spread: corpus/core/src/scripts/dev/shell.ts:76 semgrep

Spreading entire process.env into an object — may capture all secrets 74 | 75 | function childProcessEnvForRequest(): NodeJS.ProcessEnv { > 76 | const env = { ...process.env, FORCE_COLOR: "0" }; 77 | const requestScoped = hasRequestContext(); 78 | const userEmail = getRequestUserEmail();

HIGH webhook-url: corpus/core/src/secrets/substitution.ts:240 semgrep

Hardcoded webhook URL suggests data exfiltration (matched inside a comment — likely documentation, not executed code) 238 | * 239 | * Matching is exact on the URL's origin (scheme + host + port), so an entry > 240 | * like `https://hooks.slack.com` blocks `https://evil.example.com` even if 241 | * the agent tries to redirect the request elsewhere. 242 | */

HIGH env-spread: corpus/core/src/terminal/pty-server.ts:245 semgrep

Spreading entire process.env into an object — may capture all secrets 243 | // Build env, stripping CLI-specific nesting vars 244 | const registry = CLI_REGISTRY[command]; > 245 | const env: Record<string, string | undefined> = { 246 | ...process.env, 247 | TERM: "xterm-256color",

HIGH silent-process-exec: corpus/templates/content/actions/reveal-local-source-file.ts:34 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 32 | } 33 | > 34 | const child = spawn(command, args, { 35 | detached: true, 36 | stdio: "ignore",

HIGH silent-process-exec-var: corpus/templates/content/actions/reveal-local-source-file.ts:34 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 32 | } 33 | > 34 | const child = spawn(command, args, { 35 | detached: true, 36 | stdio: "ignore",

HIGH env-spread: corpus/templates/content/scripts/dev-database.mjs:58 semgrep

Spreading entire process.env into an object — may capture all secrets 56 | 57 | const envValues = ensureLocalEnv(); > 58 | const childEnv = { 59 | ...process.env, 60 | AGENT_NATIVE_MODE: "database",

INFO Has SLSA provenance attestation provenance

Published via CI/CD with Sigstore attestation (predicate: https://slsa.dev/provenance/v1). This is the strongest supply chain integrity signal.

v0.84.2

31 findings
CRITICAL shady-links-exfil-services: corpus/core/src/integrations/adapters/telegram.ts:188 semgrep

URL pointing to known exfiltration/tunneling service 186 | try { 187 | const res = await fetch( > 188 | `https://api.telegram.org/bot${token}/sendMessage`, 189 | { 190 | method: "POST",

CRITICAL shady-links-exfil-services: corpus/core/src/integrations/adapters/telegram.ts:206 semgrep

URL pointing to known exfiltration/tunneling service 204 | // Retry without Markdown if parsing fails 205 | if (data.description?.includes("parse")) { > 206 | await fetch(`https://api.telegram.org/bot${token}/sendMessage`, { 207 | method: "POST", 208 | headers: { "Content-Type": "application/json" },

CRITICAL shady-links-exfil-services: corpus/core/src/integrations/adapters/telegram.ts:246 semgrep

URL pointing to known exfiltration/tunneling service 244 | try { 245 | const res = await fetch( > 246 | `https://api.telegram.org/bot${token}/sendMessage`, 247 | { 248 | method: "POST",

CRITICAL shady-links-exfil-services: corpus/core/src/integrations/adapters/telegram.ts:282 semgrep

URL pointing to known exfiltration/tunneling service 280 | if (hasToken) { 281 | try { > 282 | const res = await fetch(`https://api.telegram.org/bot${token}/getMe`); 283 | const data = (await res.json()) as { 284 | ok: boolean;

CRITICAL shady-links-exfil-services: corpus/core/src/integrations/plugin.ts:1658 semgrep

URL pointing to known exfiltration/tunneling service 1656 | try { 1657 | const res = await fetch( > 1658 | `https://api.telegram.org/bot${token}/setWebhook`, 1659 | { 1660 | method: "POST",

CRITICAL webhook-url: corpus/core/src/secrets/substitution.ts:240 semgrep

Hardcoded webhook URL suggests data exfiltration 238 | * 239 | * Matching is exact on the URL's origin (scheme + host + port), so an entry > 240 | * like `https://hooks.slack.com` blocks `https://evil.example.com` even if 241 | * the agent tries to redirect the request elsewhere. 242 | */

HIGH Missing gitHead — previous versions had it provenance

This version has no gitHead field linking it to a source commit, but previous versions did. This suggests the publish environment changed. Published by: GitHub Actions.

HIGH New file with network + code execution: dist/agent/harness/acp-adapter.js source-diff

Newly added file contains both network calls and dynamic code execution. This is a hallmark of dropper/loader malware.

HIGH env-spread: corpus/core/src/adapters/cli/shell-adapter.ts:73 semgrep

Spreading entire process.env into an object — may capture all secrets 71 | args, 72 | { > 73 | env: this.env ? { ...process.env, ...this.env } : process.env, 74 | cwd: this.cwd, 75 | timeout: this.timeoutMs,

HIGH env-spread: corpus/core/src/agent/harness/acp-adapter.ts:119 semgrep

Spreading entire process.env into an object — may capture all secrets 117 | sessionOptions.cwd ?? options.cwd ?? process.cwd(), 118 | ); > 119 | const env: NodeJS.ProcessEnv = { 120 | ...process.env, 121 | ...(options.env ?? {}),

HIGH env-spread: corpus/core/src/checkpoints/service.ts:7 semgrep

Spreading entire process.env into an object — may capture all secrets 5 | const TIMEOUT = 10_000; 6 | > 7 | const CHECKPOINT_ENV = { 8 | ...process.env, 9 | GIT_AUTHOR_NAME: "agent-native",

HIGH silent-process-exec: corpus/core/src/cli/app-skill.ts:1193 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 1191 | : "xdg-open"; 1192 | const args = process.platform === "win32" ? ["/c", "start", "", url] : [url]; > 1193 | const child = spawn(command, args, { 1194 | detached: true, 1195 | stdio: "ignore",

HIGH silent-process-exec-var: corpus/core/src/cli/app-skill.ts:1193 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 1191 | : "xdg-open"; 1192 | const args = process.platform === "win32" ? ["/c", "start", "", url] : [url]; > 1193 | const child = spawn(command, args, { 1194 | detached: true, 1195 | stdio: "ignore",

HIGH env-spread: corpus/core/src/cli/code-agent-connector.ts:482 semgrep

Spreading entire process.env into an object — may capture all secrets 480 | detached: true, 481 | stdio: ["ignore", "pipe", "pipe"], > 482 | env: { 483 | ...process.env, 484 | AGENT_NATIVE_CODE_AGENTS_HOME: codeAgentStoreRoot(),

HIGH silent-process-exec: corpus/core/src/cli/connect.ts:646 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 644 | const openArgs = 645 | process.platform === "win32" ? ["/c", "start", "", url] : [url]; > 646 | const child = spawn(command, openArgs, { 647 | stdio: "ignore", 648 | detached: true,

HIGH silent-process-exec-var: corpus/core/src/cli/connect.ts:646 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 644 | const openArgs = 645 | process.platform === "win32" ? ["/c", "start", "", url] : [url]; > 646 | const child = spawn(command, openArgs, { 647 | stdio: "ignore", 648 | detached: true,

HIGH silent-process-exec: corpus/core/src/cli/content-local.ts:305 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 303 | : "xdg-open"; 304 | const args = process.platform === "win32" ? ["/c", "start", "", url] : [url]; > 305 | const child = spawn(command, args, { 306 | detached: true, 307 | stdio: "ignore",

HIGH silent-process-exec-var: corpus/core/src/cli/content-local.ts:305 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 303 | : "xdg-open"; 304 | const args = process.platform === "win32" ? ["/c", "start", "", url] : [url]; > 305 | const child = spawn(command, args, { 306 | detached: true, 307 | stdio: "ignore",

HIGH env-spread: corpus/core/src/cli/content-local.ts:358 semgrep

Spreading entire process.env into an object — may capture all secrets 356 | stdio: "inherit", 357 | shell: process.platform === "win32", > 358 | env: { ...process.env, ...plan.env }, 359 | }); 360 |

HIGH env-spread: corpus/core/src/cli/create.ts:1896 semgrep

Spreading entire process.env into an object — may capture all secrets 1894 | cwd: dir, 1895 | stdio: "pipe", > 1896 | env: { 1897 | ...process.env, 1898 | GIT_AUTHOR_NAME: "agent-native",

HIGH silent-process-exec: corpus/core/src/cli/design-connect.ts:1120 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 1118 | 1119 | const invocation = resolveCurrentCliInvocation(argv); > 1120 | const child = spawn(invocation.command, invocation.args, { 1121 | cwd: process.cwd(), 1122 | detached: true,

HIGH silent-process-exec-var: corpus/core/src/cli/design-connect.ts:1120 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 1118 | 1119 | const invocation = resolveCurrentCliInvocation(argv); > 1120 | const child = spawn(invocation.command, invocation.args, { 1121 | cwd: process.cwd(), 1122 | detached: true,

HIGH env-spread: corpus/core/src/coding-tools/index.ts:460 semgrep

Spreading entire process.env into an object — may capture all secrets 458 | shell: true, 459 | stdio: ["pipe", "pipe", "pipe"], > 460 | env: { ...process.env, FORCE_COLOR: "0" }, 461 | }); 462 | let stdout = "";

HIGH env-spread: corpus/core/src/coding-tools/index.ts:512 semgrep

Spreading entire process.env into an object — may capture all secrets 510 | stdio: ["ignore", logFd, logFd], 511 | detached: true, > 512 | env: { ...process.env, FORCE_COLOR: "0" }, 513 | }); 514 | child.unref();

HIGH env-spread: corpus/core/src/deploy/build.ts:1431 semgrep

Spreading entire process.env into an object — may capture all secrets 1429 | execFileSync(process.execPath, [renderScript], { 1430 | cwd, > 1431 | env: { 1432 | ...process.env, 1433 | NODE_ENV: process.env.NODE_ENV || "production",

HIGH env-spread: corpus/core/src/scripts/dev/shell.ts:76 semgrep

Spreading entire process.env into an object — may capture all secrets 74 | 75 | function childProcessEnvForRequest(): NodeJS.ProcessEnv { > 76 | const env = { ...process.env, FORCE_COLOR: "0" }; 77 | const requestScoped = hasRequestContext(); 78 | const userEmail = getRequestUserEmail();

HIGH env-spread: corpus/core/src/terminal/pty-server.ts:245 semgrep

Spreading entire process.env into an object — may capture all secrets 243 | // Build env, stripping CLI-specific nesting vars 244 | const registry = CLI_REGISTRY[command]; > 245 | const env: Record<string, string | undefined> = { 246 | ...process.env, 247 | TERM: "xterm-256color",

HIGH silent-process-exec: corpus/templates/content/actions/reveal-local-source-file.ts:34 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 32 | } 33 | > 34 | const child = spawn(command, args, { 35 | detached: true, 36 | stdio: "ignore",

HIGH silent-process-exec-var: corpus/templates/content/actions/reveal-local-source-file.ts:34 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 32 | } 33 | > 34 | const child = spawn(command, args, { 35 | detached: true, 36 | stdio: "ignore",

HIGH env-spread: corpus/templates/content/scripts/dev-database.mjs:58 semgrep

Spreading entire process.env into an object — may capture all secrets 56 | 57 | const envValues = ensureLocalEnv(); > 58 | const childEnv = { 59 | ...process.env, 60 | AGENT_NATIVE_MODE: "database",

INFO Has SLSA provenance attestation provenance

Published via CI/CD with Sigstore attestation (predicate: https://slsa.dev/provenance/v1). This is the strongest supply chain integrity signal.