etc.git


etc

~ scripts and random things
git clone https://github.com/djnnvx/etc.git
log | files | refs | archive

fuzz_crl.c (2171B)

      1 /*
      2  * CRL parsing: dirmngr fetches CRLs over HTTP/LDAP and parses them here, so this
      3  * is a remote attacker-controlled path (and CVE-2022-3515's home). Iterated
      4  * ksba_crl_parse pulls each revoked entry, then the accessors drive the rest.
      5  */
      6 #include "harness.h"
      7 
      8 static int fuzz_one(const uint8_t *data, size_t size)
      9 {
     10     ksba_reader_t reader;
     11     ksba_crl_t crl;
     12     ksba_stop_reason_t sr = KSBA_SR_RUNNING;
     13     int guard = 0;
     14 
     15     if (ksba_reader_new(&reader))
     16         return 0;
     17     if (ksba_reader_set_mem(reader, data, size)) {
     18         ksba_reader_release(reader);
     19         return 0;
     20     }
     21     if (ksba_crl_new(&crl)) {
     22         ksba_reader_release(reader);
     23         return 0;
     24     }
     25     ksba_crl_set_reader(crl, reader);
     26 
     27     do {
     28         if (ksba_crl_parse(crl, &sr))
     29             break;
     30         if (sr == KSBA_SR_GOT_ITEM) {
     31             ksba_sexp_t serial = NULL;
     32             ksba_isotime_t rdate;
     33             ksba_crl_reason_t reason;
     34             if (!ksba_crl_get_item(crl, &serial, rdate, &reason))
     35                 ksba_free(serial);
     36         }
     37     } while (sr != KSBA_SR_READY && ++guard < 100000);
     38 
     39     {
     40         char *issuer = NULL;
     41         ksba_isotime_t this_update, next_update;
     42         ksba_sexp_t number = NULL, kid = NULL, ser = NULL;
     43         ksba_name_t nm = NULL;
     44         int i;
     45 
     46         if (!ksba_crl_get_issuer(crl, &issuer))
     47             ksba_free(issuer);
     48         (void)ksba_crl_get_digest_algo(crl);             /* const, do not free */
     49         ksba_crl_get_update_times(crl, this_update, next_update);
     50         ksba_free(ksba_crl_get_sig_val(crl));
     51         if (!ksba_crl_get_crl_number(crl, &number))
     52             ksba_free(number);
     53         if (!ksba_crl_get_auth_key_id(crl, &kid, &nm, &ser)) {
     54             ksba_free(kid);
     55             ksba_free(ser);
     56             drain_name(nm);
     57         }
     58         for (i = 0; i < KSBA_FUZZ_MAXITER; i++) {
     59             const char *oid;
     60             const unsigned char *der;
     61             size_t derlen;
     62             int crit;
     63             if (ksba_crl_get_extension(crl, i, &oid, &crit, &der, &derlen))
     64                 break;
     65         }
     66     }
     67 
     68     ksba_crl_release(crl);
     69     ksba_reader_release(reader);
     70     return 0;
     71 }