{"id":29240,"date":"2026-06-24T23:38:52","date_gmt":"2026-06-24T21:38:52","guid":{"rendered":"https:\/\/daniel.haxx.se\/blog\/?p=29240"},"modified":"2026-06-24T23:44:56","modified_gmt":"2026-06-24T21:44:56","slug":"a-cve-dispute","status":"publish","type":"post","link":"https:\/\/daniel.haxx.se\/blog\/2026\/06\/24\/a-cve-dispute\/","title":{"rendered":"a CVE dispute"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A few years years ago the curl project signed up and <a href=\"https:\/\/daniel.haxx.se\/blog\/2024\/01\/16\/curl-is-a-cna\/\" data-type=\"post\" data-id=\"23736\">became a CNA<\/a>. This means that we are masters of and can allocate our own CVE identifiers. For any security problems within our territory, it is we who decides if the issue should get a CVE or not. No more <a href=\"https:\/\/daniel.haxx.se\/blog\/2023\/09\/05\/bogus-cve-follow-ups\/\" data-type=\"post\" data-id=\"22993\">bogus CVEs<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">57 CVEs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">During these years we have published <em>fifty-seven<\/em> separate <a href=\"https:\/\/curl.se\/docs\/security.html\">security vulnerabilities<\/a> with their associated CVE identifiers. Getting a CVE for an issue is easy and really quickly done when you are a CNA. No hassle, no friction and as we are a small and lean security team it just works as smoothly as you could ask. Just an API call and we have new number.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Being a CNA is low maintenance, as there really is nothing extra we need to do. We already had an established and proven <a href=\"https:\/\/curl.se\/dev\/vuln-disclosure.html\">process for receiving, managing and assessing vulnerability reports<\/a> before we became a CNA since we are a responsible and well-run Open Source project. Becoming a CNA just made the process easier as we now don&#8217;t need to involve any outsider at all.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Assess<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For every report we work hard to first assess and decide if the issue is actually a vulnerability or a security problem at all.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If we deem that there is a security problem in there, we then grade it into LOW, MEDIUM, HIGH or CRITICAL. Since we don&#8217;t know how users use curl or libcurl we cannot take that into account but rather observe and set a severity of the problem from a pure curl point of view.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s a rough indication how we see the problem but of course every user that actually are affected by the problem might rate it differently.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Lower than LOW<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For a rare few issues we can <em>imagine<\/em> that there could be a minuscule risk but because of the set of extreme requirements and convoluted steps to get there, we deem the risk so small that in practice no user is <em>likely<\/em> to ever reach it. Internally we tend to call that an issue with a  severity level lower than LOW. Issues we believe we serve humanity better by <em>not<\/em> issuing a CVE for. To avoid the security dance when it seems unnecessary.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The cost of a CVE<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">libcurl is installed in somewhere around <em>thirty billion instances<\/em> on the globe. If we imagine that at least a sizeable portion of those installs are managed by people who want to make sure they use a secure version, it means that every CVE we publish trigger activities in many security teams all over the world, leading to a significant number of patches and subsequent software updates.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Every CVE thus has this huge cost tied to it. A cost that does not land on us and we don&#8217;t really see or feel it, but a cost on the ecosystem I believe we should not ignore. We should act responsibly. Never ignore real problems of course, but also to make sure we don&#8217;t ring the alarm for theoretical problems that will not trigger any vulnerability.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The dispute<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Our first ever CVE dispute since we became a CNA reached us on February 10th, 2026 for a report submitted to us two months earlier. The reporter thinks we should have assigned <a href=\"https:\/\/hackerone.com\/reports\/3455037\">their reported problem<\/a> a CVE but we think not. Now they want to force the issue to get a CVE anyway, by escalating the situation to MITRE.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Yes, it makes you wonder <em>why<\/em> it is that important to have this as a CVE, but I will avoid speculations for now.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I replied to MITRE explaining that we considered and debated the issue and we remain happy with our previous decision. I linked them the original report and discussion to show them.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Hostname with a leading dot<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The issue is quite technical (of course) but is based on a bug in curl&#8217;s function that checks if the used hostname matches a wildcard provided in a certificate.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First: the user must use a hostname in a URL with a <em>leading<\/em> dot, like <code>https:\/\/.example.com\/<\/code> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This name is not possible to use with DNS (it is an illegal name there), but you can provide an IP address for it in your <code>\/etc\/hosts<\/code> file or similar, but still this condition is already making this issue really niche.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Why would a user ever do this? Well, there <em>could<\/em> be a redirect to such a host name from a malicious server if the application allows redirects but getting the address for the host is still a challenge and mostly requires a local attacker present add that.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then: if curl can find an address for the illegal DNS hostname, the site curl connects to, also needs to have a wildcard certificate for the name <code>*.example.com<\/code> where the tail of the wildcard needs to match the name in the URL.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If curl was built to use an OpenSSL flavor or Schannel for TLS (remember that curl supports many different TLS backends), it then calls the <code>Curl_cert_hostcheck()<\/code> function to check if the wildcard covers the used hostname.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>This function had a bug<\/strong>. The above mention combination then erroneously would return TRUE. A match. When in reality it is not a match according to the spec.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We fixed this problem on <a href=\"https:\/\/github.com\/curl\/curl\/commit\/2535c4298fede065c80b9255328c18b68d739522\">December 8, 2025<\/a>, and we added unit tests for exactly this scenario to make sure that the problem doesn&#8217;t come back. For all security issues at several below HIGH, we fix them asap so that was just our normal procedure. We then continued to discuss if this was worthy of a CVE or not.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Lower than LOW<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">It should be <em>extremely rare<\/em> that anyone uses a dot prefixed name, unless you are in an internal and controlled environment where you use something else than DNS for resolving.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It is not possible to trick an application to use a dot prefixed arbitrary name as it will fail to resolve.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The explicitly set, weirdly dot prefixed name, then needs to connect to a host that has a wildcard set for that same name and an attacker manage to run this impostor host and can now serve the application malicious data because curl did not properly reject the connection because of the wildcard mismatch.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A series of highly unlikely conditions that all need to be fulfilled for this to become a vulnerability. A lower than LOW situation. Too unlikely; no CVE.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Again in May<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On May 28, we were <em>again<\/em> contacted by MITRE <em>in the  same case,<\/em> asking again for our rationale for not giving this issue a CVE.  We responded with virtually the same wording as before and linking again to the same original Hackerone issue and discussion thread. It&#8217;s all public information really.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Again in June<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On June 15, we were <em>again<\/em> contacted by MITRE asking for the reasoning behind our decision to not give a CVE for this issue.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We replied with similar wording again. Linking to the same issue, again.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This seems like a <em>great<\/em> system.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Verdict<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On June 24 we finally got the verdict. It is not considered a security vulnerability.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Hello Yuhao,<br><br>Thank you for your participation in the CVE dispute process regarding the reported issue affecting<br>curl through 8.17.0.<br><br>The MITRE TL-Root has completed its review of the information provided by all parties involved,<br>including the materials submitted by you and the response from the responsible CNA. Based on this<br>review, the MITRE TL-Root has determined that a CVE ID will not be assigned for the reported issue.<br><br>CNA Determination (Summary):<br><br>\"This is a bug, now fixed in the master branch. It is not considered a security vulnerability<br>because of how it requires a local attacker with privileges present to make it so.\"<br><br>After evaluating the available evidence and the CNA\u2019s assessment, the MITRE TL-Root agrees with this<br>determination and considers the matter resolved. As the adjudicating authority in this dispute<br>process, the decision of the MITRE TL-Root represents the final determination for this case.<br><br>We appreciate your engagement with the CVE Program and your efforts to responsibly report and<br>coordinate security issues.<br><br>Respectfully,<br><br>MITRE TL-Root<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>A few years years ago the curl project signed up and became a CNA. This means that we are masters of and can allocate our own CVE identifiers. For any security problems within our territory, it is we who decides if the issue should get a CVE or not. No more bogus CVEs. 57 CVEs &hellip; <a href=\"https:\/\/daniel.haxx.se\/blog\/2026\/06\/24\/a-cve-dispute\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">a CVE dispute<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":5,"featured_media":28247,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,133],"tags":[33,518,428],"class_list":["post-29240","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-curl","category-security","tag-curl-and-libcurl","tag-cve","tag-security"],"_links":{"self":[{"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/posts\/29240","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/comments?post=29240"}],"version-history":[{"count":46,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/posts\/29240\/revisions"}],"predecessor-version":[{"id":30312,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/posts\/29240\/revisions\/30312"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/media\/28247"}],"wp:attachment":[{"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/media?parent=29240"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/categories?post=29240"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/tags?post=29240"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}