<?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>Ruby | FirewallSync</title><link>https://firewallsync.com/tags/ruby/</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>Fri, 30 Oct 2026 04:40:00 +0000</lastBuildDate><atom:link href="https://firewallsync.com/tags/ruby/index.xml" rel="self" type="application/rss+xml"/><item><title>GitLab CVE-2026-97229: Patch the Regex RCE, Then Hunt</title><link>https://firewallsync.com/posts/gitlab-cve-2026-97229-ci-regex-rce-patch-and-hunt/</link><guid>https://firewallsync.com/posts/gitlab-cve-2026-97229-ci-regex-rce-patch-and-hunt/</guid><pubDate>Fri, 30 Oct 2026 04:40:00 +0000</pubDate><dc:creator>John Marshall</dc:creator><category>Security Operations</category><description>CISA added GitLab CVE-2026-97229, an unauthenticated remote code execution bug in how GitLab compiles regular expressions from CI/CD configuration, to KEV on October 29 with a November 1 deadline. The 19.4.2 fix is not the end of it: a sibling bug, CVE-2026-110264, needs 19.4.3 or 19.5.1. Here are the versions that close all four related CVEs, a script to check yours, GitLab's detections, and what Ruby shops outside GitLab should check.</description><enclosure url="https://firewallsync.com/posts/gitlab-cve-2026-97229-ci-regex-rce-patch-and-hunt/cover_hu18432601525673025422.jpg" type="image/jpeg" length="0"/><media:content url="https://firewallsync.com/posts/gitlab-cve-2026-97229-ci-regex-rce-patch-and-hunt/cover_hu18432601525673025422.jpg" medium="image" type="image/jpeg" width="1200" height="630"/><content:encoded><![CDATA[<p><img src="https://firewallsync.com/posts/gitlab-cve-2026-97229-ci-regex-rce-patch-and-hunt/cover_hu18432601525673025422.jpg" alt="Black-and-white photo of rows of large valve wheels on pipes along an underground corridor, with ducting overhead and a metal grate walkway" width="1200" height="630"></p><p>CVE-2026-97229 is a remote code execution bug in self-managed GitLab Community and Enterprise Edition. GitLab&rsquo;s <a href="https://docs.gitlab.com/releases/patches/patch-release-gitlab-19-4-2-released/">19.4.2 patch release</a> says it &ldquo;could have allowed an unauthenticated user to execute arbitrary code on the GitLab server via a specially crafted regular expression in a CI/CD configuration, due to insufficient regular expression validation.&rdquo; GitLab scores it CVSS 3.1 10.0. CISA added it to the <a href="https://www.cisa.gov/known-exploited-vulnerabilities-catalog?field_cve=CVE-2026-97229">Known Exploited Vulnerabilities catalog</a> on October 29, 2026, with a due date of November 1.</p>
<p>If you run self-managed GitLab, do two things today: upgrade to the October 21 patch release for your branch (not just the October 12 one), and check for signs that someone got there first.</p>
<h2 id="what-is-affected-and-what-fixes-it">What is affected and what fixes it</h2>
<p>CVE-2026-97229 is one of four GitLab CVEs that trace back to bugs in Onigmo, the regular expression engine inside Ruby. GitLab fixed them in three patch releases between September and October. Ruby&rsquo;s own <a href="https://www.ruby-lang.org/en/news/2026/10/23/regexp-fixes-for-gitlab-cves/">advisory of October 23</a> ties them together.</p>
<table>
  <thead>
      <tr>
          <th>CVE</th>
          <th>GitLab&rsquo;s description</th>
          <th>Auth needed</th>
          <th>CVSS 3.1</th>
          <th>Affected (from the CVE record)</th>
          <th>First fixed</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>CVE-2026-89078</td>
          <td>Double free parsing a regex in CI/CD configuration</td>
          <td>Authenticated</td>
          <td>9.9</td>
          <td>19.2 before 19.2.7, 19.3 before 19.3.3, 19.4 before 19.4.1</td>
          <td>19.4.1, 19.3.3, 19.2.7</td>
      </tr>
      <tr>
          <td>CVE-2026-93577</td>
          <td>Integer overflow compiling a regex in CI/CD configuration</td>
          <td>Authenticated</td>
          <td>9.9</td>
          <td>Same as above</td>
          <td>19.4.1, 19.3.3, 19.2.7</td>
      </tr>
      <tr>
          <td><strong>CVE-2026-97229</strong></td>
          <td>Integer overflow, CI/CD regex compiler</td>
          <td><strong>Unauthenticated</strong></td>
          <td><strong>10.0</strong></td>
          <td>19.2 before 19.2.8, 19.3 before 19.3.5, 19.4 before 19.4.2</td>
          <td>19.4.2, 19.3.5, 19.2.8 (Oct 12)</td>
      </tr>
      <tr>
          <td>CVE-2026-110264</td>
          <td>Integer overflow compiling a regex</td>
          <td>Unauthenticated</td>
          <td>10.0</td>
          <td>7.0 before 18.11.13, 19.0 before 19.0.10, 19.1 before 19.1.9, 19.2 before 19.2.9, 19.3 before 19.3.6, 19.4 before 19.4.3, 19.5 before 19.5.1</td>
          <td>19.5.1, 19.4.3, 19.3.6, 19.2.9, 19.1.9, 19.0.10, 18.11.13 (Oct 21)</td>
      </tr>
  </tbody>
