net:stmmac:TSO:修复非分页 SKB 数据的不平衡 DMA 映射/取消映射(CVE-2024-53058)
CVE编号
CVE-2024-53058利用情况
暂无补丁情况
N/A披露时间
2024-11-20漏洞描述
在Linux内核中,解决了以下漏洞:网络:stmmac:TSO:修复非分页SKB数据的不平衡DMA映射/反映射在一种情况下,非分页的SKB数据携带协议头并通过DMA在特定平台上传输,如果DMA AXI地址宽度配置为40位/48位,或者非分页数据的大小大于TSO_MAX_BUFF_SIZE且DMA AXI地址宽度配置为32位时,那么这个SKB需要至少两个DMA传输描述符来服务它。例如,从一块非分页数据中映射一个DMA缓冲区需要分配三个描述符:dma_desc[N + 0],dma_desc[N + 1],dma_desc[N + 2]。然后,将为stmmac_tx_clean()重用额外信息分配三个元素:tx_q->tx_skbuff_dma[N + 0],tx_q->tx_skbuff_dma[N + 1],tx_q->tx_skbuff_dma[N + 2]。现在我们关注的是tx_q->tx_skbuff_dma[entry].buf,这是DMA映射调用返回的DMA缓冲区地址。stmmac_tx_clean()仅在tx_q->tx_skbuff_dma[entry].buf是有效缓冲区地址时尝试解除DMA缓冲区的映射。预期的行为是保存此非分页数据的DMA缓冲区地址到tx_q->tx_skbuff_dma[entry].buf,应该是这样的:tx_q->tx_skbuff_dma[N + 0].buf = NULL;tx_q->tx_skbuff_dma[N + 1].buf = NULL;tx_q->tx_skbuff_dma[N + 2].buf = dma_map_single();然而,当前代码的行为却与此相反:tx_q->tx_skbuff_dma[N + 0].buf = dma_map_single();tx_q->tx_skbuff_dma[N + 1].buf = NULL;tx_q->tx_skbuff_dma[N + 2].buf = NULL;在stmmac_tx_clean()中,当DMA引擎关闭dma_desc[N + 0]时,显然tx_q->tx_skbuff_dma[N + 0].buf是一个有效的缓冲区地址,那么DMA缓冲区会立即被解除映射。可能存在一种罕见情况,即DMA引擎尚未完成处理dma_desc[N + 1],dma_desc[N + 2],此时事情会变得很糟糕。DMA将访问未映射/未引用的内存区域,可能会导致数据传输损坏或触发IOMMU错误。相比之下,处理SKB片段的循环表现得很好,实际上驱动应该同时对非分页数据和分页片段进行这样的操作。此补丁通过修复分配DMA缓冲区地址时的数组索引来纠正DMA映射/反映射序列。已在DWXGMAC CORE 3.20a上进行了测试和验证。解决建议
建议您更新当前系统或软件至最新版,完成漏洞的修复。- 攻击路径 N/A
- 攻击复杂度 N/A
- 权限要求 N/A
- 影响范围 N/A
- 用户交互 N/A
- 可用性 N/A
- 保密性 N/A
- 完整性 N/A
CWE-ID | 漏洞类型 |
Exp相关链接

版权声明
本站原创文章转载请注明文章出处及链接,谢谢合作!
评论