<?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>CVE-2026-32475: Unauthenticated RCE in Elementor Pro via File Upload Validation Bypass</title>
      <dc:creator>Stanley A.</dc:creator>
      <pubDate>Fri, 04 Sep 2026 13:48:00 +0000</pubDate>
      <link>https://dev.to/stanleya/cve-2026-32475-unauthenticated-rce-in-elementor-pro-via-file-upload-validation-bypass-5e41</link>
      <guid>https://dev.to/stanleya/cve-2026-32475-unauthenticated-rce-in-elementor-pro-via-file-upload-validation-bypass-5e41</guid>
      <description>&lt;p&gt;CVE-2026-32475 is an unauthenticated arbitrary file upload to RCE in Elementor Pro (&amp;lt;= 4.2.1, fixed in 4.2.2). CVSS 9.0 (CWE-434). If you run WordPress with Elementor Pro forms that accept file uploads, patch and audit the uploads directory today.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bug: &lt;code&gt;return&lt;/code&gt; where &lt;code&gt;continue&lt;/code&gt; belonged
&lt;/h2&gt;

&lt;p&gt;The flaw is in the Form widget's upload path (&lt;code&gt;process_field&lt;/code&gt; -&amp;gt; &lt;code&gt;Upload::validation()&lt;/code&gt;). The validation loop iterates over the file array for one field. When the first element has &lt;code&gt;UPLOAD_ERR_NO_FILE&lt;/code&gt; (empty filename), the code calls &lt;code&gt;return&lt;/code&gt; instead of &lt;code&gt;continue&lt;/code&gt; — aborting extension and MIME checks for every remaining file in that field. The mover runs in a separate loop that correctly skips the empty slot and writes the rest. Validator stops early, mover keeps going.&lt;/p&gt;

&lt;p&gt;Exploit shape (observed in the wild by Wordfence):&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;POST /wp-admin/admin-ajax.php
action=elementor_pro_forms_send_form
form_fields['field_cc213f9'][0]; filename=""          &amp;lt;- triggers UPLOAD_ERR_NO_FILE
form_fields['field_cc213f9'][1]; filename="x1.php"    &amp;lt;- PHP webshell, never validated
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The file lands at &lt;code&gt;wp-content/uploads/elementor/forms/&amp;lt;uniqid&amp;gt;.php&lt;/code&gt; (&lt;code&gt;uniqid()&lt;/code&gt; output, attacker-supplied &lt;code&gt;.php&lt;/code&gt; extension). The upload response does not return the path, so the attacker must first work out the filename — a cheap step Patchstack documents. One GET to the file executes it. No auth, no nonce bypass needed — &lt;code&gt;admin-ajax.php&lt;/code&gt; exposes the form handler to unauthenticated callers by design. Credit: Tin Pham (TF1T) reported via Patchstack (Jul 16); Austin Ginder independently reported via the Wordfence Bug Bounty Program (~Jul 24, $15,600 bounty); Wordfence rejected its own CVE in favor of Patchstack's CVE-2026-32475.&lt;/p&gt;

&lt;p&gt;Precondition (precise): a published page with an Elementor Form widget containing at least one &lt;strong&gt;non-required&lt;/strong&gt; File Upload field. Required is off by default, so most upload fields qualify. Installed-but-no-upload-form = vulnerable code, no reachable entry point for this chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check if you are affected
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Plugin version (want &amp;gt;= 4.2.2)&lt;/span&gt;
wp plugin list | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; elementor-pro
wp plugin get elementor-pro &lt;span class="nt"&gt;--field&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;version

&lt;span class="c"&gt;# 2. Any PHP where there should never be PHP&lt;/span&gt;
find wp-content/uploads/elementor/forms/ &lt;span class="nt"&gt;-type&lt;/span&gt; f &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.php"&lt;/span&gt; &lt;span class="nt"&gt;-ls&lt;/span&gt;
&lt;span class="c"&gt;# Any hit = treat as compromise, not cleanup-and-done&lt;/span&gt;

&lt;span class="c"&gt;# 3. Look for probing in access logs (IP list rotates fast — check the live list in the Wordfence advisory, do not rely on static copies)&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"elementor_pro_forms_send_form"&lt;/span&gt; /var/log/nginx/access.log | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 50
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wordfence publishes the live offending-IP list in &lt;a href="https://www.wordfence.com/blog/2026/09/attackers-actively-exploiting-critical-vulnerability-in-elementor-pro-plugin/" rel="noopener noreferrer"&gt;its advisory&lt;/a&gt; — check there rather than any static copy. Absence of matches proves nothing (log rotation, IP churn) — the folder check is authoritative.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Update first — firewall rules are a shield, the patch removes the hole&lt;/span&gt;
wp plugin update elementor-pro
wp plugin get elementor-pro &lt;span class="nt"&gt;--field&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;version   &lt;span class="c"&gt;# confirm 4.2.2+&lt;/span&gt;

