Linus 近日在内核邮件列表(LKML)上发表长文,“怒斥”文件系统中的大小写不敏感(case-insensitive)功能。
他明确表示,这种设计是个“巨大的错误”,文件系统开发者从未吸取教训。问题的核心不在于测试不足,而在于一开始就不该实现这种功能。
Linus 表示,大小写不敏感功能会带来严重的安全风险。他举例说明,许多用户空间程序会检查文件名是否符合安全敏感模式,但文件系统可能无视不可打印字符,导致原本不应匹配的文件名被错误匹配。这种“忽略其他因素”的做法,让安全检查形同虚设。
他举了一个例子:❤ 和 ❤️表面上看非常相似,但实际上是不同的编码。如果大小写折叠逻辑一刀切地忽略这类细节,那么这两个文件名就会被错误地认为是“相同的”——这不仅仅是名字混淆,更会让原本基于字符串检查机制(如验证路径是否安全)的用户空间程序失效,引发安全漏洞。
https://lore.kernel.org/lkml/CAHk-=wjajMJyoTv2KZdpVRoPn0LFZ94Loci37WLVXmMxDbLOjg@mail.gmail.com/
Linus 还顺势讽刺了那些怀念老式 FAT 文件系统的人(FAT 文件系统是早期 PC 时代常见的文件系统,但在现代计算环境中,这种设计早已被证明存在大量问题,尤其在安全性和一致性方面表现糟糕):
真是见鬼了。大小写不敏感,本质上就是个 BUG,文件系统开发者们居然到今天还把它当作一个‘特性’,我完全无法理解。这种行为简直像是,他们对古老的 FAT 文件系统怀有一种变态的崇拜,非得一遍又一遍地把这种糟糕设计复制出来——而且每次都做得更烂。
总的来说,在 Linus 看来,所谓“正确实现大小写不敏感”,本质上就是无解的。