123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- Advisory TFV-10 (CVE-2022-47630)
- ================================
- +----------------+-------------------------------------------------------------+
- | Title | Incorrect validation of X.509 certificate extensions can |
- | | result in an out-of-bounds read. |
- +================+=============================================================+
- | CVE ID | `CVE-2022-47630`_ |
- +----------------+-------------------------------------------------------------+
- | Date | Reported on 12 Dec 2022 |
- +----------------+-------------------------------------------------------------+
- | Versions | v1.2 to v2.8 |
- | Affected | |
- +----------------+-------------------------------------------------------------+
- | Configurations | BL1 and BL2 with Trusted Boot enabled with custom, |
- | Affected | downstream usages of ``get_ext()`` and/or ``auth_nvctr()`` |
- | | interfaces. Not exploitable in upstream TF-A code. |
- +----------------+-------------------------------------------------------------+
- | Impact | Out-of-bounds read. |
- +----------------+-------------------------------------------------------------+
- | Fix Version | - `fd37982a19a4a291`_ "fix(auth): forbid junk after |
- | | extensions" |
- | | |
- | | - `72460f50e2437a85`_ "fix(auth): require at least one |
- | | extension to be present" |
- | | |
- | | - `f5c51855d36e399e`_ "fix(auth): properly validate X.509 |
- | | extensions" |
- | | |
- | | - `abb8f936fd0ad085`_ "fix(auth): avoid out-of-bounds read |
- | | in auth_nvctr()" |
- | | |
- | | Note that `72460f50e2437a85`_ is not fixing any |
- | | vulnerability per se but it is required for |
- | | `f5c51855d36e399e`_ to apply cleanly. |
- +----------------+-------------------------------------------------------------+
- | Credit | Demi Marie Obenour, Invisible Things Lab |
- +----------------+-------------------------------------------------------------+
- This security advisory describes a vulnerability in the X.509 parser used to
- parse boot certificates in TF-A trusted boot: it is possible for a crafted
- certificate to cause an out-of-bounds memory read.
- Note that upstream platforms are **not** affected by this. Only downstream
- platforms may be, if (and only if) the interfaces described below are used in a
- different context than seen in upstream code. Details of such context is
- described in the rest of this document.
- To fully understand this security advisory, it is recommended to refer to the
- following standards documents:
- - `RFC 5280`_, *Internet X.509 Public Key Infrastructure Certificate and
- Certificate Revocation List (CRL) Profile*.
- - `ITU-T X.690`_, *ASN.1 encoding rules: Specification of Basic Encoding Rules
- (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules
- (DER).*
- Bug 1: Insufficient certificate validation
- ------------------------------------------
- The vulnerability lies in the following source file:
- ``drivers/auth/mbedtls/mbedtls_x509_parser.c``. By design, ``get_ext()`` does
- not check the return value of the various ``mbedtls_*()`` functions, as
- ``cert_parse()`` is assumed to have guaranteed that they will always succeed.
- However, it passes the end of an extension as the end pointer to these
- functions, whereas ``cert_parse()`` passes the end of the ``TBSCertificate``.
- Furthermore, ``cert_parse()`` does not check that the contents of the extension
- have the same length as the extension itself. It also does not check that the
- extension block extends to the end of the ``TBSCertificate``.
- This is a problem, as ``mbedtls_asn1_get_tag()`` leaves ``*p`` and ``*len``
- undefined on failure. In practice, this results in ``get_ext()`` continuing to
- parse at different offsets than were used (and validated) by ``cert_parse()``,
- which means that the in-bounds guarantee provided by ``cert_parse()`` no longer
- holds. The result is that it is possible for ``get_ext()`` to read memory past
- the end of the certificate. This could potentially access memory with dangerous
- read side effects, or leak microarchitectural state that could theoretically be
- retrieved through some side-channel attacks as part of a more complex attack.
- Bug 2: Missing bounds check in ``auth_nvctr()``
- -----------------------------------------------
- ``auth_nvctr()`` does not check that the buffer provided is
- long enough to hold an ``ASN.1 INTEGER``. Since ``auth_nvctr()`` will only ever
- read 6 bytes, it is possible to read up to 6 bytes past the end of the buffer.
- Exploitability Analysis
- -----------------------
- Upstream TF-A Code
- ~~~~~~~~~~~~~~~~~~
- In upstream TF-A code, the only caller of ``auth_nvctr()`` takes its input from
- ``get_ext()``, which means that the second bug is exploitable, so is the first.
- Therefore, only the first bug need be considered.
- All standard chains of trust provided in TF-A source tree (that is, under
- ``drivers/auth/``) require that the certificate's signature has already been
- validated prior to calling ``get_ext()``, or any function that calls ``get_ext()``.
- Platforms taking their chain of trust from a dynamic configuration file (such as
- ``fdts/tbbr_cot_descriptors.dtsi``) are also safe, as signature verification will
- always be done prior to any calls to ``get_ext()`` or ``auth_nvctr()`` in this
- case, no matter the order of the properties in the file. Therefore, it is not
- possible to exploit this vulnerability pre-authentication in upstream TF-A.
- Furthermore, the data read through ``get_ext()`` only
- ever gets used by the authentication framework (``drivers/auth/auth_mod.c``),
- which greatly reduces the range of inputs it will ever receive and thus the
- impact this has. Specifically, the authentication framework uses ``get_ext()``
- in three cases:
- 1. Retrieving a hash from an X.509 certificate to check the integrity of a
- child certificate (see ``auth_hash()``).
- 2. Retrieving the signature details from an X.509 certificate to check its
- authenticity and integrity (see ``auth_signature()``).
- 3. Retrieving the security counter value from an X.509 certificate to protect
- it from unauthorized rollback to a previous version (see ``auth_nvctr()``).
- None of these uses authentication framework write to the out-of-bounds memory,
- so no memory corruption is possible.
- In summary, there are 2 separate issues - one in ``get_ext()`` and another one
- in ``auth_nvctr()`` - but neither of these can be exploited in the context of
- TF-A upstream code.
- Only in the following 2 cases do we expect this vulnerability to be triggerable
- prior to authentication:
- - The platform uses a custom chain of trust which uses the non-volatile counter
- authentication method (``AUTH_METHOD_NV_CTR``) before the cryptographic
- authentication method (``AUTH_METHOD_SIG``).
- - The chain of trust uses a custom authentication method that calls
- ``get_ext()`` before cryptographic authentication.
- Custom Image Parsers
- ~~~~~~~~~~~~~~~~~~~~
- If the platform uses a custom image parser instead of the certificate parser,
- the bug in the certificate parser is obviously not relevant. The bug in
- ``auth_nvctr()`` *may* be relevant, but only if the returned data is:
- - Taken from an untrusted source (meaning that it is read prior to
- authentication).
- - Not already checked to be a primitively-encoded ASN.1 tag.
- In particular, if the custom image parser implementation wraps a 32-bit integer
- in an ASN.1 ``INTEGER``, it is not affected.
- .. _CVE-2022-47630: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-47630
- .. _fd37982a19a4a291: https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/commit/?id=fd37982a19a4a291
- .. _72460f50e2437a85: https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/commit/?id=72460f50e2437a85
- .. _f5c51855d36e399e: https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/commit/?id=f5c51855d36e399e
- .. _abb8f936fd0ad085: https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/commit/?id=abb8f936fd0ad085
- .. _RFC 5280: https://www.ietf.org/rfc/rfc5280.txt
- .. _ITU-T X.690: https://www.itu.int/ITU-T/studygroups/com10/languages/X.690_1297.pdf
|