<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>CVE on ZX Cloud Security</title><link>https://zxcloudsecurity.co.uk/tags/cve/</link><description>Recent content in CVE on ZX Cloud Security</description><generator>Hugo</generator><language>en-GB</language><lastBuildDate>Thu, 18 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://zxcloudsecurity.co.uk/tags/cve/index.xml" rel="self" type="application/rss+xml"/><item><title>Recent Cloud Security CVEs: What Architects Need to Know in 2026</title><link>https://zxcloudsecurity.co.uk/guides/recent-cloud-security-cves/</link><pubDate>Thu, 18 Jun 2026 00:00:00 +0000</pubDate><guid>https://zxcloudsecurity.co.uk/guides/recent-cloud-security-cves/</guid><description>A practitioner&amp;#39;s guide to recent cloud security CVEs in 2026, covering active exploits, attacker infrastructure, detection tooling, and remediation playbooks.</description><content:encoded><![CDATA[<h1 id="recent-cloud-security-cves-a-practitioners-guide-for-2026">Recent Cloud Security CVEs: a practitioner&rsquo;s guide for 2026</h1>
<p>The signal-to-noise ratio around cloud CVEs has never been worse. Microsoft released 209 security patches on a single June 2026 Patch Tuesday, covering 24 product families and pushing the 2026 total beyond 500 CVEs. Meanwhile, the window between vulnerability disclosure and mass exploitation has collapsed from weeks to days. If your vulnerability management process still runs on a 30-day patch cycle with a change freeze in place, you are handing adversaries a standing head start. This guide focuses on what actually matters: the CVEs seeing active cloud exploitation right now, the attacker infrastructure behind them, the AWS and Azure detective controls that surface them fastest, and the operational mistakes that leave organisations perpetually behind.</p>
<hr>
<h2 id="the-2026-threat-landscape">The 2026 threat landscape</h2>
<p>Threat actors exploited third-party software vulnerabilities (44.5%) more frequently than weak credentials (27.2%) in observed cloud incidents, a significant increase from the start of 2025. That is not a marginal shift. It inverts the attack model that shaped cloud security doctrine for the past decade. Misconfig-hunting and credential-stuffing are still very much alive, but unpatched application-layer software is now the primary door in.</p>
<p>Identity compromise underpinned 83% of compromises. Attackers have moved away from traditional phishing toward voice-based social engineering and credential harvesting from third-party SaaS tokens, funding large-scale, silent data exfiltration.</p>
<p>The two trends reinforce each other. Attackers exploit a CVE to extract credentials from a workload. Those credentials then fund the identity-based lateral movement that makes the intrusion profitable. Data theft, executed through compromised but legitimate access channels, was the primary goal in 73% of cloud-related incidents.</p>
<p>For UK-regulated organisations, whether FCA-supervised firms, NHS Digital suppliers, or central government OFFICIAL-tier environments, the dwell-time problem is severe. A GDPR breach notification clock starts the moment personal data is at risk, not when you detect the incident. 45% of intrusions resulted in data theft without immediate extortion attempts, typically involving prolonged dwell and stealthy persistence.</p>
<!-- INTERNAL_LINK: cloud security shared responsibility model explained | cloud-shared-responsibility-model -->
<hr>
<h2 id="cve-2026-4020-the-gravity-smtp-credential-harvester-and-its-cloud-rented-army">CVE-2026-4020: the Gravity SMTP credential harvester and its cloud-rented army</h2>
<p>This one deserves more attention from cloud architects than it typically receives, because it is not really a WordPress story. It is a credential supply chain story.</p>
<h3 id="what-the-vulnerability-does">What the vulnerability does</h3>
<p>The Gravity SMTP plugin for WordPress is vulnerable to sensitive information exposure in all versions up to and including 2.1.4. A REST API endpoint registered at <code>/wp-json/gravitysmtp/v1/tests/mock-data</code> has a <code>permission_callback</code> that unconditionally returns <code>true</code>. When the <code>?page=gravitysmtp-settings</code> query parameter is appended, the endpoint returns approximately 365 KB of JSON containing the full system report, including PHP version, all active plugins, WordPress configuration details, database table names, and any API keys or tokens configured in the plugin.</p>
<p>That system report is the prize. Any unauthenticated visitor gets back SMTP credentials, SendGrid and Mailgun API keys, and DKIM tokens. If you configured a transactional email service through Gravity SMTP, which is precisely the use case, your third-party API keys are sitting in that JSON response.</p>
<h3 id="the-attacker-infrastructure-behind-it">The attacker infrastructure behind it</h3>
<p>This is where the HoneyLabs analysis becomes genuinely useful for defenders. CrowdSec flagged the endpoint under active exploitation, logging 412 distinct IPs against it between May 27 and June 1. HoneyLabs sensors logged 566 IPs reaching for it. 561 of them, 99.1%, sent the same HTTP client fingerprint.</p>
<p>That fingerprint convergence tells you something important. Behind it is a Google Cloud fleet of thousands of short-lived instances, disguised by 3,299 rotating user-agents, sweeping more than 36,000 ports for <code>.env</code> files, git configs, credentials, and database dumps.</p>
<p>The CVE is simply the latest entry on a standing wordlist. The same operation sweeps for <code>terraform.tfstate</code>, <code>terraform.tfvars</code>, Spring Boot <code>/actuator/configprops</code>, <code>/actuator/threaddump</code>, AWS credential JSON files, and Dockerfiles. The operation does not treat a CVE as a CVE. It treats it as one more file that returns a credential. When the next unauthenticated information disclosure bug ships, it gets appended and swept on the following pass.</p>
<p>That is why a week-old CVE already had hundreds of source IPs on it: the collector was running before the bug existed.</p>
<h3 id="fix-and-immediate-mitigations">Fix and immediate mitigations</h3>
<ul>
<li>Update Gravity SMTP to 2.1.5 or later.</li>
<li>If you were running an affected version during the May 27 to June 1 exploitation window, treat your SMTP provider API keys, SendGrid/Mailgun credentials, and DKIM tokens as fully compromised and rotate immediately.</li>
<li>Block web-server access to all dotfiles and <code>.git</code> directories at the WAF or NGINX/Apache layer (see the config block below).</li>
<li>Add <code>terraform.tfstate</code> and <code>terraform.tfvars</code> to your web-server deny list. These files should never be reachable from the internet in any configuration.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nginx" data-lang="nginx"><span class="line"><span class="cl"><span class="c1"># Nginx: deny dot-files, git configs, and common credential leaks
</span></span></span><span class="line"><span class="cl"><span class="c1"># Add to your server {} block
</span></span></span><span class="line"><span class="cl"><span class="k">location</span> <span class="p">~</span><span class="sr">*</span> <span class="s">(\.env|\.git|terraform\.tfstate|terraform\.tfvars|actuator|\.bash_history|phpinfo\.php)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kn">deny</span> <span class="s">all</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">return</span> <span class="mi">404</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">location</span> <span class="p">~</span> <span class="sr">/\.</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kn">deny</span> <span class="s">all</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">access_log</span> <span class="no">off</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">log_not_found</span> <span class="no">off</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><!-- INTERNAL_LINK: secrets management in AWS with Secrets Manager and SSM | aws-secrets-manager-guide -->
<hr>
<h2 id="microsoft-azure-and-windows-cves-the-june-2026-patch-tuesday-wave">Microsoft Azure and Windows CVEs: the June 2026 Patch Tuesday wave</h2>
<p>Microsoft&rsquo;s June 2026 security update includes 206 vulnerabilities, 32 of which are marked critical. Of those 32 critical entries, 28 are remote code execution vulnerabilities affecting Windows Active Directory, Windows Kerberos KDC, Windows Remote Desktop client, Azure Kubernetes Service (AKS), Microsoft Office, Microsoft Outlook, and the Windows HTTP Protocol Stack.</p>
<p>For cloud architects the Azure-facing items are the priority triage. The June batch includes virtualisation escapes, identity service bugs, and management API vulnerabilities, alongside code injection and tampering fixes in .NET, Visual Studio, and PowerShell.</p>
<p>The four Microsoft MSRC CVEs referenced in this guide, CVE-2026-46293, CVE-2026-46291, CVE-2026-46274, and CVE-2026-28387, fall within this June 2026 release window. At time of writing the MSRC detail pages require JavaScript to render, but the product families involved (Azure services and Windows networking components) are consistent with the broader June release profile. Check the <a href="https://msrc.microsoft.com/update-guide/">MSRC Security Update Guide</a> directly for current exploitability ratings and apply patches in priority order based on CVSS score and CISA KEV status.</p>
<h3 id="microsoft-defender-three-actively-exploited-cves">Microsoft Defender: three actively exploited CVEs</h3>
<p>Three Defender vulnerabilities reached exploitation in the wild earlier in 2026 and warrant specific attention for any hybrid cloud environment that includes Windows endpoints or servers feeding into Azure workloads.</p>
<p>CVE-2026-41091 is a local privilege elevation vulnerability caused by the Microsoft Malware Protection Engine improperly resolving links before accessing files. CISA confirmed active exploitation and added it to the Known Exploited Vulnerabilities catalogue.</p>
<p>CVE-2026-45498 causes a denial-of-service condition that prevents Microsoft Defender from functioning. Knocking out endpoint protection before deploying further payloads is a well-established attacker technique, and this fits that pattern directly.</p>
<p>Both have been addressed in Microsoft Defender Antimalware Platform versions 1.1.26040.8 and 4.18.26040.7 respectively.</p>
<p>CVE-2026-45585, named &ldquo;YellowKey&rdquo;, is a Windows security feature bypass zero-day that targets BitLocker full-disk encryption protections. The exploit abuses the Windows Recovery Environment by manipulating NTFS transaction logs and recovery configuration files, forcing WinRE to launch a privileged command prompt while the disk remains transparently decrypted by the TPM. For UK public sector and financial services organisations running encrypted Windows estates on Azure-joined devices, this should be in your risk register immediately.</p>
<!-- INTERNAL_LINK: Azure AD Conditional Access and device compliance policies | azure-conditional-access-guide -->
<hr>
<h2 id="the-credential-harvesting-supply-chain">The credential harvesting supply chain</h2>
<p>CVE-2026-4020 is a symptom of a wider industrial-scale operation that directly threatens cloud credential stores. You need to understand the full pipeline to defend against it.</p>
<p>The DFIR Report documented the Bissa scanner collecting 30,000 distinct <code>.env</code> files in eleven days in April, shipping them to cloud storage. Those files are then parsed for actionable credentials: AWS access key IDs, GCP service account JSON, Azure client secrets. They are either used directly or sold.</p>
<p>The Shai-Hulud offensive framework, attributed to threat actor TeamPCP, sits at the other end of this supply chain. It implements a full AWS credential chain resolver covering environment variables, web identity token files, ECS container metadata, and EC2 IMDSv2. Once credentials are obtained, the toolkit enumerates AWS Secrets Manager and SSM Parameter Store across all 17 default AWS regions, reading every secret value with decryption enabled.</p>
<p>That last point matters. If an attacker gets hold of even a moderately privileged IAM credential, they will enumerate your secrets store. The access key compromise is not the end of the incident. It is the beginning. The actual blast radius depends on what that key can read.</p>
<h3 id="hardening-your-aws-credential-surface">Hardening your AWS credential surface</h3>
<p>The following IAM Service Control Policy (SCP) restricts <code>secretsmanager:GetSecretValue</code> and prevents access to <code>ssm:GetParameter</code> from outside your trusted account boundary, limiting the damage a stolen credential can do. Apply this at the AWS Organisation level:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;Version&#34;</span><span class="p">:</span> <span class="s2">&#34;2012-10-17&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;Statement&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Sid&#34;</span><span class="p">:</span> <span class="s2">&#34;DenySecretsReadOutsideTrustedAccounts&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Effect&#34;</span><span class="p">:</span> <span class="s2">&#34;Deny&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Action&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;secretsmanager:GetSecretValue&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;ssm:GetParameter&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;ssm:GetParameters&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;ssm:GetParametersByPath&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">],</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Resource&#34;</span><span class="p">:</span> <span class="s2">&#34;*&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Condition&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;StringNotEquals&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nt">&#34;aws:PrincipalAccount&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34;111111111111&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34;222222222222&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;BoolIfExists&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nt">&#34;aws:PrincipalIsAWSService&#34;</span><span class="p">:</span> <span class="s2">&#34;false&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Sid&#34;</span><span class="p">:</span> <span class="s2">&#34;RequireIMDSv2&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Effect&#34;</span><span class="p">:</span> <span class="s2">&#34;Deny&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Action&#34;</span><span class="p">:</span> <span class="s2">&#34;ec2:RunInstances&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Resource&#34;</span><span class="p">:</span> <span class="s2">&#34;arn:aws:ec2:*:*:instance/*&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Condition&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;StringNotEquals&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nt">&#34;ec2:MetadataHttpTokens&#34;</span><span class="p">:</span> <span class="s2">&#34;required&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>The <code>RequireIMDSv2</code> statement is not optional. IMDSv1 is the well-documented path by which container escapes and SSRF vulnerabilities turn into full account compromise. TeamPCP&rsquo;s credential chain resolver explicitly targets EC2 IMDSv2. Enforcing IMDSv2 makes that harder, but any instance still on IMDSv1 remains trivially vulnerable to SSRF-to-credential theft.</p>
<hr>
<h2 id="detection-and-response-aws-and-azure-tooling">Detection and response: AWS and Azure tooling</h2>
<p>Knowing the CVEs is necessary but not sufficient. The gap between &ldquo;we know about this CVE&rdquo; and &ldquo;we detected exploitation&rdquo; is where most organisations fail, and where FCA Operational Resilience requirements apply most directly.</p>
<h3 id="aws-amazon-inspector-guardduty-and-security-hub">AWS: Amazon Inspector, GuardDuty, and Security Hub</h3>
<p>Amazon Inspector calculates a contextualised score for each finding by correlating the CVSS base score with network reachability results and exploitability data. Use this score for triage, not the raw NVD base score.</p>
<p>Security Hub now calculates exposures in near real-time and includes threat correlation from GuardDuty alongside vulnerability and misconfiguration analysis. When GuardDuty detects threats, Amazon Inspector identifies vulnerabilities, or Security Hub CSPM discovers misconfigurations, Security Hub automatically correlates those findings and updates associated exposures.</p>
<p>For your vulnerability management programme, enable Amazon Inspector, Amazon GuardDuty, AWS Health, and IAM Access Analyzer in each account. All four automatically send findings to Security Hub CSPM.</p>
<p>The AWS CLI command below pulls all CRITICAL and HIGH Inspector findings in your current region that have an associated CVE and have not yet been remediated. Run this as a daily triage view during active exploit campaigns:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Pull critical and high Inspector CVE findings — active/unfixed only</span>
</span></span><span class="line"><span class="cl">aws inspector2 list-findings <span class="se">\
</span></span></span><span class="line"><span class="cl">  --filter-criteria <span class="s1">&#39;{
</span></span></span><span class="line"><span class="cl"><span class="s1">    &#34;findingStatus&#34;: [{&#34;comparison&#34;: &#34;EQUALS&#34;, &#34;value&#34;: &#34;ACTIVE&#34;}],
</span></span></span><span class="line"><span class="cl"><span class="s1">    &#34;severity&#34;: [
</span></span></span><span class="line"><span class="cl"><span class="s1">      {&#34;comparison&#34;: &#34;EQUALS&#34;, &#34;value&#34;: &#34;CRITICAL&#34;},
</span></span></span><span class="line"><span class="cl"><span class="s1">      {&#34;comparison&#34;: &#34;EQUALS&#34;, &#34;value&#34;: &#34;HIGH&#34;}
</span></span></span><span class="line"><span class="cl"><span class="s1">    ],
</span></span></span><span class="line"><span class="cl"><span class="s1">    &#34;findingType&#34;: [{&#34;comparison&#34;: &#34;EQUALS&#34;, &#34;value&#34;: &#34;PACKAGE_VULNERABILITY&#34;}]
</span></span></span><span class="line"><span class="cl"><span class="s1">  }&#39;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  --sort-criteria <span class="s1">&#39;{&#34;field&#34;: &#34;INSPECTOR_SCORE&#34;, &#34;sortOrder&#34;: &#34;DESC&#34;}&#39;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  --query <span class="s1">&#39;findings[*].{
</span></span></span><span class="line"><span class="cl"><span class="s1">    Resource:resources[0].id,
</span></span></span><span class="line"><span class="cl"><span class="s1">    CVE:packageVulnerabilityDetails.vulnerabilityId,
</span></span></span><span class="line"><span class="cl"><span class="s1">    Score:inspectorScore,
</span></span></span><span class="line"><span class="cl"><span class="s1">    Status:findingStatus,
</span></span></span><span class="line"><span class="cl"><span class="s1">    Remediation:remediation.recommendation.text
</span></span></span><span class="line"><span class="cl"><span class="s1">  }&#39;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  --output table
</span></span></code></pre></div><p>GuardDuty findings to monitor specifically in the context of the credential-harvesting campaigns described in this guide:</p>
<ul>
<li><code>UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.InsideAWS</code> &ndash; EC2 credentials being used from outside the instance&rsquo;s expected network path</li>
<li><code>Discovery:S3/MaliciousIPCaller.Custom</code> &ndash; bucket enumeration from a known-bad IP</li>
<li><code>CredentialAccess:IAMUser/AnomalousBehavior</code> &ndash; unusual <code>secretsmanager:GetSecretValue</code> call patterns</li>
<li><code>Execution:Lambda/MaliciousLambdaExecution</code> &ndash; Lambda function behaviour consistent with the Shai-Hulud toolkit&rsquo;s region-sweeping enumeration</li>
</ul>
<h3 id="azure-defender-for-cloud-and-secure-score">Azure: Defender for Cloud and Secure Score</h3>
<p>For Azure environments, automated malware remediation in Defender for Storage is now generally available. It performs automatic soft-deletion of malicious blobs detected during on-upload or on-demand malware scanning. Soft-deleted blobs are quarantined and recoverable for further investigation.</p>
<p>On the Kubernetes side, Microsoft publishes Critical Security Advisories for AKS covering high-impact security vulnerabilities including zero-days, and maintains a list of ongoing security investigations for CVEs where a patch is not yet available. Subscribe to AKS release notes and security bulletins at <code>aka.ms/aks/release-notes</code>. Treating AKS as a managed service that patches itself is one of the most common and costly assumptions I see in enterprise Azure deployments.</p>
<!-- INTERNAL_LINK: AWS Inspector v2 deep dive for container vulnerability scanning | amazon-inspector-containers -->
<hr>
<h2 id="ncsc-guidance-and-your-vulnerability-management-obligations">NCSC guidance and your vulnerability management obligations</h2>
<p>The NCSC updated its Vulnerability Management guidance in May 2026. If you have not read it recently, the bar has moved. The NCSC is expecting organisations to deploy software security updates quickly, more frequently, and at scale, including across their supply chains, and is anticipating an influx of updates to address vulnerabilities across all severities, with a number expected to be critical.</p>
<p>Where automatic secure hot patching is available, meaning patching without service disruption, it should be enabled as a priority. Where automatic updates are available more broadly, including for embedded devices, they should be enabled to reduce the workload on support teams.</p>
<p>The NCSC CTO&rsquo;s May 2026 &ldquo;vulnerability patch wave&rdquo; blog is direct: where a critical vulnerability is under active exploitation, particularly one affecting an internet-facing system, accelerating the update process is not optional.</p>
<p>For FCA-regulated firms this aligns with PS21/3 Operational Resilience requirements. Your patching SLA for Critical and KEV-listed vulnerabilities needs to be documented, board-approved, and evidenced. A verbal commitment to &ldquo;patch quickly&rdquo; is not a demonstrable control. The NCSC&rsquo;s framing is useful for governance conversations too: the decision not to update is a senior-level risk decision, and should be considered in the wider context of organisational risk management policy and practice.</p>
<!-- INTERNAL_LINK: FCA operational resilience and cloud third-party risk | fca-operational-resilience-cloud -->
<hr>
<h2 id="common-pitfalls-and-how-to-avoid-them">Common pitfalls and how to avoid them</h2>
<p>These are the mistakes I see repeatedly in production AWS and Azure environments during CVE response cycles.</p>
<h3 id="1-treating-cvss-score-as-the-sole-triage-metric">1. Treating CVSS score as the sole triage metric</h3>
<p>A CVSS 9.8 on a service with no network exposure is lower priority than a CVSS 6.5 on an internet-facing, credential-holding workload. Amazon Inspector&rsquo;s contextualised score correlates the CVSS base score with network reachability and exploitability data. Use that score, not the raw NVD base score.</p>
<h3 id="2-assuming-managed-services-are-someone-elses-problem-to-patch">2. Assuming managed services are someone else&rsquo;s problem to patch</h3>
<p>They are, until they are not. The AKS Local Privilege Escalation example, CVE-2026-31431 (&ldquo;Copy Fail&rdquo;), is instructive. The vulnerability affects the Linux kernel&rsquo;s <code>algif_aead</code> module. Although <code>algif_aead</code> is not loaded by default on AKS nodes, the kernel&rsquo;s module auto-loading mechanism will load it on demand when any process, including unprivileged containers, creates an AF_ALG socket with AEAD type. The &ldquo;it&rsquo;s a managed service&rdquo; assumption breaks whenever your workload&rsquo;s runtime behaviour triggers a kernel module you assumed was dormant.</p>
<h3 id="3-not-enforcing-imdsv2-across-the-fleet">3. Not enforcing IMDSv2 across the fleet</h3>
<p>This is the single most common unforced error I encounter. Enforcing it via SCP, as shown above, takes fifteen minutes to deploy organisation-wide via AWS Control Tower. The cost of not doing it is a complete account compromise the first time a workload has an SSRF vulnerability.</p>
<h3 id="4-ignoring-the-supply-chain-credential-vector">4. Ignoring the supply chain credential vector</h3>
<p>A malicious npm package impersonating the legitimate Bitwarden CLI was published to npm in April 2026. It targets developer workstations, CI/CD pipelines, and cloud provider credentials across AWS, Azure, and GCP. The package was downloaded thousands of times before being flagged. Its payload harvests secrets from local filesystems, environment variables, GitHub Actions, and cloud secret managers.</p>
<p>Your CVE management programme must include dependency scanning of your CI/CD toolchain, not just your deployed application dependencies. If your pipeline runner has read access to <code>~/.aws/credentials</code> or injects <code>AWS_SECRET_ACCESS_KEY</code> as an environment variable, a malicious package in your dependency tree is equivalent to an IAM credential leak.</p>
<h3 id="5-rotating-credentials-after-the-exposure-window-not-immediately">5. Rotating credentials after the exposure window, not immediately</h3>
<p>If you were exposed during a known exploitation window, your credentials were almost certainly read. The instinct to wait before rotating, out of fear of breaking production, is a false economy. Rotating a compromised API key costs minutes. An undetected credential abuse incident costs months of IR work and, in GDPR terms, a potentially reportable breach.</p>
<p>64% of secrets leaked historically were still active years later. Detection without rotation is theatre.</p>
<h3 id="6-over-relying-on-waf-rules-as-cve-mitigation">6. Over-relying on WAF rules as CVE mitigation</h3>
<p>WAF rules are compensating controls, not patches. Deploying a WAF rule to neutralise an exploit at the network edge buys you time to patch. It is not a permanent fix. Treat it as a runway, not a destination.</p>
<h3 id="7-missing-the-microsoft-coordinated-disclosure-tension">7. Missing the Microsoft coordinated disclosure tension</h3>
<p>The Nightmare Eclipse vs. MSRC story running through 2026 is worth understanding. Multiple leading voices in the vulnerability disclosure community have expressed concern that Microsoft&rsquo;s invocation of its Digital Crimes Unit may prove counterproductive, if it causes researchers to back away from mutually beneficial engagements with MSRC. From a defender&rsquo;s perspective, a chilled researcher community means fewer coordinated disclosures and more abrupt zero-day drops, shortening your response window further. Monitor the MSRC Security Update Guide and the Zero Day Initiative blog as primary sources.</p>
<hr>
<h2 id="building-a-cloud-cve-response-playbook">Building a cloud CVE response playbook</h2>
<p>The following CloudFormation snippet provisions an EventBridge rule that fires a Lambda function whenever AWS Security Hub receives a new CRITICAL finding linked to a CVE from Amazon Inspector. Use this as the skeleton for an automated triage workflow. The Lambda would enrich the finding, create a ServiceNow or Jira ticket, and page the on-call engineer:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># CloudFormation: Auto-triage Security Hub Critical CVE findings</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">AWSTemplateFormatVersion</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;2010-09-09&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">Description</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;Route critical Inspector CVE findings to triage Lambda&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">Resources</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">CveCriticalTriageRule</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">Type</span><span class="p">:</span><span class="w"> </span><span class="l">AWS::Events::Rule</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">Properties</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">Name</span><span class="p">:</span><span class="w"> </span><span class="l">security-hub-critical-cve-triage</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">Description</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;Fire on CRITICAL Inspector CVE findings in Security Hub&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">EventPattern</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">source</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="l">aws.securityhub</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">detail-type</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="l">Security Hub Findings - Imported</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">detail</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">findings</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">Severity</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">Label</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span>- <span class="l">CRITICAL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">FindingProviderFields</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">Severity</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="nt">Label</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                  </span>- <span class="l">CRITICAL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">ProductArn</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="nt">prefix</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;arn:aws:securityhub:*:*:product/aws/inspector&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">Types</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="nt">prefix</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;Software and Configuration Checks/Vulnerabilities/CVE&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">State</span><span class="p">:</span><span class="w"> </span><span class="l">ENABLED</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">Targets</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">Arn</span><span class="p">:</span><span class="w"> </span>!<span class="l">GetAtt CveTriageLambda.Arn</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">Id</span><span class="p">:</span><span class="w"> </span><span class="l">CveTriageTarget</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">CveTriageLambdaPermission</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">Type</span><span class="p">:</span><span class="w"> </span><span class="l">AWS::Lambda::Permission</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">Properties</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">FunctionName</span><span class="p">:</span><span class="w"> </span>!<span class="l">Ref CveTriageLambda</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">Action</span><span class="p">:</span><span class="w"> </span><span class="l">lambda:InvokeFunction</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">Principal</span><span class="p">:</span><span class="w"> </span><span class="l">events.amazonaws.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">SourceArn</span><span class="p">:</span><span class="w"> </span>!<span class="l">GetAtt CveCriticalTriageRule.Arn</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">CveTriageLambda</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">Type</span><span class="p">:</span><span class="w"> </span><span class="l">AWS::Lambda::Function</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">Properties</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">FunctionName</span><span class="p">:</span><span class="w"> </span><span class="l">security-hub-cve-triage</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">Runtime</span><span class="p">:</span><span class="w"> </span><span class="l">python3.12</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">Handler</span><span class="p">:</span><span class="w"> </span><span class="l">index.handler</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">Timeout</span><span class="p">:</span><span class="w"> </span><span class="m">30</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">Role</span><span class="p">:</span><span class="w"> </span>!<span class="l">GetAtt CveTriageLambdaRole.Arn</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">Code</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">ZipFile</span><span class="p">:</span><span class="w"> </span><span class="p">|</span><span class="sd">
</span></span></span><span class="line"><span class="cl"><span class="sd">          import json, boto3, os
</span></span></span><span class="line"><span class="cl"><span class="sd">
</span></span></span><span class="line"><span class="cl"><span class="sd">          def handler(event, context):
</span></span></span><span class="line"><span class="cl"><span class="sd">              findings = event[&#39;detail&#39;][&#39;findings&#39;]
</span></span></span><span class="line"><span class="cl"><span class="sd">              for f in findings:
</span></span></span><span class="line"><span class="cl"><span class="sd">                  cve_id = f.get(&#39;PackageVulnerabilityDetails&#39;, {}).get(&#39;VulnerabilityId&#39;, &#39;UNKNOWN&#39;)
</span></span></span><span class="line"><span class="cl"><span class="sd">                  resource = f.get(&#39;Resources&#39;, [{}])[0].get(&#39;Id&#39;, &#39;UNKNOWN&#39;)
</span></span></span><span class="line"><span class="cl"><span class="sd">                  score = f.get(&#39;FindingProviderFields&#39;, {}).get(&#39;Severity&#39;, {}).get(&#39;Original&#39;, &#39;?&#39;)
</span></span></span><span class="line"><span class="cl"><span class="sd">                  print(f&#34;CRITICAL CVE FINDING: {cve_id} on {resource} (score: {score})&#34;)
</span></span></span><span class="line"><span class="cl"><span class="sd">                  # TODO: post to Slack/Teams, create ITSM ticket, page on-call
</span></span></span><span class="line"><span class="cl"><span class="sd">              return {&#39;statusCode&#39;: 200}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">CveTriageLambdaRole</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">Type</span><span class="p">:</span><span class="w"> </span><span class="l">AWS::IAM::Role</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">Properties</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">AssumeRolePolicyDocument</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">Version</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;2012-10-17&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">Statement</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="nt">Effect</span><span class="p">:</span><span class="w"> </span><span class="l">Allow</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">Principal</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">Service</span><span class="p">:</span><span class="w"> </span><span class="l">lambda.amazonaws.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">Action</span><span class="p">:</span><span class="w"> </span><span class="l">sts:AssumeRole</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">ManagedPolicyArns</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="l">arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole</span><span class="w">
</span></span></span></code></pre></div><p>This gets you from a CRITICAL Inspector finding to a visible ticket in under 60 seconds. The alternative, a human reviewing Security Hub daily, introduces the exact dwell-time problem that makes recent cloud security CVEs so damaging at scale.</p>
<hr>
<h2 id="key-takeaways">Key takeaways</h2>
<p>The exploitation window has collapsed. During one incident, GTIG observed threat actors deploying cryptocurrency miners within approximately 48 hours of a vulnerability&rsquo;s public disclosure. Your patch SLA must reflect this reality, not the 30-day cycles inherited from on-premises practice.</p>
<p>CVEs are now credential delivery mechanisms. CVE-2026-4020 is less about traditional exploitation and more about credential exfiltration. Google&rsquo;s H1 2026 Threat Horizons report puts identity compromise behind 83% of cloud intrusions, much of it seeded by exposed secrets. The harvester fleet described above is what the front of that supply chain looks like in practice.</p>
<p>Software vulnerabilities have overtaken credentials as the primary cloud attack vector. In the second half of 2025, software vulnerabilities accounted for 44.5% of initial access vectors in observed cloud intrusions. Rebalance your detection investment accordingly.</p>
<p>IMDSv2 enforcement and secrets-access SCPs are not optional. They are fast to deploy and materially reduce the blast radius of any credential compromise or SSRF vulnerability. The SCP template in this guide can be deployed today.</p>
<p>Automate the triage loop. Security Hub calculates exposures in near real-time, automatically correlating GuardDuty threats with Inspector CVE findings and Security Hub misconfigurations. Manual daily reviews are not sufficient. Use EventBridge automation to route CRITICAL CVE findings to your ticketing system within seconds of detection.</p>
<p>NCSC guidance has teeth. The NCSC&rsquo;s May 2026 vulnerability management update explicitly frames delayed patching of actively exploited internet-facing systems as an unacceptable risk position. The decision not to update is a senior-level risk decision and should be considered in the wider context of organisational risk management policy and practice. Document your patching SLAs, get them approved at board level, and evidence compliance. Both the NCSC and the FCA now expect it.</p>
<hr>
<p><em>This guide reflects the threat landscape as of June 2026. Recent cloud security CVEs evolve quickly; subscribe to the <a href="https://www.ncsc.gov.uk/section/keep-up-to-date/ncsc-alerts-advisories-guidance">NCSC vulnerability alerts feed</a>, CISA&rsquo;s Known Exploited Vulnerabilities catalogue, and your cloud provider&rsquo;s security bulletins to stay current between updates to this guide.</em></p>
]]></content:encoded></item></channel></rss>