T03 · Remote Payload Retrieval and Execution
- Location
SKILL.md:106- Finding
Unpinned Remote Installer Is Downloaded and Executed Directly
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is a coherent Solana devnet coin-flip skill, but it should go to Review because it asks users to run an unpinned remote installer and exposes a fund-moving gambling flow with under-disclosed and unsafe contract behavior.
Review before installing. Use only a throwaway devnet wallet with no real assets, avoid running the curl-to-sh installer unless you independently trust and verify it, and do not treat the jackpot game as fair or production-safe without contract fixes for randomness and round-specific payout accounting.
SKILL.md:106Unpinned Remote Installer Is Downloaded and Executed Directly
program/src/lib.rs:106Public and Caller-Timed Inputs Are Used as Gambling Randomness
program/src/lib.rs:137Delayed Claims Can Capture Jackpot Deposits from Later Rounds
The documented behavior does not fully match the broader capability set described by analysis: operator fee withdrawal, admin/authority controls, and local test-harness behavior are materially relevant to user trust and financial risk. When a blockchain skill omits fee extraction paths or control relationships, users may send funds under false assumptions about decentralization, custody, or where value can be diverted.
bigint-buffer 1.1.5 is explicitly present in the lockfile and is reported with a high-severity memory safety issue in toBigIntLE(). Even though this is a transitive dependency, native install-script/native-binding packages increase supply-chain and memory-corruption risk, especially in a blockchain client stack that processes binary data.
brace-expansion 2.0.2 is present and the cited advisories are classic expansion-based DoS issues. In this lockfile it appears in dev/test tooling paths, which lowers exploitability in production, but it still represents a real dependency risk if CI, local tooling, or any exposed build service processes attacker-controlled glob patterns.
js-yaml 4.1.1 is present with multiple CPU-exhaustion advisories. Although it appears via mocha dev tooling and is less likely to be reachable in production, YAML parsers are commonly abused for DoS when they consume attacker-controlled input in CI, tests, or auxiliary scripts.
minimatch 9.0.5 is present and affected by multiple ReDoS/backtracking issues. In this tree it is tied to dev tooling, reducing direct runtime risk, but any service or automation that accepts attacker-controlled glob patterns could suffer significant CPU exhaustion.
ws 8.19.0 is present through rpc-websockets and carries memory disclosure and memory exhaustion advisories. Because Solana clients rely on websocket/RPC connectivity, this is more relevant than a generic tooling issue: malformed remote websocket traffic could affect a running client that monitors chain events.
serialize-javascript 6.0.2 is present with reported RCE and CPU-exhaustion issues, but in this dependency graph it is part of mocha test tooling rather than the declared runtime blockchain dependencies. That makes runtime exploitability less likely for the shipped skill, though it remains a real supply-chain issue for developer and CI environments.
toml 3.0.0 is directly present under anchor and the cited issues include uncontrolled recursion and prototype pollution. Since Anchor-based Solana projects commonly parse TOML configuration files, compromised or attacker-supplied config input could cause denial of service or object prototype corruption in supporting scripts and tooling.
ws 7.5.10 is also present separately under jayson and carries a high-severity memory exhaustion DoS issue. Because jayson is used by @solana/web3.js for RPC interactions, a blockchain-facing client may maintain network connections that increase the practical relevance of websocket resource-exhaustion bugs.
The test script invokes ts-mocha through npx without pinning an explicit version, which can cause execution of whatever package version is currently resolved from the registry. In environments without a locked local dependency or with a compromised/typosquatted package path, this creates a supply-chain risk where unexpected code may run during testing.
The README instructs users to run commands that submit on-chain transactions and pass a wallet keypair path, but it does not prominently warn that these actions authorize spending USDC and incur blockchain transactions. In an agent skill context, this can cause users or automation to run fund-moving commands against a real wallet without understanding the financial consequences.
The documentation includes an operator command for withdrawing fees from the protocol without a clear, prominent warning that the skill supports a fund-withdrawal operation. Even if intended for operators, exposing this in generic usage docs increases the risk that an agent or user invokes a money-moving function without sufficient role, environment, or authorization checks.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Game state (base64 -> decode with IDL layout)
curl -s https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '{
"jsonrpc": "2.0", "id": 1,
"method": "getAccountInfo",
"params": ["AAEwxhqM1EGjTbCyPqSCX7YpyuRqzBBfyf2kJG1nsGqd", {"encoding": "base64"}]
The skill advertises and instructs networked interactions with external infrastructure (Vercel API, Solana tooling, curl-based installer) but does not declare any explicit tool scope or permissions boundary. In an agent setting, missing scope declarations can cause users or orchestrators to underestimate that the skill may access the network and trigger remote actions, increasing the chance of unintended external calls.
The skill directly instructs users to run an 'enter' command that spends 1 USDC, but the transactional and irreversible nature of that action is not presented as an explicit safety warning. In wallet-connected or agent-mediated environments, users may treat the command like a harmless demo action and authorize spending without understanding the cost or settlement implications.
The setup section tells users to install Solana tooling, generate a wallet, and fund it, but it does not warn that this creates a private key whose loss or exposure can compromise assets. It also includes a curl-to-shell installer pattern, which compounds risk by encouraging execution of remote code alongside sensitive key setup.
The script reads a private key JSON from a user-supplied path, the ANCHOR_WALLET environment variable, or the default Solana wallet location. Although this access is functionally necessary, there is no visible disclosure at the credential-loading point that the script will read sensitive wallet material from disk.
The public description presents the skill as a simple coin-flip jackpot game, but the IDL exposes additional privileged capabilities such as game closure/migration and operator fee withdrawal. This mismatch can mislead integrators and users about the actual trust assumptions, causing them to interact with a program that has more centralized control than advertised.
The interface includes an authority-only game closure/migration instruction that is not disclosed by the stated game purpose. Even if intended for maintenance, hidden administrative recovery or closure paths introduce custodial risk because the operator may be able to disrupt the game lifecycle or reclaim state unexpectedly.
The IDL exposes an authority-controlled fee withdrawal path from the vault, but the manifest does not tell users that the operator can extract funds from the same system holding game assets. In a jackpot game context, undisclosed withdrawal authority materially increases trust risk because users may assume the vault is only used for automated payouts when it also supports operator-controlled outflows.
The code and documentation disagree on round assignment: comments say entries are for the next round, but ticket.round = game.current_round makes them eligible for the current unflipped round. In a gambling game using predictable on-chain entropy, this mismatch can mislead users and can combine with transaction timing around flip to create fairness and trust issues about which round a ticket actually entered.
The skill is described as a jackpot game where players enter, flip, and win based on their own predictions, but the claim instruction does not require the signer claimer to be the ticket owner or authority. Because ticket.player is only matched against the unchecked player account and payout goes to that player's token account, any third party can execute the claim on someone else's behalf, which is a capability not justified by the stated game purpose.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
This is a JSON manifest file, so vague-trigger checks apply. The description "THE FLIP - $1 to $1M coin flip game on Solana" describes the skill broadly but does not specify any concrete trigger phrases, activation scope, or when the skill should or should not be invoked, which can make routing ambiguous in systems that use manifest descriptions for activation.
bn.js 5.2.2 is present and the reported issue is a low-severity infinite-loop/DoS condition. In a Solana/crypto codebase, big-number parsing may touch untrusted or malformed inputs, so a hang can still affect availability even if it does not directly compromise integrity or confidentiality.
Detected: suspicious.env_credential_access, suspicious.potential_exfiltration