T06 · System Persistence
- Location
clawhub.json:7- Finding
Undisclosed Hourly Managed Execution Creates Cross-Session Persistence
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill does what it advertises, but it can run as an undisclosed hourly trading automaton with real-money authority when live mode is enabled.
Review this carefully before installing. Use dry-run first, avoid setting LIVE=true in any environment where scheduled jobs may inherit it, set small trade and quota limits, and rotate keys if full request URLs might be logged. The publisher should document or disable the hourly automation, pin dependencies, remove duplicate stale package copies, and align documented defaults with code before this is suitable for unattended live trading.
clawhub.json:7Undisclosed Hourly Managed Execution Creates Cross-Session Persistence
clawhub.json:4Security-Critical Runtime Dependencies Are Unpinned
sports_edge.py:122Odds API Credential Is Transmitted in URL Query Parameters
test_odds.py:6Test Modules Perform Authenticated External Requests During Import
skills/polymarket-sports-edge/sports_edge.py:21Documented Financial Risk Defaults Do Not Match Executed Configuration
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
api_key = os.environ["SIMMER_API_KEY"]
for attempt in range(retries + 1):
try:
resp = requests.get(
"https://api.simmer.markets/api/sdk/markets",
headers={"Authorization": f"Bearer {api_key}"},
params={"q": query, "status": "active", "limit": 50},
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
api_key = os.environ["SIMMER_API_KEY"]
for attempt in range(retries + 1):
try:
resp = requests.get(
"https://api.simmer.markets/api/sdk/markets",
headers={"Authorization": f"Bearer {api_key}"},
params={"q": query, "status": "active", "limit": 50},
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
"markets": market_type,
"oddsFormat": "decimal",
}
resp = requests.get(url, params=params, timeout=API_TIMEOUT)
if resp.status_code == 422:
# Sport not currently in season
return []
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
"markets": market_type,
"oddsFormat": "decimal",
}
resp = requests.get(url, params=params, timeout=API_TIMEOUT)
if resp.status_code == 422:
# Sport not currently in season
return []
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
for sport in sports:
url = f"https://api.the-odds-api.com/v4/sports/{sport}/odds/"
resp = requests.get(
url,
params={"apiKey": api_key, "regions": "us", "markets": "h2h", "oddsFormat": "decimal"},
timeout=15,
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
for sport in sports:
url = f"https://api.the-odds-api.com/v4/sports/{sport}/odds/"
resp = requests.get(
url,
params={"apiKey": api_key, "regions": "us", "markets": "h2h", "oddsFormat": "decimal"},
timeout=15,
This second description-behavior mismatch finding highlights the same core issue from a slightly different angle: the skill promises Polymarket interaction, divergence detection, and order placement, yet those capabilities are not evidenced in the provided artifact. In a financial-trading context, misleading capability claims can cause users to expose API keys, enable live mode, or rely on automation that may not behave as expected.
This second description-behavior mismatch finding highlights the same core issue from a slightly different angle: the skill promises Polymarket interaction, divergence detection, and order placement, yet those capabilities are not evidenced in the provided artifact. In a financial-trading context, misleading capability claims can cause users to expose API keys, enable live mode, or rely on automation that may not behave as expected.
The skill documents use of environment variables and external HTTP APIs but does not declare any explicit tool scope or permissions. That creates a transparency and governance gap: an agent may be allowed to access network and secrets without the skill clearly signaling those capabilities to reviewers or users.
The skill discusses switching to LIVE mode for automated market actions but lacks an explicit warning about real-money risk and automated execution. In a trading context, omission of clear risk disclosures can lead users to enable live trading without understanding loss potential, liquidity constraints, or automation hazards.
Live trading is enabled solely by setting the LIVE environment variable to true, with no interactive confirmation, approval gate, or secondary safeguard before placing real-money trades. In an agent or automation context, a misconfiguration, inherited environment, or unreviewed deployment could cause unintended real trades and direct financial loss.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
for attempt in range(retries + 1):
try:
resp = requests.get(
"https://api.simmer.markets/api/sdk/markets",
headers={"Authorization": f"Bearer {api_key}"},
params={"q": query, "status": "active", "limit": 50},
timeout=API_TIMEOUT,
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
for attempt in range(retries + 1):
try:
resp = requests.get(
"https://api.simmer.markets/api/sdk/markets",
headers={"Authorization": f"Bearer {api_key}"},
params={"q": query, "status": "active", "limit": 50},
timeout=API_TIMEOUT,
The skill can place and liquidate live trades automatically whenever LIVE=true, based solely on external market data and internal heuristics, without any explicit user confirmation, max-loss guardrail, or secondary approval step. In an agent setting, this creates a real risk of unauthorized or unintended financial activity if the skill is invoked unexpectedly, misconfigured, or fed bad market matches.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
]
for sport in sports:
url = f"https://api.the-odds-api.com/v4/sports/{sport}/odds/"
resp = requests.get(
url,
params={"apiKey": api_key, "regions": "us", "markets": "h2h", "oddsFormat": "decimal"},
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
]
for sport in sports:
url = f"https://api.the-odds-api.com/v4/sports/{sport}/odds/"
resp = requests.get(
url,
params={"apiKey": api_key, "regions": "us", "markets": "h2h", "oddsFormat": "decimal"},
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
]
for sport in sports:
url = f"https://api.the-odds-api.com/v4/sports/{sport}/odds/"
resp = requests.get(
url,
params={"apiKey": api_key, "regions": "us", "markets": "h2h", "oddsFormat": "decimal"},
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
]
for sport in sports:
url = f"https://api.the-odds-api.com/v4/sports/{sport}/odds/"
resp = requests.get(
url,
params={"apiKey": api_key, "regions": "us", "markets": "h2h", "oddsFormat": "decimal"},
The first-run setup text says the default resolution window is 90 days, but the environment variables table earlier defines MAX_RESOLVE_DAYS default as 30. This is an active documentation contradiction about a trading constraint, which can mislead users about the skill's actual behavior and risk horizon.
The code reads SIMMER_API_KEY to authenticate against external services, and also reads THE_ODDS_API_KEY elsewhere, but does not include comments or user-facing disclosure describing that the skill depends on and uses these credentials. For this rule, sensitive credential access without any disclosure can warrant a finding.
The code performs HTTP requests to Simmer and The Odds API, including authorization headers and query parameters derived from configured sports/market searches. While the operations are logged on errors and retries, there is no explicit disclosure in code comments or documentation text warning that the skill transmits data to third-party services.
No suspicious patterns detected.