<?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>Atlassian | FirewallSync</title><link>https://firewallsync.com/tags/atlassian/</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, 23 Oct 2026 04:30:00 +0000</lastBuildDate><atom:link href="https://firewallsync.com/tags/atlassian/index.xml" rel="self" type="application/rss+xml"/><item><title>Atlassian CVE-2026-21589 File Read: Patch and Hunt</title><link>https://firewallsync.com/posts/atlassian-cve-2026-21589-data-center-file-read-patch-and-hunt/</link><guid>https://firewallsync.com/posts/atlassian-cve-2026-21589-data-center-file-read-patch-and-hunt/</guid><pubDate>Fri, 23 Oct 2026 04:30:00 +0000</pubDate><dc:creator>John Marshall</dc:creator><category>Security Operations</category><description>CVE-2026-21589 lets an unauthenticated attacker read files inside the web root of eight Atlassian Data Center products, including Jira, Confluence and Bitbucket. CISA added it to KEV on October 15. Here are the fixed versions, the interim mitigations, how to search access logs, and which secrets to rotate if a read succeeded.</description><enclosure url="https://firewallsync.com/posts/atlassian-cve-2026-21589-data-center-file-read-patch-and-hunt/cover_hu8381364802700144461.jpg" type="image/jpeg" length="0"/><media:content url="https://firewallsync.com/posts/atlassian-cve-2026-21589-data-center-file-read-patch-and-hunt/cover_hu8381364802700144461.jpg" medium="image" type="image/jpeg" width="1200" height="630"/><content:encoded><![CDATA[<p><img src="https://firewallsync.com/posts/atlassian-cve-2026-21589-data-center-file-read-patch-and-hunt/cover_hu8381364802700144461.jpg" alt="Two worn white card-catalog cabinets with brass label holders and handles, several drawers pulled partly open" width="1200" height="630"></p><p>CVE-2026-21589 lets an unauthenticated attacker read files from the web root of self-managed Jira, Confluence, Bitbucket, Bamboo, Crowd, Crucible and Fisheye. If you run any of them, upgrade to a fixed release now, check your access logs back to early October, and rotate credentials stored in configuration files if a read may have succeeded. CISA added the flaw to its <a href="/posts/cisa-kev-json-feed-what-each-field-means-and-how-to-match-it-against-a-scanner-export/">Known Exploited Vulnerabilities catalog</a> on October 15, 2026.</p>
<p>Atlassian Cloud is not part of the job: Atlassian says it has already patched affected Cloud products.</p>
<h2 id="the-vulnerability">The vulnerability</h2>
<p>Atlassian&rsquo;s CVE record describes an arbitrary file access flaw (CWE-552, files or directories accessible to external parties) that &ldquo;allows an unauthenticated attacker to access specific files within the web application root directory.&rdquo; Atlassian scores it CVSS 4.0 <strong>9.3</strong>, vector <code>CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:H/SI:H/SA:H</code>.</p>
<p>Read that vector carefully (our <a href="/posts/how-to-read-a-cvss-v4-0-vector-string-metric-by-metric-with-real-cve-records/">CVSS v4.0 walkthrough</a> covers each metric). The vulnerable product loses confidentiality only (<code>VC:H</code>, <code>VI:N</code>, <code>VA:N</code>). The high scores for <em>subsequent</em> systems (<code>SC:H/SI:H/SA:H</code>) reflect what stolen files can unlock elsewhere: credentials in a configuration file are worth more than the file.</p>
<p>Two limits from the record matter for triage:</p>
<ul>
<li>The attacker needs the <strong>exact name and path</strong> of the file. The flaw &ldquo;does not allow attackers to enumerate or list directory contents.&rdquo;</li>
<li>Atlassian says &ldquo;in some configurations, there may be some sensitive files that make this highly severe.&rdquo; Whether a given instance is a nuisance or a breach depends on what sits in its web root.</li>
</ul>
<h3 id="root-cause-per-watchtowr">Root cause, per watchTowr</h3>
<p>watchTowr Labs diffed vulnerable and patched Jira, Confluence and Bitbucket builds and, as summarized by Rapid7, found a path traversal in Atlassian&rsquo;s web-resource handling where double-colon (<code>::</code>) sequences can act as path separators during request processing. In watchTowr&rsquo;s testing the attacker could not leave the Tomcat context but could read files throughout the web root, including the protected <code>WEB-INF/web.xml</code>.</p>
<p>The most serious example in the research is Crowd. In a Crowd deployment connected to Jira, reading <code>WEB-INF/classes/crowd.properties</code> exposed application credentials. watchTowr used them to create a user and add it to <code>jira-administrators</code>. Rapid7 notes that Crowd&rsquo;s IP allowlisting for applications can block that second step.</p>
<h2 id="timeline">Timeline</h2>
<table>
  <thead>
      <tr>
          <th>Date (2026)</th>
          <th>Event</th>
          <th>Source</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>October 5</td>
          <td>Atlassian publishes the advisory and fixed releases; CVE record published</td>
          <td>CVE record, Rapid7</td>
      </tr>
      <tr>
          <td>October 6</td>
          <td>watchTowr publishes its technical analysis and a checker script</td>
          <td>Rapid7, Help Net Security</td>
      </tr>
      <tr>
          <td>October 6</td>
          <td>Previdian reports exploitation attempts hitting its honeypots</td>
          <td>Help Net Security</td>
      </tr>
      <tr>
          <td>October 15</td>
          <td>CISA adds the CVE to KEV; CISA&rsquo;s SSVC entry records exploitation as active</td>
          <td>KEV catalog, CVE record (CISA ADP)</td>
      </tr>
      <tr>
          <td>October 18</td>
          <td>KEV due date for US federal civilian agencies</td>
          <td>KEV catalog</td>
      </tr>
  </tbody>
