Back to skill

Security audit

SafeLink

Security checks for vulnerabilities and agentic risk

Overview

SafeLink has a coherent payments-and-agent-hiring purpose, but the reviewed artifacts expose high-impact wallet, payment, and deployment risks that need human review before installation.

Review this before installing, especially if you would use real funds or mainnet. Use only testnet funds, avoid storing long-lived secrets in the generated .env, do not run the documented curl-to-bash command, inspect or patch the deployment script, and treat Coinbase wallet export output as sensitive secret material. Do not use the x402 or escrow flows with valuable wallets until recipient/amount validation, allowance limits, and credential handling are hardened.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
Findings (8)

T03 · Remote Payload Retrieval and Execution

Error
Location
scripts/deploy-contracts.ts:6
Finding

Unpinned Remote Script Piped Directly into a Shell

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/deploy-contracts.ts:78
Finding

Shell Command Injection Through BASE_RPC_URL

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
src/payments/x402.ts:124
Finding

Facilitator-Controlled USDC Recipient and Amount Are Signed Without Validation

Content
View full analysis
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
src/payments/escrow.ts:196
Finding

Unlimited USDC Allowance Exceeds the Required Escrow Privilege

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/generate-env.ts:260
Finding

Sensitive Credentials Stored in .env Without Enforced Restrictive Permissions

Content
View full analysis
k && !k.startsWith("#")) .map(([k, v]) => `${k}=${v}`); writeFileSync(ENV_FILE, envLines.join("\n") + "\n"); ok(`.env written (${envLines.length} variables)`); ``` The values collected in `env` include sensitive entries such as: ```ts env["ANTHROPIC_API_KEY"] = key.trim(); env["COINBASE_CDP_API_KEY_PRIVATE_KEY"] = priv.trim(); env["PRIVY_APP_SECRET"] = secret.trim(); env["TENDERLY_ACCESS_KEY"] = tenderlyKey.trim(); ``` ### Technical Analysis The setup wizard serializes all credentials into a plaintext `.env` file. `writeFileSync()` is called without an explicit restrictive mode, and the script does not correct the permissions of an existing file. The effective permissions therefore depend on the process umask and prior file state. In environments with permissive defaults or a pre-existing broadly readable file, other local principals may be able to read the credentials. Sensitive prompts also use ordinary `readline.question()`, so entered secrets are displayed on the terminal rather than hidden. ### Attack Path 1. The operator runs `npm run setup`. 2. The operator enters LLM and wallet-provider credentials. 3. The script writes all values to plaintext `.env`. 4. The file inherits permissions that may permit access by other local users or services. 5. Another local principal, backup agent, log collector, or accidentally committed repository obtains the file. 6. The attacker reuses the credentials against the relevant providers. ### Impact Assessment Exposed credentials may permit: - Unauthorized LLM API usage and associated billing. - Privy or Coinbase API access and wallet signing operations, depending on provider policy. - Access to Tenderly or Redis services. - Disclosure of deployment configurat ...[truncated 120 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
src/wallet/coinbase.ts:168
Finding

Coinbase Wallet Export Material Is Printed and Partially Logged

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
scripts/deploy-contracts.ts:55
Finding

Unpinned Forge and npm Dependencies Create Mutable Supply-Chain Inputs

Content
View full analysis
/dev/null || true", { cwd: CONTRACTS_DIR, stdio: "inherit", }); } catch { // Already installed — fine } ``` Security-sensitive npm dependencies also use mutable ranges: ```json "dependencies": { "@coinbase/agentkit": "^0.4.0", "@privy-io/server-auth": "^1.14.0", "viem": "^2.21.54", "x402": "^1.1.0" } ``` No npm lockfile was present in the supplied artifact. ### Technical Analysis `forge install foundry-rs/forge-std --no-commit` retrieves an upstream repository without pinning an exact reviewed commit. The command also suppresses errors using shell redirection and `|| true`, allowing builds to continue in an uncertain dependency state. The npm manifest uses caret ranges, and the supplied artifact contains no lockfile. A future installation can therefore resolve versions different from those reviewed. This is particularly sensitive because the dependencies handle wallets, signatures, blockchain transactions, and payment protocols. This finding does not establish that the named packages are malicious. The issue is that installation inputs are mutable and insufficiently reproducible. ### Attack Path 1. An upstream repository, maintainer account, or later compatible package release is compromised. 2. The operator installs the project after the compromise. 3. Forge resolves the current repository state, or npm resolves a newer compatible dependency. 4. The modified dependency is compiled or executed with project privileges. 5. Malicious dependency code accesses runtime credentials, modifies transaction data, or affects deployment artifacts. ### Impact Assessment A compromised dependency can potentially ...[truncated 302 chars]
Remediation
View remediation
/dev/null || true`; dependency installation failures should stop the deployment. - Verify package integrity and review dependency provenance. - Enable automated dependency vulnerability and provenance scanning. - Rebuild and retest before accepting any dependency update. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
src/security/input-gate.ts:190
Finding

DNS Rebinding Gap Between Endpoint Validation and Subsequent Connection

Content
View full analysis
{ const parsed = validateEndpointUrl(rawUrl); const hostname = parsed.hostname.toLowerCase(); if (isIP(hostname)) { assertHostNotBlocked(hostname); return parsed; } let resolved: Array<{ address: string }> = []; try { const out = await resolver(hostname, { all: true }); resolved = out as Array<{ address: string }>; } catch { throw new ValidationError(`Could not resolve endpoint hostname "${hostname}"`); } if (resolved.length === 0) { throw new ValidationError(`Endpoint hostname "${hostname}" did not resolve to any address`); } for (const entry of resolved) { assertHostNotBlocked(entry.address.toLowerCase()); } return parsed; } ``` ### Technical Analysis The function checks the IP addresses returned by one DNS lookup, but it returns the original hostname-bearing URL. A later HTTP request will normally perform another DNS lookup. An attacker controlling DNS can return a public address during validation and then return a loopback, private, link-local, or metadata-service address during the actual connection. This creates a time-of-check/time-of-use gap. The explicit appearances of `metadata.google.internal` and `169.254.169.254` elsewhere in this file are defensive denylist entries; the code does not directly access those endpoints. The issue is that rebinding may bypass the intended denylist at connection time. ### Attack Path 1. An attacker registers or controls a domain used as an agent endpoint. 2. During `validateEndpointUrlStrict()`, DNS returns a public IP address. 3. Validation succeeds and returns the original URL. 4. The attacker changes the DNS response ...[truncated 747 chars]
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • YARA SignaturesMalware Match, Webshell Match, Cryptominer Match
Findings (82)

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

