fdt_region: Ensure that depth never goes below -1
authorKonrad Beckmann <konrad.beckmann@gmail.com>
Wed, 7 Nov 2018 19:51:46 +0000 (14:51 -0500)
committerTom Rini <trini@konsulko.com>
Fri, 16 Nov 2018 21:52:01 +0000 (16:52 -0500)
A specially crafted FIT image makes it possible to overflow the stack
with controlled values when using the verified boot feature. Depending
on the memory layout, this could be used to overwrite configuration
variables on the heap and setting them to 0, e.g. disable signature
verification, thus bypassing it.

This change fixes a bug in fdt_find_regions where the fdt structure is
parsed. A lower value than -1 of depth can lead to a buffer underflow
write on the stack.

Signed-off-by: Konrad Beckmann <konrad.beckmann@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
lib/libfdt/fdt_region.c

index d3b9a60e994f998be93e27f8e6875d6f178790e1..7e9fa9272e80bdf6d2deda20c284344a646b1ded 100644 (file)
@@ -96,6 +96,9 @@ int fdt_find_regions(const void *fdt, char * const inc[], int inc_count,
                        break;
 
                case FDT_END_NODE:
+                       /* Depth must never go below -1 */
+                       if (depth < 0)
+                               return -FDT_ERR_BADSTRUCTURE;
                        include = want;
                        want = stack[depth--];
                        while (end > path && *--end != '/')