On Wed, Mar 13, 2019 at 11:32:50PM +0100, Ingo Schwarze wrote:
> Hi Tom,
> 
> Tom Smyth wrote on Wed, Mar 13, 2019 at 08:32:20PM +0000:
> 
> > Just saw the following article and i was wondering if libressl
> > Might be affected by the bug also
> > Top bit being set to 0 always making an effective 63 bits rather than 64
> > bits
> 
> If i understand the article you quote correctly, is is about a minor
> bug in some CA softwares (i.e. softwares used to operate certificate
> authorities).  As far as i am aware, LibreSSL does *not* include any
> software that can be used to operate a certificate authority.
>
> The "openssl ca" subcommand of openssl(1) definitely does not count.
> The openssl(1) utility is a *testing tool* and must not be used for
> any kind of production purposes.
> 
> So i don't see how LibreSSL could possibly be affected.

ikectl(3) uses openssl(3) to generate and sign certificates.
 
> If you still think it might be, please consider stating more precisely
> which part of LibreSSL (i.e. which library function) you fear might
> be broken in precisely which way.
> 
> > https://www.theregister.co.uk/2019/03/13/tls_cert_revoke_ejbca_config/
> 
> My impression is that the most important sentence from that article is
> the following:
> 
>   While the serial number security issue is largely theoretical -
>   63 bits leaves plenty of space to fend off collision attacks,
>   even if it's not compliant with the spec [...]
> 
> That means this is unlikely to be a security issue in the first
> place but looks more like a minor bug where some software is
> gratutiosly violating a specification.  Sure, specifications should
> not be set aside without a good reason, and certainly not accidentally,
> and bugs ought to be fixed, but i fail to see any indication that
> this bug might be more important than other run-of-the-mill bugs.
> 
> Please take this with a grain of salt: while i did occasionally
> work on LibreSSL documentation in the past, my knowledge and
> experience in matters of cryptography and PKI is very limited.
> But i thought quick feedback might help to discourage people from
> panicking.

Serials are *supposed* to be unique, for (AFAIU) both cryptographic and
administrative reasons. The *original* expectation was that a CA would
maintain a monotonically increasing counter, either a simple counter as
maintained by the -CAserial option to openssl(3) or perhaps something
similar to the convention for DNS SOA serials (i.e. YYYMMDDnn...).

ikectl(3) appears to maintain a monotonic serial. It defines the environment
variable "$ENV::CASERIAL" when invoking openssl(3), which is a macro
expanded in /etc/ssl/ikeca.cnf and /etc/ssl/x509v3.cnf. It has the same
behavior as specifying -CAserial directly to openssl(3). See
usr.bin/openssl/ca.c line 892. The serial parameter specifies a stateful
file for storing the last serial used. See lines 946 and line 1086.

The EJBCA standard, however, instructs CAs to randomly generate a serial,
presumably because stateless solutions are easier to manage. They apparently
required only a 64-bit serial even though the PKIX standard (i.e. RFC 5280)
mandates,

  Certificate users MUST be able to handle serialNumber values up to 20
  octets.

Likely not a mere coincidence that SHA-1 hashes are 160 bits. And note that
in the parlance of ASN.1 DER, "20 octets" *includes* the sign bit.

So why would EJBCA only require 64 bits when serials not only should be
unique, but should be unpredictable? (Note a randomly generated 64-bit
identifier can be expected to repeat with 50% probability after only 2^32
iterations.) Again, probably not a coincidence that EJ stands for Enterprise
Java, and Java's largest native type is a *signed* 64-bit type. It's
therefore not the least bit surprising that some ECJBA-compliant software
generated a signed 64-bit ASN.1 INTEGER because it's a fair presumption that
the reason EJBCA only required 64 bits (as opposed to the obvious 128 bits
or 160 bits) was for the benefit of poorly written software that expected to
be able to convert the serial to a Java long. And if you're accomodating
poorly written software it's perfectly reasonable to ensure conversions to
the native type always result in a positive value.

The real issue here is that the EJBCA specification wasn't just a failure in
language precision, but was and remains entirely ill considered on this
score. If ASN.1 INTEGERs must now be 65 bits, it's a good bet that most if
not all software that expected to be able to convert a serial to a Java long
is broken. They haven't thought this through very well.

Should anything change in OpenBSD? It depends.

1.a) No, because ikectl is using stateful serial management, so questions of
serial length are irrelevant.

1.b) Yes, because stateful serial management can be brittle. Are people
backing up both their CA keys *and* serial files? A randomly generated 16-
or 20-octet serial has fewer moving parts and is thus more fail-safe.

2.a) No, because the original impetus for EJBCA to move to a 64-bit serial
(now 65-bit) was a demonstrated CA forgery when using MD5-based signatures:

  https://cabforum.org/pipermail/public/2016-June/007861.html
  
https://fahrplan.events.ccc.de/congress/2008/Fahrplan/attachments/1251_md5-collisions-1.0.pdf

But the default digest in /etc/ikeca.cnf is SHA256, so nothing to worry
about at the moment.

2.b) Yes, because maybe there are other problems around the corner. I don't
know off-hand if the PKIX SHA256 signature protocol is immune to
hypothetical length extension attacks. It's arguably better that the serial
be unpredictable and long. See point 1.b.

Reply via email to