Skip to content

Add signed-length validation to d2i, PEM, and buffer-load APIs#10207

Draft
ColtonWilley wants to merge 2 commits intowolfSSL:masterfrom
ColtonWilley:d2i_pem_negative_length
Draft

Add signed-length validation to d2i, PEM, and buffer-load APIs#10207
ColtonWilley wants to merge 2 commits intowolfSSL:masterfrom
ColtonWilley:d2i_pem_negative_length

Conversation

@ColtonWilley
Copy link
Copy Markdown
Contributor

@ColtonWilley ColtonWilley commented Apr 13, 2026

Internal security review found that ~25 public API entry points accept signed
length parameters (long/int) and cast them to word32 or size_t without rejecting
negative values first. A negative length wraps to a huge unsigned value, giving
ASN.1 parsers and memcpy calls a bogus bound.

Three main areas fixed:

  • d2i_* OpenSSL compat wrappers (ECDSA_SIG, RSA, X509, OCSP, etc.) — add
    len <= 0 guards before the (word32) casts
  • ProcessBuffer and PemToDer shared sinks — one guard each closes ~20 buffer-load
    entry points and all PEM conversion paths respectively
  • Certgen helpers (wc_SetIssuerBuffer, wc_SetSubjectBuffer, etc.) — reject
    negative derSz before forwarding to wc_SetCert_LoadDer

Also fixes an integer overflow in wolfSSL_ASN1_STRING_set where sz == INT_MAX
caused sz + 1 to wrap, bypassing the buffer size check.

8 locations were audited and confirmed already safe (existing guards catch
negatives). Those are left unchanged.

Still needs additional testing, PR up early for duplicate detection on vulnerability reports.

@ColtonWilley ColtonWilley marked this pull request as draft April 13, 2026 21:58
…er loaders

Reject negative signed lengths before they are cast to unsigned (word32/size_t),
preventing heap buffer over-reads and oversized allocations. Covers d2i_* OpenSSL
compat wrappers, ProcessBuffer, PemToDer, certgen helpers, and CRL buffer paths.
Add `*pp == NULL` checks to three d2i wrappers to prevent NULL deref
on public OpenSSL-compat APIs:
- d2i_evp_pkey (reachable via wolfSSL_d2i_PublicKey/PrivateKey)
- wolfSSL_d2i_OCSP_RESPONSE
- wolfSSL_d2i_ECDSA_SIG (template-ASN crash)

Also add regression tests for the existing PR fixes: ProcessBuffer
negative-size, PemToDer family negative-pemSz, GetCRLInfo negative-sz,
and wc_Set*Buffer derSz<0.
@ColtonWilley ColtonWilley force-pushed the d2i_pem_negative_length branch from 8771059 to 671876b Compare May 5, 2026 19:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant