odds-movement-monitor
合法赔率监控工具,存在文档未声明的数据库/网络访问和硬编码API密钥,无恶意行为证据。
为什么得出这个结论
2/4 个维度触发发现 4 项声明之外的能力或越权行为。
提取到 1 个高危 IOC 或外联信号。
没有形成明确的恶意路径。
发现 2 项需要关注的依赖或供应链线索。
风险分是怎么被拉高的
SKILL.md 未提及网络请求(aiohttp/requests 访问外部 API),但代码明确用于获取赔率和支付验证,属于功能性必需
monitor.py 使用 sqlite3 创建 odds_data.db 存储快照,SKILL.md 未声明 database:WRITE 权限
payment.py:12 硬编码 Billing API Key(sk_f03...),属于 supply_chain 类风险,非主动窃取
demo.py:7 使用 sys.path.insert(0, '~/.openclaw/workspace/...'),攻击面有限(仅 demo 独立执行时生效)
最关键的证据
硬编码 Billing API 密钥
payment.py:12 硬编码了完整的 Billing API Key(sk_f03aa8f8...),而非从环境变量读取。如果此代码包被发布或共享,API 密钥将随源码泄露,可能导致第三方滥用该计费接口。
payment.py:12 SKILL.md 缺少 capability 声明
SKILL.md 完全未声明网络请求(外部赔率 API + 计费 API)和本地 SQLite 数据库写入权限,agent 无法正确评估实际权限范围。
SKILL.md:1 demo.py 使用可劫持的绝对路径注入
demo.py:7 使用 sys.path.insert(0, '~/.openclaw/workspace/skills/odds-movement-monitor') 将用户目录下的路径加入 Python 模块搜索路径。如果攻击者能控制该路径(符号链接攻击或目录篡改),可劫持 skill 的 import 行为。影响范围有限(仅独立运行 demo 时触发)。
demo.py:7 依赖无版本锁定
requirements.txt 仅声明 aiohttp>=3.8.0 和 requests>=2.28.0,未锁定具体版本,存在依赖混淆攻击风险(dependency confusion)。
requirements.txt:1 声明能力 vs 实际能力
monitor.py:12 aiohttp.ClientSession, payment.py:10 requests monitor.py:57 sqlite3.connect (创建 odds_data.db) monitor.py:59 CREATE TABLE IF NOT EXISTS 写本地数据库文件 payment.py:21 os.environ.get('SKILLPAY_USER_ID'), monitor.py:30 os.getenv('ODDS_API_KEY') 可疑产物与外联
API_KEY = "sk_f03aa8f8bbcf79f7aa11c112d904780f22e62add1464e3c41a79600a451eb1d2" payment.py:12
https://api.the-odds-api.com/v4 config.json:15
https://the-odds-api.com/ monitor.py:527
https://skillpay.me payment.py:11
依赖与供应链
| 包名 | 版本 | 来源 | 漏洞 | 备注 |
|---|---|---|---|---|
| aiohttp | >=3.8.0 | pip | 否 | 无版本锁定,存在依赖混淆风险 |
| requests | >=2.28.0 | pip | 否 | 无版本锁定,存在依赖混淆风险 |
文件构成
config.json monitor.py demo.py payment.py SKILL.md requirements.txt