Chaintrap · npm supply chain
Static behavior detection plus OSV vulnerability intel in one report. Use findings for triage; confirm with your process — full stdout and JSON are in the appendix for audit.
npm-mal-scan rated malware risk CRITICAL for this package (heuristic static analysis — not a court verdict). Vulnerability signal: NONE; dependency confusion: NONE. Scanner verdict: CRITICAL.
Scanners prioritize signal over certainty: expect both false positives and blind spots. Chaintrap is designed to combine static detection with OSV CVE data so analysts spend time on packages that look risky and have known-vuln exposure — not to replace manual review or reputation checks.
14 runtime dependencies
| Package | Required | Flags |
|---|---|---|
| @dotenvx/dotenvx | ^1.52.0 | |
| @google-cloud/artifact-registry | ^4.0.1 | |
| @google-cloud/billing | ^5.0.1 | |
| @google-cloud/cloudbuild | ^5.0.1 | |
| @google-cloud/logging | ^11.2.0 | |
| @google-cloud/resource-manager | ^6.0.1 | |
| @google-cloud/run | ^3.1.0 | |
| @google-cloud/service-usage | ^4.1.0 | |
| @google-cloud/storage | ^7.16.0 | |
| @modelcontextprotocol/sdk | ^1.24.3 | |
| archiver | ^7.0.1 | |
| express | ^5.1.0 | |
| google-proto-files | ^5.0.0 | |
| zod | ^3.25.76 |
1.0.0Modes: OSV per dependency · resolve cap: 15 · per-child timeout: 120s
| Dependency | Declared | Resolved / status | OSV # | Max OSV severity | Full scan | Reports |
|---|---|---|---|---|---|---|
| @dotenvx/dotenvx | ^1.52.0 | 1.61.1 | 0 | — | — | — |
| @google-cloud/artifact-registry | ^4.0.1 | 4.7.0 | 0 | — | — | — |
| @google-cloud/billing | ^5.0.1 | 5.1.1 | 0 | — | — | — |
| @google-cloud/cloudbuild | ^5.0.1 | 5.5.0 | 0 | — | — | — |
| @google-cloud/logging | ^11.2.0 | 11.2.1 | 0 | — | — | — |
| @google-cloud/resource-manager | ^6.0.1 | 6.2.1 | 0 | — | — | — |
| @google-cloud/run | ^3.1.0 | 3.2.0 | 0 | — | — | — |
| @google-cloud/service-usage | ^4.1.0 | 4.2.1 | 0 | — | — | — |
| @google-cloud/storage | ^7.16.0 | 7.19.0 | 0 | — | — | — |
| @modelcontextprotocol/sdk | ^1.24.3 | 1.29.0 | 0 | — | — | — |
| archiver | ^7.0.1 | 7.0.1 | 0 | — | — | — |
| express | ^5.1.0 | 5.2.1 | 0 | — | — | — |
| google-proto-files | ^5.0.0 | 5.0.1 | 0 | — | — | — |
| zod | ^3.25.76 | 3.25.76 | 0 | — | — | — |
OSV queries use the resolved version shown (exact pins as declared; ranges use the highest published version satisfying the range). See NPM_RUNTIME_DEP_OSV_SCAN / NPM_RUNTIME_DEP_FULL_SCAN in operator docs.
Chaintrap pairs static behavior signals above with OSV data for this exact version — cross-check CVEs and malware listings with install scripts, execution paths, and scanner findings.
Source: osv.dev — queried at scan time.
No known vulnerabilities reported for this exact version.
Illustrative execution chain from scan order and behavior findings — heuristic, not a guaranteed exploit path.
lib/cloud-api/auth.js:65 — Subprocess: '2. Ensuring the `GOOGLE_APPLICATION_CREDENTIALS` environment variable points to a valid service account key file.'test/need-gcp/gcp-auth-check.test.js:126 — Subprocess: '2. Ensuring the `GOOGLE_APPLICATION_CREDENTIALS` environment variable points to a valid service account key file.',mcp-server.js:148 — Subprocess: token_endpoint: process.env.OAUTH_TOKEN_ENDPOINT,lib/clients.js:21 — Subprocess: const CLIENT_SECRET = process.env.GOOGLE_OAUTH_CLIENT_SECRET;lib/cloud-api/build.js:154 — Subprocess: const buildId = Buffer.from(encodedBuildId, 'base64').toString('ascii');lib/deployment/universal-maker.js:101 — Subprocess: const remoteSha256Hex = Buffer.from(remoteSha256Base64, 'base64').toString(lib/cloud-api/build.js:156 — Subprocess: while (true) {lib/cloud-api/helpers.js:37 — Subprocess: while (true) {lib/deployment/deployer.js:155 — Subprocess: skipIamCheck &&tools/register-tools.js:103 — Subprocess: projectId !== undefined &&lib/deployment/universal-maker.js:226 — Subprocess: const outputDir = path.join(os.tmpdir(), `um-output-${Date.now()}`);test/local/mcp-server-stdio.test.js:14 — Subprocess: serverProcess = spawn('node', ['mcp-server.js'], {T1 score=100 mcp-server.js package.json bin · publish entry (main / exports / module / browser) T3 score=25 constants.js other package script (tier 3 shallow scan) T3 score=25 lib/clients.js other package script (tier 3 shallow scan) T3 score=25 lib/cloud-api/auth.js other package script (tier 3 shallow scan) T3 score=25 lib/cloud-api/billing.js other package script (tier 3 shallow scan) T3 score=25 lib/cloud-api/build.js other package script (tier 3 shallow scan) T3 score=25 lib/cloud-api/helpers.js other package script (tier 3 shallow scan) T3 score=25 lib/cloud-api/metadata.js other package script (tier 3 shallow scan) T3 score=25 lib/cloud-api/projects.js other package script (tier 3 shallow scan) T3 score=25 lib/cloud-api/registry.js other package script (tier 3 shallow scan) T3 score=25 lib/cloud-api/run.js other package script (tier 3 shallow scan) T3 score=25 lib/cloud-api/storage.js other package script (tier 3 shallow scan) T3 score=25 lib/deployment/constants.js other package script (tier 3 shallow scan) T3 score=25 lib/deployment/deployer.js other package script (tier 3 shallow scan) T3 score=25 lib/deployment/helpers.js other package script (tier 3 shallow scan) T3 score=25 lib/deployment/source-processor.js other package script (tier 3 shallow scan) T3 score=25 lib/deployment/universal-maker.js other package script (tier 3 shallow scan) T3 score=25 lib/middleware/oauth.js other package script (tier 3 shallow scan) T3 score=25 lib/util/archive.js other package script (tier 3 shallow scan) T3 score=25 lib/util/helpers.js other package script (tier 3 shallow scan) T3 score=25 prompts.js other package script (tier 3 shallow scan) T3 score=25 test/local/clients.test.js other package script (tier 3 shallow scan) T3 score=25 test/local/cloud-api/build.test.js other package script (tier 3 shallow scan) T3 score=25 test/local/cloud-api/projects.test.js other package script (tier 3 shallow scan) T3 score=25 test/local/deployment-helpers.test.js other package script (tier 3 shallow scan) … and 21 more prioritized paths
Most signature hits in the command:
'2. Ensuring the `GOOGLE_APPLICATION_CREDENTIALS` environment variable points to a valid service account key file.'
DOCKER_CONFIG, KUBECONFIG, or similar CI/cloud credential paths are accessed
Most signature hits in the command:
const buildId = Buffer.from(encodedBuildId, 'base64').toString('ascii');
Buffer.from(..., "base64") or atob() is used to decode and run hidden code
Most signature hits in the command:
const remoteSha256Hex = Buffer.from(remoteSha256Base64, 'base64').toString(
Buffer.from(..., "base64") or atob() is used to decode and run hidden code
Most signature hits in the command:
'2. Ensuring the `GOOGLE_APPLICATION_CREDENTIALS` environment variable points to a valid service account key file.',
DOCKER_CONFIG, KUBECONFIG, or similar CI/cloud credential paths are accessed
Most signature hits in the command:
const CLIENT_SECRET = process.env.GOOGLE_OAUTH_CLIENT_SECRET;
Environment variables with KEY, SECRET, TOKEN, or PASSWORD in the name are read
Most signature hits in the command:
while (true) {
Infinite loop with network/exec calls is a persistent beacon/C2 pattern
Most signature hits in the command:
while (true) {
Infinite loop with network/exec calls is a persistent beacon/C2 pattern
Most signature hits in the command:
token_endpoint: process.env.OAUTH_TOKEN_ENDPOINT,
Environment variables with KEY, SECRET, TOKEN, or PASSWORD in the name are read
Most signature hits in the command:
skipIamCheck &&
Shell command sent to background with & — allows npm install to exit while payload runs
Most signature hits in the command:
const outputDir = path.join(os.tmpdir(), `um-output-${Date.now()}`);
Temp directory used to stage downloaded payloads or drop scripts
Most signature hits in the command:
projectId !== undefined &&
Shell command sent to background with & — allows npm install to exit while payload runs
Most signature hits in the command:
serverProcess = spawn('node', ['mcp-server.js'], {
spawn creates a child process
Most signature hits in the command:
serverProcess = spawn('node', ['mcp-server.js'], {
spawn creates a child process
[MEDIUM] DIFF_UNTRACKED_FILE File: example-sources-to-deploy/Dockerfile File "example-sources-to-deploy/Dockerfile" exists in the published tarball but is NOT present in the GitHub repository. Verify this is intentional (generated file, etc.).
[MEDIUM] DIFF_UNTRACKED_FILE File: example-sources-to-deploy/go.mod File "example-sources-to-deploy/go.mod" exists in the published tarball but is NOT present in the GitHub repository. Verify this is intentional (generated file, etc.).
[MEDIUM] DIFF_UNTRACKED_FILE File: example-sources-to-deploy/main.go File "example-sources-to-deploy/main.go" exists in the published tarball but is NOT present in the GitHub repository. Verify this is intentional (generated file, etc.).
No known vulnerabilities for this version.
constants.jslib/clients.jslib/cloud-api/auth.jslib/cloud-api/billing.jslib/cloud-api/build.jslib/cloud-api/helpers.jslib/cloud-api/metadata.jslib/cloud-api/projects.jslib/cloud-api/registry.jslib/cloud-api/run.jslib/cloud-api/storage.jslib/deployment/constants.jslib/deployment/deployer.jslib/deployment/helpers.jslib/deployment/source-processor.jslib/deployment/universal-maker.jslib/middleware/oauth.jslib/util/archive.jslib/util/helpers.jsmcp-server.js [bin][shebang]...and26morenpm uninstall npm uninstall -g package-lock.json and run npm install to your package manager deny-list or use .npmrc overridesGOOGLE_APPLICATION_CREDENTIALS if this package was executed on a system with that variable setOAUTH_TOKEN_ENDPOINT if this package was executed on a system with that variable setCLIENT_SECRET if this package was executed on a system with that variable setGOOGLE_OAUTH_CLIENT_SECRET if this package was executed on a system with that variable set