CVE-2023-53599CVE-2023-53599是Linux内核crypto子系统中af_alg接口的一个空指针解引用漏洞。该漏洞位于af_alg_alloc_areq()函数中,由于未正确初始化areq->first_rsgl.sgl.sgt.sgl指针,导致在特定条件下触发内核崩溃(kernel oops)。具体而言,当用户通过AF_ALG套接字向gcm-aes-s390驱动传递空的密文(empty ciphertext)时,af_alg_get_rsgl()函数中的循环会直接退出而不会设置areq->first_rsgl。随后_aead_recvmsg()调用aead_request_set_crypt()将req->dst设置为未初始化的areq->first_rsgl.sgl.sgl.sgt.sgl值。当gcm-aes-s390驱动尝试在gcm_walk_start()中对req->dst进行操作时,由于该指针指向无效地址(0x0000000a00000000),触发内核指针解引用错误,导致系统崩溃。该漏洞主要影响IBM s390x架构上的Linux系统,但根本问题存在于通用的af_alg代码中。该漏洞的CVSS评分为5.5,属于中等严重等级,攻击者需要本地低权限访问即可触发,无需用户交互,主要影响系统可用性,可能导致拒绝服务攻击。
该漏洞的根本原因在于af_alg_alloc_areq()函数中缺少对areq->first_rsgl.sgl.sgl.sgt.sgl字段的初始化。正常情况下,该字段应指向areq->first_rsgl.sgl.sgl中的scatterlist数组。
漏洞触发流程如下:
1. 用户通过AF_ALG套接字创建AEAD(Authenticated Encryption with Associated Data)加密操作
2. 调用aead_recvmsg()接收数据
3. _aead_recvmsg()调用aead_request_set_crypt(),将req->dst设置为areq->first_rsgl.sgl.sgl.sgt.sgl的值
4. af_alg_get_rsgl()函数遍历scatterlist列表,当传入空密文时,循环直接退出,不初始化areq->first_rsgl
5. gcm-aes-s390驱动的gcm_walk_start()函数尝试访问req->dst指向的内存
6. 由于req->dst包含未初始化的垃圾值(实际为0x0000000a00000000),触发内核指针解引用异常
7. 系统进入oops状态并崩溃
值得注意的是,在x86_64平台上使用gcmaes_crypt_by_sg()时不会出现此问题,因为该实现忽略req->dst而仅使用req->src。这暗示aesni-intel_glue.c中可能存在另一个潜在bug。
利用条件:
- 需要本地访问权限
- 需要低权限用户账户
- 目标系统必须使用s390x架构
- 内核必须编译了gcm-aes-s390驱动
- 需要通过AF_ALG套接字发送空的密文数据