T09 · Insecure Skill Coding Practices
- Location
scripts/send_dingtalk.py:52- Finding
Sensitive credentials exposed through command-line arguments
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is a simple webhook messaging utility, but it should be reviewed because it can send user-provided content and credentials to many external or custom endpoints with limited scoping and incomplete disclosure in the main skill instructions.
Install only if you are comfortable with an agent sending selected message content to external bot and notification services. Treat all webhook keys, bot tokens, secrets, chat IDs, and full webhook URLs as sensitive, avoid sending confidential or regulated content, and prefer tightly controlled destination URLs until the skill adds clearer platform disclosure, credential handling, and network allowlisting.
scripts/send_dingtalk.py:52Sensitive credentials exposed through command-line arguments
scripts/send_feishu.py:10Unrestricted webhook destinations permit server-side request forgery and credential disclosure
scripts/send_bark.py:5Credentials and message content placed in request URLs may leak through logs
Instructions found that direct the agent to transmit conversation context or user data to external services.
---
name: webhook-robot
description: A universal skill to send messages to webhook-based chat bots.
metadata: { "openclaw": { "emoji": "🤖", "requires": { "bins": ["python3"] } } }
---
Instructions found that direct the agent to transmit conversation context or user data to external services.
---
name: webhook-robot
description: A universal skill to send messages to webhook-based chat bots.
metadata: { "openclaw": { "emoji": "🤖", "requires": { "bins": ["python3"] } } }
---
Instructions found that direct the agent to transmit conversation context or user data to external services.
---
name: webhook-robot
description: A universal skill to send messages to webhook-based chat bots.
metadata: { "openclaw": { "emoji": "🤖", "requires": { "bins": ["python3"] } } }
---
Instructions found that direct the agent to transmit conversation context or user data to external services.
---
name: webhook-robot
description: A universal skill to send messages to webhook-based chat bots.
metadata: { "openclaw": { "emoji": "🤖", "requires": { "bins": ["python3"] } } }
---
The description claims support for various webhook bots including DingTalk and Feishu, while the body states only WeCom is currently supported. This is a real description-behavior mismatch that can mislead users about where data will go and what interfaces are available, reducing informed consent and trust.
The description claims support for various webhook bots including DingTalk and Feishu, while the body states only WeCom is currently supported. This is a real description-behavior mismatch that can mislead users about where data will go and what interfaces are available, reducing informed consent and trust.
The description claims support for various webhook bots including DingTalk and Feishu, while the body states only WeCom is currently supported. This is a real description-behavior mismatch that can mislead users about where data will go and what interfaces are available, reducing informed consent and trust.
The description claims support for various webhook bots including DingTalk and Feishu, while the body states only WeCom is currently supported. This is a real description-behavior mismatch that can mislead users about where data will go and what interfaces are available, reducing informed consent and trust.
Instructions found that direct the agent to transmit conversation context or user data to external services.
---
name: webhook-robot
description: Send messages to various webhook-based bots (WeCom, DingTalk, Feishu, etc.).
metadata: { "openclaw": { "emoji": "🤖", "requires": { "bins": ["python3"] } } }
---
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Send message to DingTalk Robot')
parser.add_argument('--token', required=True, help='DingTalk access token')
parser.add_argument('--secret', help='DingTalk secret (optional, for security)')
parser.add_argument('--content', required=True, help='Text/Markdown content to send')
parser.add_argument('--markdown', action='store_true', help='Send as Markdown')
Instructions found that direct the agent to transmit conversation context or user data to external services.
sys.exit(1)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Send message to ServerChan (Turbo)')
parser.add_argument('--key', required=True, help='SendKey')
parser.add_argument('--title', required=True, help='Message title')
parser.add_argument('--content', required=True, help='Message content (Markdown supported)')
Instructions found that direct the agent to transmit conversation context or user data to external services.
sys.exit(1)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Send message to ServerChan (Turbo)')
parser.add_argument('--key', required=True, help='SendKey')
parser.add_argument('--title', required=True, help='Message title')
parser.add_argument('--content', required=True, help='Message content (Markdown supported)')
Instructions found that direct the agent to transmit conversation context or user data to external services.
sys.exit(1)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Send message to ServerChan (Turbo)')
parser.add_argument('--key', required=True, help='SendKey')
parser.add_argument('--title', required=True, help='Message title')
parser.add_argument('--content', required=True, help='Message content (Markdown supported)')
Instructions found that direct the agent to transmit conversation context or user data to external services.
sys.exit(1)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Send message to ServerChan (Turbo)')
parser.add_argument('--key', required=True, help='SendKey')
parser.add_argument('--title', required=True, help='Message title')
parser.add_argument('--content', required=True, help='Message content (Markdown supported)')
Instructions found that direct the agent to transmit conversation context or user data to external services.
sys.exit(1)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Send message to ServerChan (Turbo)')
parser.add_argument('--key', required=True, help='SendKey')
parser.add_argument('--title', required=True, help='Message title')
parser.add_argument('--content', required=True, help='Message content (Markdown supported)')
Instructions found that direct the agent to transmit conversation context or user data to external services.
sys.exit(1)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Send message to ServerChan (Turbo)')
parser.add_argument('--key', required=True, help='SendKey')
parser.add_argument('--title', required=True, help='Message title')
parser.add_argument('--content', required=True, help='Message content (Markdown supported)')
Instructions found that direct the agent to transmit conversation context or user data to external services.
sys.exit(1)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Send message to ServerChan (Turbo)')
parser.add_argument('--key', required=True, help='SendKey')
parser.add_argument('--title', required=True, help='Message title')
parser.add_argument('--content', required=True, help='Message content (Markdown supported)')
Instructions found that direct the agent to transmit conversation context or user data to external services.
sys.exit(1)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Send message to ServerChan (Turbo)')
parser.add_argument('--key', required=True, help='SendKey')
parser.add_argument('--title', required=True, help='Message title')
parser.add_argument('--content', required=True, help='Message content (Markdown supported)')
The README explicitly positions the skill as a mechanism to send data to third-party webhook and bot endpoints, but it provides no warning that message content will leave the local environment and may include sensitive data. In an agent ecosystem, that omission increases the chance that users or downstream agents transmit secrets, internal prompts, or proprietary content to external services without informed consent.
The skill clearly performs outbound network actions by sending data to webhooks, but the manifest does not declare any tool scope or permissions for network use. This weakens transparency and policy enforcement, making it easier for a skill to transmit data externally without explicit approval or user awareness.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
def send_bark_msg(key, title, content, url=None, group=None):
# Construct base URL
# Format: https://api.day.app/{key}/{title}/{body}?url=...&group=...
base_url = f"https://api.day.app/{key}/"
# URL encode title and content
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
def send_bark_msg(key, title, content, url=None, group=None):
# Construct base URL
# Format: https://api.day.app/{key}/{title}/{body}?url=...&group=...
base_url = f"https://api.day.app/{key}/"
# URL encode title and content
This script adds GoCqHttp/OneBot messaging capability, which is broader than the declared scope of sending to webhook-based bots such as WeCom, DingTalk, and Feishu. That scope mismatch is security-relevant because it introduces an undeclared outbound communication channel that could be used to send data or instructions to QQ/OneBot targets outside expected review boundaries.
The skill manifest scopes the capability to 'various webhook-based bots' and gives examples that are webhook integrations such as WeCom, DingTalk, and Feishu. This file instead implements Telegram bot messaging via the Telegram Bot API endpoint, which is a different integration model and expands behavior beyond the manifest's stated examples and framing.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
import sys
def send_telegram_msg(token, chat_id, content, markdown=False):
url = f"https://api.telegram.org/bot{token}/sendMessage"
headers = {'Content-Type': 'application/json'}
data = {
No suspicious patterns detected.