tldr: Apple thinks it is fine. I do not.
On December 28 2023, [1]bugreport 12604 was filed in the curl issue
tracker. We get a lot issues filed most days so this fact alone was
hardly anything out of the ordinary. We read the reports, investigate,
ask follow-up questions to see what we can learn and what we need to
address.
The title stated of the problem in this case was quite clear: [2]flag
–cacert behavior isn’t consistent between macOS and Linux, and it was
filed by Yuedong Wu.
The friendly reporter showed how the curl version bundled with macOS
behaves differently than curl binaries built entirely from open source.
Even when running the same curl version on the same macOS machine.
The curl command line option [3]--cacert provides a way for the user to
say to curl that this is the exact set of CA certificates to trust when
doing the following transfer. If the TLS server cannot provide a
certificate that can be verified with that set of certificates, it
should fail and return error.
This particular behavior and functionality in curl has been established
since many years (this option was added to curl in December 2000) and
of course is provided to allow users to know that it communicates with
a known and trusted server. A pretty fundamental part of what TLS does
really.
When this command line option is used with curl on macOS, the version
shipped by Apple, it seems to fall back and checks the system CA store
in case the provided set of CA certs fail the verification. A secondary
check that was not asked for, is not documented and plain frankly comes
completely by surprise. Therefore, when a user runs the check with a
trimmed and dedicated CA cert file, it will not fail if the system CA
store contains a cert that can verify the server!
This is a security problem because now suddenly certificate checks pass
that should not pass.
I reported this as a security problem in an email sent to Product
Security at Apple on December 29 2023, 08:30 UTC. It’s not a major
problem, but it is an issue.
Apple’s says it is fine
On March 8, 2024 Apple Product Security responded with their wisdom:
Hello,
Thank you again for reporting this to us and allowing us time to investigate.
Apple’s version of OpenSSL (LibreSSL) intentionally uses the built-in system tru
st store as a default source of trust. Because the server certificate can be val
idated successfully using the built-in system trust store, we don't consider thi
s something that needs to be addressed in our platforms.
Best regards,
KC
Apple Product Security
Case closed.
I disagree
Obviously I think differently. This undocumented feature makes CA cert
verification with curl on macOS totally unreliable and inconsistent
with documentation. It tricks users.
Be aware.
Since this is not a security vulnerability in the curl version we ship,
we have not issued a CVE or anything for this problem. The problem is
strictly speaking not even in curl code. It comes with the version of
LibreSSL that Apple ships and builds curl to use on their platforms.
References
1.
https://github.com/curl/curl/issues/12604
2.
https://github.com/curl/curl/issues/12604
3.
https://curl.se/docs/manpage.html#--cacert