<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Affected Versions | FirewallSync</title><link>https://firewallsync.com/tags/affected-versions/</link><description>Practical cybersecurity writing for engineering teams that ship fast.</description><language>en-us</language><image><url>https://firewallsync.com/icon-512.png</url><title>FirewallSync</title><link>https://firewallsync.com/</link></image><lastBuildDate>Sat, 07 Nov 2026 04:50:00 +0000</lastBuildDate><atom:link href="https://firewallsync.com/tags/affected-versions/index.xml" rel="self" type="application/rss+xml"/><item><title>Linux Kernel CVE Records: Read Stable-Branch Affected Ranges</title><link>https://firewallsync.com/posts/linux-kernel-cve-records-affected-versions-stable-branches/</link><guid>https://firewallsync.com/posts/linux-kernel-cve-records-affected-versions-stable-branches/</guid><pubDate>Sat, 07 Nov 2026 04:50:00 +0000</pubDate><dc:creator>Craig Leslie</dc:creator><category>AppSec &amp; APIs</category><description>Every Linux kernel CVE record carries two product entries: git commit ranges and kernel version ranges. We read all 7,987 kernel CNA records published in 2026 to show how the two fit together, where reading only one goes wrong (1,056 records), why the CPE block over-matches fixed kernels, and a tested Python checker for a kernel.org version.</description><enclosure url="https://firewallsync.com/posts/linux-kernel-cve-records-affected-versions-stable-branches/cover_hu12897958757966638349.jpg" type="image/jpeg" length="0"/><media:content url="https://firewallsync.com/posts/linux-kernel-cve-records-affected-versions-stable-branches/cover_hu12897958757966638349.jpg" medium="image" type="image/jpeg" width="1200" height="630"/><content:encoded><![CDATA[<p><img src="https://firewallsync.com/posts/linux-kernel-cve-records-affected-versions-stable-branches/cover_hu12897958757966638349.jpg" alt="A grove of leafless trees with dark, twisting trunks that split into many crossing branches above a pale yellow lawn" width="1200" height="630"></p><p>A Linux kernel CVE record answers &ldquo;is my kernel affected?&rdquo; in two places at once: a list of <strong>git commit ranges</strong> and a list of <strong>kernel version ranges</strong>, each in its own product entry with a different <code>defaultStatus</code>. Read the version entry from top to bottom, stop at the first match, and fall back to <code>affected</code> for anything unlisted. Then check the git entry too, because in about one record in eight it carries version ranges the other entry does not.</p>
<p>We read every record the Linux kernel CNA published in 2026 (7,987 records, January 21 to November 6) from the CVE Program&rsquo;s <a href="https://github.com/CVEProject/cvelistV5">cvelistV5</a> bulk export of November 7, 2026, and counted how they are built. This article covers the kernel-specific layout. For the general rules of <code>version</code>, <code>lessThan</code>, <code>lessThanOrEqual</code> and <code>defaultStatus</code> in any CVE record, see our <a href="/posts/cve-affected-versions-lessthan-defaultstatus-versiontype/">guide to CVE affected versions</a>.</p>
<h2 id="what-a-kernel-cve-record-contains">What a kernel CVE record contains</h2>
<p>The kernel&rsquo;s <a href="https://docs.kernel.org/process/cve.html">CVE process document</a> sets the ground rules. CVEs are assigned &ldquo;after a fix is available and applied to a stable kernel tree&rdquo;, and are tracked &ldquo;by the git commit id of the original fix&rdquo;. No CVEs are assigned for kernel versions that are not &ldquo;currently being actively supported by the Stable/LTS kernel team&rdquo;. And applicability is yours to decide: &ldquo;the applicability of any specific CVE is up to the user of Linux to determine, it is not up to the CVE assignment team.&rdquo;</p>
<p>That produces a very regular structure. Across the 7,987 records:</p>
<table>
  <thead>
      <tr>
          <th>Feature</th>
          <th>Records</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Exactly two entries in <code>affected</code>, both product &ldquo;Linux&rdquo;, vendor &ldquo;Linux&rdquo;</td>
          <td>7,987</td>
      </tr>
      <tr>
          <td><code>repo</code> set to the stable tree (<code>git.kernel.org/.../stable/linux.git</code>)</td>
          <td>7,987</td>
      </tr>
      <tr>
          <td><code>programFiles</code> listing the changed source files</td>
          <td>7,987</td>
      </tr>
      <tr>
          <td>A <code>cpeApplicability</code> block</td>
          <td>7,987</td>
      </tr>
      <tr>
          <td>Version entry starts with the introducing release, then <code>0</code> to it unaffected</td>
          <td>7,911</td>
      </tr>
      <tr>
          <td>Version entry ends with an <code>original_commit_for_fix</code> range to <code>*</code></td>
          <td>7,917</td>
      </tr>
      <tr>
          <td>CNA-supplied CVSS v3.1 metrics</td>
          <td>3,154</td>
      </tr>
  </tbody>