</table>
<p>Reports differ on what was published. Help Net Security says watchTowr built but did not publish an exploit and released a vulnerability checker. Rapid7 says file-read proof-of-concept scripts and a Nuclei template are publicly available. Either way, detailed root-cause analysis has been public since October 6, and you should assume working exploits exist.</p>
<p>CISA&rsquo;s SSVC values in the CVE record are Exploitation <strong>active</strong>, Automatable <strong>no</strong>, Technical Impact <strong>total</strong>. &ldquo;Automatable: no&rdquo; fits the need to know file paths per target; it is not a reason to wait. Our <a href="/posts/cisa-vulnrichment-how-to-read-ssvc-values-in-a-cve-record-and-turn-them-into-a-patch-decision/">Vulnrichment guide</a> explains how to read these fields.</p>
<h2 id="what-to-patch">What to patch</h2>
<p>Upgrade to one of these releases or later. Versions are from Atlassian&rsquo;s CVE record; Atlassian&rsquo;s Jira ticket says versions past end of life may also be affected, so an unsupported release needs a move to a fixed supported line, not a hunt for a patch.</p>
<table>
  <thead>
      <tr>
          <th>Product</th>
          <th>Fixed releases</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Jira Software Data Center</td>
          <td>9.12.40, 10.3.26, 11.3.12</td>
      </tr>
      <tr>
          <td>Jira Service Management Data Center</td>
          <td>5.12.40, 10.3.26, 11.3.12</td>
      </tr>
      <tr>
          <td>Confluence Data Center</td>
          <td>9.2.26, 10.2.19</td>
      </tr>
      <tr>
          <td>Bitbucket Data Center</td>
          <td>9.4.26, 10.2.8, 10.5.1</td>
      </tr>
      <tr>
          <td>Bamboo Data Center</td>
          <td>10.2.24, 12.1.12</td>
      </tr>
      <tr>
          <td>Crowd Data Center</td>
          <td>6.3.7, 7.0.3, 7.1.7, 7.2.4</td>
      </tr>
      <tr>
          <td>Crucible</td>
          <td>4.9.15</td>
      </tr>
      <tr>
          <td>Fisheye</td>
          <td>4.9.15</td>
      </tr>
  </tbody>
