Back to skill

Security audit

Ardi Skill

Security checks for vulnerabilities and agentic risk

Overview

The skill matches its web3 purpose, but it needs careful review because installation and autonomous mining can run mutable remote code, and wallet-signing operations can rely on coordinator-supplied contract addresses despite an advertised allowlist.

Review this before installing, especially if the wallet holds valuable assets. Prefer a pinned release with verified checksums, avoid the pipe-to-shell bootstrap, confirm the exact contract addresses used for every signing operation, and only enable auto-mine if you are comfortable with a user-level recurring agent that can submit on-chain transactions through awp-wallet.

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 (4)

T03 · Remote Payload Retrieval and Execution

Error
Location
scripts/bootstrap.sh:10
Finding

Bootstrap Executes Mutable Remote Shell Code Without Verification

Content
View full analysis
/dev/null 2>&1; then TMP="$(mktemp)" URL="https://raw.githubusercontent.com/awp-worknet/ardi-skill/main/install.sh" if command -v curl >/dev/null 2>&1; then curl -fsSL -o "$TMP" "$URL" elif command -v wget >/dev/null 2>&1; then wget -qO "$TMP" "$URL" elif command -v python3 >/dev/null 2>&1; then python3 -c "import sys, urllib.request; urllib.request.urlretrieve(sys.argv[1], sys.argv[2])" "$URL" "$TMP" else echo "need curl, wget, or python3 to fetch ardi-agent" >&2; exit 1 fi INSTALL_DIR="$INSTALL_DIR" sh "$TMP" fi ``` The documented installation path also pipes the mutable script directly into a shell: ```sh curl -fsSL https://raw.githubusercontent.com/awp-worknet/ardi-skill/main/install.sh | sh ``` The auto-mine path independently retrieves and executes mutable repository content: ```rust let status = Command::new("git") .args(["clone", "--depth", "1", REPO_URL]) .arg(&clone_dir) .status() .map_err(|e| anyhow!("git clone failed to spawn: {e}"))?; ``` ```rust let status = Command::new("bash") .arg(&installer) .status() .map_err(|e| anyhow!("failed to exec {}: {e}", installer.display()))?; ``` ### Technical Analysis The bootstrap retrieves `install.sh` from the mutable `main` branch and immediately executes it. It does not pin a commit hash, validate a cryptographic checksum, verify a signature, or compare the downloaded file with the installer bundled in the audited artifact. Consequently, the code that runs during installation is not necessarily the code reviewed in this audit. TLS protects the connection in transit, but it does not protect against repository compromise ...[truncated 1603 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Error
Location
install.sh:93
Finding

Installer Executes an Unpinned Release Binary Without Integrity Verification

Content
View full analysis
/dev/null \ || fetch "https://api.github.com/repos/${REPO}/releases/latest" \ | grep '"tag_name"' | head -1 | sed 's/.*: "\(.*\)".*/\1/')" if [ -z "${LATEST}" ]; then echo "Error: could not find latest release of ${REPO}" >&2 echo " Check https://github.com/${REPO}/releases" >&2 exit 1 fi URL="https://github.com/${REPO}/releases/download/${LATEST}/${BINARY_NAME}" echo "Downloading ardi-agent ${LATEST} (${OS_NAME}/${ARCH_NAME})..." TMPFILE="$(mktemp)" if ! save "${URL}" "${TMPFILE}"; then rm -f "${TMPFILE}" echo "Error: download failed from ${URL}" >&2 exit 1 fi chmod +x "${TMPFILE}" ``` ### Technical Analysis The installer dynamically resolves the repository's “latest” release, downloads the corresponding executable, and makes it executable without performing any artifact-integrity or publisher-authenticity check. No SHA-256 digest, detached signature, Sigstore verification, GitHub artifact attestation, or reproducible-build comparison is used. The selected version is also not tied to the Skill version being audited. As a result, installation can retrieve a different binary at different times while using the same reviewed Skill package. HTTPS alone does not establish that the release artifact was produced from the audited source code. ### Attack Path 1. An attacker compromises the GitHub repository, release credentials, CI workflow, or release artifact upload process. 2. The attacker publishes a malicious release that becomes the repository's latest release or replaces the expected artifact. 3. The installer queries the mutable latest-release endpoint and receives the attacker-controlled tag. 4. It down ...[truncated 821 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
src/cmd/repair.rs:28
Finding