The declared description presents a production A2A operational skill centered on secure hiring/execution flows and runtime protections. This code chunk instead serves as a DevOps/deployment script for smart contracts. While it does relate loosely to ERC-8004 registry and escrow contracts mentioned in the description, its primary behavior is contract build/test/deploy automation on Base and local config updates. It also uses a deployer private key directly, which differs from the declared emphasis on MPC wallet signing for operations. The advanced runtime capabilities in the description—x402 payments, replay protection, DNS-safe validation, policy gating, and risk scoring—are not implemented or evidenced here. Therefore the description does not accurately represent what this code chunk actually does.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description presents a runtime security/transaction skill for agent-to-agent hiring and settlement workflows. The supplied code does not implement escrow, hiring/execution logic, x402 payments, ERC-8004 checks, DNS-safe endpoint validation, MPC signing, or replay protection enforcement. Instead, it is a developer setup utility whose primary purpose is environment configuration: collecting API keys and settings, testing connectivity to external services, warning about mainnet usage, and writing a .env file. While some configured variables relate to the broader system described (e.g., x402 facilitator URL, Redis for replay protection, Privy wallet provider), this code chunk itself only performs setup and validation, not the declared secure A2A workflow behavior.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

The code substantially supports part of the description: escrowed settlement, proof-before-settlement via proofCommitment/proofHash, risk-scored transactions, approval/policy gating, and MPC wallet signing. However, the declared description presents a broader production A2A hiring/execution skill with several specific security and payment capabilities that are not implemented in this chunk. The code is narrowly focused on escrow payment lifecycle management for a SafeEscrow contract using USDC, including allowance handling, simulation, risk gating, release/refund, and escrow state reads. There is no evidence here of x402 facilitator payments, ERC-8004 identity/reputation checks, replay protection, DNS-safe endpoint validation, or general A2A hiring/execution workflow behavior. Because those are prominent declared capabilities rather than minor implementation details, the description overstates what this code chunk actually does.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