</table>
<p>Every record has the two entries. In 7,923 of them the order is the same: the git entry (<code>defaultStatus</code> unaffected) first, the version entry (<code>defaultStatus</code> affected) second. In the remaining 64, both entries have <code>defaultStatus</code> unaffected, so only explicitly listed versions are affected. The checker below handles both shapes because it evaluates every entry.</p>
<h2 id="entry-1-git-commit-ranges">Entry 1: git commit ranges</h2>
<p>The first product entry has <code>&quot;defaultStatus&quot;: &quot;unaffected&quot;</code> and a list of commit ranges. Here is CVE-2026-99190 (gpiolib, published October 28, 2026), trimmed to the version list:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#f92672">&#34;version&#34;</span>: <span style="color:#e6db74">&#34;d73d2a569e6212f58d89efc6e66ffbb2386a47b1&#34;</span>, <span style="color:#f92672">&#34;lessThan&#34;</span>: <span style="color:#e6db74">&#34;68a2cd5381b8d89dc80bd16dd9cc9ca2d5c25e7f&#34;</span>, <span style="color:#f92672">&#34;status&#34;</span>: <span style="color:#e6db74">&#34;affected&#34;</span>, <span style="color:#f92672">&#34;versionType&#34;</span>: <span style="color:#e6db74">&#34;git&#34;</span>}<span style="color:#960050;background-color:#1e0010">,</span>
</span></span><span style="display:flex;"><span>{<span style="color:#f92672">&#34;version&#34;</span>: <span style="color:#e6db74">&#34;9b407312755fd5db012413ca005f0f3a661db8dd&#34;</span>, <span style="color:#f92672">&#34;lessThan&#34;</span>: <span style="color:#e6db74">&#34;78189c0e35abbcdab3b8ab0b764d578c02900734&#34;</span>, <span style="color:#f92672">&#34;status&#34;</span>: <span style="color:#e6db74">&#34;affected&#34;</span>, <span style="color:#f92672">&#34;versionType&#34;</span>: <span style="color:#e6db74">&#34;git&#34;</span>}<span style="color:#960050;background-color:#1e0010">,</span>
</span></span><span style="display:flex;"><span>{<span style="color:#f92672">&#34;version&#34;</span>: <span style="color:#e6db74">&#34;9b407312755fd5db012413ca005f0f3a661db8dd&#34;</span>, <span style="color:#f92672">&#34;lessThan&#34;</span>: <span style="color:#e6db74">&#34;890c3bf08e0fc09eff788a6cfeded7d21b4d3e9d&#34;</span>, <span style="color:#f92672">&#34;status&#34;</span>: <span style="color:#e6db74">&#34;affected&#34;</span>, <span style="color:#f92672">&#34;versionType&#34;</span>: <span style="color:#e6db74">&#34;git&#34;</span>}<span style="color:#960050;background-color:#1e0010">,</span>
</span></span><span style="display:flex;"><span>{<span style="color:#f92672">&#34;version&#34;</span>: <span style="color:#e6db74">&#34;9b407312755fd5db012413ca005f0f3a661db8dd&#34;</span>, <span style="color:#f92672">&#34;lessThan&#34;</span>: <span style="color:#e6db74">&#34;c28846ca1ac6134881114d272314623c8433e372&#34;</span>, <span style="color:#f92672">&#34;status&#34;</span>: <span style="color:#e6db74">&#34;affected&#34;</span>, <span style="color:#f92672">&#34;versionType&#34;</span>: <span style="color:#e6db74">&#34;git&#34;</span>}<span style="color:#960050;background-color:#1e0010">,</span>
</span></span><span style="display:flex;"><span>{<span style="color:#f92672">&#34;version&#34;</span>: <span style="color:#e6db74">&#34;6.12.114&#34;</span>, <span style="color:#f92672">&#34;lessThan&#34;</span>: <span style="color:#e6db74">&#34;6.12.115&#34;</span>, <span style="color:#f92672">&#34;status&#34;</span>: <span style="color:#e6db74">&#34;affected&#34;</span>, <span style="color:#f92672">&#34;versionType&#34;</span>: <span style="color:#e6db74">&#34;semver&#34;</span>}
</span></span></code></pre></div><p>Each git range reads &ldquo;from the commit that introduced the bug, up to but not including a commit that fixed it&rdquo;. The fix commits are the same ones listed in the record&rsquo;s <code>references</code> as <code>git.kernel.org/stable/c/&lt;hash&gt;</code> links, one per branch that received the fix. The CVE schema says <code>repo</code> exists &ldquo;to resolve git hash version ranges&rdquo;, which is the point: comparing commits is not a string comparison. You need a kernel git checkout to ask whether your build contains the introducing commit and not the fix.</p>
<p>If you build kernels from source, this is the most precise data in the record. Most teams run a released version instead, which is what the second entry is for. But note the last line above: a kernel version range inside the git entry. We come back to it below.</p>
<h2 id="entry-2-kernel-version-ranges-first-match-wins">Entry 2: kernel version ranges, first match wins</h2>
<p>The second entry has <code>&quot;defaultStatus&quot;: &quot;affected&quot;</code>. For CVE-2026-99190 it is:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#f92672">&#34;version&#34;</span>: <span style="color:#e6db74">&#34;6.15&#34;</span>, <span style="color:#f92672">&#34;status&#34;</span>: <span style="color:#e6db74">&#34;affected&#34;</span>}<span style="color:#960050;background-color:#1e0010">,</span>
</span></span><span style="display:flex;"><span>{<span style="color:#f92672">&#34;version&#34;</span>: <span style="color:#e6db74">&#34;0&#34;</span>, <span style="color:#f92672">&#34;lessThan&#34;</span>: <span style="color:#e6db74">&#34;6.15&#34;</span>, <span style="color:#f92672">&#34;status&#34;</span>: <span style="color:#e6db74">&#34;unaffected&#34;</span>, <span style="color:#f92672">&#34;versionType&#34;</span>: <span style="color:#e6db74">&#34;semver&#34;</span>}<span style="color:#960050;background-color:#1e0010">,</span>
</span></span><span style="display:flex;"><span>{<span style="color:#f92672">&#34;version&#34;</span>: <span style="color:#e6db74">&#34;6.12.115&#34;</span>, <span style="color:#f92672">&#34;lessThanOrEqual&#34;</span>: <span style="color:#e6db74">&#34;6.12.*&#34;</span>, <span style="color:#f92672">&#34;status&#34;</span>: <span style="color:#e6db74">&#34;unaffected&#34;</span>, <span style="color:#f92672">&#34;versionType&#34;</span>: <span style="color:#e6db74">&#34;semver&#34;</span>}<span style="color:#960050;background-color:#1e0010">,</span>
</span></span><span style="display:flex;"><span>{<span style="color:#f92672">&#34;version&#34;</span>: <span style="color:#e6db74">&#34;6.18.59&#34;</span>, <span style="color:#f92672">&#34;lessThanOrEqual&#34;</span>: <span style="color:#e6db74">&#34;6.18.*&#34;</span>, <span style="color:#f92672">&#34;status&#34;</span>: <span style="color:#e6db74">&#34;unaffected&#34;</span>, <span style="color:#f92672">&#34;versionType&#34;</span>: <span style="color:#e6db74">&#34;semver&#34;</span>}<span style="color:#960050;background-color:#1e0010">,</span>
</span></span><span style="display:flex;"><span>{<span style="color:#f92672">&#34;version&#34;</span>: <span style="color:#e6db74">&#34;7.2.13&#34;</span>, <span style="color:#f92672">&#34;lessThanOrEqual&#34;</span>: <span style="color:#e6db74">&#34;7.2.*&#34;</span>, <span style="color:#f92672">&#34;status&#34;</span>: <span style="color:#e6db74">&#34;unaffected&#34;</span>, <span style="color:#f92672">&#34;versionType&#34;</span>: <span style="color:#e6db74">&#34;semver&#34;</span>}<span style="color:#960050;background-color:#1e0010">,</span>
</span></span><span style="display:flex;"><span>{<span style="color:#f92672">&#34;version&#34;</span>: <span style="color:#e6db74">&#34;7.3&#34;</span>, <span style="color:#f92672">&#34;lessThanOrEqual&#34;</span>: <span style="color:#e6db74">&#34;*&#34;</span>, <span style="color:#f92672">&#34;status&#34;</span>: <span style="color:#e6db74">&#34;unaffected&#34;</span>, <span style="color:#f92672">&#34;versionType&#34;</span>: <span style="color:#e6db74">&#34;original_commit_for_fix&#34;</span>}
</span></span></code></pre></div><p>The <a href="https://github.com/CVEProject/cve-schema/blob/main/schema/CVE_Record_Format.json">CVE schema</a> gives the rule: walk the list, return the status of the first entry that matches, and return <code>defaultStatus</code> if none do. Applied here:</p>
<ol>
<li><strong>6.15 is affected.</strong> A bare <code>version</code> with no range is an exact match. This is the release that introduced the bug.</li>
<li><strong>Anything before 6.15 is unaffected.</strong> <code>0</code> is the schema&rsquo;s convention for &ldquo;the earliest possible version&rdquo;.</li>
<li><strong>One unaffected range per fixed stable branch.</strong> <code>6.12.115</code> to <code>6.12.*</code> means 6.12.115 and every later 6.12 release. The schema says a trailing <code>*</code> means &ldquo;an arbitrarily large number in the version ordering&rdquo;, so <code>6.12.*</code> closes the range at the end of the 6.12 branch without touching 6.13.</li>
<li><strong>The mainline fix onward is unaffected.</strong> The <code>7.3 ... *</code> entry covers 7.3 and every later release.</li>
<li><strong>Everything else is affected.</strong> 6.18.58, any 6.19 kernel, or 7.2.12 matches no entry and takes <code>defaultStatus</code>.</li>
</ol>
<p>Point 5 is the reason the order and the default both matter. A branch that does not appear at all, such as 6.19 here, has no fix listed and falls through to affected. The kernel&rsquo;s <a href="https://kernel.org/releases.html">releases page</a> currently lists 6.18, 6.12, 6.6, 6.1, 5.15 and 5.10 as longterm branches. If your kernel sits on a branch that a record does not list, the record gives you no fixed version on that branch; the way out is moving to a branch that has one.</p>
<h3 id="the-original_commit_for_fix-type-is-not-defined">The <code>original_commit_for_fix</code> type is not defined</h3>
<p>The last entry&rsquo;s <code>versionType</code> is <code>original_commit_for_fix</code>. It is not among the schema&rsquo;s <code>versionType</code> examples (&ldquo;custom&rdquo;, &ldquo;git&rdquo;, &ldquo;maven&rdquo;, &ldquo;python&rdquo;, &ldquo;rpm&rdquo;, &ldquo;semver&rdquo;), and the kernel&rsquo;s CVE process document does not mention it. From the records, the value looks like the first mainline release containing the original fix, and every one we saw was a release number such as <code>7.3</code> or <code>7.4-rc1</code>. That is our reading of the data, not a published definition.</p>
<p>The practical effect: a parser that refuses unknown version types stops at this entry for every version not matched earlier, which in practice means &ldquo;unknown&rdquo; for any kernel above the newest fixed stable branch. Our <a href="/posts/cve-affected-versions-lessthan-defaultstatus-versiontype/">generic affected-versions guide</a> shows a strict evaluator doing exactly that on a kernel record. If you choose to compare it as a normal kernel version, which is what the checker below does, make that a documented decision.</p>
<h2 id="why-you-must-read-both-entries">Why you must read both entries</h2>
<p>The <code>6.12.114 lessThan 6.12.115</code> line in the git entry is the trap. In CVE-2026-99190, the bug arrived in mainline at 6.15, so the version entry says every 6.12 kernel is &ldquo;before 6.15&rdquo; and unaffected. But the git entry marks 6.12.114 as affected and the version entry lists a 6.12.115 fix. The commit ranges hint at why: the first range starts from a different commit (<code>d73d2a5...</code>) than the other three (<code>9b40731...</code>), consistent with the bug reaching 6.12 as a stable backport. Read only the version entry and 6.12.114 comes out clean.</p>
<p>This is not rare. In 1,084 of the 7,987 records, the first (git) entry also contains <code>semver</code> ranges. In <strong>1,056 records</strong> (3,136 ranges), at least one of those ranges marks a stable release affected that the version entry, evaluated alone, calls unaffected.</p>
<p>Running the checker below against the record:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>$ python3 kernel_affected.py CVE-2026-99190.json 6.12.113 6.12.114 6.18.58 6.18.59 6.19.10 7.3 6.12.114-1-amd64
</span></span><span style="display:flex;"><span>CVE-2026-99190 6.12.113: unaffected
</span></span><span style="display:flex;"><span>CVE-2026-99190 6.12.114: affected
</span></span><span style="display:flex;"><span>CVE-2026-99190 6.18.58: affected
</span></span><span style="display:flex;"><span>CVE-2026-99190 6.18.59: unaffected
</span></span><span style="display:flex;"><span>CVE-2026-99190 6.19.10: affected
</span></span><span style="display:flex;"><span>CVE-2026-99190 7.3: unaffected
</span></span><span style="display:flex;"><span>CVE-2026-99190 6.12.114-1-amd64: distribution kernel suffix; use your distro&#39;s tracker
</span></span></code></pre></div><p>(Per-entry lines trimmed; for 6.12.114 the checker reports entry[0] affected via the <code>6.12.114</code>-<code>6.12.115</code> range and entry[1] unaffected via <code>0</code>-<code>6.15</code>.)</p>
<h2 id="why-cpe-matching-over-flags-fixed-kernels">Why CPE matching over-flags fixed kernels</h2>
<p>Every 2026 kernel record also has a <code>cpeApplicability</code> block. For CVE-2026-100075, it is one OR node of eight ranges on <code>cpe:2.3:o:linux:linux_kernel</code>, each starting at 4.7 and ending before one fixed version: 5.10.270, 5.15.221, 6.1.188, 6.6.157, 6.12.110, 6.18.52, 7.2.6, and 7.3. OR&rsquo;d together, those ranges collapse to &ldquo;4.7 up to 7.3&rdquo;, so 5.10.300, a fixed 5.10 kernel, still matches the 7.3 range.</p>
<p>We checked this across the corpus. The version entries name 36,296 fixed stable releases (the start of each <code>X.Y.N</code> to <code>X.Y.*</code> unaffected range). The OR&rsquo;d CPE ranges in the same records match <strong>35,340 of them (97.4%) as vulnerable</strong>, in 7,917 records. CPE ranges have no way to say &ldquo;fixed on the 6.12 branch at 6.12.110&rdquo;; the affected block does. We covered this limit with one example in our <a href="/posts/cve-cpeapplicability-cpe-match-nodes-operators-version-ranges/">cpeApplicability guide</a>; the corpus count shows it is the norm for kernel records, not an edge case.</p>
<p>If your scanner or SBOM tool matches kernel CVEs by CPE and reports patched LTS kernels as vulnerable, this is the first thing to check.</p>
<h2 id="distribution-kernels-stop-here">Distribution kernels: stop here</h2>
<p>kernel.org is direct about this: &ldquo;If you see anything at all after the dash, you are running a distribution kernel&rdquo;, and &ldquo;kernel developers can provide no support for them&rdquo;. A RHEL, Ubuntu or Debian kernel version reflects the distribution&rsquo;s base plus its own backports, so <code>5.14.0-...</code> or <code>6.8.0-...</code> cannot be compared to the kernel.org ranges in a CVE record. The kernel&rsquo;s CVE document also says issues only present in a distribution&rsquo;s kernel get CVEs from that distribution, not from the kernel team.</p>
<p>For those kernels, use the distribution&rsquo;s security tracker or its VEX/CSAF data. Our <a href="/posts/vex-explained-what-a-not-affected-statement-means-and-how-to-read-one/">VEX explainer</a> covers how to read a &ldquo;not affected&rdquo; statement from a vendor.</p>
<h2 id="a-tested-checker-for-kernelorg-versions">A tested checker for kernel.org versions</h2>
<p>The script below implements the schema&rsquo;s first-match algorithm over <strong>both</strong> product entries, skips git commit ranges (they need a kernel checkout), and reports affected if either entry says so. It refuses versions with a distribution suffix. We ran it with Python 3.12 against CVE-2026-99190 (output above) and across all 7,987 2026 records to produce the counts in this article.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e">#!/usr/bin/env python3</span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">&#34;&#34;&#34;Evaluate a kernel.org version against a Linux kernel CNA record (CVE JSON 5).
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">usage: kernel_affected.py CVE-record.json VERSION [VERSION ...]&#34;&#34;&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> json<span style="color:#f92672">,</span> re<span style="color:#f92672">,</span> sys
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">key</span>(v):
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;&#34;&#34;Kernel version -&gt; comparable tuple. &#39;*&#39; sorts above any number; -rcN sorts before final.&#34;&#34;&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> v <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;*&#34;</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> ((float(<span style="color:#e6db74">&#34;inf&#34;</span>),),)
</span></span><span style="display:flex;"><span>    m <span style="color:#f92672">=</span> re<span style="color:#f92672">.</span>fullmatch(<span style="color:#e6db74">r</span><span style="color:#e6db74">&#34;(\d+(?:\.\d+)*)(?:\.(\*))?(?:-rc(\d+))?&#34;</span>, v)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> m:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">raise</span> <span style="color:#a6e22e">ValueError</span>(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;not a kernel.org version: </span><span style="color:#e6db74">{</span>v<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>    nums <span style="color:#f92672">=</span> tuple(int(p) <span style="color:#66d9ef">for</span> p <span style="color:#f92672">in</span> m<span style="color:#f92672">.</span>group(<span style="color:#ae81ff">1</span>)<span style="color:#f92672">.</span>split(<span style="color:#e6db74">&#34;.&#34;</span>))
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> m<span style="color:#f92672">.</span>group(<span style="color:#ae81ff">2</span>):                                   <span style="color:#75715e"># &#34;6.12.*&#34; -&gt; 6.12.&lt;infinity&gt;</span>
</span></span><span style="display:flex;"><span>        nums <span style="color:#f92672">+=</span> (float(<span style="color:#e6db74">&#34;inf&#34;</span>),)
</span></span><span style="display:flex;"><span>    rc <span style="color:#f92672">=</span> int(m<span style="color:#f92672">.</span>group(<span style="color:#ae81ff">3</span>)) <span style="color:#66d9ef">if</span> m<span style="color:#f92672">.</span>group(<span style="color:#ae81ff">3</span>) <span style="color:#66d9ef">else</span> float(<span style="color:#e6db74">&#34;inf&#34;</span>)  <span style="color:#75715e"># 7.4-rc1 &lt; 7.4</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> (nums <span style="color:#f92672">+</span> (<span style="color:#ae81ff">0</span>,) <span style="color:#f92672">*</span> (<span style="color:#ae81ff">4</span> <span style="color:#f92672">-</span> len(nums)), rc)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">status</span>(product, v):
</span></span><span style="display:flex;"><span>    k <span style="color:#f92672">=</span> key(v)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> e <span style="color:#f92672">in</span> product<span style="color:#f92672">.</span>get(<span style="color:#e6db74">&#34;versions&#34;</span>, []):
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> e<span style="color:#f92672">.</span>get(<span style="color:#e6db74">&#34;versionType&#34;</span>) <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;git&#34;</span>:
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">continue</span>                                 <span style="color:#75715e"># commit ranges need a kernel git checkout</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> <span style="color:#e6db74">&#34;lessThan&#34;</span> <span style="color:#f92672">not</span> <span style="color:#f92672">in</span> e <span style="color:#f92672">and</span> <span style="color:#e6db74">&#34;lessThanOrEqual&#34;</span> <span style="color:#f92672">not</span> <span style="color:#f92672">in</span> e:
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> key(e[<span style="color:#e6db74">&#34;version&#34;</span>]) <span style="color:#f92672">==</span> k:
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">return</span> e[<span style="color:#e6db74">&#34;status&#34;</span>], e
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">continue</span>
</span></span><span style="display:flex;"><span>        lo <span style="color:#f92672">=</span> key(e[<span style="color:#e6db74">&#34;version&#34;</span>])
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> <span style="color:#e6db74">&#34;lessThan&#34;</span> <span style="color:#f92672">in</span> e <span style="color:#f92672">and</span> lo <span style="color:#f92672">&lt;=</span> k <span style="color:#f92672">&lt;</span> key(e[<span style="color:#e6db74">&#34;lessThan&#34;</span>]):
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">return</span> e[<span style="color:#e6db74">&#34;status&#34;</span>], e
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> <span style="color:#e6db74">&#34;lessThanOrEqual&#34;</span> <span style="color:#f92672">in</span> e <span style="color:#f92672">and</span> lo <span style="color:#f92672">&lt;=</span> k <span style="color:#f92672">&lt;=</span> key(e[<span style="color:#e6db74">&#34;lessThanOrEqual&#34;</span>]):
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">return</span> e[<span style="color:#e6db74">&#34;status&#34;</span>], e
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> product<span style="color:#f92672">.</span>get(<span style="color:#e6db74">&#34;defaultStatus&#34;</span>, <span style="color:#e6db74">&#34;unknown&#34;</span>), <span style="color:#66d9ef">None</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>rec <span style="color:#f92672">=</span> json<span style="color:#f92672">.</span>load(open(sys<span style="color:#f92672">.</span>argv[<span style="color:#ae81ff">1</span>]))
</span></span><span style="display:flex;"><span>cve <span style="color:#f92672">=</span> rec[<span style="color:#e6db74">&#34;cveMetadata&#34;</span>][<span style="color:#e6db74">&#34;cveId&#34;</span>]
</span></span><span style="display:flex;"><span>prods <span style="color:#f92672">=</span> rec[<span style="color:#e6db74">&#34;containers&#34;</span>][<span style="color:#e6db74">&#34;cna&#34;</span>][<span style="color:#e6db74">&#34;affected&#34;</span>]       <span style="color:#75715e"># kernel records carry two product entries</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> v <span style="color:#f92672">in</span> sys<span style="color:#f92672">.</span>argv[<span style="color:#ae81ff">2</span>:]:
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> <span style="color:#e6db74">&#34;-&#34;</span> <span style="color:#f92672">in</span> v <span style="color:#f92672">and</span> <span style="color:#f92672">not</span> re<span style="color:#f92672">.</span>search(<span style="color:#e6db74">r</span><span style="color:#e6db74">&#34;-rc\d+$&#34;</span>, v):
</span></span><span style="display:flex;"><span>        print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>cve<span style="color:#e6db74">}</span><span style="color:#e6db74"> </span><span style="color:#e6db74">{</span>v<span style="color:#e6db74">}</span><span style="color:#e6db74">: distribution kernel suffix; use your distro&#39;s tracker&#34;</span>)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">continue</span>
</span></span><span style="display:flex;"><span>    verdicts <span style="color:#f92672">=</span> []
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> i, p <span style="color:#f92672">in</span> enumerate(prods):
</span></span><span style="display:flex;"><span>        s, e <span style="color:#f92672">=</span> status(p, v)
</span></span><span style="display:flex;"><span>        why <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;defaultStatus&#34;</span> <span style="color:#66d9ef">if</span> e <span style="color:#f92672">is</span> <span style="color:#66d9ef">None</span> <span style="color:#66d9ef">else</span> json<span style="color:#f92672">.</span>dumps({k: e[k] <span style="color:#66d9ef">for</span> k <span style="color:#f92672">in</span> e <span style="color:#66d9ef">if</span> k <span style="color:#f92672">!=</span> <span style="color:#e6db74">&#34;status&#34;</span>})
</span></span><span style="display:flex;"><span>        verdicts<span style="color:#f92672">.</span>append(s)
</span></span><span style="display:flex;"><span>        print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;  entry[</span><span style="color:#e6db74">{</span>i<span style="color:#e6db74">}</span><span style="color:#e6db74">] defaultStatus=</span><span style="color:#e6db74">{</span>p<span style="color:#f92672">.</span>get(<span style="color:#e6db74">&#39;defaultStatus&#39;</span>)<span style="color:#e6db74">}</span><span style="color:#e6db74">: </span><span style="color:#e6db74">{</span>s<span style="color:#e6db74">}</span><span style="color:#e6db74"> (matched </span><span style="color:#e6db74">{</span>why<span style="color:#e6db74">}</span><span style="color:#e6db74">)&#34;</span>)
</span></span><span style="display:flex;"><span>    final <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;affected&#34;</span> <span style="color:#66d9ef">if</span> <span style="color:#e6db74">&#34;affected&#34;</span> <span style="color:#f92672">in</span> verdicts <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;unaffected&#34;</span> <span style="color:#66d9ef">if</span> all(x <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;unaffected&#34;</span> <span style="color:#66d9ef">for</span> x <span style="color:#f92672">in</span> verdicts) <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;unknown&#34;</span>
</span></span><span style="display:flex;"><span>    print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>cve<span style="color:#e6db74">}</span><span style="color:#e6db74"> </span><span style="color:#e6db74">{</span>v<span style="color:#e6db74">}</span><span style="color:#e6db74">: </span><span style="color:#e6db74">{</span>final<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span></code></pre></div><p>Limits: it treats <code>original_commit_for_fix</code> as a kernel version comparison (see above), ignores git ranges, and only understands kernel.org version strings. It is a reference for reading the data, not a vulnerability scanner.</p>
<h2 id="turning-the-answer-into-a-decision">Turning the answer into a decision</h2>
<p>&ldquo;Affected&rdquo; in a kernel record means the code is in your build, not that it is reachable. The kernel team says plainly that &ldquo;large numbers of assigned CVEs are not relevant for their systems&rdquo;, and the <code>programFiles</code> list (here <code>drivers/gpio/gpiolib.c</code>) is a quick first filter against your kernel config. After that, the usual signals apply: is it in KEV, what does EPSS say, what is exposed. Our <a href="/posts/vulnerability-prioritization-workflow-cve-record-to-patch-ticket/">vulnerability prioritization workflow</a> walks through that decision from the CVE record to a ticket.</p>
<p>The kernel team&rsquo;s own advice is to take whole stable releases rather than cherry-pick: &ldquo;it is best to take all released kernel changes, as they are tested together in a unified whole&rdquo;. For most teams, staying on a current LTS point release answers more of these records than evaluating them one by one.</p>
<h2 id="limits-of-this-article">Limits of this article</h2>
<p>The counts cover Linux kernel CNA records with IDs CVE-2026-* in the PUBLISHED state, from the cvelistV5 export of November 7, 2026. The CNA updates records, so counts will drift. We did not check git ranges against a kernel tree, so the backport explanation for CVE-2026-99190 is an inference from the record. The meaning of <code>original_commit_for_fix</code> is our reading of the data, not a published definition.</p>
<h2 id="sources-and-verification">Sources and verification</h2>
<table>
  <thead>
      <tr>
          <th>Important claim</th>
          <th>Source</th>
          <th>Status</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Record counts, entry structure, 1,056 records / 3,136 ranges, 36,296 fixed releases and 35,340 CPE matches</td>
          <td><a href="https://github.com/CVEProject/cvelistV5">CVEProject/cvelistV5</a> bulk export 2026-11-07, computed with the script above</td>
          <td>Verified (computed)</td>
      </tr>
      <tr>
          <td>CVE-2026-99190 and CVE-2026-100075 affected and cpeApplicability data</td>
          <td><a href="https://github.com/CVEProject/cvelistV5">cvelistV5 records</a></td>
          <td>Verified</td>
      </tr>
      <tr>
          <td>First-match algorithm, <code>defaultStatus</code> fallback, <code>*</code> wildcard, <code>repo</code> for git ranges, <code>versionType</code> examples</td>
          <td><a href="https://github.com/CVEProject/cve-schema/blob/main/schema/CVE_Record_Format.json">CVE JSON schema</a></td>
          <td>Verified</td>
      </tr>
      <tr>
          <td>CVEs assigned after a fix reaches stable, tracked by original fix commit; only supported branches; applicability is the user&rsquo;s; take all stable changes</td>
          <td><a href="https://docs.kernel.org/process/cve.html">Linux kernel CVE process</a></td>
          <td>Verified</td>
      </tr>
      <tr>
          <td>Longterm branches; text after the dash means a distribution kernel</td>
          <td><a href="https://kernel.org/releases.html">kernel.org releases</a></td>
          <td>Verified, Nov 7, 2026</td>
      </tr>
      <tr>
          <td>Meaning of <code>original_commit_for_fix</code></td>
          <td>Record data only; no definition found</td>
          <td>Qualified</td>
      </tr>
  </tbody>
</table>
]]></content:encoded></item></channel></rss>