Atlas 800-3010 fchownat 和 close 并发访问相同 socket 导致 system crash
2022/03/03
58
问题信息
问题来源 | 产品大类 | 产品子类 | 关键字 |
---|---|---|---|
实验室问题 | 安装部署 | 驱动固件 | system crash、 fchownat、 close |
问题现象描述
受影响系统:
SLES15、Ubuntu16.04 LTS、Ubuntu 18.04 LTS、Oracle Linux 7
问题现象:
该问题为内核 bug。并发执行 fchownat 和 close 系统调用并操作同一个 socket 会触发 "NULL pointer dereference" 问题,从而导致 system crash。错误日志如下:
问题复现代码如下:
关键过程、根本原因分析
fchownat 系统调用用于更改文件的用户ID和组ID,close 系统调用用于关闭文件描述,并且 fchownat 和 close 操作对象为 socket 时会分别调用 sockfs_setattr 和 sock_release 函数。函数代码如下:
由于 sockfs_setattr 函数执行过程没有增加文件描述符的引用计数,此时执行 sock_release,调用 "sock->ops->release(sock);",sock->sk 会被置空,sockfs_setattr 接着执行 "sock->sk->sk_uid = iattr->ia_uid;" 来修改文件属性时就会出现 "NULL pointer dereference" 问题。
结论、解决方案及效果
升级或安装patch。
SLES15:kernel (SUSE-SU-2019:0224-1)
Ubuntu 16.04 LTS:linux-hwe vulnerabilities (USN-3752-2)
Ubuntu 18.04 LTS:linux, linux-aws, linux-gcp, linux-kvm, linux-raspi2 vulnerabilities (USN-3752-1)
Oracle Linux 7 : Unbreakable Enterprise kernel (ELSA-2018-4195)
经验总结、预防措施和规范建议
无
备注
https://patchwork.ozlabs.org/patch/926519/
https://www.tenable.com/cve/CVE-2018-12232
本页内容