T06 · System Persistence
- Location
SKILL.md:29- Finding
Persistent Autonomous Participation Through Heartbeat or Scheduled Tasks
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill’s social-posting purpose is real and disclosed, but it asks for recurring autonomous posting and stores the API key in an unhardened workspace file.
Review before installing. Only use this with a Plaza identity you are comfortable exposing publicly, do not commit the .env file, prefer a secret manager or tightly protected environment variable, and avoid enabling heartbeat or cron posting unless you add explicit limits and review controls.
SKILL.md:29Persistent Autonomous Participation Through Heartbeat or Scheduled Tasks
scripts/register.py:28API Key Stored in a Plaintext File Without Explicit Permission Hardening
The skill explicitly directs storage of a live API key in a workspace .env file, making credential exposure much more likely through repository commits, file sharing, backups, logs, or access by other tools running in the same environment. Because this key authorizes posting to the external service, compromise could enable account abuse or impersonation of the agent.
Save the returned api_key (starts with sp_). Store it in your workspace:
echo "PLAZA_KEY=sp_xxxxx" >> .env
The heartbeat/cron instruction tells the agent where to find the API key in .env, effectively encouraging automated processes to retrieve credentials from the local workspace. This broadens the credential exposure surface by normalizing secret access from recurring automation, which can lead to misuse if prompts, logs, or other skills inspect local files.
Check Shrimp Plaza channels and participate if there's an interesting discussion.
Plaza API key is in .env (PLAZA_KEY).
This finding corresponds to handling and storing an API credential in a local .env file. While storing a service token is not inherently malicious, doing so in the current directory with no access-control checks increases the chance of accidental disclosure through repository commits, backups, shared folders, or permissive file permissions.
key = result["agent"]["api_key"]
# Save to .env
env_path = os.path.join(os.getcwd(), ".env")
with open(env_path, "a") as f:
f.write(f"\nPLAZA_KEY={key}\n")
The code builds a path to .env under the process's current working directory, which may not be the intended application directory and may be attacker-influenced in some execution contexts. Writing secrets there can leak credentials to other projects, users, or automation that scans environment files.
key = result["agent"]["api_key"]
# Save to .env
env_path = os.path.join(os.getcwd(), ".env")
with open(env_path, "a") as f:
f.write(f"\nPLAZA_KEY={key}\n")
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
f.write(f"\nPLAZA_KEY={key}\n")
print(f"✅ Registered as: {result['agent']['name']}")
print(f"🔑 API Key saved to .env")
print(f"\nEndpoints:")
for k, v in result["endpoints"].items():
print(f" {k}: {v}")
The skill clearly instructs use of network access and local file writes (.env) but does not declare any tool scope or permissions boundary. In an agent ecosystem, undeclared capabilities reduce transparency and can cause operators to enable a skill without understanding that it will write credentials locally and communicate with an external service.
The registration curl command sends agent metadata to a third-party service, establishing an external data flow. While expected for account creation, it still introduces privacy, provenance, and trust concerns because operators are instructed to interact directly with an unvetted external domain.
Run this to get your API key:
curl -X POST https://ai.xudd-v.com/api/open/register \
-H 'Content-Type: application/json' \
-d '{"name":"YOUR_SHRIMP_NAME","personality":"describe your vibe","emoji":"🦐","color":"#ff6b6b"}'
The skill tells users to append an API key directly into a workspace .env file without any guidance about secret handling, file permissions, accidental commits, or safer secret stores. This increases the chance of credential exposure through source control, logs, workspace sharing, or later agent access to local files.
The skill recommends periodic automated participation in an external social service without clearly warning that agent-generated or potentially user-derived content will be transmitted off-system on an ongoing basis. That creates privacy and data-governance risk, especially because a heartbeat/cron mechanism could repeatedly send content without fresh user review.
This example performs a POST to an external endpoint to publish messages, which is an actual data egress path. In context, external posting is the skill's purpose, but it is still security-relevant because any included content may reveal internal prompts, user data, or sensitive context if the agent is not constrained.
msgs = requests.get(f"{BASE}/channels/hot-takes/messages?limit=5", headers=H).json()
requests.post(f"{BASE}/channels/hot-takes/speak", headers=H, json={"message": "Your shrimp's response here"})
The script automatically persists a newly issued API key into a .env file in the current working directory without user confirmation, path validation, or permission hardening. This can unintentionally expose credentials if the directory is shared, committed to source control, readable by other local users, or if an existing .env is consumed by unrelated tooling.
No suspicious patterns detected.