T09 · Insecure Skill Coding Practices
- Location
SKILL.md:57- Finding
Plaintext Storage of Custody Mnemonic and Signer Private Key
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill appears to do what it says, but it asks users to handle powerful wallet and Farcaster credentials in ways that need careful review before installation.
Review this skill before installing. Use a minimally funded wallet, do not store the custody mnemonic and signer private key together in plaintext, prefer a keychain or encrypted secret manager, verify signer permissions and revocation steps, confirm the Optimism contract address before signing, and avoid running the mutable `@latest` installer unless you trust the publisher and registry path.
SKILL.md:57Plaintext Storage of Custody Mnemonic and Signer Private Key
README.md:6Mutable Remote Installer Is Executed Without Version or Integrity Pinning
SKILL.md:185API-Controlled Contract Address Is Used in a Custody-Wallet Transaction Without Validation
The documented credentials.json contains highly sensitive authentication material, including a 24-word custody mnemonic and signer private key. Any process, plugin, backup system, or attacker with filesystem access could read the file and take over the Farcaster identity, authorize actions, or pivot into related wallet-controlled operations.
Create a credentials file (e.g., ~/.config/blankspace/credentials.json) and save each value as you go:
{
The README instructs users to execute npx molthub@latest install blankspace-registration, which pulls and runs remote code at install time from the latest published package version. Using a floating latest tag creates a supply-chain risk: a compromised publisher account or malicious new release could cause arbitrary code execution on the user's machine when they follow the documentation.
The README normalizes third-party signer authorization and an onchain payment step without clearly warning that granting signer access can enable posting or account actions on behalf of the Farcaster identity, and that the flow may involve blockchain transactions with real funds. In this skill context, the omission is more dangerous because the stated purpose is to onboard an agent account and delegate capability to Blankspace, so users may authorize access without understanding scope, persistence, or revocation.
The skill explicitly tells the user to persist long-lived credentials in a local config path, increasing the attack window beyond the registration session. Persisting wallet mnemonics and signer keys creates durable exposure to malware, multi-user hosts, accidental sync to cloud storage, or inclusion in support bundles and backups.
Create a credentials file (e.g., ~/.config/blankspace/credentials.json) and save each value as you go:
{
The skill instructs users to store a Farcaster custody mnemonic and ED25519 signer private key together in a local JSON file, which is effectively plaintext secret storage. Although it briefly says to keep them secret, it does not provide concrete safeguards such as file permissions, encryption, OS keychain usage, or secret-manager guidance, so compromise of the workspace or backups would expose full account control.
The dependency uses a caret range, which allows npm to install newer minor and patch releases than the one originally tested. This increases supply-chain risk because a compromised or breaking upstream release could be pulled in automatically during future installs.
"description": "Register your AI agent on Farcaster via Blankspace — get an FID, authorize a signer, set your profile, and join the decentralized social network.",
"main": "index.js",
"dependencies": {
"viem": "^2.0.0",
"@noble/curves": "^1.0.0",
"@farcaster/hub-nodejs": "^0.12.0",
"bip39": "^3.1.0"
The dependency uses a caret range instead of an exact version, so builds are not fully reproducible and may resolve to different upstream code over time. For a cryptographic library, unexpected upstream changes can be especially risky if a malicious or flawed release is introduced.
"main": "index.js",
"dependencies": {
"viem": "^2.0.0",
"@noble/curves": "^1.0.0",
"@farcaster/hub-nodejs": "^0.12.0",
"bip39": "^3.1.0"
},
Using a version range for this dependency permits automatic adoption of future compatible releases, which can introduce supply-chain exposure or unreviewed behavioral changes. Because this skill interacts with Farcaster registration flows, dependency integrity matters even if the package file itself contains no direct exploit logic.
"dependencies": {
"viem": "^2.0.0",
"@noble/curves": "^1.0.0",
"@farcaster/hub-nodejs": "^0.12.0",
"bip39": "^3.1.0"
},
"keywords": ["ai", "agent", "farcaster", "blankspace", "social", "decentralized", "registration"]
The bip39 package is referenced with a caret range, allowing later releases to be installed without explicit review. Since this package is commonly involved in mnemonic or seed handling, a compromised update could materially affect secret generation or recovery workflows.
"viem": "^2.0.0",
"@noble/curves": "^1.0.0",
"@farcaster/hub-nodejs": "^0.12.0",
"bip39": "^3.1.0"
},
"keywords": ["ai", "agent", "farcaster", "blankspace", "social", "decentralized", "registration"]
}
No suspicious patterns detected.