Headline
CVE-2023-2977: Possible buffer overrun vulnerability in pkcs15 `cardos_have_verifyrc_package` · Issue #2785 · OpenSC/OpenSC
A vulnerbility was found in OpenSC. This security flaw cause a buffer overrun vulnerability in pkcs15 cardos_have_verifyrc_package. The attacker can supply a smart card package with malformed ASN1 context. The cardos_have_verifyrc_package function scans the ASN1 buffer for 2 tags, where remaining length is wrongly caculated due to moved starting pointer. This leads to possible heap-based buffer oob read. In cases where ASAN is enabled while compiling this causes a crash. Further info leak or more damage is possible.
Problem Description
On reviewing historical CVE vulnerabilities, I found a possible recurring vulnerability as CVE-2021-42782, which was reported by oss-fuzz and fixed in commit 1252aca.
The newly found issue exists in pkcs15-init module. Like the original bug in libopensc, cardos_have_verifyrc_package in pkcs15-cardos.c scans an ans1 buffer for 2 tags. The pointer p is moved after each sc_asn1_find_tag invocation, which results in the miscalculation of the length of left bytes in buffer and hence reading beyond the end of the buffer.
Proposed Resolution
Almost the same patch like 1252aca will do:
diff --git a/src/pkcs15init/pkcs15-cardos.c b/src/pkcs15init/pkcs15-cardos.c index 9715cf39…f41f73c3 100644 — a/src/pkcs15init/pkcs15-cardos.c +++ b/src/pkcs15init/pkcs15-cardos.c @@ -872,7 +872,7 @@ static int cardos_have_verifyrc_package(sc_card_t *card) sc_apdu_t apdu; u8 rbuf[SC_MAX_APDU_BUFFER_SIZE]; int r; - const u8 *p = rbuf, *q;
const u8 \*p = rbuf, \*q, \*pp; size\_t len, tlen = 0, ilen = 0; sc\_format\_apdu(card, &apdu, SC\_APDU\_CASE\_2\_SHORT, 0xca, 0x01, 0x88);
@@ -888,13 +888,13 @@ static int cardos_have_verifyrc_package(sc_card_t *card) return 0;
while (len != 0) {
- p = sc_asn1_find_tag(card->ctx, p, len, 0xe1, &tlen); - if (p == NULL)
pp = sc\_asn1\_find\_tag(card->ctx, p, len, 0xe1, &tlen);
if (pp == NULL) return 0; if (card->type == SC\_CARD\_TYPE\_CARDOS\_M4\_3) { /\* the verifyRC package on CardOS 4.3B use Manufacturer ID 0x01 \*/ /\* and Package Number 0x07 \*/
- q = sc_asn1_find_tag(card->ctx, p, tlen, 0x01, &ilen);
q = sc\_asn1\_find\_tag(card->ctx, pp, tlen, 0x01, &ilen); if (q == NULL || ilen != 4) return 0; if (q\[0\] == 0x07)
@@ -902,7 +902,7 @@ static int cardos_have_verifyrc_package(sc_card_t *card) } else if (card->type == SC_CARD_TYPE_CARDOS_M4_4) { /* the verifyRC package on CardOS 4.4 use Manufacturer ID 0x03 */ /* and Package Number 0x02 */ - q = sc_asn1_find_tag(card->ctx, p, tlen, 0x03, &ilen);
q = sc\_asn1\_find\_tag(card->ctx, pp, tlen, 0x03, &ilen); if (q == NULL || ilen != 4) return 0; if (q\[0\] == 0x02)
Reference
https://www.opencve.io/cve/CVE-2021-42782
https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=29912
Related news
Red Hat Security Advisory 2023-7160-01 - An update for opensc is now available for Red Hat Enterprise Linux 8.
Gentoo Linux Security Advisory 202209-3 - Multiple vulnerabilities have been discovered in OpenSC, the worst of which could result in the execution of arbitrary code. Versions less than 0.22.0 are affected.
Stack buffer overflow issues were found in Opensc before version 0.22.0 in various places that could potentially crash programs using the library.