&lt;span class="c"&gt;# Harden the uploads path so the next validation bug buys nothing (defense in depth)&lt;/span&gt;
&lt;span class="c"&gt;# nginx: never execute PHP under the forms upload dir&lt;/span&gt;
location ^~ /wp-content/uploads/elementor/forms/ &lt;span class="o"&gt;{&lt;/span&gt;
  location ~ &lt;span class="se"&gt;\.&lt;/span&gt;php&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; deny all&lt;span class="p"&gt;;&lt;/span&gt; access_log off&lt;span class="p"&gt;;&lt;/span&gt; log_not_allowed 1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="c"&gt;# Apache alternative (.htaccess in wp-content/uploads/elementor/forms/)&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;FilesMatch&lt;/span&gt;&lt;span class="sr"&gt; "\.php$"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="nc"&gt;Require&lt;/span&gt; &lt;span class="ss"&gt;all&lt;/span&gt; denied
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;FilesMatch&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you run Wordfence Premium, Care, or Response, confirm Firewall -&amp;gt; Global Options -&amp;gt; "Disable Code Execution for Uploads directory" is on — that is what makes its file-access block work. Note the free version of Wordfence receives new firewall rules ~30 days after paid tiers, so free-tier sites had no firewall cover during the Aug 19-23 attack peak: updating was the only immediate protection. Patchstack has a virtual patch for unpatched sites. Either way, update: WAF rules rot, the patch does not.&lt;/p&gt;

&lt;p&gt;Also worth a pass: &lt;code&gt;wp post list --post_type=page --fields=ID,post_title&lt;/code&gt; plus a quick audit of which pages carry Form widgets with upload fields, and whether each one still needs to accept files. Restrict &lt;code&gt;accept&lt;/code&gt; to what the workflow needs (PDF/images for applications) and drop upload fields from pages that no longer need them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this one stung
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;6M+ installs, 190,000+ blocked attempts since Aug 19 disclosure, heaviest Aug 19-23. Same-day weaponization is now normal for internet-facing unauthenticated flaws.&lt;/li&gt;
&lt;li&gt;The validator/mover split-loop pattern is a classic: two passes over the same array with different empty-element handling. If you write upload handling, validate and move in one pass, or fuzz the validator with &lt;code&gt;[empty, valid, malicious]&lt;/code&gt; permutations.&lt;/li&gt;
&lt;li&gt;Duplicate CVE CVE-2026-17590 was rejected — if your scanner flags it, map it to CVE-2026-32475.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Technical takeaway: never let validation and file-move disagree on what "empty" means. One loop, &lt;code&gt;continue&lt;/code&gt; on empty, allowlist extensions, randomize stored names without preserving the attacker extension, and deny execution in upload dirs at the web server layer.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full prevention-focused version with the shop-owner playbook: &lt;a href="https://wardenbit.com/posts/elementor-pro-file-upload-cve-2026-32475/?utm_source=devto&amp;amp;utm_medium=organic&amp;amp;utm_campaign=elementor-pro-file-upload-cve-2026-32475" rel="noopener noreferrer"&gt;WardenBit&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>cybersecurity</category>
      <category>devops</category>
    </item>
    <item>
      <title>1,033 Live Stripe Secret Keys Leaked: How Exposed .env Files Became a Payment Rail Breach</title>
      <dc:creator>Stanley A.</dc:creator>
      <pubDate>Tue, 01 Sep 2026 14:34:00 +0000</pubDate>
      <link>https://dev.to/stanleya/1033-live-stripe-secret-keys-leaked-how-exposed-env-files-became-a-payment-rail-breach-4l8n</link>
      <guid>https://dev.to/stanleya/1033-live-stripe-secret-keys-leaked-how-exposed-env-files-became-a-payment-rail-breach-4l8n</guid>
      <description>&lt;h1&gt;
  
  
  1,033 Live Stripe Secret Keys Leaked: How Exposed .env Files Became a Payment Rail Breach
&lt;/h1&gt;

&lt;p&gt;On August 18, 2026, a threat actor dumped &lt;strong&gt;1,033 live Stripe &lt;code&gt;sk_live_...&lt;/code&gt; keys from 669 vendors&lt;/strong&gt; on an illicit forum — with a direct claim to Hudson Rock that &lt;strong&gt;~20,000 keys&lt;/strong&gt; are held for staggered release. The leaked keys had charge capabilities, were tied to real invoices and promo-code tables, and the victims ran completely different stacks. Hudson Rock found &lt;strong&gt;no infostealer infections tied to the vendor domains&lt;/strong&gt;. The working hypothesis: &lt;strong&gt;automated mass-scanning for publicly exposed &lt;code&gt;.env&lt;/code&gt; files and debug logs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;No vulnerability in Stripe. No single WordPress plugin. One misconfigured file, found at scale.&lt;/p&gt;

&lt;p&gt;If you build or operate anything that talks to Stripe, this is a build-pipeline and deployment-hygiene incident you can verify in five minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the dump actually contained
&lt;/h2&gt;

&lt;p&gt;Per &lt;a href="https://www.infostealers.com/article/analyzing-stripe-breach-confirmed-vendor-exposure-and-claims-of-20000-compromised-apis" rel="noopener noreferrer"&gt;Hudson Rock's Infostealers analysis&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;669 vendors, 1,033 &lt;code&gt;sk_live&lt;/code&gt; keys, customer rows, charges, balances, payouts, invoices&lt;/li&gt;
&lt;li&gt;Advertised 33 GB total; the provided archive was 2.37 GB — consistent with a staggered release&lt;/li&gt;
&lt;li&gt;JSON samples show &lt;code&gt;"sk_live_51H..."&lt;/code&gt; with explicit charge-access flags&lt;/li&gt;
&lt;li&gt;Invoice-linked CSVs with customer name / email / phone / home address / IP at purchase / internal transaction IDs / third-party integration identifiers — plus hosted invoice URLs that resolve to valid Stripe invoices exposing last-four of card&lt;/li&gt;
&lt;li&gt;A separate promo-code spreadsheet (code, discount amount, duration) — mass abuseable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The 20,000 figure is an actor claim to Hudson Rock researchers, not an independent count. Treat it as claimed; the 1,033 observed keys are verified. That distinction matters if you cite the story.&lt;/p&gt;

&lt;h2&gt;
  
  
  What &lt;code&gt;sk_live&lt;/code&gt; actually unlocks
&lt;/h2&gt;

&lt;p&gt;Depending on scope, a standard &lt;code&gt;sk_live&lt;/code&gt; is not read-only:&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;GET /v1/customers
GET /v1/invoices/:id
GET /v1/charges
POST /v1/refunds        # with charge capability → direct financial control
POST /v1/payouts        # if account-settings write is allowed
GET /v1/coupons         # promo-code enumeration
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is programmatic access through normal Stripe API calls. No exploit. A scanner that finds the key gets the same interface your backend uses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why &lt;code&gt;.env&lt;/code&gt; and not a package bug
&lt;/h2&gt;

&lt;p&gt;Two signals rule out a single-dependency explanation:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Victim tech stacks are heterogeneous — PHP storefronts, Node services, Python APIs, hosted site builders. No common plugin or framework.&lt;/li&gt;
&lt;li&gt; Hudson Rock's telemetry found no infostealer infections on the specific vendor domains in the dump.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both point to infrastructure-level exposure: a document root that serves dotfiles, a Docker image that copies &lt;code&gt;.env&lt;/code&gt; into the served directory, or a debug/error page that dumps &lt;code&gt;process.env&lt;/code&gt; / &lt;code&gt;$_ENV&lt;/code&gt;. Scanners for &lt;code&gt;/.env&lt;/code&gt;, &lt;code&gt;/.git/HEAD&lt;/code&gt;, and &lt;code&gt;/debug&lt;/code&gt; are older than this breach and fully automated.&lt;/p&gt;

&lt;p&gt;A quick check you can run from any machine:&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;p &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;"/.env"&lt;/span&gt; &lt;span class="s2"&gt;"/.env.example"&lt;/span&gt; &lt;span class="s2"&gt;"/.git/HEAD"&lt;/span&gt; &lt;span class="s2"&gt;"/debug"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;  &lt;span class="c"&gt;# keep /.well-known/security.txt public per RFC 9116&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="s2"&gt; -&amp;gt; "&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="s2"&gt;"https://yourdomain.com&lt;/span&gt;&lt;span class="nv"&gt;$p&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;# all should be 403/404 — any 200 that returns key-value secrets is an incident (note: /.well-known/security.txt should return 200 and is not part of this check)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Server-side, the fix is boring and decisive. Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="c1"&gt;# nginx — block dotfiles before any try_files&lt;/span&gt;
&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt; &lt;span class="sr"&gt;/\.&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kn"&gt;deny&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kn"&gt;access_log&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kn"&gt;log_not_found&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;/.env&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kn"&gt;deny&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt; &lt;span class="sr"&gt;/\.git&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kn"&gt;deny&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="c"&gt;# Apache .htaccess&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;FilesMatch&lt;/span&gt;&lt;span class="sr"&gt; "^\.env"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="nc"&gt;Require&lt;/span&gt; &lt;span class="ss"&gt;all&lt;/span&gt; denied
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;FilesMatch&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="nc"&gt;RedirectMatch&lt;/span&gt; 404 /\.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Dockerfile — do not copy .env into the image&lt;/span&gt;
&lt;span class="c"&gt;# .dockerignore must contain: .env&lt;/span&gt;
&lt;span class="c"&gt;# and: RUN --mount=type=secret,id=stripe_key ...  # BuildKit secrets, not COPY&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Cloudflare, a single WAF custom rule blocking &lt;code&gt;URI Path contains /.env&lt;/code&gt; or &lt;code&gt;/.git&lt;/code&gt; covers the edge, but it is not a substitute for origin hygiene — the origin must not serve the file even if the edge is bypassed by direct IP.&lt;/p&gt;

&lt;h2&gt;
  
  
  The check that actually invalidates a copied key
&lt;/h2&gt;

&lt;p&gt;Scanning fixes the exposure. Rotation invalidates what was already copied.&lt;/p&gt;

&lt;p&gt;In the Stripe Dashboard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developers → API keys → Roll secret key → Revoke previous value
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you use restricted keys, roll each one and audit whether any key was issued as a standard-type key with full charge + refund + payout scope when your integration only needs &lt;code&gt;payment_intents:write&lt;/code&gt; and &lt;code&gt;customers:read&lt;/code&gt;. Scope reduction after rotation:&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;# list keys and their scopes (restricted keys API)&lt;/span&gt;
curl https://api.stripe.com/v1/restricted_keys &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-u&lt;/span&gt; sk_live_...: &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-G&lt;/span&gt;

&lt;span class="c"&gt;# create a least-privilege restricted key for a checkout-only service&lt;/span&gt;
curl https://api.stripe.com/v1/restricted_keys &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-u&lt;/span&gt; sk_live_...: &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"name=checkout-only &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="nt"&gt;-I&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&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;"restricted_resources[0][resource]=payment_intent"&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;"restricted_resources[0][permissions][]=write"&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;"restricted_resources[1][resource]=customer"&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;"restricted_resources[1][permissions][]=read"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A copied standard key and a copied restricted key are both breaches — but one can refund and reroute payouts, the other cannot. That scope boundary is the difference between a privacy incident and a financial one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inventory every place the key has lived
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;.env&lt;/code&gt; on production is rarely the only copy. After rotation, inventory and clean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.env&lt;/code&gt; committed to a private repo that later became public&lt;/li&gt;
&lt;li&gt;CI logs and build artifacts that echoed environment&lt;/li&gt;
&lt;li&gt;Backup snapshots of the app directory (&lt;code&gt;app-2026-03-01.tar.gz&lt;/code&gt; that includes &lt;code&gt;.env&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Staging / legacy subdomains sharing the same key (&lt;code&gt;staging.yourdomain.com/.env&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Third-party deploy tools and env-sync services that replicate variables&lt;/li&gt;
&lt;li&gt;Local &lt;code&gt;.env&lt;/code&gt; files on developer machines that were never rotated after the exposure window&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A single &lt;code&gt;git log --all --full-history -- ".env"&lt;/code&gt; and a secrets scan (GitGuardian, TruffleHog, gitleaks in CI) catches most historical commits. The point of the inventory is speed the next time any one location leaks: you rotate the key once and every copy is covered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detection after the fact
&lt;/h2&gt;

&lt;p&gt;After rotating, look backwards 30 days in both places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stripe Dashboard → Developers → Logs:&lt;/strong&gt; filter for &lt;code&gt;POST /v1/refunds&lt;/code&gt;, &lt;code&gt;POST /v1/payouts&lt;/code&gt;, and high-volume &lt;code&gt;GET /v1/customers&lt;/code&gt; or &lt;code&gt;GET /v1/invoices&lt;/code&gt; from unfamiliar IPs / ASNs. Normal integrations have a predictable call pattern; bulk listing is anomalous.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Origin access logs:&lt;/strong&gt; &lt;code&gt;GET /.env&lt;/code&gt; and &lt;code&gt;GET /.git/HEAD&lt;/code&gt; from scanner user-agents in the weeks before the dump date. Even a 404-heavy scan leaves a fingerprint.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If either log shows unfamiliar calls, treat the window as an active incident — preserve logs, notify the payment processor, and consider a focused review of the key's lifetime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this keeps happening
&lt;/h2&gt;

&lt;p&gt;Doppler's &lt;a href="https://www.doppler.com/breach-dashboard" rel="noopener noreferrer"&gt;Breach Dashboard&lt;/a&gt; timeline makes the pattern explicit. Recent examples include &lt;strong&gt;n8n&lt;/strong&gt; (4,576 tokens found in public GitHub, 321 still valid, August 2026) and &lt;strong&gt;LiteLLM&lt;/strong&gt; on PyPI — where CloudSEK initially tracked roughly 434,000 pipelines potentially exposed and Hudson Rock's independent analysis corroborated the scale at about 2,500 organizations (March 2026 backdoored releases 1.82.7/1.82.8) — alongside two disclosures from May 2026: &lt;strong&gt;Nx Console&lt;/strong&gt; (poisoned VS Code extension 18.95.0 published May 18, more than 2.2 million installs) and &lt;strong&gt;CISA's own 844 MB public repo&lt;/strong&gt; of production secrets (also May 2026, reportedly exposed for about six months). The Hudson Rock note on LiteLLM applies verbatim: removal of the file does not end the incident — copied credentials outlive the exposure.&lt;/p&gt;

&lt;p&gt;For small teams, the durable fix is three habits rather than a vault project:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Time-box secrets&lt;/strong&gt; — Stripe keys every 90 days, DB URLs every 180, on the same calendar as domain renewal&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Keep secrets out of the repo&lt;/strong&gt; — &lt;code&gt;.env&lt;/code&gt; in &lt;code&gt;.gitignore&lt;/code&gt;, history scanned in CI, BuildKit secrets or env injection at deploy time&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Maintain a live inventory&lt;/strong&gt; of every location that holds each secret, so rotation is one action, not a scavenger hunt&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  TL;DR for the reviewer who finds &lt;code&gt;/.env&lt;/code&gt; returning 200
&lt;/h2&gt;

&lt;p&gt;Your &lt;code&gt;.env&lt;/code&gt; is your payment rail's access-control list. Check whether it is public, rotate the key, inventory where it lives, scope its permissions, and review the logs. That is the hour of work that 669 vendors are doing after the fact. You can do it before the next batch drops.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://wardenbit.com/posts/stripe-sk-live-leaked-1033-keys-what-store-owners-should-do/?utm_source=devto&amp;amp;utm_medium=organic&amp;amp;utm_campaign=stripe-sk-live-leak" rel="noopener noreferrer"&gt;WardenBit&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>devops</category>
    </item>
    <item>
      <title>CVE-2026-19478: GitLab's CVSS 9.4 GraphQL Flaw Was Exploited Within Days — Patch Now</title>
      <dc:creator>Stanley A.</dc:creator>
      <pubDate>Tue, 25 Aug 2026 14:37:00 +0000</pubDate>
      <link>https://dev.to/stanleya/cve-2026-19478-gitlabs-cvss-94-graphql-flaw-was-exploited-within-days-patch-now-1n01</link>
      <guid>https://dev.to/stanleya/cve-2026-19478-gitlabs-cvss-94-graphql-flaw-was-exploited-within-days-patch-now-1n01</guid>
      <description>&lt;p&gt;GitLab shipped an &lt;strong&gt;out-of-band emergency release on August 17, 2026&lt;/strong&gt; fixing &lt;strong&gt;CVE-2026-19478&lt;/strong&gt; — a code injection flaw in a GraphQL directive, CVSS &lt;strong&gt;9.4&lt;/strong&gt;. Unauthenticated, network-exploitable, no user interaction. On self-managed instances, a single HTTP request can &lt;strong&gt;delete repositories, forge merge records, and ban maintainers&lt;/strong&gt;, according to watchTowr principal researcher Jake Knott, who reproduced the exploit shortly after disclosure. Reported through GitLab's &lt;strong&gt;HackerOne bug bounty&lt;/strong&gt; program by researcher &lt;strong&gt;hiimguardian&lt;/strong&gt;. The same release also patched a related CSRF flaw in the GraphQL multiplex handler — &lt;strong&gt;CVE-2026-19650 (CVSS 7.1)&lt;/strong&gt; — which, unlike the main flaw, does require some user interaction to trigger. Self-managed instances get two fixes in one upgrade.&lt;/p&gt;

&lt;p&gt;Fixed builds: &lt;strong&gt;19.2.4, 19.1.6, 19.0.8, 18.11.11&lt;/strong&gt; (affects 18.2+). GitLab.com / Dedicated are already patched server-side — no action needed there.&lt;/p&gt;

&lt;h2&gt;
  
  
  The timeline is the story
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Aug 17&lt;/strong&gt; — patch released; advisory says "under certain conditions," the vulnerable directive isn't named (full technical details are embargoed for ~90 days, per GitLab's usual disclosure policy)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aug 18&lt;/strong&gt; — watchTowr reproduces the flaw within &lt;strong&gt;minutes&lt;/strong&gt;, working from nothing but the advisory and the diff in the patch itself — and says AI tooling is what let them move that fast&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aug 19&lt;/strong&gt; — watchTowr's honeypot network catches the &lt;strong&gt;first in-the-wild exploitation attempts&lt;/strong&gt;, roughly two days after disclosure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Within the week&lt;/strong&gt; — working proof-of-concept exploit code starts showing up publicly on GitHub, well before GitLab's 90-day embargo on full technical details even gets close to lifting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point matters: the "we'll release full details in 90 days" cushion GitLab normally relies on didn't buy anyone 90 days of safety here. Researchers armed only with a diff got there in hours.&lt;/p&gt;

&lt;p&gt;Jake Knott (watchTowr), on why the old playbook doesn't hold anymore:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This is the new reality of vulnerability reproduction and exploitation, where AI-enabled attackers are able to compress the time from disclosure to exploitation, and 'waiting until the next patch cycle' is often too late."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What to do
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Self-hosting? Upgrade today&lt;/strong&gt; — &lt;code&gt;19.2.4&lt;/code&gt;, &lt;code&gt;19.1.6&lt;/code&gt;, &lt;code&gt;19.0.8&lt;/code&gt;, or &lt;code&gt;18.11.11&lt;/code&gt;. Not next maintenance window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unpatched still?&lt;/strong&gt; Hunt web/reverse-proxy logs for &lt;code&gt;@gl_introduced&lt;/code&gt; — watchTowr's identified probe/exploitation marker. If you can't patch immediately, restrict unauthenticated access to &lt;code&gt;/api/graphql&lt;/code&gt; at the proxy or WAF layer as a stopgap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rethink your patch SLA for internet-facing, unauthenticated, critical CVEs.&lt;/strong&gt; Days, not weeks. If a patch takes longer than that to roll out, you need compensating controls (WAF rules, network restrictions) in the gap, not just a ticket in the backlog.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The pattern to internalize
&lt;/h2&gt;

&lt;p&gt;This is the third GraphQL-layer flaw GitLab has patched in 2026 — a sustained hardening signal, not a one-off. More importantly, it's a concrete data point for a broader shift: &lt;strong&gt;weaponization time is collapsing, and AI is a big part of why.&lt;/strong&gt; watchTowr didn't need a leaked exploit or insider knowledge — a public advisory plus a public patch diff was enough to get from "here's what we fixed" to working exploit in minutes. The old "let the patch bake for two weeks" playbook is now a liability for internet-facing critical flaws.&lt;/p&gt;

&lt;p&gt;Build an emergency-patch lane before you need one: auto-alerts on critical CVEs in your stack, tested upgrade runbooks, and a standing decision rule — &lt;em&gt;critical + unauthenticated + internet-facing → patch within 24–48h, no exceptions.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;GitLab.com tenants: nothing to do here — but it's a good moment to inventory which self-hosted tools in your stack you'd quietly forgotten you're responsible for patching.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://wardenbit.com/posts/gitlab-cve-2026-19478-graphql-flaw-exploited-within-days/?utm_source=devto&amp;amp;utm_medium=organic&amp;amp;utm_campaign=gitlab-cve-2026-19478" rel="noopener noreferrer"&gt;the WardenBit blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>devops</category>
      <category>cybersecurity</category>
      <category>cloud</category>
    </item>
    <item>
      <title>CVE-2026-69836: Entra ID CVSS 10.0 RCE — What Business Owners Should Know</title>
      <dc:creator>Stanley A.</dc:creator>
      <pubDate>Sat, 22 Aug 2026 12:09:43 +0000</pubDate>
      <link>https://dev.to/stanleya/cve-2026-69836-entra-id-cvss-100-rce-what-business-owners-should-know-lcc</link>
      <guid>https://dev.to/stanleya/cve-2026-69836-entra-id-cvss-100-rce-what-business-owners-should-know-lcc</guid>
      <description>&lt;p&gt;On August 20, Microsoft disclosed &lt;strong&gt;CVE-2026-69836&lt;/strong&gt; — a remote code execution flaw in &lt;strong&gt;Entra ID&lt;/strong&gt; (formerly Azure Active Directory), the identity service behind Microsoft 365 logins. CVSS 10.0. Unauthenticated. Network-reachable. The original bulletin said it had been exploited in the wild; Microsoft corrected that on Friday to "no evidence of exploitation." Either way: fixed in the cloud, no customer action required.&lt;/p&gt;

&lt;p&gt;For developers and technical teams, three things are worth pulling out of this one.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The disclosure flip is a process story
&lt;/h2&gt;

&lt;p&gt;The bulletin went from "exploited" to "not exploited" in about 24 hours — the correction reportedly came after The Hacker News asked Microsoft directly (Cybersecurity Dive and Forkast covered the change; most outlets, including THN's own article, still carry the original "exploited" framing). If you run threat-intel feeds or alerting off MSRC flags, treat first-pass exploitation claims as provisional — especially on cloud-service CVEs where Microsoft's visibility is asymmetric (they see their telemetry; you see a flag). Automations that page people at 2 a.m. based on an initial "exploited: yes" should have a re-check step.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Deserialization in identity infrastructure
&lt;/h2&gt;

&lt;p&gt;CWE-502 (deserialization of untrusted data) keeps showing up in high-severity CVEs. In an auth service, a deserialization bug isn't just RCE-on-one-box — the blast radius is every tenant behind it. If your own services deserialize anything from tokens to webhook payloads, this is your reminder to keep deserialization on the threat-model list, prefer safe formats (JSON with schema validation over native object serialization), and never deserialize data from unauthenticated endpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Know your patch-responsibility boundary
&lt;/h2&gt;

&lt;p&gt;The useful mental model for any team: split your stack into &lt;em&gt;vendor-patched&lt;/em&gt; (Microsoft 365, managed databases, SaaS) and &lt;em&gt;self-patched&lt;/em&gt; (your WordPress/plugins, self-hosted apps, servers). The Entra fix required nothing from you. The WordPress 7.0.4 / Magento APSB26-92 releases two weeks ago required everything from you. Teams that can't enumerate their self-patched column are the ones that get breached by a July plugin CVE in October.&lt;/p&gt;

&lt;p&gt;Practical checklist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MFA on all admin accounts (the vendor patch doesn't cover credential theft)&lt;/li&gt;
&lt;li&gt;Expect fake "emergency patch" emails after headline CVSS-10 disclosures — Microsoft explicitly required no action, so any such email is a scam by definition&lt;/li&gt;
&lt;li&gt;Keep a living list of what YOU must update; review it monthly&lt;/li&gt;
&lt;li&gt;If you build alerting on MSRC/CISA feeds, add a delay or re-check for exploitation-status flips&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Microsoft found this one themselves, fixed it server-side, and disclosed for transparency. That's the system working. Your side of the line is smaller than the headlines suggest — but it's not zero.&lt;/p&gt;

</description>
      <category>security</category>
      <category>cloud</category>
      <category>cybersecurity</category>
      <category>devops</category>
    </item>
    <item>
      <title>Magento APSB26-92 and WordPress 7.0.4: Two Security Releases, Two Opposite Risk Profiles</title>
      <dc:creator>Stanley A.</dc:creator>
      <pubDate>Tue, 18 Aug 2026 14:27:00 +0000</pubDate>
      <link>https://dev.to/stanleya/magento-apsb26-92-and-wordpress-704-two-security-releases-two-opposite-risk-profiles-3igm</link>
      <guid>https://dev.to/stanleya/magento-apsb26-92-and-wordpress-704-two-security-releases-two-opposite-risk-profiles-3igm</guid>
      <description>&lt;p&gt;Two platform security releases landed 24 hours apart (Aug 11–12, 2026): an unauthenticated account takeover in Magento/Adobe Commerce, and an authenticated RCE in WordPress that needs two separate preconditions to fire. Same week, same severity tier on paper, very different exposure in practice. If you run — or maintain client sites on — either platform, here's what actually matters and what to do about it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Magento (APSB26-92, Aug 11):&lt;/strong&gt; unauthenticated session-hijack bug, CVSS 9.1. No release, isolated patch only. Exploitation attempts already observed — patch now.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WordPress (7.0.4, Aug 12):&lt;/strong&gt; authenticated Author+ RCE, CVSS 8.8, needs Imagick + Ghostscript on the server. Third core security release in under a month — &lt;code&gt;wp core update&lt;/code&gt; and move on.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Magento / Adobe Commerce APSB26-92 (Aug 11)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2026-71362&lt;/strong&gt; — Incorrect Authorization (CWE-863), &lt;strong&gt;CVSS 9.1&lt;/strong&gt;
(&lt;code&gt;AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N&lt;/code&gt;). No auth, no admin, no interaction.&lt;/li&gt;
&lt;li&gt;Sansec confirmed the mechanism: an attacker can switch an active customer session onto
another customer's account, exposing profile and private customer data.&lt;/li&gt;
&lt;li&gt;7 vulnerabilities total, 5 Critical: stored XSS (CVE-2026-48413, 8.7; CVE-2026-48414, 7.7),
auth bypasses (CVE-2026-48415, B2B, 7.6; CVE-2026-48416, 7.5), plus CVE-2026-48411/48412.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No new release, no new Composer packages.&lt;/strong&gt; Fixes ship as isolated patch files; you must
be on the latest &lt;code&gt;-p&lt;/code&gt; release of your line first (e.g. &lt;code&gt;2.4.9-2026-jul&lt;/code&gt;), then apply the
isolated patch on top.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exploitation attempts observed within ~24h of disclosure&lt;/strong&gt; (Sansec Shield blocking logs,
BleepingComputer, Aug 12); no confirmed successful compromises reported yet.&lt;/li&gt;
&lt;li&gt;Affected: &lt;code&gt;-2026-jul&lt;/code&gt; and earlier; fixed: &lt;code&gt;-2026-aug&lt;/code&gt; versions of each line.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  WordPress 7.0.4 (Aug 12)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2026-65640 / GHSA-8vr3-7mxf-gx8w&lt;/strong&gt; (&lt;strong&gt;CVSS 8.8&lt;/strong&gt;) — authenticated &lt;strong&gt;Author+ RCE via
malicious file upload&lt;/strong&gt;, on sites running &lt;strong&gt;Imagick + Ghostscript&lt;/strong&gt;. Reported by pwn.ai.&lt;/li&gt;
&lt;li&gt;Fixed point releases shipped across every maintained branch (7.0.4 down to 4.7.35); only
the latest branch stays actively supported going forward.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Third core security release in under a month:&lt;/strong&gt; 7.0.2 (Jul 17, unauthenticated pre-auth
RCE chain, "wp2shell", exploited at scale within hours), 7.0.3 (Aug 6, 12 fixes including
CVE-2026-64638, a pre-auth reflected XSS on the login screen), 7.0.4 (Aug 12).&lt;/li&gt;
&lt;li&gt;The 7.0.3 → 7.0.4 diff is small and focused: 7 files, 267 insertions — 235 of them in a
single file, &lt;code&gt;wp-includes/class-wp-image-editor-imagick.php&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why the contrast matters
&lt;/h2&gt;

&lt;p&gt;The Magento bug asks &lt;strong&gt;nothing&lt;/strong&gt; of the victim — no credential, no click, no account. The patch window &lt;em&gt;is&lt;/em&gt; the exposure window, full stop. The WordPress bug is gated twice (Author account &lt;strong&gt;and&lt;/strong&gt; a specific image-processing stack), which genuinely lowers exploitability — but Author accounts accumulate on any site with guest writers or agency clients, and "third core security release in a month" is exactly the pattern that produces update fatigue. Teams tend to patch the first one carefully and the third one on autopilot. That's the real risk here, not the CVSS number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical steps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Magento:&lt;/strong&gt; confirm your release line, update to the latest &lt;code&gt;-p&lt;/code&gt; release, then apply the
APSB26-92 isolated patch. There's no full security release this month — don't wait for one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WordPress:&lt;/strong&gt; run &lt;code&gt;wp core update&lt;/code&gt; (or Dashboard → Updates). If you want to scope actual
exposure, check Site Health for Imagick/Ghostscript — but treat the update itself as the fix
regardless of what you find.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Both:&lt;/strong&gt; keep a version inventory so "are we exposed" is a lookup, not a fire drill. Apply
security releases within days; stage majors. (WordPress 7.1, a feature release, is expected
around Aug 19 during WordCamp US — stage that one, don't rush it.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How are you handling the "third patch this month" problem — forced auto-updates, a staging gate, something else? Curious what's actually working for people running multiple sites.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This post originally appeared on the &lt;a href="https://wardenbit.com/posts/wordpress-magento-august-security-releases-what-shop-owners-should-know/?utm_source=devto&amp;amp;utm_medium=organic&amp;amp;utm_campaign=wordpress-magento-august-security-releases-what-shop-owners-should-know" rel="noopener noreferrer"&gt;WardenBit blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>wordpress</category>
      <category>devops</category>
    </item>
    <item>
      <title>Metabase Zero-Day: An Unauthenticated SQLi That Hit CVSS 10.0 and Stole Real Customer Data</title>
      <dc:creator>Stanley A.</dc:creator>
      <pubDate>Tue, 11 Aug 2026 14:21:00 +0000</pubDate>
      <link>https://dev.to/stanleya/metabase-zero-day-an-unauthenticated-sqli-that-hit-cvss-100-and-stole-real-customer-data-1i7i</link>
      <guid>https://dev.to/stanleya/metabase-zero-day-an-unauthenticated-sqli-that-hit-cvss-100-and-stole-real-customer-data-1i7i</guid>
      <description>&lt;p&gt;On &lt;strong&gt;3 August 2026&lt;/strong&gt;, attackers exploited a previously unknown, unauthenticated SQL injection in Metabase — starting with Metabase's &lt;strong&gt;own Cloud SaaS platform&lt;/strong&gt;. Framework and Tally, both Metabase Cloud customers, confirmed customer data theft after Metabase notified them on 6 August that their instances had been accessed. Metabase disclosed the zero-day on &lt;strong&gt;6 August&lt;/strong&gt; with a CVSS &lt;strong&gt;10.0&lt;/strong&gt; rating and confirmed active exploitation — before any CVE was assigned (the advisory ID is GHSA-vwf4-m7j8-wcjf).&lt;/p&gt;

&lt;h2&gt;
  
  
  The vulnerability
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advisory:&lt;/strong&gt; GHSA-vwf4-m7j8-wcjf (GitHub Security Advisory). No CVE at disclosure — scanners that only track the CVE/NVD feed won't flag an exposed instance until one is assigned.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type:&lt;/strong&gt; unauthenticated SQL injection, reachable through the password reset flow (&lt;code&gt;/api/session/reset_password&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Impact:&lt;/strong&gt; arbitrary SQL into the Metabase application database → full administrator access → change application configuration, steal stored credentials for connected databases, read any data reachable through those connections, export data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Affected:&lt;/strong&gt; self-hosted branches 0.58 through 0.63; Metabase Cloud was patched automatically for all customers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Minimum safe releases:&lt;/p&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;Minimum safe version&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0.58&lt;/td&gt;
&lt;td&gt;0.58.24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.59&lt;/td&gt;
&lt;td&gt;0.59.21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.60&lt;/td&gt;
&lt;td&gt;0.60.17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.61&lt;/td&gt;
&lt;td&gt;0.61.11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.62&lt;/td&gt;
&lt;td&gt;0.62.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.63&lt;/td&gt;
&lt;td&gt;0.63.5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Temporary workaround&lt;/strong&gt; if you can't upgrade immediately: block access to &lt;code&gt;/api/session/reset_password&lt;/code&gt;. Stopgap, not a fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cloud vs. self-hosted: read this twice
&lt;/h2&gt;

&lt;p&gt;The confirmed victims — Framework and Tally — were &lt;strong&gt;Metabase Cloud customers&lt;/strong&gt;. The breach happened at the vendor's end: attackers got into Metabase's managed platform, then into customer instances. Nobody at Framework or Tally "forgot to patch" anything; Metabase patched every Cloud customer automatically.&lt;/p&gt;

&lt;p&gt;That's the part that should worry self-hosted operators more, not less. The same flaw is present in every self-hosted install from 0.58 to 0.63 — and for those, &lt;strong&gt;you&lt;/strong&gt; are the vendor. The fix shipped within days of disclosure; applying it is entirely on whoever runs the instance.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A word of caution on attribution:&lt;/strong&gt; you may see other outlets mention LexisNexis alongside Framework and Tally as a third victim. LexisNexis did disclose a service disruption at a third-party vendor around the same time, affecting something it calls "Metabase API" — but that's LexisNexis's own news-aggregation product, a completely separate piece of software that happens to share the name. LexisNexis itself has not confirmed any link to this vulnerability. Worth flagging as a reminder to double-check attribution during a fast-moving incident, but not something to repeat as fact.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Compromise signature (check your logs)
&lt;/h2&gt;

&lt;p&gt;Metabase published the attack indicator: a &lt;strong&gt;POST to &lt;code&gt;/api/session/reset_password&lt;/code&gt; returning HTTP 400&lt;/strong&gt;, followed by a successful &lt;strong&gt;GET to &lt;code&gt;/api/user/current&lt;/code&gt;&lt;/strong&gt;. If your logs show that pairing, treat the instance as compromised — patching alone is not enough.&lt;/p&gt;

&lt;p&gt;Post-compromise cleanup per the advisory:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Revoke all active sessions — delete every row in the &lt;code&gt;core_session&lt;/code&gt; table&lt;/li&gt;
&lt;li&gt;Review API keys; remove any you don't recognize&lt;/li&gt;
&lt;li&gt;Review administrator accounts for unexpected changes&lt;/li&gt;
&lt;li&gt;Rotate credentials for &lt;strong&gt;every&lt;/strong&gt; connected database&lt;/li&gt;
&lt;li&gt;Review data-warehouse logs for unauthorized access&lt;/li&gt;
&lt;li&gt;Review Metabase activity and query history&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The pattern to internalize
&lt;/h2&gt;

&lt;p&gt;This is another incident where an unauthenticated, remotely reachable flaw in a &lt;em&gt;tool&lt;/em&gt; — not the main application — became the entry point to a database the tool was allowed to reach. Cloud users got patched for them; self-hosted users had to move within days. If you run any self-hosted tool that holds database credentials, version-check it this week — and don't assume your scanner will tell you first, because until this one gets a CVE, CVE-feed scanners won't know it exists.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://www.bleepingcomputer.com/news/security/framework-tally-disclose-metabase-data-theft-attacks" rel="noopener noreferrer"&gt;BleepingComputer&lt;/a&gt; · &lt;a href="https://github.com/metabase/metabase/security/advisories/GHSA-vwf4-m7j8-wcjf" rel="noopener noreferrer"&gt;Metabase advisory&lt;/a&gt; · &lt;a href="https://www.metabase.com/blog/security-update" rel="noopener noreferrer"&gt;Metabase security update&lt;/a&gt; · &lt;a href="https://www.secureinseconds.com/blog/2026-08-08-metabase-sqli-zero-day-check-instance" rel="noopener noreferrer"&gt;SecureInSeconds&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Full prevention-focused version: &lt;a href="https://wardenbit.com/posts/metabase-zero-day-sqli-what-website-owners-should-know/" rel="noopener noreferrer"&gt;WardenBit&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>cybersecurity</category>
      <category>database</category>
    </item>
    <item>
      <title>CVE-2026-8457: WooCommerce Social Login Auth Bypass — Forged Apple JWTs Take Over Accounts</title>
      <dc:creator>Stanley A.</dc:creator>
      <pubDate>Tue, 04 Aug 2026 14:08:00 +0000</pubDate>
      <link>https://dev.to/stanleya/cve-2026-8457-woocommerce-social-login-auth-bypass-forged-apple-jwts-take-over-accounts-14m6</link>
      <guid>https://dev.to/stanleya/cve-2026-8457-woocommerce-social-login-auth-bypass-forged-apple-jwts-take-over-accounts-14m6</guid>
      <description>&lt;p&gt;On August 1, 2026, Wordfence disclosed a &lt;strong&gt;critical authentication bypass&lt;/strong&gt; in the &lt;strong&gt;WooCommerce – Social Login&lt;/strong&gt; plugin (WPWeb Elite), tracked as &lt;strong&gt;CVE-2026-8457&lt;/strong&gt; (CVSS 9.8).&lt;/p&gt;

&lt;p&gt;The short version: the plugin's Apple login handler accepts an &lt;code&gt;id_token&lt;/code&gt;, decodes its base64 payload — and &lt;strong&gt;never verifies the JWT signature, issuer, audience, or expiry&lt;/strong&gt;. Combined with a login nonce that's publicly exposed via &lt;code&gt;wp_localize_script&lt;/code&gt;, an unauthenticated attacker can log in as &lt;strong&gt;any existing WordPress user, including administrators&lt;/strong&gt;, by forging a token whose payload contains the target's email.&lt;/p&gt;

&lt;p&gt;No password. No 2FA. No user interaction. Just an email address.&lt;/p&gt;

&lt;h2&gt;
  
  
  The technical breakdown
&lt;/h2&gt;

&lt;p&gt;The vulnerable flow, in pseudocode terms:&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="c1"&gt;// What the plugin does (vulnerable):&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;base64Decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id_token&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]));&lt;/span&gt;  &lt;span class="c1"&gt;// decode only&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getUserByEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;loginAs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// no signature check, no iss/aud/exp validation&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// What it should do:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jwt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;verifySignature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id_token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;APPLE_PUBLIC_KEYS&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// via JWKS&lt;/span&gt;
&lt;span class="nf"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jwt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;iss&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://appleid.apple.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jwt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;aud&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;YOUR_CLIENT_ID&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jwt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exp&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jwt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The two problems stack:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Missing JWT validation&lt;/strong&gt; — the handler decodes the payload without verifying it was signed by Apple (&lt;code&gt;CWE-289&lt;/code&gt;, Authentication Bypass by Alternate Name).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public nonce&lt;/strong&gt; — the security nonce required to invoke the login flow is emitted to unauthenticated users via a localized JS object on the login page, so there's no client-side gate either.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The plugin resolves the WordPress user &lt;strong&gt;by email from the forged payload, with no role exclusion&lt;/strong&gt;, and immediately issues an authenticated session.&lt;/p&gt;

&lt;h2&gt;
  
  
  Affected versions &amp;amp; fix
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Plugin&lt;/td&gt;
&lt;td&gt;WooCommerce – Social Login (WPWeb Elite, CodeCanyon)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Affected&lt;/td&gt;
&lt;td&gt;&amp;lt;= 2.8.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.8.8&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVSS&lt;/td&gt;
&lt;td&gt;9.8 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CWE&lt;/td&gt;
&lt;td&gt;CWE-289&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Researcher&lt;/td&gt;
&lt;td&gt;Rafie Muhammad (Lead Security Researcher, Patchstack — credited via Wordfence's PRISM researcher program)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disclosed&lt;/td&gt;
&lt;td&gt;August 1, 2026 (Wordfence Threat Intelligence)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exploitation status&lt;/td&gt;
&lt;td&gt;None confirmed at disclosure (Aug 1, 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;References:&lt;/strong&gt; &lt;a href="https://www.wordfence.com/threat-intel/vulnerabilities/id/53e83037-2cc5-4dc9-b55d-03829df12a65" rel="noopener noreferrer"&gt;Wordfence vulnerability entry&lt;/a&gt; · &lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2026-8457" rel="noopener noreferrer"&gt;NVD: CVE-2026-8457&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note: this is a &lt;strong&gt;CodeCanyon premium plugin&lt;/strong&gt; — updates don't flow through the usual WordPress.org free-plugin channel, so affected stores often patch late.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters to developers
&lt;/h2&gt;

&lt;p&gt;This is the &lt;strong&gt;third authentication-related flaw&lt;/strong&gt; Wordfence has logged for this plugin family:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2024-7503&lt;/strong&gt; (Aug 2024): Authentication Bypass to Account Takeover via loose comparison of an activation code, &lt;strong&gt;CVSS 9.8&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2024-10114&lt;/strong&gt; (Nov 2024): Authentication Bypass via WordPress.com OAuth provider — insufficient verification of the user returned by the token, &lt;strong&gt;CVSS 8.1&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2026-8457&lt;/strong&gt; (Aug 2026): Forged Apple JWT auth bypass, &lt;strong&gt;CVSS 9.8&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three critical-to-high auth bypasses in two years, all in the same "trust the token/claim without properly verifying it" family, is a pattern worth noting — not just a one-off bug.&lt;/p&gt;

&lt;p&gt;Auth code is genuinely hard to get right, and the pattern here — decode-then-trust instead of verify-then-trust — is one of the most common JWT mistakes in the wild. If you build or maintain WooCommerce sites:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Always verify JWTs against the provider's JWKS endpoint.&lt;/strong&gt; Signature first, then &lt;code&gt;iss&lt;/code&gt;, &lt;code&gt;aud&lt;/code&gt;, &lt;code&gt;exp&lt;/code&gt;, and any provider-specific claims (e.g. Apple's &lt;code&gt;nonce&lt;/code&gt; claim if you use the Sign in with Apple nonce).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never expose the auth nonce to unauthenticated clients.&lt;/strong&gt; If a nonce is in &lt;code&gt;wp_localize_script&lt;/code&gt;, it's not a security control — it's a formality.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resolve accounts with role exclusion in mind.&lt;/strong&gt; Even a legitimate flow shouldn't auto-login into an administrator account purely from a provider email without additional checks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat paid/CodeCanyon plugins as first-class update targets.&lt;/strong&gt; They don't get WordPress.org's auto-update pipeline; schedule manual checks or use a license-manager integration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Remediation checklist for affected stores
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Update to &lt;strong&gt;2.8.8&lt;/strong&gt; (via CodeCanyon downloads or the plugin's license-connected updater).&lt;/li&gt;
&lt;li&gt;Audit &lt;strong&gt;Users → All Users&lt;/strong&gt; for unrecognized admin accounts, especially created on/after Aug 1, 2026.&lt;/li&gt;
&lt;li&gt;Review access logs for unusual requests to the social-login callback endpoints around the disclosure window.&lt;/li&gt;
&lt;li&gt;Check for signs of post-exploitation (new admin users, unfamiliar plugins/themes installed, modified files, unexpected outbound requests) — not just the login itself, since a compromised admin session can be used to plant persistence.&lt;/li&gt;
&lt;li&gt;If you can't update immediately, consider disabling the &lt;strong&gt;Apple login provider&lt;/strong&gt; in plugin settings as a temporary mitigation — it disables the affected handler until you patch.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;CVE-2026-8457 is a reminder that "log in with X" buttons are only as safe as the verification code behind them. A missing signature check turned a customer convenience into a full account-takeover path. The fix is one version — but only if you know you run the plugin and you act before attackers decide it's worth their time.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://wardenbit.com/posts/woocommerce-social-login-auth-bypass-cve-2026-8457/?utm_source=devto&amp;amp;utm_medium=organic&amp;amp;utm_campaign=woocommerce-social-login-auth-bypass-cve-2026-8457" rel="noopener noreferrer"&gt;WardenBit&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>wordpress</category>
      <category>javascript</category>
    </item>
    <item>
      <title>AI Is Finding Bugs Faster Than You're Patching Them — What Website Owners Should Do Differently</title>
      <dc:creator>Stanley A.</dc:creator>
      <pubDate>Tue, 28 Jul 2026 14:21:00 +0000</pubDate>
      <link>https://dev.to/stanleya/ai-is-finding-bugs-faster-than-youre-patching-them-what-website-owners-should-do-differently-1679</link>
      <guid>https://dev.to/stanleya/ai-is-finding-bugs-faster-than-youre-patching-them-what-website-owners-should-do-differently-1679</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"As AI helps defenders discover more issues, customers will see a higher volume of security updates included in each security release."&lt;/em&gt;&lt;br&gt;
— Pavan Davuluri, Microsoft EVP, Windows + Devices, July 9, 2026&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Five days later, Microsoft shipped patches for &lt;strong&gt;570 security vulnerabilities&lt;/strong&gt; in a single Patch Tuesday — its largest release ever, and more than double the previous month's already-record count.&lt;/p&gt;

&lt;p&gt;That is not a sign that Windows got less secure. It is a sign that the way vulnerabilities are discovered has changed. AI tools are now scanning code at a scale and speed that human teams alone cannot match. More bugs found, more patches shipped, and a widening gap between when a vulnerability appears and when you actually fix it.&lt;/p&gt;

&lt;p&gt;If you maintain websites, web apps, or WordPress installations — and you think this is an enterprise-only concern — the data will change your mind.&lt;/p&gt;

&lt;h2&gt;
  
  
  The discovery acceleration is real
&lt;/h2&gt;

&lt;p&gt;The July 2026 Patch Tuesday was the sharpest point of a trend that has been building all year:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Period&lt;/th&gt;
&lt;th&gt;CVEs patched&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;July 2025&lt;/td&gt;
&lt;td&gt;137&lt;/td&gt;
&lt;td&gt;baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;June 2026&lt;/td&gt;
&lt;td&gt;~200–206&lt;/td&gt;
&lt;td&gt;previous record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;July 2026&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;570&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;largest Patch Tuesday ever&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First 7 months of 2026&lt;/td&gt;
&lt;td&gt;1,308&lt;/td&gt;
&lt;td&gt;nearly double the same period last year&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Microsoft attributes the surge to AI-assisted vulnerability discovery through its internal &lt;strong&gt;MDASH&lt;/strong&gt; (Multi-Model Agentic Scanning Harness) system. But the pattern extends well beyond Microsoft:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mozilla + Anthropic:&lt;/strong&gt; Claude Mythos Preview, an unreleased frontier model restricted to a small group of organizations under Anthropic's Project Glasswing, identified &lt;strong&gt;271 vulnerabilities&lt;/strong&gt; in Firefox in a single evaluation pass — all patched in Firefox 150. That's roughly 12× the number found by the previous model used in the same collaboration (Opus 4.6, which found 22 security-sensitive bugs in a two-week engagement, shipped in Firefox 148). Worth noting: Mozilla and outside commentators have pushed back on calling all 271 "zero-days" — most were bugs an elite human researcher could plausibly have found too; the real story is the speed, not exotic new bug classes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cisco:&lt;/strong&gt; Shifting to a &lt;strong&gt;twice-monthly security disclosure schedule&lt;/strong&gt; (1st and 3rd Wednesdays) with seven days' advance notice of which product families are affected, explicitly citing AI-accelerated vulnerability discovery as the reason.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Oracle:&lt;/strong&gt; Its most recent quarterly update included &lt;strong&gt;1,449 security patches&lt;/strong&gt;, which it also links to AI-assisted internal scanning.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;U.S. Executive Order 14409, "Promoting Advanced Artificial Intelligence Innovation and Security" (signed June 2, 2026), directs the Treasury Department, in consultation with the National Cyber Director, NSA, and CISA, to stand up an AI cybersecurity clearinghouse that coordinates vulnerability scanning, validation, and patch distribution across government and industry.&lt;/p&gt;

&lt;p&gt;The message from every major vendor is similar: AI finds bugs faster than before. That pace does not look like it's slowing down.&lt;/p&gt;

&lt;h2&gt;
  
  
  The wp2shell case study: patched fast, exploited even faster
&lt;/h2&gt;

&lt;p&gt;One week before the July Patch Tuesday, the WordPress Security Team released an emergency patch for a vulnerability chain dubbed &lt;strong&gt;wp2shell&lt;/strong&gt;. Two bugs in WordPress core — CVE-2026-63030 (a REST API batch-route confusion flaw) and CVE-2026-60137 (SQL injection in &lt;code&gt;WP_Query&lt;/code&gt;) — could be chained to let an unauthenticated attacker take complete control of a stock WordPress install. No plugins required. No login required. Just a crafted HTTP request.&lt;/p&gt;

&lt;p&gt;The chain was found by Adam Kues at Searchlight Cyber, who pointed &lt;strong&gt;OpenAI's GPT-5.6 Sol Ultra&lt;/strong&gt; at a stripped-down copy of the WordPress source (with git history removed, so the model couldn't just trace old bug fixes) and let it search for a pre-auth-to-RCE path. The AI-assisted portion of the work took roughly &lt;strong&gt;10 hours&lt;/strong&gt; and about $25 in API usage. It's worth being precise about what that means, though: Kues still defined the target, wrote the prompt, verified the SQL injection by hand against a live install, and then spent additional time afterward untangling the escalation chain the model produced. As Kues himself put it, the shift isn't that AI replaced the researcher — it's that the researcher's role moved up a level, from writing exploit code to steering and verifying it. Even accounting for that, a chain this complex against a target this hardened would very likely have taken a human team weeks, not a single working session.&lt;/p&gt;

&lt;p&gt;Then the timeline compressed:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Time elapsed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Patch ships (7.0.2 / 6.9.5 / 6.8.6)&lt;/td&gt;
&lt;td&gt;T+0 (Friday)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First mitigation rules seeing exploit attempts&lt;/td&gt;
&lt;td&gt;T+~90 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public PoC exploit code&lt;/td&gt;
&lt;td&gt;T+overnight&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mass scanning + confirmed in-the-wild exploitation&lt;/td&gt;
&lt;td&gt;T+1–2 days&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At the time of disclosure, WordPress's own statistics showed &lt;strong&gt;400+ million sites&lt;/strong&gt; running an affected version. That number doesn't reflect sites patched since — and here the actual news is more encouraging than it might sound: security consultant Daniel Card sampled roughly 3,500–4,200 WordPress sites and estimated that &lt;strong&gt;fewer than 15% remained unpatched/vulnerable&lt;/strong&gt; days after disclosure, thanks largely to WordPress's forced auto-update mechanism and Cloudflare's WAF rules. That's the good news. The bad news is that even a small vulnerable percentage of a 400-million-site ecosystem is still on the order of &lt;strong&gt;90 million exposed sites&lt;/strong&gt; — and that's the segment this article is really about: the sites where auto-update was disabled, delayed, or silently failed.&lt;/p&gt;

&lt;p&gt;The implication for developers and DevOps: the window between "patch available" and "attackers exploiting at scale" is now measured in hours, and being in the "small percentage that didn't auto-update" is no longer a safe place to be.&lt;/p&gt;

&lt;h2&gt;
  
  
  The exploitation gap is a configuration problem
&lt;/h2&gt;

&lt;p&gt;For teams managing multiple sites or deployments, the gap between "patch ships" and "site is protected" is not just an awareness problem. It is a configuration problem:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Auto-update disabled&lt;/strong&gt; — many managed WordPress deployments disable core auto-updates for stability. The tradeoff: every emergency patch requires manual intervention.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No verification&lt;/strong&gt; — auto-update runs but no one confirms the version number post-update. wp2shell triggered forced auto-updates, but only for installations that hadn't opted out.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plugin compatibility stalls&lt;/strong&gt; — "we'll update after we test plugin X" is a rational response that becomes a week-long exposure window.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No centralized version inventory&lt;/strong&gt; — teams running 10, 20, or 50 WordPress sites often have no dashboard showing which versions are live.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hosting provider patching lag&lt;/strong&gt; — your site may be patched, but the server OS, PHP version, or database underneath may not be.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What to implement this week
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Verify auto-update configuration
&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;# Check WordPress auto-update settings&lt;/span&gt;
wp option get auto_update_core
wp option get auto_update_plugins
wp option get auto_update_themes

&lt;span class="c"&gt;# Check current version across all sites&lt;/span&gt;
wp core version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If auto-update is disabled, enable it for minor and security releases at minimum. Major-version auto-update is a separate risk decision, but security releases should never be deferred.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Add a post-update verification step to your deploy pipeline
&lt;/h3&gt;

&lt;p&gt;After any WordPress update, automatically run something like:&lt;br&gt;
&lt;/p&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="nt"&gt;-q&lt;/span&gt; &lt;span class="s2"&gt;"7.0.2"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"PATCHED"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"VULNERABLE"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fail the deploy if the version doesn't match the expected security release.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Build a version inventory
&lt;/h3&gt;

&lt;p&gt;For teams managing multiple WordPress instances, maintain a simple manifest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&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;"site"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"wp_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"7.0.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"last_checked"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-25"&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="nl"&gt;"site"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"shop.example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"wp_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"7.0.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"last_checked"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-25"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Automate it with a daily cron job that checks &lt;code&gt;wp core version&lt;/code&gt; or queries the REST API:&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; https://example.com/wp-json/wp/v2/ | jq &lt;span class="s1"&gt;'.namespaces'&lt;/span&gt;
&lt;span class="c"&gt;# Or check the generator meta tag:&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://example.com/ | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'content="[0-9.]*"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Run a baseline security scan
&lt;/h3&gt;

&lt;p&gt;External scans check SSL configuration, security headers, DNS records, email authentication, CMS version fingerprinting, and known technology exposures — 40+ categories. This is not a penetration test; it's a hygiene check that tells you your public exposure profile before an attacker does.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Write your 24-hour response checklist
&lt;/h3&gt;

&lt;p&gt;Not a 30-page incident response plan. A literal checklist for the next critical disclosure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check the version on every site you manage&lt;/li&gt;
&lt;li&gt;Apply the patch (or confirm auto-update ran)&lt;/li&gt;
&lt;li&gt;Verify the version number post-update&lt;/li&gt;
&lt;li&gt;Run a file integrity check for recently modified PHP files&lt;/li&gt;
&lt;li&gt;Review access logs for suspicious requests&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Repeat this sequence for every critical security release. It's worth more than any security product purchased after the fact.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers that matter
&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;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;Microsoft July 2026 CVEs&lt;/td&gt;
&lt;td&gt;570 (record)&lt;/td&gt;
&lt;td&gt;Krebs on Security, BleepingComputer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First 7 months of 2026 CVEs&lt;/td&gt;
&lt;td&gt;1,308 (~2× prior year)&lt;/td&gt;
&lt;td&gt;Windows Latest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firefox vulnerabilities found by Mythos&lt;/td&gt;
&lt;td&gt;271 in one evaluation pass&lt;/td&gt;
&lt;td&gt;Mozilla Blog&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WordPress sites on a vulnerable version&lt;/td&gt;
&lt;td&gt;400M+ (at disclosure)&lt;/td&gt;
&lt;td&gt;WordPress.org, via TechCrunch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Estimated share still vulnerable days later&lt;/td&gt;
&lt;td&gt;&amp;lt;15% (≈90M sites)&lt;/td&gt;
&lt;td&gt;Daniel Card, via TechCrunch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wp2shell AI-assisted discovery time&lt;/td&gt;
&lt;td&gt;~10 hours (human-steered)&lt;/td&gt;
&lt;td&gt;Searchlight Cyber / Dark Reading&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First exploit attempts after patch&lt;/td&gt;
&lt;td&gt;~90 minutes&lt;/td&gt;
&lt;td&gt;Patchstack, via The Repository&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Key takeaway
&lt;/h2&gt;

&lt;p&gt;AI-accelerated vulnerability discovery is not a future problem. It's the current operating environment. The bottleneck has shifted from finding bugs to patching and verifying them fast enough — and the wp2shell numbers actually cut both ways: most of the WordPress ecosystem patched quickly thanks to forced auto-updates, but the exposed minority is still tens of millions of sites, and the attackers only need one of them.&lt;/p&gt;

&lt;p&gt;For developers and DevOps teams: your patching pipeline, version verification, and configuration management are now first-class security controls, not just operational hygiene. The teams that handle the next wp2shell-level event best will be the ones that have already automated the verification step — not the ones relying on "we'll get to it this week."&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://wardenbit.com/posts/ai-is-finding-bugs-faster-than-youre-patching-them-what-website-owners-should-do-differently/?utm_source=devto&amp;amp;utm_medium=organic&amp;amp;utm_campaign=ai-finding-bugs-faster-than-patching" rel="noopener noreferrer"&gt;WardenBit&lt;/a&gt; — helping small businesses understand their security exposure before attackers do.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>cybersecurity</category>
      <category>devops</category>
      <category>javascript</category>
    </item>
    <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>
  </channel>
</rss>
