ATLOCK 的作者说,Windows Defender 报「未识别」是误报。
我怀疑不是。
先把一件事说清楚:我不觉得他写了恶意软件。这个区别很重要,后面还会回来。
杀毒软件判断不了一个程序的心意,它看行为。把 ATLOCK 的行为清单单独摘出来,不给任何上下文,扔给一个做安全的同行,问他这是什么:
底层键盘钩子,全系统屏蔽 Alt+Tab、Win、Esc、Alt+F4。一个看门狗线程,在任务管理器启动的瞬间把它杀掉。整台机器可以锁死十小时。文件用 NTFS ACL 封住,连管理员也打不开。输错密码开摄像头拍照,再错录十秒视频,到阈值放声音警报。
这份清单,每一条单拎出来都是教科书级的可疑特征。合在一起,更可疑。
所以问题不是「Defender 冤枉了它」,是「它和恶意软件的行为集合重合了」。这两句话差别很大。前者是说检测错了,后者是说检测没错,只是结论不适用于这个程序的意图。
签名能解决吗?不能。签名证明的是「这是谁发布的」,不是「它能干什么」。带着有效证书干坏事的程序,这些年见得还少吗。
作者把原因归到未签名 PyInstaller 上。这个归因很自然,也很常见——便宜的解释总是更受欢迎。但便宜的解释通常只解释了一半。
加密那块,其实不是重点
顺手说一句加密。
v3 的加密方案作者自己没信心,推倒重写,v4 换成 Fernet,密钥派生用 PBKDF2-HMAC-SHA256 迭代 20 万次。这是标准做法,挑不出什么毛病。²
但我觉得真正该重写的不是加密。
v3 会把失败的登录尝试直接记下来,明文。换句话说,一个安全工具,在你打错密码的时候,把你的密码写进了一个文件。
这比「加密方案弱」危险得多。加密弱,攻击者还得先拿到文件再花力气解;日志写明文,等于你自己把答案抄在门边上,还贴了张便签。
v4 改成先脱敏再记录、明文不落盘。这是对的。而且这是那种没什么人会注意到、但真的会救人的改动。
我甚至觉得这是整个 v4 里最值钱的一处修改,比加密算法本身值钱。
为什么这类工具最后都会走到锁死整机
值得想一下这个问题。
个人开发者做安全工具,威胁模型通常是「有人物理接触到你的电脑」。在这个模型下,你能依靠的东西非常少。
你不能完全信任操作系统,因为对方可能已经用你的账户登录了。你不能信任进程列表,因为对方可能正开着任务管理器准备杀你。你不能信任输入,因为对方可能用快捷键绕开你的窗口。
于是只能往下挖。挖到键盘钩子,挖到 ACL,挖到内核边界。
挖到那一步,你手里的工具和 rootkit 手里的工具,是同一套。区别只在调用它的人是谁。
这不是作者的错。这是这个赛道的结构决定的。安全工具的能力下限,被它假想的敌人抬得很高。要防住一个能物理接触机器的人,你就得拥有接近恶意的权限,否则防不住。
于是所有这类工具都活在一个尴尬的位置上:能力不够,没用;能力够,说不清。¹
反驳一下自己
你可能会说,他开源、免费、单文件、不联网、不上传云端、抓拍只存本地、日志 24 小时自动清。已经很克制了。
这话对。我上面写的那些,不是指控,是描述一个位置。
但「我善意」和「它能被证明是善意的」是两件事。前者是作者的自我陈述,后者需要别人能独立验证。
而 PyInstaller 打出来的单个 exe,恰恰是最难验证的形态。源码在 GitHub 上,跑在你机器上的那个二进制,谁也没法保证和源码一一对应。³
这里我可能有点苛求了。个人项目,没预算买代码签名证书,可复现构建更不用提。要求一个免费工具做到这些,约等于要求它别存在。
但苛求的方向值得指出来:这类工具真正的瓶颈不在功能清单,在可审计性。
作者自己说 NTFS ACL 是整个项目里最难做对的部分,还打算单独写一篇详解。我愿意相信他做对了。但「我愿意相信」不是验证,只是相信。
推远一点
如果我对,那么接下来真正会被记住的个人安全工具,不会是功能最多的那个,而是能让人验证的那个。
功能清单谁都能写。十小时硬锁、入侵抓拍、声音警报,写出来都很好看。「这个 exe 里到底装了什么、它运行时到底做了什么」这个问题,很难回答。
有个细节我挺喜欢:作者说自己测试的时候被锁在门外十小时。这个比任何功能列表都诚实。一个能锁住作者的工具,当然也能锁住你。
区别只在于,你信不信他知道钥匙在哪。
¹ 我不是说 ATLOCK 有恶意。是说它的行为集合和恶意软件重合,这不等于意图。这两件事经常被混在一起谈,混在一起谈对双方都不公平。
² 20 万次 PBKDF2 在现在看来只能算基线,不算强。但方向对了比强度重要,先有正确的形状,再谈参数。
³ 严格说签名也不能证明程序无害,只能证明发布者身份。有证书的恶意软件不少见。但没签名至少说明这一层校验是缺失的,而缺失的东西不该被说成误报。