linux
Insufficient buffer length leads to buffer overflow
The char[4] `method' variable does not have enough space for the 2 extra chars required by strncat(method, ..., 2), since there must also be room for the final '\0'. The rule is that strncat(dest, src, n) requires sizeof(dest) >= strlen(dest) + n + 1; and in this case 4 >= 2 + 2 + 1 does not hold. Note that this bug is *not* revealed by just enabling STACKPROTECTOR, as it is stated in the commit message.
Bug fixed by commit f3d83e24154
Type | BufferOverflow |
Config | "X86 && ACPI_WMI" (2nd degree) |
Fix-in | code |
Location | drivers/platform/x86/ |
#if defined(CONFIG_X86) && defined(CONFIG_ACPI_WMI) #include <string.h> static char block_object_id[3] = "XX"; void wmi_query_block() { char method[4]; // (4) just four bytes long strcpy(method, "WQ"); // (5) writes two bytes plus '\0' strncat(method, block_object_id, 2); // (6) ERROR: no space for the final '\0' } int get_wmid_devices(void) { wmi_query_block(); // (3) return 0; } int acer_wmi_init(void) { get_wmid_devices(); // (2) return 0; } #endif int main() { #if defined(CONFIG_X86) && defined(CONFIG_ACPI_WMI) acer_wmi_init(); // (1) #endif return 0; }
diff --git a/simple/f3d83e2.c b/simple/f3d83e2.c --- a/simple/f3d83e2.c +++ b/simple/f3d83e2.c @@ -6,7 +6,7 @@ void wmi_query_block() { - char method[4]; // (4) just four bytes long + char method[5]; // (4) just four bytes long strcpy(method, "WQ"); // (5) writes two bytes plus '\0' strncat(method, block_object_id, 2); // (6) ERROR: no space for the final '\0'
#if defined(CONFIG_X86) && defined(CONFIG_ACPI_WMI) #include <string.h> static char block_object_id[3] = "XX"; #endif int main() { #if defined(CONFIG_X86) && defined(CONFIG_ACPI_WMI) // acer_wmi_init(); char method[4]; strcpy(method, "WQ"); strncat(method, block_object_id, 2); // ERROR #endif return 0; }
. call init/main.c:740:do_one_initcall() . 753: ret.result = fn(); .. dyn-call drivers/platform/x86/acer-wmi.c:1266:acer_wmi_init() ... call drivers/platform/x86/acer-wmi.c:1090:get_wmid_devices() .... call drivers/platform/x86/wmi.c:322:wmi_query_block() .... 331: char method[4]; .... 378: strcpy(method, "WQ"); .... ERROR 379: strncat(method, block->object_id, 2);