diff options
| author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2021-08-23 07:38:42 +0200 | 
|---|---|---|
| committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2021-08-23 07:38:42 +0200 | 
| commit | dce3efdab4ea7314a3e1db3af2cb0aac3f48dcef (patch) | |
| tree | 7212ff817ceb8d20aa2e948c10436dc5c5cad12a /debian/patches/0505-fix_CVE-2020-5208.patch | |
| parent | b2402345fbef781e1e3e4eeb72226674fb7f4106 (diff) | |
| parent | 8fcf0ba6f182918bd584bb80bf0b8998acad26a8 (diff) | |
Merge tag 'debian/1.8.18-11' into develop
Bugfix release
Diffstat (limited to 'debian/patches/0505-fix_CVE-2020-5208.patch')
| -rw-r--r-- | debian/patches/0505-fix_CVE-2020-5208.patch | 187 | 
1 files changed, 186 insertions, 1 deletions
| diff --git a/debian/patches/0505-fix_CVE-2020-5208.patch b/debian/patches/0505-fix_CVE-2020-5208.patch index 5b76b32..1295180 100644 --- a/debian/patches/0505-fix_CVE-2020-5208.patch +++ b/debian/patches/0505-fix_CVE-2020-5208.patch @@ -1,5 +1,11 @@  Description: Fix CVE-2020-5208 -Origin: backport from https://github.com/ipmitool/ipmitool/commit/7ccea283dd62a05a320c1921e3d8d71a87772637 +Origin: backport from + https://github.com/ipmitool/ipmitool/commit/e824c23316ae50beb7f7488f2055ac65e8b341f2 + https://github.com/ipmitool/ipmitool/commit/840fb1cbb4fb365cb9797300e3374d4faefcdb10 + https://github.com/ipmitool/ipmitool/commit/41d7026946fafbd4d1ec0bcaca3ea30a6e8eed22 + https://github.com/ipmitool/ipmitool/commit/9452be87181a6e83cfcc768b3ed8321763db50e4 + https://github.com/ipmitool/ipmitool/commit/d45572d71e70840e0d4c50bf48218492b79c1a10 + https://github.com/ipmitool/ipmitool/commit/7ccea283dd62a05a320c1921e3d8d71a87772637  Bug: https://github.com/ipmitool/ipmitool/security/advisories/GHSA-g659-9qxw-p7cp  Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=950761  Forwarded: not-needed @@ -112,3 +118,182 @@ Index: trunk/lib/ipmi_fru.c   		/* sometimes the size returned in the Info command   		* is too large.  return 0 so higher level function +@@ -3033,7 +3062,7 @@ ipmi_fru_print(struct ipmi_intf * intf, + 		return 0; +  + 	memset(desc, 0, sizeof(desc)); +-	memcpy(desc, fru->id_string, fru->id_code & 0x01f); ++	memcpy(desc, fru->id_string, __min(fru->id_code & 0x01f, sizeof(desc))); + 	desc[fru->id_code & 0x01f] = 0; + 	printf("FRU Device Description : %s (ID %d)\n", desc, fru->device_id); +  +Index: trunk/lib/ipmi_sdr.c +=================================================================== +--- trunk.orig/lib/ipmi_sdr.c ++++ trunk/lib/ipmi_sdr.c +@@ -2084,7 +2084,7 @@ ipmi_sdr_print_sensor_eventonly(struct i + 		return -1; +  + 	memset(desc, 0, sizeof (desc)); +-	snprintf(desc, (sensor->id_code & 0x1f) + 1, "%s", sensor->id_string); ++	snprintf(desc, sizeof(desc), "%.*s", (sensor->id_code & 0x1f) + 1, sensor->id_string); +  + 	if (verbose) { + 		printf("Sensor ID              : %s (0x%x)\n", +@@ -2135,7 +2135,7 @@ ipmi_sdr_print_sensor_mc_locator(struct + 		return -1; +  + 	memset(desc, 0, sizeof (desc)); +-	snprintf(desc, (mc->id_code & 0x1f) + 1, "%s", mc->id_string); ++	snprintf(desc, sizeof(desc), "%.*s", (mc->id_code & 0x1f) + 1, mc->id_string); +  + 	if (verbose == 0) { + 		if (csv_output) +@@ -2228,7 +2228,7 @@ ipmi_sdr_print_sensor_generic_locator(st + 	char desc[17]; +  + 	memset(desc, 0, sizeof (desc)); +-	snprintf(desc, (dev->id_code & 0x1f) + 1, "%s", dev->id_string); ++	snprintf(desc, sizeof(desc), "%.*s", (dev->id_code & 0x1f) + 1, dev->id_string); +  + 	if (!verbose) { + 		if (csv_output) +@@ -2285,7 +2285,7 @@ ipmi_sdr_print_sensor_fru_locator(struct + 	char desc[17]; +  + 	memset(desc, 0, sizeof (desc)); +-	snprintf(desc, (fru->id_code & 0x1f) + 1, "%s", fru->id_string); ++	snprintf(desc, sizeof(desc), "%.*s", (fru->id_code & 0x1f) + 1, fru->id_string); +  + 	if (!verbose) { + 		if (csv_output) +@@ -2489,35 +2489,43 @@ ipmi_sdr_print_name_from_rawentry(struct +  +    int rc =0; +    char desc[17]; ++   const char *id_string; ++   uint8_t id_code; +    memset(desc, ' ', sizeof (desc)); +  +    switch ( type) { +       case SDR_RECORD_TYPE_FULL_SENSOR: +       record.full = (struct sdr_record_full_sensor *) raw; +-      snprintf(desc, (record.full->id_code & 0x1f) +1, "%s", +-               (const char *)record.full->id_string); ++      id_code = record.full->id_code; ++      id_string = record.full->id_string; +       break; ++ +       case SDR_RECORD_TYPE_COMPACT_SENSOR: +       record.compact = (struct sdr_record_compact_sensor *) raw	; +-      snprintf(desc, (record.compact->id_code & 0x1f)  +1, "%s", +-               (const char *)record.compact->id_string); ++      id_code = record.compact->id_code; ++      id_string = record.compact->id_string; +       break; ++ +       case SDR_RECORD_TYPE_EVENTONLY_SENSOR: +       record.eventonly  = (struct sdr_record_eventonly_sensor *) raw ; +-      snprintf(desc, (record.eventonly->id_code & 0x1f)  +1, "%s", +-               (const char *)record.eventonly->id_string); +-      break;             ++      id_code = record.eventonly->id_code; ++      id_string = record.eventonly->id_string; ++      break; ++ +       case SDR_RECORD_TYPE_MC_DEVICE_LOCATOR: +       record.mcloc  = (struct sdr_record_mc_locator *) raw ; +-      snprintf(desc, (record.mcloc->id_code & 0x1f)  +1, "%s", +-               (const char *)record.mcloc->id_string);		 ++      id_code = record.mcloc->id_code; ++      id_string = record.mcloc->id_string; +       break; ++ +       default: +       rc = -1; +-      break; +-   }    ++   } ++   if (!rc) { ++       snprintf(desc, sizeof(desc), "%.*s", (id_code & 0x1f) + 1, id_string); ++   } +  +-      lprintf(LOG_INFO, "ID: 0x%04x , NAME: %-16s", id, desc); ++   lprintf(LOG_INFO, "ID: 0x%04x , NAME: %-16s", id, desc); +    return rc; + } +  +Index: trunk/lib/ipmi_channel.c +=================================================================== +--- trunk.orig/lib/ipmi_channel.c ++++ trunk/lib/ipmi_channel.c +@@ -378,7 +378,10 @@ ipmi_get_channel_cipher_suites(struct ip + 		lprintf(LOG_ERR, "Unable to Get Channel Cipher Suites"); + 		return -1; + 	} +-	if (rsp->ccode > 0) { ++	if (rsp->ccode ++	    || rsp->data_len < 1 ++	    || rsp->data_len > sizeof(uint8_t) + MAX_CIPHER_SUITE_DATA_LEN) ++	{ + 		lprintf(LOG_ERR, "Get Channel Cipher Suites failed: %s", + 			val2str(rsp->ccode, completion_code_vals)); + 		return -1; +Index: trunk/lib/ipmi_session.c +=================================================================== +--- trunk.orig/lib/ipmi_session.c ++++ trunk/lib/ipmi_session.c +@@ -309,8 +309,10 @@ ipmi_get_session_info(struct ipmi_intf + 		} + 		else + 		{ +-			memcpy(&session_info,  rsp->data, rsp->data_len); +-			print_session_info(&session_info, rsp->data_len); ++			memcpy(&session_info,  rsp->data, ++			    __min(rsp->data_len, sizeof(session_info))); ++			print_session_info(&session_info, ++			    __min(rsp->data_len, sizeof(session_info))); + 		} + 		break; + 		 +@@ -341,9 +343,10 @@ ipmi_get_session_info(struct ipmi_intf + 				break; + 			} +  +-			memcpy(&session_info,  rsp->data, rsp->data_len); +-			print_session_info(&session_info, rsp->data_len); +-			 ++			memcpy(&session_info,  rsp->data, ++			     __min(rsp->data_len, sizeof(session_info))); ++			print_session_info(&session_info, ++			     __min(rsp->data_len, sizeof(session_info))); + 		} while (i <= session_info.session_slot_count); + 		break; + 	} +Index: trunk/lib/dimm_spd.c +=================================================================== +--- trunk.orig/lib/dimm_spd.c ++++ trunk/lib/dimm_spd.c +@@ -1621,7 +1621,7 @@ ipmi_spd_print_fru(struct ipmi_intf * in + 	struct ipmi_rq req; + 	struct fru_info fru; + 	uint8_t *spd_data, msg_data[4]; +-	int len, offset; ++	uint32_t len, offset; +  + 	msg_data[0] = id; +  +@@ -1697,6 +1697,13 @@ ipmi_spd_print_fru(struct ipmi_intf * in + 		} +  + 		len = rsp->data[0]; ++		if(rsp->data_len < 1 ++		   || len > rsp->data_len - 1 ++		   || len > fru.size - offset) ++		{ ++			printf(" Not enough buffer size"); ++			return -1; ++		} + 		memcpy(&spd_data[offset], rsp->data + 1, len); + 		offset += len; + 	} while (offset < fru.size); | 
