Linus 痛恨大小写不敏感的文件系统


Linus 近日在内核邮件列表(LKML)上发表长文,“怒斥”文件系统中的大小写不敏感(case-insensitive)功能。

他明确表示,这种设计是个“巨大的错误”,文件系统开发者从未吸取教训。问题的核心不在于测试不足,而在于一开始就不该实现这种功能。

Linus 表示,大小写不敏感功能会带来严重的安全风险。他举例说明,许多用户空间程序会检查文件名是否符合安全敏感模式,但文件系统可能无视不可打印字符,导致原本不应匹配的文件名被错误匹配。这种“忽略其他因素”的做法,让安全检查形同虚设。

他举了一个例子:❤ 和 ❤️表面上看非常相似,但实际上是不同的编码。如果大小写折叠逻辑一刀切地忽略这类细节,那么这两个文件名就会被错误地认为是“相同的”——这不仅仅是名字混淆,更会让原本基于字符串检查机制(如验证路径是否安全)的用户空间程序失效,引发安全漏洞。

https://lore.kernel.org/lkml/CAHk-=wjajMJyoTv2KZdpVRoPn0LFZ94Loci37WLVXmMxDbLOjg@mail.gmail.com/

Linus 还顺势讽刺了那些怀念老式 FAT 文件系统的人(FAT 文件系统是早期 PC 时代常见的文件系统,但在现代计算环境中,这种设计早已被证明存在大量问题,尤其在安全性和一致性方面表现糟糕):

真是见鬼了。大小写不敏感,本质上就是个 BUG,文件系统开发者们居然到今天还把它当作一个‘特性’,我完全无法理解。这种行为简直像是,他们对古老的 FAT 文件系统怀有一种变态的崇拜,非得一遍又一遍地把这种糟糕设计复制出来——而且每次都做得更烂。

总的来说,在 Linus 看来,所谓“正确实现大小写不敏感”,本质上就是无解的。


相關推薦

2023-08-11

根据科技媒体 Phoronix 的报道,开发已久的 Bcachefs 文件系统驱动程序已提交到 Linux 6.5,但由于各种技术问题和开发者的“内斗”,此驱动程序并没有在该开发周期内合并。 Bcachefs 是一个写时复制(CoW)的文件系统,其源自于

2023-04-17

开头。但在解决了这一问题之后,Linus 就在内核中实现了文件权限。 时间线来到 1991 年 8 月,Linus 在 comp.os.minix 新闻组中首次公开提及了他的新内核,透露正在出于爱好开发新的免费操作系统 —— 最初命名为 Freax。几周后,Li

2023-09-02

发现找不到任何有用的信息,最接近的似乎是 MAINTAINERS 文件条目,上面写着 "GENERIC PM DOMAIN PROVIDERS",不过它并没有解释任何内容。 接着 Linus 发现 PM_GENERIC_DOMAINS 的 Kconfig 选项,查看后发现它也没有帮助文本,因为这完全是内部

2021-12-13

列表的一篇帖子中明确对 DRM 打开大门,他表示 Linux 操作系统的基本规则中,没有任何阻止开发者使用 DRM 的内容。 2006 年 1 月,GPLv3 刚公布第一个草案没多久,Linus 就明确表示 Linux 不会将许可证转换至 GPLv3,因为他反对该

2024-10-25

名明确为俄罗斯身份的维护者从 MAINTAINERS(维护者名录)文件除名。 这一提交已于上周日被 Linus Torvalds 拉取并包含于 6.12-rc4 版本的代码中。 Greg K-H 并未详述这项更新的具体原因,仅含糊其辞地表示该更改是“由于某些合规性

2024-03-08

户端) *** *** 从0.78 版本起把MySQL数据库中关键字都改为大小写敏感,另外生成id的方法也做了改变,只生成小写的id,避免出现id重复的问题,建议所有客户都升级 *** *** 从0.79 版本起把log4j升级到log4j2,因为log4j已经不再维护而

2023-12-05

户端) *** *** 从0.78 版本起把MySQL数据库中关键字都改为大小写敏感,另外生成id的方法也做了改变,只生成小写的id,避免出现id重复的问题,建议所有客户都升级 *** *** 从0.79 版本起把log4j升级到log4j2,因为log4j已经不再维护而

2024-08-23

ix 新闻组的成员透露了出于“业余爱好”而正在研究操作系统的消息。当时他在邮件中表示自己捣鼓的操作系统只是一个业余性质项目,不会像 GNU 那样庞大和专业。 Linus 称这封邮件并不是 Linux 的发布公告,而是第一封公开

2024-01-15

户端) *** *** 从0.78 版本起把MySQL数据库中关键字都改为大小写敏感,另外生成id的方法也做了改变,只生成小写的id,避免出现id重复的问题,建议所有客户都升级 *** *** 从0.79 版本起把log4j升级到log4j2,因为log4j已经不再维护而

2024-04-20

户端) *** *** 从0.78 版本起把MySQL数据库中关键字都改为大小写敏感,另外生成id的方法也做了改变,只生成小写的id,避免出现id重复的问题,建议所有客户都升级 *** *** 从0.79 版本起把log4j升级到log4j2,因为log4j已经不再维护而

2023-10-13

户端) *** *** 从0.78 版本起把MySQL数据库中关键字都改为大小写敏感,另外生成id的方法也做了改变,只生成小写的id,避免出现id重复的问题,建议所有客户都升级 *** *** 从0.79 版本起把log4j升级到log4j2,因为log4j已经不再维护而

2023-08-27

的人能够反馈意见,因为我的系统和它有点类似(同样的文件系统的物理布局 —— 由于实际原因,还有些其他的东西)。 我现在已经移植了 bash (1.08) 和 gcc (1.40), 而且看起来奏效了。这意味着我会在几个月内得到一

2023-11-19

户端) *** *** 从0.78 版本起把MySQL数据库中关键字都改为大小写敏感,另外生成id的方法也做了改变,只生成小写的id,避免出现id重复的问题,建议所有客户都升级 *** *** 从0.79 版本起把log4j升级到log4j2,因为log4j已经不再维护而

2024-09-26

施本身还不够稳定。确实如此,与C语言相比,Rust的生态系统还相对年轻,而C语言的生态系统已经发展了几十年,拥有大量稳定、经过时间检验的库和工具。 虽然这么说,但也并不影响Linux、Windows、Android 三大操作系统积极探