Coordinator-Controlled Contract Addresses Bypass the Claimed Transaction Allowlist

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
src/state.rs:145
Finding

Commit Preimages Are Stored Without Enforced Restrictive File Permissions

Content
View full analysis
Result<()> { let tmp = p.with_extension("json.tmp"); fs::write(&tmp, serde_json::to_string_pretty(self)?)?; fs::rename(&tmp, p)?; Ok(()) } ``` ### Technical Analysis The commit-reveal protocol depends on keeping the `(answer, salt)` preimage confidential until reveal. The state writer uses `fs::write`, which creates the temporary file according to the process umask. It does not explicitly create the state directory as mode `0700` or state, temporary, and lock files as mode `0600`. On systems with permissive umasks, shared home directories, unusual container defaults, or inherited directory permissions, another local account may be able to read the state file. Atomic rename protects against partial writes but does not enforce confidentiality. The issue also applies to pre-existing state files: the code does not inspect or repair unsafe ownership or modes before reading and updating them. ### Attack Path 1. The Skill runs under a permissive umask or in an environment where `~/.ardi-agent` is accessible to another local user. 2. `fs::write` creates `state-.json.tmp` with group- or world-readable permissions. 3. The temporary file is renamed to `state-.json` while retaining those permissions. 4. A local attacker reads the plaintext answer and salt before the reveal transaction. 5. The attacker ...[truncated 790 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (93)

Chaining Abuse

High
Category
Tool Misuse
Confidence
99% confidence
Finding

Piping downloaded content directly into sh is a classic command-chaining abuse pattern because it converts untrusted network content into immediate execution. This eliminates opportunities for inspection, integrity checks, sandboxing, or policy controls, making compromise straightforward if the upstream content is ever altered. In a skill tied to wallet tooling and costly blockchain operations, the blast radius includes host takeover, transaction tampering, and financial loss.

Content

Scanner excerpt · README.md (reported line 14)May include surrounding context.

Recommended (auto-detects OS / arch / GLIBC):

bash
curl -fsSL https://raw.githubusercontent.com/awp-worknet/ardi-skill/main/install.sh | sh

This drops the ardi-agent binary in ~/.local/bin (or /usr/local/bin

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

Uninstalling or modifying user systemd services is a host-management capability not obvious from the top-level Ardi operations framing. Hidden cleanup or service-management behavior can surprise users and cause unintended local state changes even if it is not overtly malicious.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

Uninstalling or modifying user systemd services is a host-management capability not obvious from the top-level Ardi operations framing. Hidden cleanup or service-management behavior can surprise users and cause unintended local state changes even if it is not overtly malicious.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Uninstalling or modifying user systemd services is a host-management capability not obvious from the top-level Ardi operations framing. Hidden cleanup or service-management behavior can surprise users and cause unintended local state changes even if it is not overtly malicious.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Uninstalling or modifying user systemd services is a host-management capability not obvious from the top-level Ardi operations framing. Hidden cleanup or service-management behavior can surprise users and cause unintended local state changes even if it is not overtly malicious.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Uninstalling or modifying user systemd services is a host-management capability not obvious from the top-level Ardi operations framing. Hidden cleanup or service-management behavior can surprise users and cause unintended local state changes even if it is not overtly malicious.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

Uninstalling or modifying user systemd services is a host-management capability not obvious from the top-level Ardi operations framing. Hidden cleanup or service-management behavior can surprise users and cause unintended local state changes even if it is not overtly malicious.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

Uninstalling or modifying user systemd services is a host-management capability not obvious from the top-level Ardi operations framing. Hidden cleanup or service-management behavior can surprise users and cause unintended local state changes even if it is not overtly malicious.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Uninstalling or modifying user systemd services is a host-management capability not obvious from the top-level Ardi operations framing. Hidden cleanup or service-management behavior can surprise users and cause unintended local state changes even if it is not overtly malicious.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Uninstalling or modifying user systemd services is a host-management capability not obvious from the top-level Ardi operations framing. Hidden cleanup or service-management behavior can surprise users and cause unintended local state changes even if it is not overtly malicious.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

Uninstalling or modifying user systemd services is a host-management capability not obvious from the top-level Ardi operations framing. Hidden cleanup or service-management behavior can surprise users and cause unintended local state changes even if it is not overtly malicious.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Uninstalling or modifying user systemd services is a host-management capability not obvious from the top-level Ardi operations framing. Hidden cleanup or service-management behavior can surprise users and cause unintended local state changes even if it is not overtly malicious.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Uninstalling or modifying user systemd services is a host-management capability not obvious from the top-level Ardi operations framing. Hidden cleanup or service-management behavior can surprise users and cause unintended local state changes even if it is not overtly malicious.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Uninstalling or modifying user systemd services is a host-management capability not obvious from the top-level Ardi operations framing. Hidden cleanup or service-management behavior can surprise users and cause unintended local state changes even if it is not overtly malicious.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

Uninstalling or modifying user systemd services is a host-management capability not obvious from the top-level Ardi operations framing. Hidden cleanup or service-management behavior can surprise users and cause unintended local state changes even if it is not overtly malicious.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

Uninstalling or modifying user systemd services is a host-management capability not obvious from the top-level Ardi operations framing. Hidden cleanup or service-management behavior can surprise users and cause unintended local state changes even if it is not overtly malicious.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Uninstalling or modifying user systemd services is a host-management capability not obvious from the top-level Ardi operations framing. Hidden cleanup or service-management behavior can surprise users and cause unintended local state changes even if it is not overtly malicious.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Uninstalling or modifying user systemd services is a host-management capability not obvious from the top-level Ardi operations framing. Hidden cleanup or service-management behavior can surprise users and cause unintended local state changes even if it is not overtly malicious.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Uninstalling or modifying user systemd services is a host-management capability not obvious from the top-level Ardi operations framing. Hidden cleanup or service-management behavior can surprise users and cause unintended local state changes even if it is not overtly malicious.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

Uninstalling or modifying user systemd services is a host-management capability not obvious from the top-level Ardi operations framing. Hidden cleanup or service-management behavior can surprise users and cause unintended local state changes even if it is not overtly malicious.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Uninstalling or modifying user systemd services is a host-management capability not obvious from the top-level Ardi operations framing. Hidden cleanup or service-management behavior can surprise users and cause unintended local state changes even if it is not overtly malicious.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Uninstalling or modifying user systemd services is a host-management capability not obvious from the top-level Ardi operations framing. Hidden cleanup or service-management behavior can surprise users and cause unintended local state changes even if it is not overtly malicious.

Content

No source excerpt is available for this finding.

Chaining Abuse

High
Category
Tool Misuse
Confidence
98% confidence
Finding

The documented curl ... | sh one-liner is a classic chaining-abuse pattern because it streams mutable remote code straight into the shell. In the context of an agent skill explicitly designed for automated use, this raises the likelihood of blind execution and makes compromise of the repository, branch, or delivery path immediately actionable.

Content

Scanner excerpt · install.sh (reported line 4)May include surrounding context.

sh
#!/bin/sh
# Install ardi-agent binary from GitHub releases.
# Usage:
#   curl -fsSL https://raw.githubusercontent.com/awp-worknet/ardi-skill/main/install.sh | sh
# or
#   sh install.sh
#

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The code downloads a remote shell script to a temporary file and immediately executes it with sh, which is a classic arbitrary code execution pattern. Because the fetched content is not authenticated or integrity-checked, an attacker controlling the source or delivery path can run any commands with the privileges of the invoking agent or user.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The script silently downloads and runs a remote installer as the first action, with no warning, consent, or opportunity for review. In an agent skill context, this is especially dangerous because the bootstrap may run automatically, turning repository compromise or installer drift into unattended code execution across multiple hosts.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.