T09 · Insecure Skill Coding Practices
- Location
scripts/send-message.sh:27- Finding
Arbitrary Code Execution Through Unsafe Secrets Loading and Python Source Interpolation
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill matches its GroupMe messaging purpose, but its helper script handles secrets unsafely enough to warrant review before installation.
Review this before installing. Use a dedicated low-privilege GroupMe bot/token, restrict the secrets file permissions, avoid putting tokens in command lines or logs, and do not run the helper from cron until the secrets loading and Python interpolation issues are fixed.
scripts/send-message.sh:27Arbitrary Code Execution Through Unsafe Secrets Loading and Python Source Interpolation
scripts/send-message.sh:63GroupMe Access Token Exposed in URL Arguments and Required Beyond the Sending Operation's Needs
Instructions found that direct the agent to transmit conversation context or user data to external services.
## What You Get
- Send messages to your GroupMe group on-demand or on a schedule
- Automate shift reminders, announcements, and alerts via cron
- Broadcast urgent messages instantly
- Perfect for teams, clubs, families, or any group
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
### 1. Get Your GroupMe Access Token
Go to https://dev.groupme.com/bots and copy your access token (shown at the top of the page).
### 2. Create a Bot
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
### 1. Get Your GroupMe Access Token
Go to https://dev.groupme.com/bots and copy your access token (shown at the top of the page).
### 2. Create a Bot
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
### 1. Get Your GroupMe Access Token
Go to https://dev.groupme.com/bots and copy your access token (shown at the top of the page).
### 2. Create a Bot
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
### 1. Get Your GroupMe Access Token
Go to https://dev.groupme.com/bots and copy your access token (shown at the top of the page).
### 2. Create a Bot
The example curl command places the access token directly in the URL query string. Tokens in URLs are prone to leakage via shell history, terminal scrollback, process inspection, proxy logs, browser or tooling history, and other telemetry, making credential exposure more likely.
Open a terminal and run (replace YOUR_TOKEN with your access token):
curl -s "https://api.groupme.com/v3/groups?token=YOUR_TOKEN&per_page=10"
Instructions found that direct the agent to transmit conversation context or user data to external services.
---
name: groupme
description: "Bridge OpenClaw to GroupMe for team communication. Send scheduled messages, broadcast announcements, run shift reminders, and automate group messaging via cron jobs. Use when: you want to send messages to a GroupMe group on a schedule or on-demand, automate team announcements, or create notification workflows."
metadata:
openclaw:
requires:
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
#
# What this script DOES:
# - Takes one argument: the message text to send
# - Sends it to https://api.groupme.com/v3/bots/post using your Bot ID and Access Token
# - ONLY communicates with GroupMe's official API endpoint
#
# What this script DOES NOT DO:
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
#
# What this script DOES:
# - Takes one argument: the message text to send
# - Sends it to https://api.groupme.com/v3/bots/post using your Bot ID and Access Token
# - ONLY communicates with GroupMe's official API endpoint
#
# What this script DOES NOT DO:
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
#
# What this script DOES:
# - Takes one argument: the message text to send
# - Sends it to https://api.groupme.com/v3/bots/post using your Bot ID and Access Token
# - ONLY communicates with GroupMe's official API endpoint
#
# What this script DOES NOT DO:
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
#
# What this script DOES:
# - Takes one argument: the message text to send
# - Sends it to https://api.groupme.com/v3/bots/post using your Bot ID and Access Token
# - ONLY communicates with GroupMe's official API endpoint
#
# What this script DOES NOT DO:
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
Go to https://dev.groupme.com/bots and copy your access token (shown at the top of the page).
### 2. Create a Bot
Go to https://dev.groupme.com/bots/new and create a new bot:
- **Name:** Whatever you want (e.g., "OpenClaw", "Team Bot")
The README instructs users to store a long-lived GroupMe access token and bot identifiers in a local file but does not warn that the token is sensitive or recommend file permission restrictions. This increases the risk of accidental disclosure through weak filesystem permissions, backups, dotfile syncing, screenshots, or committing the file into version control, which would allow unauthorized use of the GroupMe API.
The skill documents shell-based network actions but does not declare an explicit tool scope such as allowed shell/network capabilities. In an agent ecosystem, missing scope boundaries increases the chance that automation can invoke broader shell behavior than users expect, reducing containment and auditability.
The documentation explicitly recommends passing the GroupMe access token in the URL query string but does not warn that query parameters are commonly exposed through shell history, logs, proxies, and process listings. This can leak a reusable credential and allow unauthorized access to GroupMe resources tied to the token.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
1. **GroupMe Access Token** — get it at https://dev.groupme.com/bots (top of page)
2. **Group ID** — the ID of your GroupMe group (fetch via API)
3. **Bot ID** — create a bot at https://dev.groupme.com/bots/new
### Save Your Tokens
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Run this command (replace with your token):
curl -s "https://api.groupme.com/v3/groups?token=YOUR_TOKEN&per_page=10"
Look for your group in the response — the id field is your Group ID.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
## Setup Checklist
- [ ] Get access token: https://dev.groupme.com/bots
- [ ] Create bot: https://dev.groupme.com/bots/new
- [ ] Find Group ID via API
- [ ] Save tokens to `~/.openclaw/secrets/groupme.env`
- [ ] Test: send a message manually
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
#
# What this script DOES:
# - Takes one argument: the message text to send
# - Sends it to https://api.groupme.com/v3/bots/post using your Bot ID and Access Token
# - ONLY communicates with GroupMe's official API endpoint
#
# What this script DOES NOT DO:
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
#
# What this script DOES:
# - Takes one argument: the message text to send
# - Sends it to https://api.groupme.com/v3/bots/post using your Bot ID and Access Token
# - ONLY communicates with GroupMe's official API endpoint
#
# What this script DOES NOT DO:
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
#
# What this script DOES:
# - Takes one argument: the message text to send
# - Sends it to https://api.groupme.com/v3/bots/post using your Bot ID and Access Token
# - ONLY communicates with GroupMe's official API endpoint
#
# What this script DOES NOT DO:
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
#
# What this script DOES:
# - Takes one argument: the message text to send
# - Sends it to https://api.groupme.com/v3/bots/post using your Bot ID and Access Token
# - ONLY communicates with GroupMe's official API endpoint
#
# What this script DOES NOT DO:
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
#
# What this script DOES:
# - Takes one argument: the message text to send
# - Sends it to https://api.groupme.com/v3/bots/post using your Bot ID and Access Token
# - ONLY communicates with GroupMe's official API endpoint
#
# What this script DOES NOT DO:
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
#
# What this script DOES:
# - Takes one argument: the message text to send
# - Sends it to https://api.groupme.com/v3/bots/post using your Bot ID and Access Token
# - ONLY communicates with GroupMe's official API endpoint
#
# What this script DOES NOT DO:
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
#
# What this script DOES:
# - Takes one argument: the message text to send
# - Sends it to https://api.groupme.com/v3/bots/post using your Bot ID and Access Token
# - ONLY communicates with GroupMe's official API endpoint
#
# What this script DOES NOT DO: