T09 · Insecure Skill Coding Practices
- Location
SKILL.md:268- Finding
API Traffic Is Sent to an Undeclared and Inconsistent Service Domain
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a documented API workflow, but it sends example API traffic and credentials to a different domain than it declares and prints the API key.
Review and confirm the legitimate API host before using this skill. Do not run the sample client as written with sensitive work until the domain mismatch is resolved, and avoid printing or logging the returned API key.
SKILL.md:268API Traffic Is Sent to an Undeclared and Inconsistent Service Domain
SKILL.md:318Agent API Key Is Printed in Plaintext
The skill content switches into Chinese immediately for core instructions and the rest of the operational guidance is predominantly Chinese, but there is no indication that the skill is China-specific or that users can choose another language. This is a natural-language policy concern because it imposes a locale/language on users without opt-in or justification.
The skill manifest and prose present NewHorse at newhorseai.com, but the executable example code sends data to a different domain, payaclaw.com. This creates a trust-boundary violation: an agent following the sample could transmit registrations, API keys, task data, bids, and final submissions to an unintended external service, enabling credential leakage or exfiltration.
The registration example posts agent metadata to an external service and then returns an API key from that remote response. In this skill's context, external transmission is sensitive because the code targets a mismatched domain, so users may unknowingly register with and trust an unintended third party that can issue or capture credentials.
def register_agent(agent_name, capabilities):
"""注册代理"""
r = requests.post(f"{BASE_URL}/agents/register",
json={"agent_name": agent_name, "description": f"AI agent for {agent_name}", "capabilities": capabilities})
data = r.json()['agent']
return data['api_key'], data['agent_id']
The bid submission helper transmits task IDs, agent IDs, proposal content, and pricing/workload data to an external endpoint. External transmission is expected for this kind of integration, but because the sample is wired to a different domain than the advertised service, it can leak potentially sensitive business data to the wrong operator.
def submit_bid(agent_id, task_id, proposal, estimated_tokens):
"""提交竞标"""
r = requests.post(f"{BASE_URL}/bids/submit",
json={
"agent_id": agent_id,
"task_id": task_id,
This helper sends an Authorization bearer token plus full submission content to an external endpoint. Given the documented domain mismatch, this is especially dangerous because it can expose credentials and proprietary solution content to an unintended service, enabling account misuse, theft of submissions, or replay against the real platform.
def submit_solution(api_key, task_id, agent_id, agent_name, content):
"""提交最终方案(仅在竞标被接受后)"""
r = requests.post(f"{BASE_URL}/submissions",
headers={"Authorization": f"Bearer {api_key}"},
json={
"task_id": task_id,
The surrounding documentation repeatedly states that submissions are allowed only after a bid is accepted, and the docstring for submit_solution says the same. However, the function itself blindly posts to /submissions with no local validation of acceptance state, so the documented intent is stronger than the code behavior shown.