LWN:ksmbd 的困难开场!
关注了就能看到更多这么棒的文章哦~
A rough start for ksmbd
By Jonathan Corbet
October 7, 2021
DeepL assisted translation
https://lwn.net/Articles/871866/
在 5.15 合并窗口期间被合入 mainline 的许多新功能中,有一项是 ksmbd 网络文件系统服务器(network filesystem server)。Ksmbd 实现了在 Windows 世界中广泛使用的 SMB 协议(也被称为 CIFS,尽管这个名字已经不受欢迎了)。鉴于 Linux 从很早开始可以很好地使用用户空间的 Samba 解决方案了,因此现在还在创建一个内核内(in-kernel)的 SMB 服务实现就有点令人惊讶了。这样做是有其合理性的,但至少在短期内这些合理性可能都无法摆脱 ksmbd 中令人担忧的安全相关问题相关讨论。
为什么在这个时候创建一个 in-kernel 的 SMB 服务?从某种意义上说,ksmbd 并不是要与 Samba 竞争。事实上,它是与 Samba 项目合作开发的。然而,它的目的是要成为一个比 Samba 更高性能、更集中的解决方案。目前的 Samba 中包括了大量的功能,而不是简简单单地提供文件(file serving)。Ksmbd 声称在很多测试中都看到了明显的性能提升。https://github.com/namjaejeon/ksmbd#performance 的图示就显示出在一些测试中性能提高了一倍。内核服务可以更加容易地支持 SMB Direct 等变种协议,因为 SMB Direct 是使用 RDMA 在系统之间传输数据的。合并到 mainline 上的话,可以吸引更多的人关注这部分代码,从而通常也可以加快开发进程。另一个原因是,这个新的实现可以采用 GPLv2 授权,而 Samba 是 GPLv3。
Ksmbd 是由 Namjae Jeon 在 3 月底首次发布出来供 review 的(当时名为 "cifsd")。其第八次修订版是在 8 月底的 5.15 合并窗口开放之前发布的。最后一个版本没有收到 review 意见,但以前的版本显然已经有一些开发者 review 过了。当 Steve French 要求 Linus Torvalds 在 8 月 29 日将 ksmbd 拉入主线时,没有人反对。
一个新的子系统在进入 mainline kernel 后收到大量的修 fix,这是很常见的事情。合并到 mainline 往往会引起对代码的更多关注,测试人员的数量通常也会增加,从而导致可以发现更多的问题。毕竟,这就是为什么要在合并窗口之后设置一个稳定期的原因。有一种说法是后续进行的 fix 的性质可以让人了解这部分代码的质量,而 ksmbd 这里的情况并不太妙。
ksmbd 的提交历史(commit history)可以看到有稳定的 fix 不断进来,这是符合预期的。但令人担忧的是,许多被修复的问题很明显是安全问题。对于一个网络文件系统的实现代码来说,这个情况不太好。举例来说有:
改变所有权和权限的代码没有首先检查现有文件的权限。
没有验证数据的长度可能导致访问无效数据。
服务器在查找路径名时,会盲目地跟随符号链接。
许多验证缓冲区长度的故障,如这个或这个。
所有这些 fix 都是在 ksmbd 进入 mainline 后合入的。还有一些是在这之前就出现的 fix。目前,有 12 个对 ksmbd 的 fix 都在其 changelog 中将发现这个 bug 归功于 Coverity 扫描。
在一个新的网络文件系统实现中出现一两个安全问题并不令人惊讶。但是 ksmbd 已经显示出过多的问题,在内核社区引起了一些关注,而对这些问题的讨论显然已经在私下里进行了一段时间。当 French 在 9 月中旬推送另一组 ksmbd 的 fix 时,Kees Cook 把讨论公开化了:
我正在查看 ksmbd 工作的历史记录[1],对这里发现的一些缺陷感到惊讶。这看起来像是在写全新代码,这是我的感觉(或者是我的发现[0])?其中一些缺陷是相当基础的文件系统安全性相关的问题[2],看起来并没有进行过测试。此外还有一些是在内核文件系统服务器中出现缓冲区溢出[3]这种令人不安的 bug。
我很担心代码的质量,我认为这里的 review 和测试过程需要改变。
French 回答说他也对这里的一些 bug 感到意外。他提供了一个维基页面,其中记录了正在进行的对这段代码的 security review,这似乎已经变得更加紧迫了。他说,目前正在制定一些新的流程,也会针对各种互操作性的情况下进行测试。French 说他 "对正在取得的进展感到高兴,但也承认 ksmbd ‘还没有准备好用于生产环境’ "。
他继续提到,在安全方面也有一些值得期待的事情:
有一些好消息(与安全有关),只要 Namjae 等人了结了那些缓冲区溢出等 patch:
他已经实现了 SMB3.1.1 中支持的最强加密功能
他已经实现了该协议的中间人攻击预防功能
实现了 strong authentication(Kerberos)
他已经删除了对协议中安全性较弱的旧版本(包括 SMB1 和 SMB2)的支持
他将取消对安全性较弱的认证的支持(包括 NTLMv1)。
在这之后,删除 NTLMv1 的改动已经被合并到 mainline 中。在看到 French 的消息后,Cook 回应说 "感谢你最近做的这些改变,现在我对 ksmbd 的未来感觉好多了"。
清理 ksmbd 的工作继续进行。French 在 10 月 1 日又推送了 11 个 fix。
目前来看,几乎没有人怀疑 ksmbd 都在进行着合理的 review 和清理。有一双双眼睛盯着代码,而且 ksmbd 本身也非常小,可以做到全面深入的 review。到那时,内核应该会有一个功能丰富、性能良好并且安全的 SMB 实现。看起来在部署 SMB 之前,还要再等一两个内核开发周期,因为让开发人员 "能批准这些缓冲区溢出等 patch" 可能会是比较谨慎的做法。
这一切都很好,但仍然有点令人担忧的是,这段代码在当时不完善的情况下还能走到今天。很明显,在开发这段代码的时候,安全问题并没有被放在首位,而且在合并之前,它所接受的 review 在这方面也是比较失败的。增加安全功能是好事,但如果没有安全的实现的情况下,这些功能并没有什么好处。如果我们想达到目标,让内核中增加的安全问题不能比 fix 掉的更多,我们就需要做得更好。
全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。
长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~