The description presents a broad production A2A hiring/execution skill with multiple security and trust features. The supplied code chunk is much narrower: it handles x402 payment requirement retrieval, validates facilitator-returned chainId/token/deadline, signs a USDC TransferWithAuthorization payload via MPC wallet, submits it to a facilitator, and verifies receipts. MPC wallet signing and x402 facilitator payments do align with the description, and there is some defensive validation. However, most of the declared core capabilities are not represented in this code chunk, especially escrow, identity/reputation checks, DNS-safe endpoint validation, policy gating, and risk scoring. Because the declared purpose materially overstates the implemented behavior of the provided code, this is a mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The supplied code is narrowly focused on MPC wallet operations: selecting a wallet provider, creating/loading a wallet, sending EVM transactions, signing typed data and messages, and exposing the agent address. While MPC wallet signing is indeed present and aligns with one part of the description, the majority of the declared purpose is not represented in this code chunk. There is no evidence of escrow logic, hiring/execution workflow handling, x402 payments, ERC-8004 identity or reputation validation, DNS-safe endpoint checks, explicit replay-protection mechanisms beyond ordinary transaction nonce usage, policy gating, or risk scoring. Because the declared description presents a much broader secure A2A execution/hiring skill and this code only implements wallet functionality, the description does not accurately represent what this specific code chunk actually does.

Content

No source excerpt is available for this finding.

YARA rule 'agent_skill_prompt_injection_hidden_instructions': Prompt injection or hidden instructions embedded in AI agent skill text [agent_skills]

High
Category
YARA Match
Confidence
80% confidence
Finding

YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).

Content

Scanner excerpt · SKILL.md (reported line 11)May include surrounding context.

md
Base RPC endpoint), ERC8004_REGISTRY_ADDRESS (after deploy), SAFE_ESCROW_ADDRESS (after deploy), X402_FACILITATOR_URL (default: https://x402.org/facilitator)"
  required_env_wallet: "One of: COINBASE_CDP_API_KEY_NAME + COINBASE_CDP_API_KEY_PRIVATE_KEY (Coinbase AgentKit) OR PRIVY_APP_ID + PRIVY_APP_SECRET (Privy MPC). Both are MPC providers — private keys never enter app memory."
  required_env_llm: "ANTHROPIC_API_KEY (when LLM_PROVIDER=anthropic, default) OR LLM_BASE_URL + LLM_API_KEY (when LLM_PROVIDER=openai_compatible)"
  optional_env: "REDIS_URL (multi-instance replay store), TENDERLY_ACCESS_KEY (simulation), BASESCAN_API_KEY (explorer), TASK_AUTH_SHARED_SECRET (>=32 chars, when TASK_AUTH_REQUIRED=true), SIWX_VERIFIER_URL (when SIWX_REQUIRED=true), AUTONOMYS_RPC_URL (memory checkpoints)"
  deploy_only_env: "DEPLOYER_PRIVATE_KEY — used once by scripts/deploy-contracts.ts to deploy on-chain contracts. NOT loaded at MCP runtime. Use a throwaway funded key; discard after deploymen

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 15)May include surrounding context.

md
runtime_files: "scripts/generate-env.ts writes .env interactively on first setup. scripts/deploy-contracts.ts writes deployed contract addresses back to .env af

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 439)May include surrounding context.

md
runtime_files: "scripts/generate-env.ts writes .env interactively on first setup. scripts/deploy-contracts.ts writes deployed contract addresses back to .env af

Credential Access

High
Category
Privilege Escalation
Confidence
88% confidence
Finding

The skill requires and documents handling of multiple secrets in .env, including API credentials and a deployer private key for one-time contract deployment. Even though the file says the deployer key is not used at runtime, combining secret collection, local file writes, and agent-accessible environment usage materially increases the blast radius if the host, setup scripts, or logs are compromised.

Content

Scanner excerpt · SKILL.md (reported line 15)May include surrounding context.

md
optional_env: "REDIS_URL (multi-instance replay store), TENDERLY_ACCESS_KEY (simulation), BASESCAN_API_KEY (explorer), TASK_AUTH_SHARED_SECRET (>=32 chars, when TASK_AUTH_REQUIRED=true), SIWX_VERIFIER_URL (when SIWX_REQUIRED=true), AUTONOMYS_RPC_URL (memory checkpoints)"
  deploy_only_env: "DEPLOYER_PRIVATE_KEY — used once by scripts/deploy-contracts.ts to deploy on-chain contracts. NOT loaded at MCP runtime. Use a throwaway funded key; discard after deployment."
  runtime_network: "Opens HTTP server on TASK_SERVER_PORT (default 3402, bound to 127.0.0.1) only when safe_listen_for_hire tool is called."
  runtime_files: "scripts/generate-env.ts writes .env interactively on first setup. scripts/deploy-contracts.ts writes deployed contract addresses back to .env after one-time deployment. Neither runs automatically."
  security_test_note: "tests/stress/ files contain literal prompt-injection strings (e.g. Ignore all previous instructions) as adversarial test fixtures to verify the input-gate blocks them. These are not instructions."
  homepage: "https://github.com/charliebot8888/SafeLink"
  repository: "https://github.com/charliebot8888/SafeLink"

