T09 · Insecure Skill Coding Practices
- Location
references/subgraph.md:14- Finding
Bearer Token Disclosure Through Unvalidated Subgraph Endpoints
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill matches its Aavegotchi automation purpose, but it needs review because it handles a raw wallet private key and gives live blockchain transaction commands.
Install only if you are comfortable reviewing every transaction before broadcast. Prefer a dedicated low-value wallet, keystore, hardware wallet, or isolated signer instead of passing a production private key with --private-key, keep DRY_RUN as guidance rather than a real guard, and verify RPC, chain ID, contract addresses, parcel IDs, access-right settings, and costs before any live transaction.
references/subgraph.md:14Bearer Token Disclosure Through Unvalidated Subgraph Endpoints
references/realm-recipes.md:81Raw Wallet Private Key Exposed in Process Command-Line Arguments
references/addresses.md:47Declared DRY_RUN Safety Control Does Not Prevent Transaction Broadcasts
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
curl -s "$GOTCHIVERSE_SUBGRAPH_URL" -H 'content-type: application/json' ${GOLDSKY_API_KEY:+-H "Authorization: Bearer $GOLDSKY_API_KEY"} --data '{"query":"{ __schema { queryType { fields { name } } } }"}' \
| python3 -c 'import json,sys; f=[x["name"] for x in json.load(sys.stdin)["data"]["__schema"]["queryType"]["fields"]]; print([n for n in ("parcel","parcels","installationTypes","tileTypes","parcelAccessRights") if n in f])'
curl -s "$CORE_SUBGRAPH_URL" -H 'content-type: application/json' ${GOLDSKY_API_KEY:+-H "Authorization: Bearer $GOLDSKY_API_KEY"} --data '{"query":"{ __schema { queryType { fields { name } } } }"}' \
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
curl -s "$GOTCHIVERSE_SUBGRAPH_URL" -H 'content-type: application/json' ${GOLDSKY_API_KEY:+-H "Authorization: Bearer $GOLDSKY_API_KEY"} --data '{"query":"{ __schema { queryType { fields { name } } } }"}'
| python3 -c 'import json,sys; f=[x["name"] for x in json.load(sys.stdin)["data"]["__schema"]["queryType"]["fields"]]; print([n for n in ("parcel","parcels","installationTypes","tileTypes","parcelAccessRights") if n in f])'
curl -s "$CORE_SUBGRAPH_URL" -H 'content-type: application/json' ${GOLDSKY_API_KEY:+-H "Authorization: Bearer $GOLDSKY_API_KEY"} --data '{"query":"{ __schema { queryType { fields { name } } } }"}'
| python3 -c 'import json,sys; f=[x["name"] for x in json.load(sys.stdin)["data"]["__schema"]["queryType"]["fields"]]; print([n for n in ("aavegotchi","erc721Listings","erc1155Listings") if n in f])'
The documented cast send command signs and broadcasts a live transaction using a raw private key, but the surrounding guidance does not explicitly warn that this changes parcel permissions onchain and may be costly or difficult to reverse. In an agent skill context, this increases the chance of accidental execution, especially if an automation system moves from simulation to broadcast without strong user confirmation.
This broadcast example performs live whitelist-based access-right updates with cast send, again using a private key and without a prominent warning about modifying authorization settings onchain. Because access-control changes can unintentionally open parcel actions to others or lock intended operators out, accidental execution can have meaningful operational consequences.
The file provides broadcast examples that submit live, state-changing transactions to a blockchain using a private key, but it does not explicitly warn that these actions are irreversible and can consume assets or alter game state. In an agent skill that automates crafting and upgrades, omission of a clear safety warning increases the chance of unintended on-chain execution by users or downstream automation.
The recipe instructs users to pass a raw private key via --private-key on the command line without any warning, which can expose the secret through shell history, process listings, logs, agent traces, or telemetry. In an automation-focused skill, this is especially dangerous because users may paste production keys into scripted workflows, enabling wallet compromise and unauthorized transactions if the key is captured.
The reference repeatedly instructs use of $PRIVATE_KEY for transaction signing without any safety guidance on secret handling. In agent or CLI workflows, this can normalize unsafe practices such as exporting raw keys into shell history, logs, process tables, or shared environments, leading to wallet compromise and loss of on-chain assets.
The manifest says the skill supports 'parcel access-right management', which implies both inspection and execution of access-right changes, but this file only documents read/preflight operations (getParcelsAccessRights, whitelist ID lookup, and verifyAccessRight). In contrast, the rest of the file includes explicit broadcast recipes for state-changing workflows, so the absence of any access-right modification operation indicates the documented behavior is narrower than the claimed capability.
The document provides cast send examples for live state-changing transactions signed with a private key, but it does not clearly warn that these actions are irreversible and can spend gas or mutate on-chain assets. In a wallet-operating skill for game assets on mainnet, that omission increases the chance of accidental broadcasts, especially if a user confuses simulation and broadcast steps.
The manifest claims the skill operates crafting of installations/tiles, building on parcels, installation upgrades, and craft/upgrade queue management. This reference file documents building operations and some harvesting/channeling flows, but it contains no recipes for crafting, upgrading installations, or managing craft/upgrade queues, creating a mismatch between the claimed workflow coverage and the actual documented operations here.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Subgraph Queries (Base)
Endpoints:
- `GOTCHIVERSE_SUBGRAPH_URL=https://api.goldsky.com/api/public/project_cmh3flagm0001r4p25foufjtt/subgraphs/gotchiverse-base/prod/gn`
- `CORE_SUBGRAPH_URL=https://api.goldsky.com/api/public/project_cmh3flagm0001r4p25foufjtt/subgraphs/aavegotchi-core-base/prod/gn`
Notes:
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Subgraph Queries (Base)
Endpoints:
- `GOTCHIVERSE_SUBGRAPH_URL=https://api.goldsky.com/api/public/project_cmh3flagm0001r4p25foufjtt/subgraphs/gotchiverse-base/prod/gn`
- `CORE_SUBGRAPH_URL=https://api.goldsky.com/api/public/project_cmh3flagm0001r4p25foufjtt/subgraphs/aavegotchi-core-base/prod/gn`
Notes:
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Subgraph Queries (Base)
Endpoints:
- `GOTCHIVERSE_SUBGRAPH_URL=https://api.goldsky.com/api/public/project_cmh3flagm0001r4p25foufjtt/subgraphs/gotchiverse-base/prod/gn`
- `CORE_SUBGRAPH_URL=https://api.goldsky.com/api/public/project_cmh3flagm0001r4p25foufjtt/subgraphs/aavegotchi-core-base/prod/gn`
Notes:
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Subgraph Queries (Base)
Endpoints:
- `GOTCHIVERSE_SUBGRAPH_URL=https://api.goldsky.com/api/public/project_cmh3flagm0001r4p25foufjtt/subgraphs/gotchiverse-base/prod/gn`
- `CORE_SUBGRAPH_URL=https://api.goldsky.com/api/public/project_cmh3flagm0001r4p25foufjtt/subgraphs/aavegotchi-core-base/prod/gn`
Notes:
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Subgraph Queries (Base)
Endpoints:
- `GOTCHIVERSE_SUBGRAPH_URL=https://api.goldsky.com/api/public/project_cmh3flagm0001r4p25foufjtt/subgraphs/gotchiverse-base/prod/gn`
- `CORE_SUBGRAPH_URL=https://api.goldsky.com/api/public/project_cmh3flagm0001r4p25foufjtt/subgraphs/aavegotchi-core-base/prod/gn`
Notes:
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Subgraph Queries (Base)
Endpoints:
- `GOTCHIVERSE_SUBGRAPH_URL=https://api.goldsky.com/api/public/project_cmh3flagm0001r4p25foufjtt/subgraphs/gotchiverse-base/prod/gn`
- `CORE_SUBGRAPH_URL=https://api.goldsky.com/api/public/project_cmh3flagm0001r4p25foufjtt/subgraphs/aavegotchi-core-base/prod/gn`
Notes:
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl -s "$GOTCHIVERSE_SUBGRAPH_URL" -H 'content-type: application/json' ${GOLDSKY_API_KEY:+-H "Authorization: Bearer $GOLDSKY_API_KEY"} --data '{"query":"{ __schema { queryType { fields { name } } } }"}' \
| python3 -c 'import json,sys; f=[x["name"] for x in json.load(sys.stdin)["data"]["__schema"]["queryType"]["fields"]]; print([n for n in ("parcel","parcels","installationTypes","tileTypes","parcelAccessRights") if n in f])'
curl -s "$CORE_SUBGRAPH_URL" -H 'content-type: application/json' ${GOLDSKY_API_KEY:+-H "Authorization: Bearer $GOLDSKY_API_KEY"} --data '{"query":"{ __schema { queryType { fields { name } } } }"}' \
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl -s "$GOTCHIVERSE_SUBGRAPH_URL" -H 'content-type: application/json' ${GOLDSKY_API_KEY:+-H "Authorization: Bearer $GOLDSKY_API_KEY"} --data '{"query":"{ __schema { queryType { fields { name } } } }"}' \
| python3 -c 'import json,sys; f=[x["name"] for x in json.load(sys.stdin)["data"]["__schema"]["queryType"]["fields"]]; print([n for n in ("parcel","parcels","installationTypes","tileTypes","parcelAccessRights") if n in f])'
curl -s "$CORE_SUBGRAPH_URL" -H 'content-type: application/json' ${GOLDSKY_API_KEY:+-H "Authorization: Bearer $GOLDSKY_API_KEY"} --data '{"query":"{ __schema { queryType { fields { name } } } }"}' \
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl -s "$GOTCHIVERSE_SUBGRAPH_URL" -H 'content-type: application/json' ${GOLDSKY_API_KEY:+-H "Authorization: Bearer $GOLDSKY_API_KEY"} --data '{"query":"{ __schema { queryType { fields { name } } } }"}'
| python3 -c 'import json,sys; f=[x["name"] for x in json.load(sys.stdin)["data"]["__schema"]["queryType"]["fields"]]; print([n for n in ("parcel","parcels","installationTypes","tileTypes","parcelAccessRights") if n in f])'
curl -s "$CORE_SUBGRAPH_URL" -H 'content-type: application/json' ${GOLDSKY_API_KEY:+-H "Authorization: Bearer $GOLDSKY_API_KEY"} --data '{"query":"{ __schema { queryType { fields { name } } } }"}'
| python3 -c 'import json,sys; f=[x["name"] for x in json.load(sys.stdin)["data"]["__schema"]["queryType"]["fields"]]; print([n for n in ("aavegotchi","erc721Listings","erc1155Listings") if n in f])'
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl -s "$GOTCHIVERSE_SUBGRAPH_URL" -H 'content-type: application/json' ${GOLDSKY_API_KEY:+-H "Authorization: Bearer $GOLDSKY_API_KEY"} --data '{
"query":"query($id:ID!){ parcel(id:$id){ id tokenId parcelId owner coordinateX coordinateY district size surveyRound lastChanneledAlchemica lastClaimedAlchemica remainingAlchemica totalAlchemicaClaimed equippedInstallationsBalance equippedTilesBalance equippedInstallations{ id installationType name level alchemicaType capacity harvestRate craftTime prerequisites alchemicaCost } equippedTiles{ id tileType name width height craftTime alchemicaCost } } }",
"variables":{"id":"59"}
}'
The command uses cast send with a supplied private key, which will submit a live transaction to craft tiles onchain, consuming gas and potentially spending in-game resources irreversibly. Because the file is an operational runbook for real Base mainnet interactions, omission of an explicit warning increases the chance that a user copies the command believing it is only a verification step.
This batch craft example broadcasts a state-changing transaction using --private-key, which can consume gas and commit multiple crafting actions at once. In the context of a blockchain gameplay skill, batching amplifies the risk of unintended asset consumption because a mistaken command can affect several tile crafts in one irreversible submission.
The claimTiles broadcast command submits a real transaction with the user's private key, incurring gas and changing onchain queue state. Even though claiming is typically less destructive than crafting, it remains irreversible operationally and can surprise users who mistake the example for a read-only command.
reduceCraftTime is a live state-changing transaction that can spend GLTR and gas irreversibly, yet the example lacks any warning of that effect. In this skill's context, reducing craft time directly consumes game resources, so a copied command with wrong queue IDs or block amounts can cause immediate, unrecoverable loss of value.
No suspicious patterns detected.