File: 0001-NetworkPkg-IScsiDxe-Fix-for-Remote-Memory-Exposure-i.patch

package info (click to toggle)
edk2 2025.02-10
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 271,976 kB
  • sloc: ansic: 2,110,013; asm: 263,832; perl: 227,730; python: 149,827; sh: 34,967; cpp: 21,813; makefile: 3,337; xml: 806; pascal: 721; lisp: 35; ruby: 16; sed: 6; tcl: 4
file content (54 lines) | stat: -rw-r--r-- 2,051 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
From 17cdc512f02a2dfd1b9e24133da56fdda099abda Mon Sep 17 00:00:00 2001
From: Madhavan <madavtechy@gmail.com>
Date: Fri, 14 Mar 2025 14:15:13 -0400
Subject: [PATCH] NetworkPkg/IScsiDxe:Fix for Remote Memory Exposure in ISCSI
 bz4206

Used SafeUint32Add to calculate and validate OutTransferLength with
boundary check in IScsiOnR2TRcvd to avoid integer overflow

Signed-off-by: Madhavan <madavtechy@gmail.com>

Origin: https://github.com/tianocore/edk2/commit/17cdc512f02a2dfd1b9e24133da56fdda099abda
Bug: https://github.com/tianocore/edk2/security/advisories/GHSA-8522-69fh-w74x
Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1100594
Last-Updated: 2025-03-22

diff --git a/NetworkPkg/IScsiDxe/IScsiProto.c b/NetworkPkg/IScsiDxe/IScsiProto.c
index ef587649a0..fb48e6304d 100644
--- a/NetworkPkg/IScsiDxe/IScsiProto.c
+++ b/NetworkPkg/IScsiDxe/IScsiProto.c
@@ -1,7 +1,7 @@
 /** @file
   The implementation of iSCSI protocol based on RFC3720.
 
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2004 - 2025, Intel Corporation. All rights reserved.<BR>
 SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
@@ -2682,6 +2682,7 @@ IScsiOnR2TRcvd (
   EFI_STATUS               Status;
   ISCSI_XFER_CONTEXT       *XferContext;
   UINT8                    *Data;
+  UINT32                   TransferLength;
 
   R2THdr = (ISCSI_READY_TO_TRANSFER *)NetbufGetByte (Pdu, 0, NULL);
   if (R2THdr == NULL) {
@@ -2712,7 +2713,12 @@ IScsiOnR2TRcvd (
   XferContext->Offset            = R2THdr->BufferOffset;
   XferContext->DesiredLength     = R2THdr->DesiredDataTransferLength;
 
-  if (((XferContext->Offset + XferContext->DesiredLength) > Packet->OutTransferLength) ||
+  Status = SafeUint32Add (XferContext->Offset, XferContext->DesiredLength, &TransferLength);
+  if (EFI_ERROR (Status)) {
+    return EFI_PROTOCOL_ERROR;
+  }
+
+  if ((TransferLength > Packet->OutTransferLength) ||
       (XferContext->DesiredLength > Tcb->Conn->Session->MaxBurstLength)
       )
   {
-- 
2.47.2