check X509_NAME_get_text_by_NID return in credential name checks#1652
Open
aizu-m wants to merge 1 commit into
Open
check X509_NAME_get_text_by_NID return in credential name checks#1652aizu-m wants to merge 1 commit into
aizu-m wants to merge 1 commit into
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
X509_NAME_get_text_by_NID() returns -1 and leaves its output buffer untouched when the requested NID is absent. A certificate with no commonName (SAN-only, normal for modern certs) takes that path, and the openssl backend uses the buffer regardless:
Found while reading the trust path. cupsGetCredentialsTrust() (the https client certificate check reached from http.c) hands an untrusted server certificate to both cupsAreCredentialsValidForName() and cupsGetCredentialsInfo(), so for a CN-less certificate the name comparison and the "%s (issued by %s)" description both run on uninitialised name[256]/issuer[256]. The snprintf %s then scans past the 256-byte buffer into adjacent stack, so it is an out-of-bounds read and a stack disclosure, and the name check comes out depending on stack residue. With a self-signed no-CN certificate I could get cupsAreCredentialsValidForName() to return true for an unrelated hostname.
The gnutls backend already falls back to "unknown" for the missing-CN case. This checks the return value and does the same at each X509_NAME_get_text_by_NID call in the file.