GitHub每日热评|GitHub 开源深度评测:unikeyfarmer 源码审计,为什么不建议直接运行一个 Web3 批量注册脚本

0 阅读16分钟

GitHub每日热评|GitHub 开源深度评测:unikeyfarmer 源码审计,为什么不建议直接运行一个 Web3 批量注册脚本

专栏:开源工程静态审阅
评测对象:guajiimi/unikeyfarmer
快照提交:4e3020adbc67ac12afc25753072ec9f8fd3145ed
评测方式:固定提交、限定范围、只读静态分析
评测结论:仅用于技术研究和安全初筛,不构成运行许可、安全承诺或生产准入结论 作者:Valhalla Matrix治理实验室

@[toc]

一、结论先行

unikeyfarmer 是一个基于 Python 的 Web3 自动化脚本,静态源码线索显示,它围绕以下流程组织:

生成钱包账户
  -> 创建注册任务
  -> 通过 HTTP 客户端访问目标服务
  -> 使用代理执行网络请求
  -> 处理注册结果
  -> 保存账号、密钥或 API 凭据

本次固定快照中扫描到:

指标观测结果
扫描文件8
生产源码文件6
配置或契约文件2
未纳入扫描文件3
GitHub Stars54
主要语言Python
依赖清单未发现
自动化测试未发现
CI 工作流未发现
架构评分因证据不足未输出有效分数
落地优先级21/100,C 级

最重要的结论不是“这个项目分数较低”,而是:

当前源码证据不足以证明脚本安全,且其业务流程涉及钱包生成、私钥保存、代理访问和批量注册,因此不应在真实钱包、真实账号或生产网络环境中直接运行。

本次分析属于限定范围静态审阅,仍有 3 个文件未纳入扫描范围,也没有执行代码、安装依赖、发送网络请求或进行运行时测试。因此,任何关于“无后门”“无恶意行为”或“可以安全使用”的结论,都超出了当前证据能够支持的范围。


二、项目定位:一个高敏感度的自动化脚本

从源码结构和命名可以看出,unikeyfarmer 并不是普通的 API 调用示例,而是一个面向特定平台的批量注册自动化工具。

报告中识别到的核心对象包括:

  • UnikeyClient
  • worker
  • main
  • banner
  • save_accounts
  • worker_logger
  • main_logger

核心网络方法包括:

  • _post
  • _api
  • warmup

从这些符号可以还原出一个大致的程序结构:

mermaid diagram

需要强调的是,上图是根据静态源码线索整理的阅读模型,不是完整调用图,也不代表所有分支在运行时都一定可达。


三、源码规模不大,安全敏感度却很高

unikeyfarmer 的扫描样本只有 8 个文件,代码规模并不大。但代码量小,不代表风险低。

对于涉及钱包和账号的自动化脚本,风险主要取决于数据敏感度,而不是仓库规模。

一个只有几百行的脚本,如果同时具备以下能力,仍然可能带来较大影响:

  • 生成或读取钱包私钥
  • 保存助记词、私钥或签名材料
  • 获取第三方 API Key
  • 访问远程注册接口
  • 通过代理发起批量请求
  • 将结果写入本地文件
  • 在异常情况下继续执行任务

因此,审阅此类项目时,应优先关注:

密钥从哪里来
密钥保存到哪里
网络请求发往哪里
请求失败后如何处理
代理和并发是否受到限制
日志中是否包含敏感信息

四、核心架构分析

1. UnikeyClient:统一网络请求边界

UnikeyClient 负责封装网络访问,相关方法包括:

_post
_api
warmup

这说明项目将底层请求和上层业务调用进行了基本分离。

这种封装方式有一定好处:

  • 请求逻辑集中。
  • 代理和会话配置容易统一。
  • 接口地址便于追踪。
  • 后续补充超时、重试和日志相对方便。

但网络层也是本项目最需要重点审计的区域。

需要检查的内容

首先要确认请求是否设置了明确超时:

连接超时
读取超时
整体请求超时

没有超时的网络请求,可能导致工作线程长期阻塞,最终造成:

  • 任务队列无法清空
  • 线程资源持续占用
  • 程序无法正常退出
  • 失败任务无法统计

其次要检查异常处理是否完整:

代理不可用
DNS 失败
TLS 失败
服务端返回错误
返回数据格式变化
接口限流
连接中断

如果 _post 只捕获了通用异常并继续循环,可能导致大量失败请求被重复提交,既无法准确定位问题,也可能进一步触发目标服务的风控机制。

2. worker:多线程任务执行核心

报告显示,项目使用 Python 的 threadingqueue 组织并发任务,每个工作线程可以绑定独立代理。

从工程角度看,队列加 Worker 是一种常见的任务处理模型:

生产任务
  -> 放入队列
  -> Worker 获取任务
  -> 执行业务流程
  -> 标记完成
  -> 继续处理下一项任务

但在涉及远程服务的场景中,并发模型需要受到严格约束。

重点风险

线程数量是否可控

如果线程数量直接来自配置,且没有上限校验,可能导致:

  • 本地资源消耗过高
  • 代理连接数迅速增加
  • 远程服务收到异常高频请求
  • 错误重试进一步放大请求量

任务是否能够正确结束

需要确认:

  • queue.task_done() 是否在所有路径执行。
  • Worker 遇到异常后是否退出。
  • 主线程是否等待所有任务完成。
  • 程序终止时是否能够关闭线程。
  • 失败任务是否会被无限重新加入队列。

失败是否会被放大

一个稳定的任务系统应当区分:

可重试错误
不可重试错误
配置错误
身份验证错误
远程限流
本地数据错误

如果所有异常都采用相同的“记录日志并继续”策略,问题可能被隐藏,程序表面上持续运行,实际却不断产生无效请求。

3. 钱包生成:最需要人工复核的边界

项目使用 eth-account 生成以太坊账户。

从业务上看,钱包生成本身并不等于危险行为,但一旦私钥进入后续流程,就必须明确回答:

  • 私钥是否只在内存中短暂存在。
  • 是否被写入本地文件。
  • 文件权限是否受到限制。
  • 是否被写入日志。
  • 是否通过异常信息泄露。
  • 是否会随任务结果上传到远程服务。
  • 是否存在备份文件或临时文件。
  • 是否会被多个线程共享。

尤其需要重点审查 save_accounts

如果该函数将以下信息直接保存到普通文本文件:

地址
私钥
助记词
API Key
注册结果
代理信息

那么即使程序本身没有恶意逻辑,也可能因为本地文件泄露造成严重后果。

建议的安全原则
  • 测试时使用专门的空钱包,不要使用真实资产钱包。
  • 私钥和 API Key 不应进入普通运行日志。
  • 保存文件应使用最小权限。
  • 结果文件不应默认上传、同步或提交到 Git。
  • 测试结束后应清理密钥和临时数据。
  • 应明确区分地址、公钥、私钥和服务凭据。
  • 不应把任何真实资产交给未经验证的第三方脚本。

本文不提供批量注册或规避平台限制的操作步骤,原因是这类行为可能违反目标平台的用户协议,也可能触发账号、IP 或服务侧风控。

4. 代理层:不仅是网络配置问题

报告显示,每个工作线程可以独立绑定代理。

在静态审阅中,代理逻辑需要从四个方面检查:

配置来源

代理地址来自:

  • 配置文件
  • 环境变量
  • 命令行参数
  • 远程接口
  • 本地代理池

不同来源对应不同的信任边界。

凭据保护

如果代理 URL 中包含用户名和密码,需要确认:

  • 是否会出现在日志。
  • 是否会被异常堆栈打印。
  • 是否会写入结果文件。
  • 是否会被传给不可信的第三方库。
失效处理

需要确认代理失败后是否:

  • 立即停止当前任务。
  • 按有限次数重试。
  • 标记代理不可用。
  • 将任务重新排队。
  • 区分代理故障和目标服务故障。
合规边界

代理切换和多线程批量请求可能被用于绕过服务限制。即使技术上可行,也不代表使用方式符合目标平台的规则。

因此,代理模块不仅要进行稳定性审计,也要进行使用场景和合规性审查。


五、依赖管理是本项目的明显短板

报告中识别到以下第三方依赖:

curl-cffi
eth-account
loguru
python-dotenv

但扫描范围内没有发现:

requirements.txt
pyproject.toml
Pipfile
poetry.lock
uv.lock

这意味着项目没有提供明确、可复现的依赖安装边界。

可能带来的问题

版本漂移

如果使用者直接安装最新版本,可能出现:

  • API 发生变化。
  • 参数行为改变。
  • 加密库之间版本不兼容。
  • Python 版本不再支持。
  • TLS 或 HTTP 行为发生变化。
无法可靠复现

不同用户在不同时间安装依赖,得到的环境可能不同。这样即使使用同一个 Git 提交,也可能出现不同结果。

供应链审计困难