</table>
<p>Only CVE-2026-97229 is in KEV today. CISA&rsquo;s SSVC entries in the CVE records list Exploitation as &ldquo;active&rdquo; for CVE-2026-97229 and &ldquo;none&rdquo; for the other three, as of the dates CISA recorded them. CVE-2026-110264 is also unauthenticated and rated 10.0, and its range reaches back to GitLab 7.0, so treat it with the same urgency.</p>
<p><strong>Upgrade target:</strong> 19.5.1, 19.4.3, 19.3.6, 19.2.9, 19.1.9, 19.0.10 or 18.11.13, or anything later on the same branch. If you are on a branch older than 18.11, there is no backport; move to a supported branch. GitLab&rsquo;s <a href="https://docs.gitlab.com/releases/patches/patch-release-gitlab-19-5-1-released/">19.5.1 release post</a> lists no workaround, only &ldquo;upgrade to the latest version as soon as possible.&rdquo;</p>
<p>GitLab.com and GitLab Dedicated are already patched, according to both release posts. This is a self-managed problem.</p>
<h3 id="check-a-version-quickly">Check a version quickly</h3>
<p>The <a href="https://docs.gitlab.com/ee/api/version">Version API</a> returns the running version (<code>GET /api/v4/version</code> with a token). The script below compares a version string against the affected ranges in the four CVE records. We ran it with Python 3.13; the output shown is real.</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;Check a GitLab version against the four Onigmo regex CVEs.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">Fixed versions come from each CVE record&#39;s &#39;affected&#39; ranges (read 2026-10-30).&#34;&#34;&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> re<span style="color:#f92672">,</span> sys
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>FIXED <span style="color:#f92672">=</span> {  <span style="color:#75715e"># CVE -&gt; {(major, minor): first fixed patch}</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;CVE-2026-89078&#34;</span>:  {(<span style="color:#ae81ff">19</span>, <span style="color:#ae81ff">2</span>): <span style="color:#ae81ff">7</span>, (<span style="color:#ae81ff">19</span>, <span style="color:#ae81ff">3</span>): <span style="color:#ae81ff">3</span>, (<span style="color:#ae81ff">19</span>, <span style="color:#ae81ff">4</span>): <span style="color:#ae81ff">1</span>},
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;CVE-2026-93577&#34;</span>:  {(<span style="color:#ae81ff">19</span>, <span style="color:#ae81ff">2</span>): <span style="color:#ae81ff">7</span>, (<span style="color:#ae81ff">19</span>, <span style="color:#ae81ff">3</span>): <span style="color:#ae81ff">3</span>, (<span style="color:#ae81ff">19</span>, <span style="color:#ae81ff">4</span>): <span style="color:#ae81ff">1</span>},
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;CVE-2026-97229&#34;</span>:  {(<span style="color:#ae81ff">19</span>, <span style="color:#ae81ff">2</span>): <span style="color:#ae81ff">8</span>, (<span style="color:#ae81ff">19</span>, <span style="color:#ae81ff">3</span>): <span style="color:#ae81ff">5</span>, (<span style="color:#ae81ff">19</span>, <span style="color:#ae81ff">4</span>): <span style="color:#ae81ff">2</span>},
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;CVE-2026-110264&#34;</span>: {(<span style="color:#ae81ff">18</span>, <span style="color:#ae81ff">11</span>): <span style="color:#ae81ff">13</span>, (<span style="color:#ae81ff">19</span>, <span style="color:#ae81ff">0</span>): <span style="color:#ae81ff">10</span>, (<span style="color:#ae81ff">19</span>, <span style="color:#ae81ff">1</span>): <span style="color:#ae81ff">9</span>, (<span style="color:#ae81ff">19</span>, <span style="color:#ae81ff">2</span>): <span style="color:#ae81ff">9</span>,
</span></span><span style="display:flex;"><span>                        (<span style="color:#ae81ff">19</span>, <span style="color:#ae81ff">3</span>): <span style="color:#ae81ff">6</span>, (<span style="color:#ae81ff">19</span>, <span style="color:#ae81ff">4</span>): <span style="color:#ae81ff">3</span>, (<span style="color:#ae81ff">19</span>, <span style="color:#ae81ff">5</span>): <span style="color:#ae81ff">1</span>},
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>OLD_RANGE_START <span style="color:#f92672">=</span> {<span style="color:#e6db74">&#34;CVE-2026-110264&#34;</span>: (<span style="color:#ae81ff">7</span>, <span style="color:#ae81ff">0</span>)}  <span style="color:#75715e"># affected from 7.0, no fix before 18.11</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">check</span>(ver):
</span></span><span style="display:flex;"><span>    major, minor, patch <span style="color:#f92672">=</span> map(int, re<span style="color:#f92672">.</span><span style="color:#66d9ef">match</span>(<span style="color:#e6db74">r</span><span style="color:#e6db74">&#34;(\d+)\.(\d+)\.(\d+)&#34;</span>, ver)<span style="color:#f92672">.</span>groups())
</span></span><span style="display:flex;"><span>    branch, out <span style="color:#f92672">=</span> (major, minor), {}
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> cve, fixes <span style="color:#f92672">in</span> FIXED<span style="color:#f92672">.</span>items():
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> branch <span style="color:#f92672">in</span> fixes:
</span></span><span style="display:flex;"><span>            out[cve] <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;FIXED&#34;</span> <span style="color:#66d9ef">if</span> patch <span style="color:#f92672">&gt;=</span> fixes[branch] <span style="color:#66d9ef">else</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;VULNERABLE (fixed in </span><span style="color:#e6db74">{</span>major<span style="color:#e6db74">}</span><span style="color:#e6db74">.</span><span style="color:#e6db74">{</span>minor<span style="color:#e6db74">}</span><span style="color:#e6db74">.</span><span style="color:#e6db74">{</span>fixes[branch]<span style="color:#e6db74">}</span><span style="color:#e6db74">)&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">elif</span> branch <span style="color:#f92672">&gt;</span> max(fixes):
</span></span><span style="display:flex;"><span>            out[cve] <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;FIXED (newer branch)&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">elif</span> cve <span style="color:#f92672">in</span> OLD_RANGE_START <span style="color:#f92672">and</span> branch <span style="color:#f92672">&gt;=</span> OLD_RANGE_START[cve]:
</span></span><span style="display:flex;"><span>            out[cve] <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;VULNERABLE (no fix on this branch)&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>            out[cve] <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;not in affected range&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> out
</span></span><span style="display:flex;"><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">1</span>:]:
</span></span><span style="display:flex;"><span>    print(v)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> cve, status <span style="color:#f92672">in</span> check(v)<span style="color:#f92672">.</span>items():
</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">16</span><span style="color:#e6db74">}</span><span style="color:#e6db74"> </span><span style="color:#e6db74">{</span>status<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span></code></pre></div><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 check_gitlab_regex_cves.py 19.4.2-ee 18.9.4
</span></span><span style="display:flex;"><span>19.4.2-ee
</span></span><span style="display:flex;"><span>  CVE-2026-89078   FIXED
</span></span><span style="display:flex;"><span>  CVE-2026-93577   FIXED
</span></span><span style="display:flex;"><span>  CVE-2026-97229   FIXED
</span></span><span style="display:flex;"><span>  CVE-2026-110264  VULNERABLE (fixed in 19.4.3)
</span></span><span style="display:flex;"><span>18.9.4
</span></span><span style="display:flex;"><span>  CVE-2026-89078   not in affected range
</span></span><span style="display:flex;"><span>  CVE-2026-93577   not in affected range
</span></span><span style="display:flex;"><span>  CVE-2026-97229   not in affected range
</span></span><span style="display:flex;"><span>  CVE-2026-110264  VULNERABLE (no fix on this branch)
</span></span></code></pre></div><p>The first result is the trap: an instance patched promptly on October 12 for the CVE that is now in KEV is still exposed to the sibling bug.</p>
<h2 id="how-the-bug-works-as-far-as-the-sources-say">How the bug works, as far as the sources say</h2>
<p>GitLab lets users supply regular expressions in places such as CI/CD configuration and compiles them with Ruby. Ruby&rsquo;s advisory explains: &ldquo;GitLab compiles regular expressions supplied by its users, such as patterns in CI configuration, with <code>Regexp.new</code>. GitLab found that specially crafted patterns could corrupt memory while Ruby compiles them, and that this could be turned into remote code execution on GitLab servers.&rdquo;</p>
<p>The Ruby change behind CVE-2026-97229 (and CVE-2026-93577) is described as an &ldquo;Integer overflow in the size of a compiled pattern&rdquo;, fixed in <a href="https://github.com/ruby/ruby/pull/19020">ruby/ruby#19020</a>. GitLab patched the Ruby it ships rather than waiting for a Ruby release.</p>
<p>GitLab says the bug is reachable by an unauthenticated user &ldquo;under certain conditions&rdquo; and does not spell those conditions out. The names of GitLab&rsquo;s own detections (below) refer to the CI Lint feature and its GraphQL endpoint, which suggests where to look first, but that is our reading of the detection names, not a statement from GitLab. No public write-up of the exploitation we could find gives more detail; treat any blog that claims a precise attack path without citing GitLab or the reporter with caution.</p>
<h2 id="hunt-gitlabs-detections">Hunt: GitLab&rsquo;s detections</h2>
<p>The 19.4.2 release post lists six detections for self-managed instances, each linked to a write-up in GitLab&rsquo;s <a href="https://gitlab.com/gitlab-security-oss/tldr"><code>gitlab-security-oss/tldr</code> repository</a> under <code>Detections/platforms/GitLab/Vulnerability Detections/</code>:</p>
<table>
  <thead>
      <tr>
          <th>Detection name</th>
          <th>File</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Onigmo native worker crash</td>
          <td><code>onigmo_native_worker_crash.md</code></td>
      </tr>
      <tr>
          <td>Graphql cilint hostile regexp</td>
          <td><code>graphql_cilint_hostile_regexp.md</code></td>
      </tr>
      <tr>
          <td>ci regexp oversized non ascii path</td>
          <td><code>ci_regexp_oversized_non_ascii_path.md</code></td>
      </tr>
      <tr>
          <td>ci regexp guard rejection</td>
          <td><code>ci_regexp_guard_rejection.md</code></td>
      </tr>
      <tr>
          <td>ci lint workhorse worker crash</td>
          <td><code>ci_lint_workhorse_worker_crash.md</code></td>
      </tr>
      <tr>
          <td>ci lint scripted client error burst</td>
          <td><code>ci_lint_scripted_client_error_burst.md</code></td>
      </tr>
  </tbody>
</table>
<p>The 19.5.1 post adds two for CVE-2026-110264: &ldquo;Onigmo native worker crash&rdquo; and &ldquo;Org mode render error burst&rdquo;.</p>
<p>We have not reproduced these detections; use GitLab&rsquo;s files for the exact log sources and queries. Practical order of work:</p>
<ol>
<li><strong>Look back before the patch date.</strong> Run the detections over logs as far back as your retention allows, up to the moment you upgraded. Worker crashes in the regex engine are not normal background noise.</li>
<li><strong>Assume the GitLab host is a credential store.</strong> A GitLab server holds CI/CD variables, runner registration tokens, deploy keys, and access tokens. If you find hits, or you cannot rule exploitation out, rotate those secrets and review recent pipeline and runner activity. Our guide to <a href="/posts/how-to-detect-and-rotate-leaked-api-keys-before-attackers-use-them/">detecting and rotating leaked API keys</a> covers the rotation order.</li>
<li><strong>Check for persistence.</strong> Look for new admin users, personal access tokens you did not create, new SSH keys on admin accounts, and unexpected files or processes on the host.</li>
</ol>
<p>KEV marks this entry <code>forensicTriage: Yes</code>. Under CISA&rsquo;s BOD 26-04 that means federal agencies must collect forensic data, not just patch; our <a href="/posts/cisa-bod-26-04-explained-kev-deadlines-forensic-triage-and-what-private-teams-can-borrow/">BOD 26-04 explainer</a> covers what that involves and what private teams can borrow.</p>
<h2 id="if-you-run-ruby-but-not-gitlab">If you run Ruby but not GitLab</h2>
<p>Ruby released 4.0.9, 3.4.12 and 3.3.13 with fixes for all the underlying Onigmo bugs. Ruby&rsquo;s advisory is precise about who is affected:</p>
<blockquote>
<p>These bugs are reached only when an application compiles a regular expression from a string that an attacker controls, for example by passing it to <code>Regexp.new</code>, <code>Regexp.union</code> or <code>Regexp.compile</code>, or by interpolating it into a regexp literal such as <code>/#{input}/</code>. Applications that only use regular expressions written by their own developers are not affected.</p>
</blockquote>
<p>Two points in that advisory matter for anyone building search filters, routing rules or admin &ldquo;match by pattern&rdquo; features:</p>
<ul>
<li>&ldquo;<code>Regexp.timeout</code> does not protect against these bugs.&rdquo; Timeouts address ReDoS, not memory corruption during compilation.</li>
<li>&ldquo;Limiting the length of patterns does not reliably protect against them either, because some of them can be triggered by short patterns.&rdquo;</li>
</ul>
<p>Ruby has not requested its own CVE IDs, so scanners may not flag your Ruby runtime. A quick way to find candidates in a codebase (illustrative, not exhaustive):</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-bash" data-lang="bash"><span style="display:flex;"><span>grep -rnE <span style="color:#e6db74">&#39;Regexp\.(new|union|compile)\(|/[^/]*#\{&#39;</span> --include<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;*.rb&#39;</span> app lib
</span></span></code></pre></div><p>Review each hit for whether the pattern can come from a user. If it can, upgrade Ruby, and consider whether users need regexes at all: plain substring or glob matching is a much smaller attack surface.</p>
<h2 id="limits-of-this-article">Limits of this article</h2>
<ul>
<li>GitLab has not published the exact preconditions for unauthenticated exploitation, and we have not tested an exploit. The CI Lint connection above is inferred from detection names.</li>
<li>KEV listing tells you exploitation has happened, not how widely. We found no primary source for a count of exposed or compromised instances.</li>
<li>Version data comes from the CVE records as updated on 2026-10-30. If GitLab revises them, the records win over this page.</li>
</ul>
<p>For how to weigh a KEV entry against CVSS and EPSS in your own queue, see <a href="/posts/cvss-vs-epss-vs-kev-which-signal-should-decide-what-you-patch-first/">CVSS vs EPSS vs KEV</a>, and for reading the SSVC values quoted above, <a href="/posts/cisa-vulnrichment-how-to-read-ssvc-values-in-a-cve-record-and-turn-them-into-a-patch-decision/">our Vulnrichment guide</a>.</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>KEV addition 2026-10-29, due 2026-11-01, CWE-190, forensic triage &ldquo;Yes&rdquo;, ransomware use &ldquo;Unknown&rdquo;</td>
          <td><a href="https://github.com/cisagov/kev-data/blob/main/known_exploited_vulnerabilities.json">CISA KEV catalog (kev-data)</a></td>
          <td>Verified</td>
      </tr>
      <tr>
          <td>Description, CVSS 10.0 vector, affected ranges, fix versions, reporter credit</td>
          <td><a href="https://github.com/CVEProject/cvelistV5/blob/main/cves/2026/97xxx/CVE-2026-97229.json">CVE-2026-97229 record</a></td>
          <td>Verified</td>
      </tr>
      <tr>
          <td>SSVC Exploitation &ldquo;active&rdquo; for CVE-2026-97229; &ldquo;none&rdquo; for the other three</td>
          <td>CISA ADP entries in each CVE record (<a href="https://github.com/CVEProject/cvelistV5/blob/main/cves/2026/97xxx/CVE-2026-97229.json">97229</a>, <a href="https://github.com/CVEProject/cvelistV5/blob/main/cves/2026/110xxx/CVE-2026-110264.json">110264</a>)</td>
          <td>Verified (as of CISA&rsquo;s timestamps)</td>
      </tr>
      <tr>
          <td>Release date October 12, 2026; GitLab.com and Dedicated already patched; six detections</td>
          <td><a href="https://docs.gitlab.com/releases/patches/patch-release-gitlab-19-4-2-released/">GitLab 19.4.2 patch release</a></td>
          <td>Verified</td>
      </tr>
      <tr>
          <td>CVE-2026-110264 range from 7.0; fix versions; release October 21, 2026; two detections</td>
          <td><a href="https://docs.gitlab.com/releases/patches/patch-release-gitlab-19-5-1-released/">GitLab 19.5.1 patch release</a> and <a href="https://github.com/CVEProject/cvelistV5/blob/main/cves/2026/110xxx/CVE-2026-110264.json">CVE record</a></td>
          <td>Verified</td>
      </tr>
      <tr>
          <td>CVE-2026-89078 and CVE-2026-93577 authenticated, 9.9, ranges</td>
          <td><a href="https://github.com/CVEProject/cvelistV5/blob/main/cves/2026/89xxx/CVE-2026-89078.json">CVE-2026-89078</a>, <a href="https://github.com/CVEProject/cvelistV5/blob/main/cves/2026/93xxx/CVE-2026-93577.json">CVE-2026-93577</a></td>
          <td>Verified</td>
      </tr>
      <tr>
          <td>Onigmo root cause, Ruby fix versions, who is affected, Regexp.timeout does not help</td>
          <td><a href="https://www.ruby-lang.org/en/news/2026/10/23/regexp-fixes-for-gitlab-cves/">Ruby advisory, 2026-10-23</a></td>
          <td>Verified</td>
      </tr>
      <tr>
          <td>Unauthenticated path involves CI Lint</td>
          <td>Inferred from GitLab detection names</td>
          <td>Qualified (our interpretation)</td>
      </tr>
  </tbody>
</table>
]]></content:encoded></item></channel></rss>