From: | Jacob Champion <pchampion(at)vmware(dot)com> |
---|---|
To: | "daniel(at)yesql(dot)se" <daniel(at)yesql(dot)se>, "andres(at)anarazel(dot)de" <andres(at)anarazel(dot)de> |
Cc: | "pgsql-hackers(at)lists(dot)postgresql(dot)org" <pgsql-hackers(at)lists(dot)postgresql(dot)org>, "andrew(dot)dunstan(at)2ndquadrant(dot)com" <andrew(dot)dunstan(at)2ndquadrant(dot)com>, "thomas(dot)munro(at)gmail(dot)com" <thomas(dot)munro(at)gmail(dot)com>, "michael(at)paquier(dot)xyz" <michael(at)paquier(dot)xyz>, "sfrost(at)snowman(dot)net" <sfrost(at)snowman(dot)net> |
Subject: | Re: Support for NSS as a libpq TLS backend |
Date: | 2021-01-13 17:07:53 |
Message-ID: | 7d6a23a7e30540b486abc823f7ced7a93e1da1e8.camel@vmware.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On Tue, 2020-10-27 at 21:07 +0100, Daniel Gustafsson wrote:
> > On 20 Oct 2020, at 21:15, Andres Freund <andres(at)anarazel(dot)de> wrote:
> >
> > > +static SECStatus
> > > +pg_cert_auth_handler(void *arg, PRFileDesc * fd, PRBool checksig, PRBool isServer)
> > > +{
> > > + SECStatus status;
> > > + Port *port = (Port *) arg;
> > > + CERTCertificate *cert;
> > > + char *peer_cn;
> > > + int len;
> > > +
> > > + status = SSL_AuthCertificate(CERT_GetDefaultCertDB(), port->pr_fd, checksig, PR_TRUE);
> > > + if (status == SECSuccess)
> > > + {
> > > + cert = SSL_PeerCertificate(port->pr_fd);
> > > + len = strlen(cert->subjectName);
> > > + peer_cn = MemoryContextAllocZero(TopMemoryContext, len + 1);
> > > + if (strncmp(cert->subjectName, "CN=", 3) == 0)
> > > + strlcpy(peer_cn, cert->subjectName + strlen("CN="), len + 1);
> > > + else
> > > + strlcpy(peer_cn, cert->subjectName, len + 1);
> > > + CERT_DestroyCertificate(cert);
> > > +
> > > + port->peer_cn = peer_cn;
> > > + port->peer_cert_valid = true;
> >
> > Hm. We either should have something similar to
> >
> > /*
> > * Reject embedded NULLs in certificate common name to prevent
> > * attacks like CVE-2009-4034.
> > */
> > if (len != strlen(peer_cn))
> > {
> > ereport(COMMERROR,
> > (errcode(ERRCODE_PROTOCOL_VIOLATION),
> > errmsg("SSL certificate's common name contains embedded null")));
> > pfree(peer_cn);
> > return -1;
> > }
> > here, or a comment explaining why not.
>
> We should, but it's proving rather difficult as there is no equivalent API call
> to get the string as well as the expected length of it.
I'm going to try to tackle this part next. It looks like NSS uses RFC
4514 (or something like it) backslash-quoting, which this code either
needs to undo or bypass before performing a comparison.
--Jacob
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2021-01-13 17:23:27 | Re: pg_preadv() and pg_pwritev() |
Previous Message | Tom Lane | 2021-01-13 16:17:47 | Re: Yet another fast GiST build |