Instruction Override

High
Category
Prompt Injection
Confidence
80% confidence
Finding

This pattern attempts to override system instructions or ignore safety constraints. Without LLM analysis, manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 16)May include surrounding context.

md
deploy_only_env: "DEPLOYER_PRIVATE_KEY — used once by scripts/deploy-contracts.ts to deploy on-chain contracts. NOT loaded at MCP runtime. Use a throwaway funded key; discard after deployment."
  runtime_network: "Opens HTTP server on TASK_SERVER_PORT (default 3402, bound to 127.0.0.1) only when safe_listen_for_hire tool is called."
  runtime_files: "scripts/generate-env.ts writes .env interactively on first setup. scripts/deploy-contracts.ts writes deployed contract addresses back to .env after one-time deployment. Neither runs automatically."
  security_test_note: "tests/stress/ files contain literal prompt-injection strings (e.g. Ignore all previous instructions) as adversarial test fixtures to verify the input-gate blocks them. These are not instructions."
  homepage: "https://github.com/charliebot8888/SafeLink"
  repository: "https://github.com/charliebot8888/SafeLink"
---

Instruction Override

High
Category
Prompt Injection
Confidence
80% confidence
Finding

This pattern attempts to override system instructions or ignore safety constraints. Without LLM analysis, manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 441)May include surrounding context.

md
deploy_only_env: "DEPLOYER_PRIVATE_KEY — used once by scripts/deploy-contracts.ts to deploy on-chain contracts. NOT loaded at MCP runtime. Use a throwaway funded key; discard after deployment."
  runtime_network: "Opens HTTP server on TASK_SERVER_PORT (default 3402, bound to 127.0.0.1) only when safe_listen_for_hire tool is called."
  runtime_files: "scripts/generate-env.ts writes .env interactively on first setup. scripts/deploy-contracts.ts writes deployed contract addresses back to .env after one-time deployment. Neither runs automatically."
  security_test_note: "tests/stress/ files contain literal prompt-injection strings (e.g. Ignore all previous instructions) as adversarial test fixtures to verify the input-gate blocks them. These are not instructions."
  homepage: "https://github.com/charliebot8888/SafeLink"
  repository: "https://github.com/charliebot8888/SafeLink"
---

Instruction Override

High
Category
Prompt Injection
Confidence
80% confidence
Finding

This pattern attempts to override system instructions or ignore safety constraints. Without LLM analysis, manual review is recommended.

Content

Scanner excerpt · _meta.json (reported line 86)May include surrounding context.

json
deploy_only_env: "DEPLOYER_PRIVATE_KEY — used once by scripts/deploy-contracts.ts to deploy on-chain contracts. NOT loaded at MCP runtime. Use a throwaway funded key; discard after deployment."
  runtime_network: "Opens HTTP server on TASK_SERVER_PORT (default 3402, bound to 127.0.0.1) only when safe_listen_for_hire tool is called."
  runtime_files: "scripts/generate-env.ts writes .env interactively on first setup. scripts/deploy-contracts.ts writes deployed contract addresses back to .env after one-time deployment. Neither runs automatically."
  security_test_note: "tests/stress/ files contain literal prompt-injection strings (e.g. Ignore all previous instructions) as adversarial test fixtures to verify the input-gate blocks them. These are not instructions."
  homepage: "https://github.com/charliebot8888/SafeLink"
  repository: "https://github.com/charliebot8888/SafeLink"
---

YARA rule 'agent_skill_prompt_injection_hidden_instructions': Prompt injection or hidden instructions embedded in AI agent skill text [agent_skills]

High
Category
YARA Match
Confidence
80% confidence
Finding

YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).

Content

Scanner excerpt · _meta.json (reported line 13)May include surrounding context.

json
rst MCP server for agent-to-agent hiring with on-chain escrow, x402 USDC micropayments, MPC wallets, ERC-8004 identity, and policy-gated transactions on Base.",
  "tags": ["security", "web3", "a2a", "payments", "escrow", "x402", "erc-8004", "agentic-wallet", "mcp", "production"],
  "requiredEnv": [
    {
      "name": "ANTHROPIC_API_KEY",
      "description": "Claude Haiku key for task execution (LLM_PROVIDER=anthropic)",
      "sensitive": true,
      "required": "when LLM_PROVIDER=anthropic"
    },
    {
      "name": "BASE_RPC_URL",
      "description": "Base network RPC endpoint (default: https://sepolia.base.org)",
      "sensitive": false,
      "required": "always"
    },
    {
      "name": "PRIVY_APP_ID",
      "description": "Privy application ID for MPC wallet (WALLET_PROVIDER=privy)",
      "sensitive": false,
      "required": "when WALLET_PROVIDER=privy"
    },
    {
      "name": "PRIVY_APP_SECRET",
      "description": "Privy application secret for MPC wallet signing",

External Script Fetching

High
Category
Supply Chain
Confidence
96% confidence
Finding

The documented prerequisite curl -L https://foundry.paradigm.xyz | bash is a classic pipe-to-shell pattern that executes remote content without integrity verification. If the remote endpoint, DNS, TLS trust chain, or distribution path is compromised, users could run arbitrary code on their machine, which is especially dangerous in a deployment workflow that also handles private keys.

Content

Scanner excerpt · scripts/deploy-contracts.ts (reported line 6)May include surrounding context.

ts
* Deploy ERC8004Registry and SafeEscrow to Base (Sepolia or Mainnet based on BASE_RPC_URL).
 *
 * Prerequisites:
 *   1. Install Foundry: curl -L https://foundry.paradigm.xyz | bash && foundryup
 *   2. Set BASE_RPC_URL and DEPLOYER_PRIVATE_KEY in .env
 *   3. Fund the deployer address with ETH on the target Base network
 *

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
70% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · scripts/deploy-contracts.ts (reported line 32)May include surrounding context.

ts
process.exit(1);
}

if (!process.env["DEPLOYER_PRIVATE_KEY"]) {
  console.error(
    "闂?DEPLOYER_PRIVATE_KEY not set in .env\n" +
    "   This is a ONE-TIME deploy key 闂?you can use a throwaway.\n" +

External Script Fetching

High
Category
Supply Chain
Confidence
96% confidence
Finding

Repeating the same pipe-to-shell install command in an error message reinforces unsafe operator behavior and normalizes arbitrary remote script execution. Because this skill is for production A2A and contract deployment, the context increases risk: a compromised installer could steal wallet material, alter artifacts, or tamper with deployments.

Content

Scanner excerpt · scripts/deploy-contracts.ts (reported line 48)May include surrounding context.

ts
} catch {
  console.error(
    "闂?Foundry not found.\n" +
    "   Install: curl -L https://foundry.paradigm.xyz | bash && foundryup"
  );
  process.exit(1);
}

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · _meta.json (reported line 82)May include surrounding context.

json
#!/usr/bin/env tsx
/**
 * SafeLink interactive .env setup wizard.
 *
 * Usage: npm run setup
 */

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · _meta.json (reported line 84)May include surrounding context.

json
#!/usr/bin/env tsx
/**
 * SafeLink interactive .env setup wizard.
 *
 * Usage: npm run setup
 */

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/deploy-contracts.ts (reported line 7)May include surrounding context.

ts
#!/usr/bin/env tsx
/**
 * SafeLink interactive .env setup wizard.
 *
 * Usage: npm run setup
 */

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/deploy-contracts.ts (reported line 109)May include surrounding context.

ts
#!/usr/bin/env tsx
/**
 * SafeLink interactive .env setup wizard.
 *
 * Usage: npm run setup
 */

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/deploy-contracts.ts (reported line 127)May include surrounding context.

ts
#!/usr/bin/env tsx
/**
 * SafeLink interactive .env setup wizard.
 *
 * Usage: npm run setup
 */

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/generate-env.ts (reported line 3)May include surrounding context.

ts
#!/usr/bin/env tsx
/**
 * SafeLink interactive .env setup wizard.
 *
 * Usage: npm run setup
 */

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · src/wallet/mpc.ts (reported line 256)May include surrounding context.

ts
#!/usr/bin/env tsx
/**
 * SafeLink interactive .env setup wizard.
 *
 * Usage: npm run setup
 */

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/deploy-contracts.ts (reported line 23)May include surrounding context.

ts
import { fileURLToPath } from "url";

const __dirname = dirname(fileURLToPath(import.meta.url));
const ENV_FILE = join(__dirname, "..", ".env");
const MAINNET_CONFIRM_PHRASE = "I_UNDERSTAND_MAINNET_RISK";

const rl = readline.createInterface({ input: process.stdin, output: process.stdout });

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/deploy-contracts.ts (reported line 28)May include surrounding context.

ts
import { fileURLToPath } from "url";

const __dirname = dirname(fileURLToPath(import.meta.url));
const ENV_FILE = join(__dirname, "..", ".env");
const MAINNET_CONFIRM_PHRASE = "I_UNDERSTAND_MAINNET_RISK";

const rl = readline.createInterface({ input: process.stdin, output: process.stdout });