</table>
<p>Don&rsquo;t forget the quiet ones. Crowd and Bamboo often run on separate hosts owned by a different team, and Crowd is where the published credential-theft path lives.</p>
<h3 id="if-you-cannot-patch-today">If you cannot patch today</h3>
<p>Atlassian offers three interim mitigations, described in its per-product Jira tickets:</p>
<ol>
<li><strong>A WAF or reverse-proxy rule</strong> (all products) that blocks URLs where <code>..</code> sits next to <code>/</code>, <code>\</code> or <code>::</code>, including URL-encoded forms. Atlassian asks you to test that encoded variants are blocked.</li>
<li><strong>A Tomcat <code>RewriteValve</code></strong> (Confluence, Jira Software, Jira Service Management, Bamboo, Crowd): add <code>&lt;Valve className=&quot;org.apache.catalina.valves.rewrite.RewriteValve&quot; /&gt;</code> inside the application&rsquo;s <code>&lt;Context&gt;</code> in <code>conf/server.xml</code>, install Atlassian&rsquo;s <code>rewrite.config</code> under the application&rsquo;s <code>WEB-INF</code>, and restart each node in turn.</li>
<li><strong>A <code>urlrewrite.xml</code> rule</strong> for Bitbucket.</li>
</ol>
<p>Take the rule content from Atlassian&rsquo;s ticket for your product, not from a third-party blog. Atlassian is direct about the value: the mitigations are &ldquo;limited and not a replacement for patching.&rdquo; Where possible, remove unpatched instances from internet reach until they are upgraded.</p>
<h2 id="how-to-hunt">How to hunt</h2>
<p>Patching closes the hole; it does not tell you whether someone already read a file. Rapid7 recommends checking for compromise even after patching and describes a log search: decode each request line up to twice, then look for <code>..</code> directly next to <code>/</code>, <code>\</code> or <code>::</code>.</p>
<p>Here is a small implementation of that approach. It is <strong>our</strong> script, not Atlassian&rsquo;s published regex, and it will flag some benign requests. We ran it with Python 3 against a five-line synthetic log; the request paths in that test were made up to exercise the matcher and are not real exploit strings.</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;Flag access-log lines with &#39;..&#39; next to &#39;/&#39;, &#39;</span><span style="color:#ae81ff">\\</span><span style="color:#e6db74">&#39; or &#39;::&#39; after up to two
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">rounds of URL decoding. Illustrates the approach Rapid7 describes for
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">CVE-2026-21589; it is not Atlassian&#39;s published regex.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">Usage: python3 scan_access_log.py access_log.txt&#34;&#34;&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> re
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> sys
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> urllib.parse <span style="color:#f92672">import</span> unquote
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>PATTERN <span style="color:#f92672">=</span> re<span style="color:#f92672">.</span>compile(<span style="color:#e6db74">r</span><span style="color:#e6db74">&#34;(\.\.(/|</span><span style="color:#ae81ff">\\</span><span style="color:#e6db74">|::))|((/|</span><span style="color:#ae81ff">\\</span><span style="color:#e6db74">|::)\.\.)&#34;</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">suspicious</span>(line):
</span></span><span style="display:flex;"><span>    candidates <span style="color:#f92672">=</span> [line]
</span></span><span style="display:flex;"><span>    decoded <span style="color:#f92672">=</span> line
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> _ <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">2</span>):
</span></span><span style="display:flex;"><span>        decoded <span style="color:#f92672">=</span> unquote(decoded)
</span></span><span style="display:flex;"><span>        candidates<span style="color:#f92672">.</span>append(decoded)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> any(PATTERN<span style="color:#f92672">.</span>search(c) <span style="color:#66d9ef">for</span> c <span style="color:#f92672">in</span> candidates)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open(sys<span style="color:#f92672">.</span>argv[<span style="color:#ae81ff">1</span>], errors<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;replace&#34;</span>) <span style="color:#66d9ef">as</span> f:
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> n, line <span style="color:#f92672">in</span> enumerate(f, <span style="color:#ae81ff">1</span>):
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> suspicious(line):
</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>n<span style="color:#e6db74">}</span><span style="color:#e6db74">: </span><span style="color:#e6db74">{</span>line<span style="color:#f92672">.</span>rstrip()<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span></code></pre></div><p>On the synthetic log it flagged a raw <code>::..::</code> request, a double-encoded <code>%252e%252e%252f</code> request and an encoded backslash variant, and ignored a filename containing <code>report..final</code>.</p>
<p>When you triage hits:</p>
<ul>
<li><strong>Start from October 5.</strong> Scan back at least to the advisory date; extend further if your logs allow, because the CVE record lists every release before the fixes as affected.</li>
<li><strong>Look at the status code and size.</strong> A <code>200</code> with a body on a traversal-shaped request deserves more attention than a <code>404</code>.</li>
<li><strong>Check every node and the proxy.</strong> In a Data Center cluster each node has its own Tomcat access log; a WAF or load balancer in front may log what the nodes did not.</li>
<li><strong>Note what the path aimed at.</strong> Requests for <code>WEB-INF</code> paths, configuration files or <code>.properties</code> files tell you which secrets to rotate.</li>
</ul>
<h2 id="if-a-read-may-have-succeeded">If a read may have succeeded</h2>
<p>Treat any secret in a web-root file as exposed, then contain and rotate in this order:</p>
<ol>
<li><strong>Crowd application credentials</strong> from <code>crowd.properties</code>, and review Crowd&rsquo;s application IP allowlists.</li>
<li><strong>Recently created users and group changes</strong>, especially additions to <code>jira-administrators</code> or other admin groups since October 5.</li>
<li><strong>Database credentials, API tokens and integration secrets</strong> held in configuration files the requests could have reached.</li>
<li><strong>Downstream systems</strong> those credentials unlock: build agents behind Bamboo, repositories behind Bitbucket, SSO-linked applications behind Crowd.</li>
</ol>
<p>Rapid7&rsquo;s advice matches: contain first, then rotate exposed credentials and secrets. If you work to US federal timelines, this flaw also falls under <a href="/posts/cisa-bod-26-04-explained-kev-deadlines-forensic-triage-and-what-private-teams-can-borrow/">BOD 26-04&rsquo;s forensic triage requirements</a>, which the required action of every KEV entry added in October cites.</p>
<h2 id="limits-of-this-article">Limits of this article</h2>
<p>We have not tested the vulnerability or Atlassian&rsquo;s mitigations. The root-cause details come from watchTowr&rsquo;s research as reported by Rapid7 and Help Net Security; we did not reach watchTowr&rsquo;s original post or Atlassian&rsquo;s main advisory page during research, and rely on the CVE record and Atlassian&rsquo;s public Jira tickets for versions and mitigations. No public source we found names the files requested in observed attacks.</p>
<h2 id="sources-and-verification">Sources and verification</h2>
<table>
  <thead>
      <tr>
          <th>Important claim</th>
          <th>Source</th>
          <th>Verification</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Description, eight products, unauthenticated web-root file read, no enumeration, CWE-552, CVSS 4.0 9.3 and vector, fixed releases, published October 5</td>
          <td><a href="https://www.cve.org/CVERecord?id=CVE-2026-21589">CVE-2026-21589 record</a> (read via the cvelistV5 repository)</td>
          <td>Verified</td>
      </tr>
      <tr>
          <td>SSVC: Exploitation active, Automatable no, Technical Impact total</td>
          <td>CISA ADP container in the CVE record</td>
          <td>Verified</td>
      </tr>
      <tr>
          <td>KEV addition October 15, due date October 18, BOD 26-04 forensic triage wording</td>
          <td><a href="https://www.cisa.gov/known-exploited-vulnerabilities-catalog">CISA KEV catalog</a> (JSON feed, catalog version 2026.10.21)</td>
          <td>Verified</td>
      </tr>
      <tr>
          <td>Cloud already patched; WAF, RewriteValve and urlrewrite mitigations; &ldquo;limited and not a replacement for patching&rdquo;; EOL versions may be affected</td>
          <td><a href="https://jira.atlassian.com/browse/JRASERVER-79546">Atlassian JRASERVER-79546</a></td>
          <td>Verified</td>
      </tr>
      <tr>
          <td><code>::</code> traversal root cause; web-root reads; crowd.properties to jira-administrators path; log-search approach</td>
          <td><a href="https://www.rapid7.com/blog/post/etr-cve-2026-21589-critical-unauthenticated-arbitrary-file-access-in-atlassian-products/">Rapid7 analysis</a> summarizing watchTowr</td>
          <td>Qualified: secondary account of watchTowr research</td>
      </tr>
      <tr>
          <td>Exploitation attempts reported by Previdian on October 6; watchTowr released a checker, not an exploit</td>
          <td><a href="https://www.helpnetsecurity.com/?p=387226">Help Net Security</a></td>
          <td>Qualified: Rapid7 reports public file-read PoCs</td>
      </tr>
  </tbody>
</table>
]]></content:encoded></item></channel></rss>