]> git.baikalelectronics.ru Git - arm-tf.git/commit
fix(auth): avoid out-of-bounds read in auth_nvctr()
authorDemi Marie Obenour <demiobenour@gmail.com>
Fri, 9 Dec 2022 23:21:47 +0000 (18:21 -0500)
committerSandrine Bailleux <sandrine.bailleux@arm.com>
Tue, 10 Jan 2023 13:32:52 +0000 (14:32 +0100)
commitabb8f936fd0ad085b1966bdc2cddf040ba3865e3
treef0fd9949f28c6e1d862c38b16d039184a57fe9f8
parent601e2d4325a7def628990f4a25889f374c81ca06
fix(auth): avoid out-of-bounds read in auth_nvctr()

auth_nvctr() does not check that the buffer provided is long enough to
hold an ASN.1 INTEGER, or even that the buffer is non-empty.  Since
auth_nvctr() will only ever read 6 bytes, it is possible to read up to
6 bytes past the end of the buffer.

This out-of-bounds read turns out to be harmless.  The only caller of
auth_nvctr() always passes a pointer into an X.509 TBSCertificate, and
all in-tree chains of trust require that the certificate’s signature has
already been validated.  This means that the signature algorithm
identifier is at least 4 bytes and the signature itself more than that.
Therefore, the data read will be from the certificate itself.  Even if
the certificate signature has not been validated, an out-of-bounds read
is still not possible.  Since there are at least two bytes (tag and
length) in both the signature algorithm ID and the signature itself, an
out-of-bounds read would require that the tag byte of the signature
algorithm ID would need to be either the tag or length byte of the
DER-encoded nonvolatile counter.  However, this byte must be
(MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE) (0x30), which is
greater than 4 and not equal to MBEDTLS_ASN1_INTEGER (2).  Therefore,
auth_nvctr() will error out before reading the integer itself,
preventing an out-of-bounds read.

Change-Id: Ibdf1af702fbeb98a94c0c96456ebddd3d392ad44
Signed-off-by: Demi Marie Obenour <demiobenour@gmail.com>
drivers/auth/auth_mod.c