安全决策报告

odds-movement-monitor

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

安装决策优先 来源: ClawHub 扫描时间: 2026/4/12
文件 10
IOC 4
越权项 4
发现 4

为什么得出这个结论

2/4 个维度触发
阻止
声明与实际能力

发现 4 项声明之外的能力或越权行为。

阻止
隐藏执行与外联

提取到 1 个高危 IOC 或外联信号。

通过
攻击链与高危发现

没有形成明确的恶意路径。

复核
依赖与供应链卫生

发现 2 项需要关注的依赖或供应链线索。

风险分是怎么被拉高的

文档未声明网络访问 +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 独立执行时生效)

最关键的证据

中危 供应链

硬编码 Billing API 密钥

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

payment.py:12
使用 os.environ.get('SKILLPAY_API_KEY') 从环境变量读取,或使用密钥管理服务
低危 文档欺骗

SKILL.md 缺少 capability 声明

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

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

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

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

demo.py:7
移除此行,使用相对导入或标准 PYTHONPATH
低危 供应链

依赖无版本锁定

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

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

声明能力 vs 实际能力

网络访问 阻止
声明 NONE
→
推断 READ
monitor.py:12 aiohttp.ClientSession, payment.py:10 requests
数据库 阻止
声明 NONE
→
推断 WRITE
monitor.py:57 sqlite3.connect (创建 odds_data.db)
文件系统 阻止
声明 NONE
→
推断 WRITE
monitor.py:59 CREATE TABLE IF NOT EXISTS 写本地数据库文件
环境变量 阻止
声明 NONE
→
推断 READ
payment.py:21 os.environ.get('SKILLPAY_USER_ID'), monitor.py:30 os.getenv('ODDS_API_KEY')

可疑产物与外联

高危 API 密钥
API_KEY = "sk_f03aa8f8bbcf79f7aa11c112d904780f22e62add1464e3c41a79600a451eb1d2"

payment.py:12

中危 外部 URL
https://api.the-odds-api.com/v4

config.json:15

中危 外部 URL
https://the-odds-api.com/

monitor.py:527

中危 外部 URL
https://skillpay.me

payment.py:11

依赖与供应链

包名版本来源漏洞备注
aiohttp >=3.8.0 pip 否 无版本锁定,存在依赖混淆风险
requests >=2.28.0 pip 否 无版本锁定,存在依赖混淆风险

文件构成

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

安全亮点

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