diff --git a/src/sysupdate/sysupdate-resource.c b/src/sysupdate/sysupdate-resource.c index e234b3c914..abc63960df 100644 --- a/src/sysupdate/sysupdate-resource.c +++ b/src/sysupdate/sysupdate-resource.c @@ -532,6 +532,11 @@ static int resource_load_from_web( r = unhexmem_full(p, 64, /* secure= */ false, &h.iov_base, &h.iov_len); if (r < 0) return log_error_errno(r, "Failed to parse digest at manifest line %zu, refusing.", line_nr); + if (h.iov_len != sizeof_field(InstanceMetadata, sha256sum)) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), + "Manifest hash at line %zu decoded to %zu bytes, refusing.", + line_nr, + h.iov_len); p += 64, left -= 64; diff --git a/test/units/TEST-72-SYSUPDATE.sh b/test/units/TEST-72-SYSUPDATE.sh index 0b008271b0..749af71a06 100755 --- a/test/units/TEST-72-SYSUPDATE.sh +++ b/test/units/TEST-72-SYSUPDATE.sh @@ -608,4 +608,30 @@ rm "$CONFIGDIR/01-tiny-url.transfer" rm "$WORKDIR/source/tiny-v1.bin" rm "$WORKDIR/source/SHA256SUMS" +# Check that malformed manifest hashes are rejected without aborting. +rm -rf "$WORKDIR/malformed-manifest" +mkdir -p "$WORKDIR/malformed-manifest/definitions" "$WORKDIR/malformed-manifest/source" "$WORKDIR/malformed-manifest/target" +printf 'payload\n' >"$WORKDIR/malformed-manifest/source/malformed-v1.bin" +hash_64=0000000000000000000000000000000000000000000000000000000000000000 +printf '%s\t\t *malformed-v1.bin\n' "${hash_64%??}" >"$WORKDIR/malformed-manifest/source/SHA256SUMS" +cat >"$WORKDIR/malformed-manifest/definitions/01-malformed-hash.transfer" <"$WORKDIR/malformed-manifest/check-new.log" +rc=$? +set -e +[[ $rc -ne 0 ]] +[[ $rc -ne 134 ]] +grep -F "Manifest hash at line 1 decoded to 31 bytes" "$WORKDIR/malformed-manifest/check-new.log" >/dev/null + touch /testok