Skill Trust Decision

odds-movement-monitor

合法赔率监控工具,存在文档未声明的数据库/网络访问和硬编码API密钥,无恶意行为证据。

Install decision first Source: ClawHub Scanned: Apr 12, 2026
Files 10
Artifacts 4
Violations 4
Findings 4

Why this conclusion was reached

2/4 dimensions flagged
Block
Declared vs actual capability

4 undeclared or violating capabilities were inferred.

Block
Hidden execution and egress

1 high-risk artifacts or egress signals were extracted.

Pass
Attack chain and severe findings

There is no explicit malicious chain in the report.

Review
Dependencies and supply chain hygiene

2 dependency or supply-chain issues need attention.

What drove the risk score up

文档未声明网络访问 +10

SKILL.md 未提及网络请求(aiohttp/requests 访问外部 API),但代码明确用于获取赔率和支付验证,属于功能性必需

文档未声明数据库访问 +5

monitor.py 使用 sqlite3 创建 odds_data.db 存储快照,SKILL.md 未声明 database:WRITE 权限

硬编码 API 密钥 +5

payment.py:12 硬编码 Billing API Key(sk_f03...),属于 supply_chain 类风险,非主动窃取

demo.py 路径注入 +5

demo.py:7 使用 sys.path.insert(0, '~/.openclaw/workspace/...'),攻击面有限(仅 demo 独立执行时生效)

Most important evidence

Medium Supply Chain

硬编码 Billing API 密钥

payment.py:12 硬编码了完整的 Billing API Key(sk_f03aa8f8...),而非从环境变量读取。如果此代码包被发布或共享,API 密钥将随源码泄露,可能导致第三方滥用该计费接口。

payment.py:12
使用 os.environ.get('SKILLPAY_API_KEY') 从环境变量读取,或使用密钥管理服务
Low Doc Mismatch

SKILL.md 缺少 capability 声明

SKILL.md 完全未声明网络请求(外部赔率 API + 计费 API)和本地 SQLite 数据库写入权限,agent 无法正确评估实际权限范围。

SKILL.md:1
在 SKILL.md 中添加 ## Required Permissions 段落,声明 network:READ(外部API调用)和 database:WRITE(本地数据持久化)
Low Priv Escalation

demo.py 使用可劫持的绝对路径注入

demo.py:7 使用 sys.path.insert(0, '~/.openclaw/workspace/skills/odds-movement-monitor') 将用户目录下的路径加入 Python 模块搜索路径。如果攻击者能控制该路径(符号链接攻击或目录篡改),可劫持 skill 的 import 行为。影响范围有限(仅独立运行 demo 时触发)。

demo.py:7
移除此行,使用相对导入或标准 PYTHONPATH
Low Supply Chain

依赖无版本锁定

requirements.txt 仅声明 aiohttp>=3.8.0 和 requests>=2.28.0,未锁定具体版本,存在依赖混淆攻击风险(dependency confusion)。

requirements.txt:1
使用精确版本号(如 aiohttp==3.9.1)并建议配合 pip-tools 或 poetry 锁定全量依赖

Declared capability vs actual capability

Network Block
Declared NONE
→
Inferred READ
monitor.py:12 aiohttp.ClientSession, payment.py:10 requests
Database Block
Declared NONE
→
Inferred WRITE
monitor.py:57 sqlite3.connect (创建 odds_data.db)
Filesystem Block
Declared NONE
→
Inferred WRITE
monitor.py:59 CREATE TABLE IF NOT EXISTS 写本地数据库文件
Environment Block
Declared NONE
→
Inferred READ
payment.py:21 os.environ.get('SKILLPAY_USER_ID'), monitor.py:30 os.getenv('ODDS_API_KEY')

Suspicious artifacts and egress

High API Key
API_KEY = "sk_f03aa8f8bbcf79f7aa11c112d904780f22e62add1464e3c41a79600a451eb1d2"

payment.py:12

Medium External URL
https://api.the-odds-api.com/v4

config.json:15

Medium External URL
https://the-odds-api.com/

monitor.py:527

Medium External URL
https://skillpay.me

payment.py:11

Dependencies and supply chain

PackageVersionSourceKnown vulnNotes
aiohttp >=3.8.0 pip No 无版本锁定,存在依赖混淆风险
requests >=2.28.0 pip No 无版本锁定,存在依赖混淆风险

File composition

10 files · 1699 lines
Python 5 files · 1432 linesMarkdown 2 files · 194 linesJSON 2 files · 71 linesText 1 files · 2 lines
Files of concern · 6
config.json JSON · 49 lines
https://api.the-odds-api.com/v4
monitor.py Python · 597 lines
https://the-odds-api.com/
demo.py Python · 223 lines
demo.py 使用可劫持的绝对路径注入
payment.py Python · 142 lines
硬编码 Billing API 密钥 · API_KEY = "sk_f03aa8f8bbcf79f7aa11c112d904780f22e62add1464e3c41a79600a451eb1d2" · https://skillpay.me
SKILL.md Markdown · 97 lines
SKILL.md 缺少 capability 声明
requirements.txt Text · 2 lines
依赖无版本锁定
Other files · change_detector.py · README.md · __init__.py · _meta.json

Security positives

代码结构清晰,监控逻辑完整(变化检测、分级预警、报告生成)
使用 asyncio + aiohttp 进行异步网络请求,性能合理
支付验证集成在技能入口,无绕过风险
无 Base64 编码执行、无反向 Shell、无凭证枚举遍历
外部 API 调用均有合理解释(赔率数据源 + 支付验证),非隐蔽数据外泄