没有锁定版本,就难以准确回答:

  • 实际运行的是哪个依赖版本。
  • 某个版本是否包含已知漏洞。
  • 哪些依赖来自直接声明。
  • 哪些依赖是间接安装。
  • 当前运行环境与源码作者环境是否一致。

建议补齐的工程文件

至少应提供:

pyproject.toml
requirements.txt
requirements.lock
uv.lock
poetry.lock

具体选哪种方式并不重要,关键是做到:

  • 声明运行依赖。
  • 固定可验证版本。
  • 区分开发依赖和生产依赖。
  • 提供 Python 版本范围。
  • 记录安装和运行方式。
  • 对关键依赖进行漏洞扫描。

六、测试与 CI:当前没有形成可验证闭环

本次扫描样本内未发现:

  • 单元测试
  • 集成测试
  • 端到端测试
  • CI 工作流
  • 自动化依赖检查
  • 静态代码检查配置

这意味着以下关键行为无法通过仓库现有证据确认:

网络超时是否正确处理
代理失效是否能够恢复
接口返回异常是否会中断任务
钱包生成是否稳定
账号保存是否完整
多线程退出是否可靠
重复执行是否产生数据污染

需要特别注意:

未发现测试文件,不等于整个仓库绝对没有测试;本次结论只适用于扫描样本和当前限定范围。

如果要让项目具备基本工程可信度,建议优先补充以下测试。

网络客户端测试

使用 Mock 或本地测试服务器验证:

  • 成功响应。
  • 超时。
  • 连接失败。
  • 非 2xx 响应。
  • 非法 JSON。
  • 缺少关键字段。
  • 服务端限流。

Worker 测试

验证:

  • 任务能够正常消费。
  • 任务异常不会导致主线程永久等待。
  • 队列能够正确结束。
  • Worker 数量受到限制。
  • 线程退出后资源被释放。

敏感数据测试

验证:

  • 日志不包含私钥。
  • 日志不包含 API Key。
  • 结果文件权限符合预期。
  • 异常堆栈不会输出完整凭据。
  • 临时文件能够清理。

配置测试

验证:

  • 缺少配置时有明确错误。
  • 代理格式错误时能够提前退出。
  • 线程数和任务数存在合理边界。
  • 环境变量解析失败时不会静默使用危险默认值。

七、语义防火墙红灯应该如何理解

本次报告触发了:

semantic_firewall_red_gate

并且没有输出有效的架构评分。

这个信号不应被解读为:

项目一定存在恶意代码

更准确的解释是:

当前可观测源码不足以支撑高置信度架构结论

触发原因主要包括:

  • 仅扫描了部分文件。
  • 仍有 3 个文件未纳入。
  • 缺少依赖清单。
  • 缺少测试和 CI 证据。
  • 未执行运行时行为验证。
  • 钱包和网络相关逻辑具有较高敏感度。

在这种情况下,强行给出“架构优秀”或“代码安全”的结论,反而会降低报告可信度。

静态审计应当坚持一个原则:

没有证据时,输出“未验证”或“证据不足”,不要用主观推断填补空白。


八、建议的人工审阅顺序

第一层:网络客户端

优先阅读:

UnikeyClient
_post
_api
warmup

重点确认:

  • 请求地址。
  • 请求方法。
  • 请求头。
  • Cookie 和 Token。
  • 代理传递。
  • 超时配置。
  • 重试策略。
  • 错误处理。
  • 返回数据解析。

第二层:多线程调度

阅读:

main
worker
queue
threading

重点确认:

  • Worker 创建数量。
  • 任务入队方式。
  • 线程停止机制。
  • 异常传播方式。
  • 重试和重新入队逻辑。
  • 速率与并发限制。

第三层:钱包生成

阅读所有与以下关键词相关的代码:

Account
private_key
mnemonic
key
address
sign

重点判断敏感信息的生命周期:

生成
  -> 传递
  -> 请求使用
  -> 日志记录
  -> 文件保存
  -> 清理

第四层:结果保存

重点审查:

save_accounts
open
write
json
csv

需要确认:

  • 输出文件的绝对路径还是相对路径。
  • 是否使用追加模式。
  • 多线程写入是否安全。
  • 文件权限是否受控。
  • 是否存在明文凭据。
  • 文件名是否可被外部输入影响。

第五层:配置和代理

最后检查:

dotenv
proxy
headers
config

确认配置是否会被日志、异常和结果文件间接泄露。


九、如何复核固定提交

在隔离环境中获取固定版本:

