Skip to content

Commit 8ec321e

Browse files
AlanSternJiri Kosina
authored andcommitted
HID: Fix slab-out-of-bounds read in hid_field_extract
The syzbot fuzzer found a slab-out-of-bounds bug in the HID report handler. The bug was caused by a report descriptor which included a field with size 12 bits and count 4899, for a total size of 7349 bytes. The usbhid driver uses at most a single-page 4-KB buffer for reports. In the test there wasn't any problem about overflowing the buffer, since only one byte was received from the device. Rather, the bug occurred when the HID core tried to extract the data from the report fields, which caused it to try reading data beyond the end of the allocated buffer. This patch fixes the problem by rejecting any report whose total length exceeds the HID_MAX_BUFFER_SIZE limit (minus one byte to allow for a possible report index). In theory a device could have a report longer than that, but if there was such a thing we wouldn't handle it correctly anyway. Reported-and-tested-by: [email protected] Signed-off-by: Alan Stern <[email protected]> CC: <[email protected]> Signed-off-by: Jiri Kosina <[email protected]>
1 parent 348b80b commit 8ec321e

File tree

1 file changed

+6
-0
lines changed

1 file changed

+6
-0
lines changed

drivers/hid/hid-core.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,12 @@ static int hid_add_field(struct hid_parser *parser, unsigned report_type, unsign
288288
offset = report->size;
289289
report->size += parser->global.report_size * parser->global.report_count;
290290

291+
/* Total size check: Allow for possible report index byte */
292+
if (report->size > (HID_MAX_BUFFER_SIZE - 1) << 3) {
293+
hid_err(parser->device, "report is too long\n");
294+
return -1;
295+
}
296+
291297
if (!parser->local.usage_index) /* Ignore padding fields */
292298
return 0;
293299

0 commit comments

Comments
 (0)