The data-offset, data-position and data-size FIT properties are 32-bit unsigned values, but were read through signed int. Also, they are excluded from the configuration signature, so they are attacker controlled.
Patch 1 switches the accessors and their callers to u32, removing the ad-hoc handling of "negative" values in U-Boot proper. This transition was discussed and agreed on in [1]. The SPL loader has its own copy of this logic with the same problems and fewer checks. Patch 2 factors out a test helper, patch 3 makes the SPL offset/size arithmetic overflow-safe, and patch 4 adds the addressable-range and FIT_SIGNATURE_MAX_SIZE bounds check that U-Boot proper already performs in fit_image_get_data(). Patches 3 and 4 build on each other and on patch 1, so they are not intended to be cherry-picked individually. [1] https://lore.kernel.org/u-boot/capwax55xwflcmgruauuxxn__mx_ug4j8qtd6rvxzmj4wsoc...@mail.gmail.com/ --- Anton Ivanov (4): image-fit: Use unsigned types for external data properties test: spl: Factor out external-data FIT property checks spl: fit: Harden external-data offset and size arithmetic spl: fit: Bound external data like U-Boot proper boot/image-fit.c | 29 ++++------ common/spl/spl_fit.c | 122 +++++++++++++++++++++++++-------------- common/splash_source.c | 2 +- drivers/fpga/socfpga_arria10.c | 3 +- include/image.h | 6 +- test/image/spl_load.c | 128 +++++++++++++++++++++++++++++++++++------ test/py/tests/test_vboot.py | 6 +- 7 files changed, 206 insertions(+), 90 deletions(-) --- base-commit: 94b349bd902d9e38e1846c157fadd9054c34680a change-id: 20260730-b4-fit-ext-data-hardening-1734a9203753 Best regards, -- Anton Ivanov <[email protected]>