git clone https://github.com/guajiimi/unikeyfarmer.git
cd unikeyfarmer
git checkout 4e3020adbc67ac12afc25753072ec9f8fd3145ed

查看文件清单:

find . -type f | sort

查找网络、钱包和敏感数据线索:

rg -n 'curl_cffi|eth_account|private_key|mnemonic|api[_-]?key|proxy|threading|queue|save_accounts' .

查找文件写入和日志输出:

rg -n 'open\(|write\(|dump\(|logger|loguru|print\(' .

查找异常与超时:

rg -n 'try:|except|timeout|retry|raise|status_code' .

这些命令仅用于静态定位,不应直接执行目标脚本,也不应使用真实钱包、真实 API Key 或真实代理凭据进行验证。


十、运行前必须完成的安全检查

如果研究者确实需要在本地继续分析,建议遵守以下边界:

环境隔离

  • 使用一次性虚拟机或容器。
  • 使用专门的测试账号。
  • 不连接真实资产钱包。
  • 不导入真实助记词或私钥。
  • 不使用生产 API Key。
  • 限制出站网络访问。
  • 保存完整进程、文件和网络日志。

代码复核

至少确认:

  • 所有请求目标域名。
  • 所有文件写入路径。
  • 所有日志内容。
  • 所有私钥和 API Key 的流向。
  • 所有外部命令调用。
  • 所有动态导入和远程加载行为。
  • 所有异常处理和重试逻辑。

合规确认

批量注册、代理切换和自动化访问可能违反目标平台的服务条款,也可能触发:

  • 账号封禁。
  • IP 或代理封禁。
  • API 权限收回。
  • 数据使用限制。
  • 法律和合规风险。

技术可行性不等于使用合法性。实际操作前,应先确认目标平台允许的自动化范围。


十一、综合评价

从当前固定快照的有限静态证据看,unikeyfarmer 具备一个相对直接的脚本架构:

配置加载
  -> 多线程任务调度
  -> 钱包生成
  -> HTTP 注册请求
  -> 结果判断
  -> 本地保存
  -> 日志输出

它的优点是:

  • 核心流程集中。
  • 网络客户端有独立封装。
  • Worker 与主流程存在职责区分。
  • 代理、钱包和结果保存等功能边界较容易定位。

但当前短板也非常明确:

  • 扫描范围不完整。
  • 没有发现依赖声明文件。
  • 没有测试和 CI 证据。
  • 私钥、API Key 和账号结果可能被本地持久化。
  • 网络、代理和并发行为未经运行验证。
  • 无法证明代码不存在后门或恶意逻辑。
  • 批量注册行为存在明显的平台合规边界。

因此,本项目当前不适合被描述为“可以直接运行的稳定工具”,更适合被定义为:

一个具有 Web3 钱包和 HTTP 自动化能力的 Python 脚本样本,其源码结构可以用于研究多线程任务编排和客户端封装,但在完成全仓库审阅、敏感数据流分析、依赖锁定和隔离测试之前,不应投入真实账号、真实凭据或真实资产环境。


十二、最终结论

本次审计的核心发现可以归纳为三点。

第一,unikeyfarmer 的技术结构并不复杂,主要由客户端、Worker、钱包生成、代理配置和结果保存组成。

第二,项目的风险集中在敏感数据和外部交互,而不是代码规模本身。私钥、API Key、代理凭据、网络请求和本地文件写入需要作为一个完整数据流进行审阅。

第三,本次报告最可靠的结论是“证据不足,禁止直接运行”,而不是“项目一定恶意”或“项目一定安全”。

对于此类开源自动化脚本,正确的安全流程应该是:

固定提交
  -> 完整源码获取
  -> 静态数据流审阅
  -> 依赖与权限检查
  -> 隔离环境验证
  -> 敏感信息清理
  -> 合规性确认

在这些步骤完成之前,不建议使用真实钱包、真实 API 凭据、生产代理或目标平台正式账号进行任何测试。


参考资料

  1. guajiimi/unikeyfarmer
  2. 评测快照:4e3020adbc67ac12afc25753072ec9f8fd3145ed
  3. Python threadingqueue 官方文档
  4. eth-account 官方文档
  5. 目标平台公开的服务条款、自动化访问规则与 API 使用政策

本文是基于固定源码快照的技术研究文章,不构成安全审计、代码无恶意证明、运行许可、投资建议或生产环境准入结论。文章中的架构描述来自限定范围静态证据,未经运行时验证的内容均应视为待确认项。

推荐标签: PythonWeb3源码审计多线程钱包安全依赖管理开源项目分析网络安全自动化脚本