[PATCH BlueZ v2 01/10] eir: Fix stack buffer overflow when parsing the remote name
Luiz Augusto von Dentz <[email protected]>
| Newsgroups | org.kernel.vger.linux-bluetooth |
|---|---|
| Message-ID | <[email protected]> |
From: Luiz Augusto von Dentz <[email protected]> name2utf8() copies len bytes into a HCI_MAX_NAME_LENGTH + 2, so 250, byte stack buffer without clamping len first. eir_parse() only rejects a field once it runs past the end of the EIR data, and that data is up to 255 bytes, so field_len can be 254 and the data_len passed to name2utf8() can reach 253. strncpy() then writes 253 bytes into the 250 byte buffer and leaves it unterminated, so the following g_strstrip() and g_strdup() also read past the end. The EIR data comes from a remote device, either in an extended inquiry response or in an advertising report, so the length is attacker controlled. Clamp len to HCI_MAX_NAME_LENGTH, which is what the local name is limited to anyway, and what ad_replace_name() already clamps to. Fixes: https://github.com/bluez/bluez/security/advisories/GHSA-68h6-5qgp-3975 Assisted-by: Claude:claude-opus-5 --- src/eir.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/eir.c b/src/eir.c index 89c15995a546..4421b1662d65 100644 --- a/src/eir.c +++ b/src/eir.c @@ -137,6 +137,8 @@ static char *name2utf8(const uint8_t *name, uint8_t len) { char utf8_name[HCI_MAX_NAME_LENGTH + 2]; + len = MIN(len, HCI_MAX_NAME_LENGTH); + memset(utf8_name, 0, sizeof(utf8_name)); strncpy(utf8_name, (char *) name, len); strtoutf8(utf8_name, len); -- 2.54.0