@agent-native/core
Framework for agent-native application development — where AI agents and UI share state via files
Supply chain provenance
Status for the latest visible version.
Maintainers
Accepted risks
Findings the reviewer chose to accept rather than block on.
| Source | Rule | Reason | Accepted by | When |
|---|---|---|---|---|
| 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 findingsNewly added source file contains lines over 3000 chars, suggesting minified or obfuscated code. New obfuscated files are a strong attack indicator.
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 findingPublished via CI/CD with Sigstore attestation (predicate: https://slsa.dev/provenance/v1). This is the strongest supply chain integrity signal.
v0.101.2
1 findingPublished via CI/CD with Sigstore attestation (predicate: https://slsa.dev/provenance/v1). This is the strongest supply chain integrity signal.
v0.99.0
1 findingPublished via CI/CD with Sigstore attestation (predicate: https://slsa.dev/provenance/v1). This is the strongest supply chain integrity signal.
v0.93.0
1 findingPublished via CI/CD with Sigstore attestation (predicate: https://slsa.dev/provenance/v1). This is the strongest supply chain integrity signal.
v0.92.11
1 findingPublished via CI/CD with Sigstore attestation (predicate: https://slsa.dev/provenance/v1). This is the strongest supply chain integrity signal.
v0.91.0
1 findingPublished via CI/CD with Sigstore attestation (predicate: https://slsa.dev/provenance/v1). This is the strongest supply chain integrity signal.
v0.87.0
2 findingsThis 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.
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 findingsThis 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.
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,
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 ?? {}),
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",
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",
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",
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(),
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,
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,
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",
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",
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 |
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",
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,
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,
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 = "";
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();
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",
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",
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" },
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",
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;
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",
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();
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 | */
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",
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",
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",
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",
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 findingsThis 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.
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,
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 ?? {}),
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",
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",
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",
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(),
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,
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,
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",
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",
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 |
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",
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,
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,
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 = "";
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();
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",
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",
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" },
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",
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;
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",
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();
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 | */
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",
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",
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",
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",
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 findingsURL 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",
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" },
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",
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;
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",
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 | */
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.
Newly added file contains both network calls and dynamic code execution. This is a hallmark of dropper/loader malware.
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,
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 ?? {}),
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",
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",
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",
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(),
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,
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,
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",
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",
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 |
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",
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,
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,
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 = "";
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();
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",
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();
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",
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",
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",
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",
Published via CI/CD with Sigstore attestation (predicate: https://slsa.dev/provenance/v1). This is the strongest supply chain integrity signal.