在1995年,一个操作系统要靠“文件名里有那几个词”来判断谁在装东西。这听起来像闹着玩,但Windows 95就是这么干的。微软资深工程师雷蒙德·陈近日在官方博客里,把这段老底翻了出来。这个判断机制的启发式规则简单到可以用一句话说完:只要运行中的程序文件名包含setup、installer或inst等关键词,系统就认为它大概率是个安装程序。如果再叠加上路径里夹着“setup”的备用规则,这套“名字匹配”方案就构成了Windows 95拦截问题安装包的整套防线。
站在当年的技术条件下看,这套路数其实不乏道理。第一,它不需要任何复杂的运行时行为分析,只在进程启动那一刻扫一遍字符串。对比同期其他操作系统的类似机制,Win95这种0成本判定既省内存又省CPU,几乎不会拖慢用户的操作。第二,它直接覆盖了绝大多数正规软件——上世纪90年代的安装程序命名习惯极其统一,setup.exe几乎是行业标配。第三,为了防漏报,团队还专门收录了意大利语imposta、土耳其语ayarla、希伯来语felrak等多语种变体,试图把语言死角一并消灭。从产品经理的视角看,一个极低开销的模块,把90%以上的安装场景都框进去了,这就是当时资源约束下的最优工程选择。
不过,反方的质疑同样站得住脚——这套判定逻辑脆弱得令人不安。任何一个稍微有点想法的恶意软件,只要把setup.exe改名为backup.exe,或者干脆把安装文件放进一个不带“setup”的文件夹,Win95立刻就会闭眼放行。更糟糕的是,系统收到名字匹配的信号后并不会马上校验文件,而是特意把检查延迟到下次开机。陈解释,这纯粹是被现实逼的:有些安装程序一旦发现系统文件被占用无法替换,就会调用ExitWindowsExec函数退出Windows,切回MS-DOS环境运行批处理脚本完成篡改,再重启系统。Windows 95只能等重启后,才能逮住那批脚本非法改动的文件。这个“延迟检查”机制,本来是为了适应安装程序的行为逻辑,却给攻击者留出了一整个关机周期的空档。在越来越复杂的恶意代码面前,这种“先开绿灯、秋后算账”的策略已经很难自保。
这场跨越年代的辩论,其实没有真正的输家。当我重新审视这两方观点时,看到的不是一个简陋机制的可笑,而是操作系统安全防护进化路线的必然切片。Windows 95用启发式文件名匹配解决大规模兼容性问题,本质是在极简计算环境里做出的一种可解释、可调试的尝试。后来随着攻击手段的爆炸式进化,Windows 11这类现代系统早已转向基于数字签名验证、行为监控和机器学习等精密方案,而当年那套逻辑里“文件路径包含setup即信任”的思路,某种意义上就是后来的用户账户控制和文件信誉体系的原始雏形。
值得注意的是,即使在这个看起来粗糙的规则里,微软依然留了一道精准的例外开关:通过INF文件安装多媒体驱动时,系统会实时校验相关文件。当时负责多媒体驱动开发的团队拿到了特殊豁免权限,这也从侧面说明,即便是同代产品,不同模块对安全强度的需求早已存在落差。一条看似一刀切的判定规则,内部已经藏好了分而治之的接口。这种对工程现实妥协的同时又留好后手的设计习惯,可能才是这篇24年前的旧故事里最值得揣摩的东西。
热门跟贴