<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>OwnerTrail articles</title>
    <link>https://ownertrail.decodeinfy.in/articles/</link>
    <atom:link href="https://ownertrail.decodeinfy.in/articles/feed.xml" rel="self" type="application/rss+xml"/>
    <description>WordPress plugin security: who controls the plugins on your site, whether their code is genuine, and what Google is shown.</description>
    <language>en</language>
    <lastBuildDate>Mon, 26 Oct 2026 00:00:00 GMT</lastBuildDate>
    <item>
      <title>Is This WordPress Plugin Safe? A 5-Minute Check</title>
      <link>https://ownertrail.decodeinfy.in/articles/is-this-wordpress-plugin-safe/</link>
      <guid isPermaLink="true">https://ownertrail.decodeinfy.in/articles/is-this-wordpress-plugin-safe/</guid>
      <pubDate>Mon, 26 Oct 2026 00:00:00 GMT</pubDate>
      <description>Learn how to verify if a WordPress plugin is safe before installing or keeping it by checking ownership, commit history, closure status, and support forums.</description>
      <content:encoded><![CDATA[<p><img src="https://ownertrail.decodeinfy.in/images/articles/is-this-wordpress-plugin-safe.png" alt="A flat vector illustration showing a inspection checklist next to a plugin repository page."></p>
<p><em>Before installing a plugin or keeping an old one, spend five minutes checking who maintains it, when it was last updated, its SVN commits, and its support threads.</em></p>

          <h2 id="check-developer-and-ownership">Check the developer profile and ownership history</h2>

          <p>When evaluating a plugin on WordPress.org, start by looking at who currently owns and maintains the project. Ownership of popular plugins can change hands quietly when original developers sell their work to commercial entities or third-party maintainers.</p><p>To inspect the plugin maintainer on WordPress.org, follow these steps:</p><ol><li>Go to the plugin page on WordPress.org.</li><li>Look at the sidebar under the <strong>Author</strong> field, or directly below the main title.</li><li>Click the maintainer's username to view their WordPress.org public profile.</li><li>Check how long the account has existed and what other plugins or contributions are attached to it.</li></ol><p>A sudden shift in authorship—such as a plugin transferring from a long-time open-source contributor to a newly registered account or an aggressive marketing agency—warrants further examination. If you want to dive deeper into tracking maintainers, see our detailed guide on <a href="https://ownertrail.decodeinfy.in/articles/how-to-check-who-owns-a-wordpress-plugin/">how to check who owns a WordPress plugin</a>.</p>

          <h2 id="look-for-warning-flags">Look for warning flags on WordPress.org</h2>

          <p>WordPress.org displays specific indicators directly on a plugin's main page when potential issues arise or when maintenance stalls. Before downloading any zip file or clicking install, review these key metadata points on the right-hand sidebar:</p><ul><li><strong>Last Updated:</strong> Check when the maintainer last pushed an update. If a plugin has not received an update in over two years, WordPress.org displays a prominent notice warning that it has not been tested with recent major WordPress releases.</li><li><strong>Closure Banners:</strong> If WordPress.org closes a plugin, a red or yellow banner appears at the top of the page stating that the plugin is no longer available for download.</li><li><strong>Tested up to:</strong> Compare the maximum tested WordPress version listed on the page against your current core version.</li></ul><p>A closed plugin does not immediately break your site, but it means no future updates or security patches will be published through the official directory. If you discover an installed plugin has been removed, read our overview on <a href="https://ownertrail.decodeinfy.in/articles/wordpress-plugin-closed-what-to-do/">what to do when a WordPress plugin is closed</a>.</p>

          <h2 id="inspect-svn-commit-history">Inspect the public SVN commit history</h2>

          <p>Every plugin hosted on WordPress.org stores its code in a public Subversion (SVN) repository. You can view every code change, commit message, and committer account directly through your browser without downloading the plugin.</p><p>To review the public commit log:</p><ol><li>Navigate to the plugin page on WordPress.org.</li><li>Click the <strong>Development</strong> tab in the navigation menu below the plugin title.</li><li>Click the link for <strong>Development Log</strong> or browse the <strong>SVN repository</strong> directly.</li><li>Review the recent commit entries for unexpected changes, such as new accounts pushing massive code updates after months or years of inactivity.</li></ol><p>Pay attention to sudden modifications in obfuscated external API calls, unexpected remote file requests, or structural rewrites pushed by unfamiliar username handles. For step-by-step instructions on reading repository logs, see our guide on <a href="https://ownertrail.decodeinfy.in/articles/reading-a-wordpress-plugin-svn-commit-history/">reading a WordPress plugin SVN commit history</a>.</p>

          <h2 id="review-support-forum">Review the support forum and user reports</h2>

          <p>The official support forum on WordPress.org provides real-time signal regarding whether a plugin functions predictably or introduces unwanted changes. User reports often highlight problems weeks before official notices are posted elsewhere.</p><p>Click on the <strong>Support</strong> tab on the plugin page and check these key areas:</p><ul><li><strong>Resolved Threads:</strong> Look at the ratio of resolved to unresolved topics over the past two months.</li><li><strong>Specific Error Complaints:</strong> Look for threads reporting unexpected external redirects, unwanted promotional popups, unknown admin accounts, or unexplained performance drops.</li><li><strong>Developer Responses:</strong> Check whether the plugin team responds professionally to bug reports, or if support threads are ignored entirely.</li></ul><p>If multiple users report that a recent update altered plugin behavior without documentation, hold off on updating or installing until the maintainers address the issue publicly.</p>

          <h2 id="audit-installed-plugins-wp-admin">Audit installed plugins inside wp-admin</h2>

          <p>Checking plugins is not just a task for new installations; existing plugins on your site must be checked regularly. Inactive or unmaintained plugins remain on your server's disk and can pose unnecessary risks if neglected.</p><p>Perform a quick monthly check inside your dashboard by doing the following:</p><ol><li>Log in to your site and go to <code>Plugins &gt; Installed Plugins</code>.</li><li>Filter by <strong>Inactive</strong> plugins. Deactivate and fully delete any plugin you no longer use. Leaving unused code on your server increases your attack surface.</li><li>Click <strong>View details</strong> on remaining active plugins to check their current version, author links, and compatibility notes directly from wp-admin.</li><li>Verify that the plugin author link points to the expected domain and developer.</li></ol><p>If a plugin changes author, or its updates have ceased altogether, decide whether to keep the plugin or find an actively maintained alternative.</p>

          <h2 id="ownertrail">Automate plugin safety checks with OwnerTrail</h2>

          <p><a href="https://wordpress.org/plugins/ownertrail/">OwnerTrail</a> is a free WordPress plugin available on WordPress.org that checks your site and its plugins for you, every day.</p><p>It does the checks above on its own, every day:</p><ul><li>It checks WordPress core, plugin, and theme files against the official releases published on WordPress.org.</li><li>It looks inside files that are not part of any official release, such as PHP in your uploads folder, for the telltale shapes of malware.</li><li>It opens your pages the way Google does, to catch spam that hackers show only to search engines, such as the Japanese keyword hack.</li><li>It notices when a plugin gets a new owner or a new developer, when an abandoned plugin suddenly updates, and when WordPress.org closes a plugin.</li><li>It gives every plugin a trust score from 0 to 100, and can email you when something needs your attention.</li><li>When a plugin changes hands, it holds that plugin's next update until you have looked (free, from version 1.3.6).</li><li>Its Code lock means code on your site can only be changed over FTP, unless you loosen it.</li></ul><p>In a historical replay against 31 backdoored plugins from 2025–2026, OwnerTrail generated warnings on all 31 plugins between 41 and 321 days before the backdoors activated, with a median lead time of 139 days. OwnerTrail detects irregularities and warns the site owner. It is not a firewall: pair it with one, and with backups.</p>

          <aside class="article-note">
            <p><strong>About OwnerTrail.</strong> A free WordPress plugin that watches who controls every plugin on your site, flags plugins WordPress.org has closed, checks your code against WordPress.org's fingerprints, and fetches your pages as Googlebot to catch spam shown only to search engines. It detects; it is not a firewall. <a href="https://wordpress.org/plugins/ownertrail/">Free on WordPress.org</a>.</p>
          </aside>

          <p class="article-related">Related: <a href="https://ownertrail.decodeinfy.in/articles/how-to-check-who-owns-a-wordpress-plugin/">How to check who owns a WordPress plugin</a> and <a href="https://ownertrail.decodeinfy.in/articles/wordpress-plugin-closed-what-to-do/">A WordPress plugin was closed: what it means and what to do</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Japanese keyword hack: SEO spam that hides from you and shows itself to Google</title>
      <link>https://ownertrail.decodeinfy.in/articles/wordpress-japanese-keyword-hack-googlebot-cloaking/</link>
      <guid isPermaLink="true">https://ownertrail.decodeinfy.in/articles/wordpress-japanese-keyword-hack-googlebot-cloaking/</guid>
      <pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate>
      <description>How cloaked SEO spam shows pharma and Japanese pages to Googlebot while your own browser sees a clean site, and how a Googlebot canary catches it.</description>
      <content:encoded><![CDATA[<p><img src="https://ownertrail.decodeinfy.in/images/articles/wordpress-japanese-keyword-hack-googlebot-cloaking.png" alt="The same page requested twice: a clean homepage to a browser, and a wall of Japanese and pharma links to Googlebot."></p>
<p><em>You open your site and it looks fine. Google has indexed hundreds of pages you never wrote. That gap is the whole trick, and it is checkable.</em></p>

          <p>The <strong>Japanese keyword hack</strong> is one of the most common WordPress compromises, and one of the hardest for an owner to notice. The attacker does not deface your site. They add pages, thousands of them, selling counterfeit goods or pharmaceuticals, and they show those pages only to search engines. To you, logged in or just visiting, the site looks exactly as it did.</p>

          <h2 id="cloaking">Why you cannot see it</h2>

          <p>The injected code checks who is asking for the page. It reads the <code>User-Agent</code> header, and sometimes the visitor's IP or where they arrived from. If the request looks like Googlebot, it serves the spam. If it looks like an ordinary browser, it serves your real page. This is <strong>cloaking</strong>: one URL, two different answers.</p>

          <p>So the damage lands entirely in Google's index. Your rankings get hijacked, your listings sprout Japanese titles, and Google eventually flags the site as hacked, all while your own browser shows nothing wrong.</p>

          <h2 id="where">Where it hides</h2>

          <ul>
            <li>A few lines prepended to <code>wp-config.php</code> or <code>index.php</code>, so the code runs before WordPress on every request.</li>
            <li>A PHP file dropped into <code>wp-content/uploads</code> and pulled in by an <code>.htaccess</code> or <code>.user.ini</code> rule.</li>
            <li>A changed core or plugin file that no longer matches the genuine release.</li>
            <li>A rewritten <code>robots.txt</code> or a fake <code>sitemap.xml</code> pointing Google at the spam.</li>
          </ul>

          <h2 id="check">How to check for it by hand</h2>

          <p>Ask your own site for a page the way Googlebot would, and compare it with an ordinary request:</p>

          <pre><code>curl -s https://example.com/ | wc -c
curl -s -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" https://example.com/ | wc -c</code></pre>

          <p>If the two pages differ in size, title, language, or links, and you did not build them to, that is cloaking. Also search Google for <code>site:example.com</code> and look for pages and languages you never published.</p>

          <p>One caution: a cloaked page does not always answer a spoofed Googlebot from the wrong IP. Serious attackers verify the request really comes from Google's address range, so a single curl can come back clean. The reliable tell is the gap between what Google has indexed and what your site actually contains.</p>

          <h2 id="canary">The Googlebot canary, every day</h2>

          <p><a href="https://ownertrail.decodeinfy.in/">OwnerTrail</a> runs this comparison for you, once a day, from your own server. It requests a handful of your pages three ways, as an ordinary browser, as Googlebot, and as a visitor arriving from a Google search, and compares the answers: the title, the language, the size, the links, and any redirect to another site.</p>

          <ul>
            <li>Spam shown only to the crawler, a redirect that fires only for search visitors, or a sudden wall of links one view has and the others do not, is reported as a serious finding and emailed within the hour.</li>
            <li>It ignores the differences that are not cloaking: a firewall refusing a spoofed Googlebot (a 403 or 503), and the nonces, cache-busters and tracking tags that change on every request.</li>
            <li>No page content leaves your site.</li>
          </ul>

          <p>It will not remove the spam for you, that is a clean-up job, but it ends the months of not knowing. The sooner you see the gap, the less of your ranking you lose.</p>

          <aside class="article-note">
            <p><strong>About OwnerTrail.</strong> A free WordPress plugin that checks every code file against WordPress.org's official fingerprints daily, reads unverified files for the shapes malware takes, asks your own pages as Googlebot to catch cloaked SEO spam, and watches who controls each plugin. No telemetry. <a href="https://ownertrail.decodeinfy.in/">How it works</a>.</p>
          </aside>

          <p class="article-related">Related: <a href="https://ownertrail.decodeinfy.in/articles/php-files-in-wordpress-uploads-folder-polyglot-malware/">PHP files hidden in your uploads folder</a> and <a href="https://ownertrail.decodeinfy.in/articles/wordpress-file-integrity-check/">how to check your files are genuine</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>A PHP file in your uploads folder is never supposed to be there</title>
      <link>https://ownertrail.decodeinfy.in/articles/php-files-in-wordpress-uploads-folder-polyglot-malware/</link>
      <guid isPermaLink="true">https://ownertrail.decodeinfy.in/articles/php-files-in-wordpress-uploads-folder-polyglot-malware/</guid>
      <pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate>
      <description>How backdoors hide in wp-content/uploads as PHP, as .ico and image polyglots, and behind .user.ini overrides, and how to find and quarantine them.</description>
      <content:encoded><![CDATA[<p><img src="https://ownertrail.decodeinfy.in/images/articles/php-files-in-wordpress-uploads-folder-polyglot-malware.png" alt="An uploads folder of images, with one file quietly carrying a PHP tag highlighted among them."></p>
<p><em>The uploads folder holds pictures and documents. It should never hold code. When it does, that code was almost always put there to run a backdoor.</em></p>

          <p>WordPress writes uploads to <code>wp-content/uploads</code>: images, PDFs, the odd zip. Nothing there is ever meant to be executable PHP. So a <code>.php</code> file in uploads is one of the clearest signals of a compromise there is, and attackers know the folder is writable, rarely watched, and excluded from most integrity checks.</p>

          <h2 id="shapes">The shapes it takes</h2>

          <ul>
            <li><strong>Plain PHP, oddly named.</strong> A file like <code>wp-content/uploads/2026/10/.cache.php</code> or <code>icon-cache.php</code>, holding a web shell that runs whatever a request sends it.</li>
            <li><strong>Polyglot images.</strong> A real image header followed by PHP, saved as <code>.ico</code>, <code>.gif</code> or <code>.png</code>. It opens as a picture and runs as code. A favicon named <code>.f4812a.ico</code> is a classic.</li>
            <li><strong>Payloads inside fonts or compressed blobs.</strong> PHP or a zlib-compressed loader tucked into a <code>.woff</code>, <code>.ttf</code> or <code>.dat</code> file that something else pulls in.</li>
            <li><strong>Execution overrides.</strong> A <code>.user.ini</code> or <code>.htaccess</code> in an uploads subfolder that sets <code>auto_prepend_file</code>, or <code>AddType application/x-httpd-php .jpg</code>, so the server runs images as PHP.</li>
          </ul>

          <h2 id="find">Finding them by hand</h2>

          <p>List executable code where only media belongs:</p>

          <pre><code>find wp-content/uploads -type f \( -name '*.php*' -o -name '*.phtml' \)
grep -rl '&lt;?php' wp-content/uploads
find wp-content/uploads -name '.user.ini' -o -name '.htaccess'</code></pre>

          <p>Anything the first two commands return is worth opening. A <code>.user.ini</code> or <code>.htaccess</code> deep in uploads almost never belongs there. Do not just delete what you find until you have a copy: a backdoor is also evidence of how they got in.</p>

          <h2 id="radar">What the R7 radar reads</h2>

          <p><a href="https://ownertrail.decodeinfy.in/">OwnerTrail</a> treats uploads, and the other folders where code never belongs, as code-free zones. Any PHP there is reported as unexpected. Beyond the name, it reads the file for the shapes malware takes, the same way a human reviewer would:</p>

          <ul>
            <li>PHP after an image or font header (a polyglot), and compressed or encoded payloads.</li>
            <li>Code that runs, decodes or includes whatever a request sends it.</li>
            <li><code>.htaccess</code> and <code>.user.ini</code> rules that switch PHP execution back on.</li>
            <li>The same reading applied to the files that run before WordPress, such as <code>wp-config.php</code> and <code>index.php</code>, whose contents never leave the file.</li>
          </ul>

          <p>On a very large uploads folder it works in short time-slices and picks up where it left off, so even tens of thousands of files get read without stalling the site.</p>

          <h2 id="quarantine">Quarantine, not delete</h2>

          <p>Finding the file is half the job. With <a href="https://ownertrail.decodeinfy.in/#pricing">OwnerTrail Pro</a> you move an unexpected file into a sealed vault in one click: it is taken out of the web root into a folder the server refuses to serve or run, under a random name with no extension, and it can be put back if you were wrong. Nothing is destroyed, and the file stops running at once. The files that would take the site down if moved, WordPress's own start-up files and known firewall bootstraps, are never touched.</p>

          <aside class="article-note">
            <p><strong>About OwnerTrail.</strong> A free WordPress plugin that reports unexpected code in uploads and reads it for malware shapes, checks every file against WordPress.org's official fingerprints daily, and watches who controls each plugin. Pro quarantines and restores files in one click. No telemetry. <a href="https://ownertrail.decodeinfy.in/">How it works</a>.</p>
          </aside>

          <p class="article-related">Related: <a href="https://ownertrail.decodeinfy.in/articles/wordpress-japanese-keyword-hack-googlebot-cloaking/">the Japanese keyword hack</a> and <a href="https://ownertrail.decodeinfy.in/articles/wordpress-file-integrity-check/">how to check your files are genuine</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Verifying a premium plugin when WordPress.org has no checksum for it</title>
      <link>https://ownertrail.decodeinfy.in/articles/verify-premium-wordpress-plugin-integrity-checksums/</link>
      <guid isPermaLink="true">https://ownertrail.decodeinfy.in/articles/verify-premium-wordpress-plugin-integrity-checksums/</guid>
      <pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate>
      <description>Paid plugins have no public fingerprints to check against. How to verify their files against the vendor's own zip, including in-memory fingerprinting.</description>
      <content:encoded><![CDATA[<p><img src="https://ownertrail.decodeinfy.in/images/articles/verify-premium-wordpress-plugin-integrity-checksums.png" alt="The vendor's original zip on the left, the plugin's installed files on the right, each one matched against it."></p>
<p><em>WordPress.org publishes a fingerprint for every file of every free plugin. For the paid plugin you bought elsewhere, there is nothing to check against, unless you bring your own reference.</em></p>

          <p>For a plugin from the directory, checking integrity is easy: WordPress.org publishes the fingerprint of every file it ships, and <code>wp plugin verify-checksums</code> compares your copy against it. For a <strong>premium plugin</strong>, bought from the vendor and installed by upload, none of that exists. There is no public release, no published fingerprint, no history to read.</p>

          <p>That is a real gap. Premium page builders, form plugins and themes are exactly the high-value targets a supply-chain attacker goes after, and they are the ones you cannot check the usual way.</p>

          <h2 id="first-seen">First-seen is a weak reference</h2>

          <p>Most tools fall back to "first-seen": they record the files the first time they look, and tell you if anything changes afterwards. That is useful for catching a later change, but it proves nothing about the starting point. If the plugin was already tampered with when it was first installed, the bad files become the baseline, and every check says fine.</p>

          <h2 id="vendor-zip">Check against the vendor's own zip</h2>

          <p>The genuine reference for a premium plugin is the zip the vendor gave you. Keep the original download. To verify a file by hand, unzip the vendor archive to a clean folder and compare:</p>

          <pre><code># hash a file on the site and the same file from the vendor zip
sha256sum wp-content/plugins/acme-pro/includes/core.php
unzip -p acme-pro-4.2.0.zip acme-pro/includes/core.php | sha256sum</code></pre>

          <p>If the two hashes match, that file is byte for byte what the vendor shipped. Doing this for every file, by hand, across a few updates, is where it falls apart in practice.</p>

          <h2 id="in-memory">In-memory fingerprinting on the Code screen</h2>

          <p><a href="https://ownertrail.decodeinfy.in/">OwnerTrail</a> does the whole comparison for you. On the Code screen you drop the vendor's original <code>.zip</code> onto the plugin or theme. OwnerTrail reads it in memory, fingerprints every file inside, and checks your installed copy against that genuine archive rather than against a first-seen guess.</p>

          <ul>
            <li>The zip is read in memory and deleted at once; it is never unpacked onto the server and never kept.</li>
            <li>Large archives are bounded, so a crafted zip cannot exhaust memory or disk.</li>
            <li>From then on, any file that differs from the vendor's release is named, and with <a href="https://ownertrail.decodeinfy.in/#pricing">Pro</a> you can restore the genuine file from that same zip in one click.</li>
          </ul>

          <h2 id="limit">What this still cannot catch</h2>

          <p>If the vendor's own build was poisoned before they shipped it, their zip and your files agree, because both are the tampered release. No fingerprint check, theirs or yours, sees that. The earlier signal is provenance: a plugin changing hands, a new name with commit access. That is why OwnerTrail watches ownership as well as code, and why it says plainly it belongs alongside a vulnerability scanner, not instead of one.</p>

          <aside class="article-note">
            <p><strong>About OwnerTrail.</strong> A free WordPress plugin that checks directory plugins against WordPress.org's fingerprints, verifies premium plugins and themes against the vendor's own zip (read in memory), and watches who controls each plugin. No telemetry. <a href="https://ownertrail.decodeinfy.in/">How it works</a>.</p>
          </aside>

          <p class="article-related">Related: <a href="https://ownertrail.decodeinfy.in/articles/wordpress-file-integrity-check/">how to check your files are genuine</a> and <a href="https://ownertrail.decodeinfy.in/articles/how-to-check-who-owns-a-wordpress-plugin/">how to check who owns a plugin</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>EssentialPlugin backdoor, replayed: 31 of 31 warned</title>
      <link>https://ownertrail.decodeinfy.in/articles/the-essentialplugin-backdoor-replayed/</link>
      <guid isPermaLink="true">https://ownertrail.decodeinfy.in/articles/the-essentialplugin-backdoor-replayed/</guid>
      <pubDate>Thu, 01 Oct 2026 00:00:00 GMT</pubDate>
      <description>We ran OwnerTrail's rules against the history of the 31 WordPress plugins backdoored in 2026. All 31 would have warned, a median of 139 days early.</description>
      <content:encoded><![CDATA[<p><img src="https://ownertrail.decodeinfy.in/images/articles/the-essentialplugin-backdoor-replayed.png" alt="A chart of thirty-one rows, one per closed plugin. Each row starts with a blue dot on the day OwnerTrail would have warned and runs to a dark bar on the right, the day the backdoor switched on. Most dots sit months before the bar."></p>
<p><em>Thirty-one plugins, one backdoor, eight months of silence. We replayed OwnerTrail's rules against what was public at the time, week by week, to see when it would have spoken up.</em></p>

          <p><strong>The short answer: yes, on all 31.</strong> Every plugin would have raised OwnerTrail's high-severity &ldquo;new committer&rdquo; finding, naming the account that shipped the backdoor, within a week of that account's first commit. The warning would have arrived <strong>41 to 321 days before the backdoor switched on</strong>, with a median of 139 days.</p>

          

          <p>This page shows how we tested that, what OwnerTrail would and would not have done, and the limits of the claim.</p>

          <h2 id="what-happened">What happened</h2>

          <ul>
            <li>Around May 2025 a buyer acquired a portfolio of more than thirty WordPress plugins on Flippa for a reported six-figure sum, and with it their commit access.</li>
            <li>The new owner's first release, on 8 August 2025, carried a backdoor. It did nothing for eight months.</li>
            <li>Around 5 April 2026 it switched on: it rewrote <code>wp-config.php</code> and injected spam pages and redirects across roughly 400,000 declared installs.</li>
            <li>On 7 April 2026 the WordPress Plugins Team closed all 31 plugins in a single day.</li>
          </ul>

          <p>WordPress.org checks that the old owner agreed to a transfer. It does not vet the buyer, review the new owner's first release, or tell anyone running the plugin that it changed hands. That gap is <a href="https://meta.trac.wordpress.org/ticket/5509" target="_blank" rel="noopener">documented and still open</a>.</p>

          <h2 id="method">How we replayed it</h2>

          <ul>
            <li><strong>The data:</strong> each plugin's full commit history from <code>plugins.svn.wordpress.org</code>, fetched with the same request OwnerTrail makes. It is still public after the closure.</li>
            <li><strong>The site:</strong> OwnerTrail installed on 6 January 2025, scanning once a week. It actually scans daily, so weekly is the cautious case.</li>
            <li><strong>The rules:</strong> two of OwnerTrail's detection rules, unchanged in their logic: a first commit by an account not seen before (high severity), and a release after 180 or more days without commits (medium).</li>
            <li><strong>Not replayed:</strong> the change of listed author and contributors, because the directory data for closed plugins is gone. Real installs would have had that signal too.</li>
          </ul>

          <h2 id="results">What it found</h2>

          <div class="table-wrap">
            <table class="article-table">
              <thead><tr><th>Signal</th><th>Plugins</th><th>When</th></tr></thead>
              <tbody>
                <tr><td>New committer, the account that shipped the backdoor (high)</td><td>31 of 31</td><td>18 on 17 November 2025; the rest between May 2025 and February 2026</td></tr>
                <tr><td>Released again after a long silence (medium), first</td><td>10 of 31</td><td>January to May 2025, around the handover</td></tr>
                <tr><td>Earliest warning</td><td>1</td><td>11 August 2025, three days after the backdoored release</td></tr>
                <tr><td>Warned before the backdoor switched on</td><td>31 of 31</td><td>41 to 321 days ahead, median 139</td></tr>
              </tbody>
            </table>
          </div>

          <p>In the picture at the top of this page, each row is one plugin. The blue dot is the week OwnerTrail would have warned; the dark bar on the right is the day the backdoor switched on. The long grey lines are the months a site owner would have had to look, decide, and act.</p>

          <h2 id="what-ownertrail-does">What OwnerTrail would, and would not, have done</h2>

          <ul>
            <li><strong>The free plugin</strong> would have raised the finding, dropped the plugin's trust score, put it at the top of the list, and emailed the owner within the hour if email alerts were on. Since 1.2.0 it also offers one click to stop WordPress auto-updating a plugin that changed hands.</li>
            <li><strong>OwnerTrail Pro</strong> would have held the update of a plugin with that open finding until someone approved that exact version, and listed the new web addresses and risky calls in the release before it installed.</li>
            <li><strong>Its code check would not have caught the backdoor itself.</strong> The bad code was inside the official releases, so it matched WordPress.org's own fingerprints. The code check would have caught what the backdoor did next: the rewrite of <code>wp-config.php</code>, within a day in the free plugin and within fifteen minutes in Pro.</li>
          </ul>

          <p>A new committer is not proof of harm. Most plugin sales are honest, and a new maintainer is often good news. OwnerTrail's job is to make the handover visible, so that a person decides rather than an automatic update.</p>

          <h2 id="limits">The honest limits</h2>

          <ul>
            <li>This is a replay, not a live catch. Nobody ran OwnerTrail on these sites at the time.</li>
            <li>A warning only helps if someone reads it. That is why OwnerTrail emails within the hour, keeps a finding open until it is acknowledged, and in Pro can hold the update until a person decides.</li>
            <li>It would not have caught the separate <a href="https://ownertrail.decodeinfy.in/articles/wordpress-plugin-supply-chain-attacks-2026/#shapedplugin">ShapedPlugin compromise</a>, where the existing owner's build pipeline was turned against them and nothing about who held control changed.</li>
          </ul>

          <h2 id="check-yours">Check your own site</h2>

          <p>You can read any plugin's history by hand: its directory page lists the author and contributors, and its SVN log names everyone who ever committed. <a href="https://ownertrail.decodeinfy.in/articles/how-to-check-who-owns-a-wordpress-plugin/">Here is how, step by step</a>. Doing it every week for every plugin on every site you run is the part nobody manages, which is why the backdoor sat there for eight months.</p>

          <aside class="article-note">
            <p><strong>About OwnerTrail.</strong> A free WordPress plugin that watches who controls every plugin on your site and whether anyone has changed its code, from public WordPress.org data only, with no telemetry. It is free on <a href="https://wordpress.org/plugins/ownertrail/">WordPress.org</a>. <a href="https://ownertrail.decodeinfy.in/#pricing">See what is free and what Pro adds</a>.</p>
          </aside>

          <p class="article-related">Related: <a href="https://ownertrail.decodeinfy.in/articles/wordpress-plugin-supply-chain-attacks-2026/">the 2026 supply-chain attacks, dated and sourced</a> and <a href="https://ownertrail.decodeinfy.in/articles/ways-a-wordpress-plugin-can-change-hands/">every way a plugin can change hands</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>WordPress file integrity check: was your plugin code changed?</title>
      <link>https://ownertrail.decodeinfy.in/articles/wordpress-file-integrity-check/</link>
      <guid isPermaLink="true">https://ownertrail.decodeinfy.in/articles/wordpress-file-integrity-check/</guid>
      <pubDate>Thu, 01 Oct 2026 00:00:00 GMT</pubDate>
      <description>How to check that WordPress core and your plugins are the genuine files from WordPress.org, by hand with WP-CLI or automatically every day.</description>
      <content:encoded><![CDATA[<p><img src="https://ownertrail.decodeinfy.in/images/articles/wordpress-file-integrity-check.png" alt="Five rows of files, each with a fingerprint; four are ticked, one is highlighted with a cross because it no longer matches."></p>
<p><em>WordPress.org publishes a fingerprint for every file it ships. Comparing your files with those fingerprints is the fastest way to know whether anyone changed your code.</em></p>

          <p>A backdoor has to live somewhere. Usually that is an edited plugin file, a new PHP file dropped into a plugin or into <code>wp-content/uploads</code>, or a changed <code>wp-config.php</code>. A <strong>file integrity check</strong> finds all three, without guessing at what malware looks like.</p>

          <h2 id="fingerprints">The fingerprints WordPress.org already publishes</h2>

          <ul>
            <li><strong>WordPress core:</strong> <code>https://api.wordpress.org/core/checksums/1.0/?version=7.1.3&amp;locale=en_US</code> lists the MD5 of every core file for that version and language.</li>
            <li><strong>Every plugin in the directory:</strong> <code>https://downloads.wordpress.org/plugin-checksums/{slug}/{version}.json</code> lists the MD5 and SHA-256 of every file in that release.</li>
          </ul>

          <p>If your file's fingerprint matches, it is byte for byte what WordPress.org published. If it does not, something changed it.</p>

          <h2 id="wp-cli">Check by hand with WP-CLI</h2>

          <pre><code>wp core verify-checksums
wp plugin verify-checksums --all</code></pre>

          <p>The first checks WordPress core; the second checks every plugin installed from the directory. Each lists files that do not match, and files that should not be there.</p>

          <p><strong>Where it falls short:</strong> it runs only when someone remembers to, it needs shell access, premium plugins and themes have no published fingerprints, and it says nothing about PHP files hiding in uploads.</p>

          <h2 id="what-to-check">What a complete check covers</h2>

          <div class="table-wrap">
            <table class="article-table">
              <thead><tr><th>Part of the site</th><th>Compared with</th></tr></thead>
              <tbody>
                <tr><td>WordPress core</td><td>WordPress.org's core checksums</td></tr>
                <tr><td>Directory plugins</td><td>WordPress.org's plugin checksums for the installed version</td></tr>
                <tr><td>Themes, premium and custom plugins</td><td>The vendor&rsquo;s own zip, if you have it; otherwise the first copy you trusted, and any later change is named</td></tr>
                <tr><td><code>wp-config.php</code>, <code>.htaccess</code>, must-use plugins, drop-ins</td><td>The first copy you trusted, and read for the shapes a loader takes</td></tr>
                <tr><td><code>wp-content/uploads</code></td><td>Should contain no PHP at all</td></tr>
              </tbody>
            </table>
          </div>

          <h2 id="automatic">Every day, without thinking about it</h2>

          <p><a href="https://ownertrail.decodeinfy.in/">OwnerTrail</a> runs exactly this check every day, in the background, and names any file that changed:</p>

          <ul>
            <li>A change in a part you have not opened to a developer is a serious finding, emailed within the hour.</li>
            <li>A change in an area you opened, such as the theme your developer is working on, is noted quietly.</li>
            <li>If the file is later put back exactly as it was, the finding says so, and still waits for you to acknowledge it.</li>
            <li>No file contents leave your site: only plugin slugs and versions are sent, to WordPress.org.</li>
          </ul>

          <h2 id="limit">The one thing a file check cannot see</h2>

          <p>If a malicious release is published by the plugin's own author, the bad files <em>are</em> the official files, and the fingerprints match. That is what happened with the <a href="https://ownertrail.decodeinfy.in/articles/the-essentialplugin-backdoor-replayed/">EssentialPlugin backdoor</a>. The signal there is earlier: the plugin changing hands. That is why OwnerTrail watches ownership as well as code.</p>

          <aside class="article-note">
            <p><strong>About OwnerTrail.</strong> A free WordPress plugin that checks every code file against WordPress.org's official fingerprints daily, verifies premium plugins against the vendor's own zip, reads unverified files for the shapes malware takes, watches who controls each plugin, and locks code changes to FTP. No telemetry. <a href="https://ownertrail.decodeinfy.in/">How it works</a>.</p>
          </aside>

          <p class="article-related">Related: <a href="https://ownertrail.decodeinfy.in/articles/how-to-lock-the-wordpress-plugin-editor/">how to lock the plugin editor</a> and <a href="https://ownertrail.decodeinfy.in/articles/how-to-check-who-owns-a-wordpress-plugin/">how to check who owns a plugin</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How to lock the WordPress plugin and theme editor</title>
      <link>https://ownertrail.decodeinfy.in/articles/how-to-lock-the-wordpress-plugin-editor/</link>
      <guid isPermaLink="true">https://ownertrail.decodeinfy.in/articles/how-to-lock-the-wordpress-plugin-editor/</guid>
      <pubDate>Thu, 01 Oct 2026 00:00:00 GMT</pubDate>
      <description>Three ways to stop code being edited from the WordPress admin: DISALLOW_FILE_EDIT, DISALLOW_FILE_MODS, and a lock only a site owner can lift.</description>
      <content:encoded><![CDATA[<p><img src="https://ownertrail.decodeinfy.in/images/articles/how-to-lock-the-wordpress-plugin-editor.png" alt="A grid of code cards with a large padlock in front of them."></p>
<p><em>Anyone with an administrator login can rewrite your plugins from the browser. Here is how to close that door, and what each option costs you.</em></p>

          <p>WordPress ships with a <strong>plugin file editor</strong> and a <strong>theme file editor</strong> under Tools and Appearance. Any administrator can open a plugin's PHP and change it, live, with no review and no record. That includes a developer you gave access to last year, and anyone who steals an administrator's password.</p>

          <p>WordPress itself recommends turning the editors off. There are three ways to do it.</p>

          <h2 id="disallow-file-edit">1. DISALLOW_FILE_EDIT: turn the editors off</h2>

          <p>Add one line to <code>wp-config.php</code>, above the line that says to stop editing:</p>

          <pre><code>define( 'DISALLOW_FILE_EDIT', true );</code></pre>

          <p>The plugin and theme file editors disappear for every user. Plugins and themes can still be installed, updated and deleted from the admin.</p>

          <p><strong>The catch:</strong> it is all or nothing, it lives in a file only someone with server access can change, and it does nothing about the other ways code arrives: uploading a plugin zip, or installing one that writes files itself.</p>

          <h2 id="disallow-file-mods">2. DISALLOW_FILE_MODS: stop every change from the admin</h2>

          <pre><code>define( 'DISALLOW_FILE_MODS', true );</code></pre>

          <p>This goes further. No installs, no uploads, no deletes, and <strong>no updates</strong> from the admin either, including automatic ones. Code can only change over FTP, SSH or your deployment pipeline.</p>

          <p><strong>The catch:</strong> you now own every update by hand, including security fixes. On a site nobody deploys to regularly, that is how plugins go stale and vulnerable.</p>

          <h2 id="code-lock">3. A lock only a site owner can lift</h2>

          <p>The middle path: lock the editors and stop uploads, installs and deletes from the admin, but <em>let updates run</em>, and let a named site owner lift the lock for an hour when they genuinely need it. That is what <a href="https://ownertrail.decodeinfy.in/#detection">OwnerTrail's Code lock</a> does:</p>

          <ul>
            <li>The editors are locked the moment OwnerTrail is activated, for everyone, administrators included.</li>
            <li>One click allows code changes only over FTP: no editors, uploads, installs or deletes from the admin. Updates still run.</li>
            <li>Only a site owner can loosen it, and an hour later it locks itself again. Other administrators, including developers, cannot.</li>
            <li>It lists the installed plugins that could get around the lock, such as file managers and code-snippet plugins, so you can decide whether you need them.</li>
          </ul>

          <h2 id="which">Which should you use?</h2>

          <div class="table-wrap">
            <table class="article-table">
              <thead><tr><th></th><th>Editors off</th><th>Installs and uploads off</th><th>Updates still run</th><th>Owner can lift it for an hour</th></tr></thead>
              <tbody>
                <tr><td><code>DISALLOW_FILE_EDIT</code></td><td>Yes</td><td>No</td><td>Yes</td><td>No</td></tr>
                <tr><td><code>DISALLOW_FILE_MODS</code></td><td>Yes</td><td>Yes</td><td>No</td><td>No</td></tr>
                <tr><td>OwnerTrail Code lock</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
              </tbody>
            </table>
          </div>

          <h2 id="limits">What none of them can stop</h2>

          <p>Anyone with FTP or server access can still change files and even remove the plugin that guards them. A plugin can write files with PHP directly. So a lock is half the job: the other half is <strong>noticing a change</strong>. OwnerTrail checks every code file against WordPress.org's official fingerprints each day and names any file that changed. <a href="https://ownertrail.decodeinfy.in/articles/wordpress-file-integrity-check/">How a file integrity check works</a>.</p>

          <aside class="article-note">
            <p><strong>About OwnerTrail.</strong> A free WordPress plugin that watches who controls every plugin on your site and whether anyone has changed its code, reads unverified files for the shapes malware takes, and locks code changes so they happen only over FTP. No telemetry. <a href="https://ownertrail.decodeinfy.in/">How it works</a>.</p>
          </aside>

          <p class="article-related">Related: <a href="https://ownertrail.decodeinfy.in/articles/wordpress-file-integrity-check/">WordPress file integrity check</a> and <a href="https://ownertrail.decodeinfy.in/articles/the-essentialplugin-backdoor-replayed/">the EssentialPlugin backdoor, replayed</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>A WordPress plugin was closed: what it means and what to do</title>
      <link>https://ownertrail.decodeinfy.in/articles/wordpress-plugin-closed-what-to-do/</link>
      <guid isPermaLink="true">https://ownertrail.decodeinfy.in/articles/wordpress-plugin-closed-what-to-do/</guid>
      <pubDate>Thu, 01 Oct 2026 00:00:00 GMT</pubDate>
      <description>When WordPress.org closes a plugin it stops getting updates. How to tell if one of yours was closed, why it happens, and what to do next.</description>
      <content:encoded><![CDATA[<p><img src="https://ownertrail.decodeinfy.in/images/articles/wordpress-plugin-closed-what-to-do.png" alt="A grid of plugin tiles with one lifted out and a striped barrier across it."></p>
<p><em>A closed plugin keeps running on your site exactly as before. It just never gets another fix, and WordPress does not tell you.</em></p>

          <p>The WordPress Plugins Team can <strong>close</strong> a plugin in the directory. Its page shows a closure notice, it cannot be downloaded, and it receives no more updates. On 7 April 2026 the team closed <a href="https://ownertrail.decodeinfy.in/articles/the-essentialplugin-backdoor-replayed/">31 plugins in a single day</a> after a backdoor was found in all of them.</p>

          <p>What it does not do is reach the sites already running it. The plugin stays active, unchanged, with no notice in your admin.</p>

          <h2 id="why">Why plugins get closed</h2>

          <p>WordPress.org records a short reason with each closure, such as:</p>

          <ul>
            <li><strong>Security Issue</strong>: a vulnerability or malicious code. The most urgent case.</li>
            <li><strong>Guideline Violation</strong>: the plugin broke the directory's rules.</li>
            <li><strong>Author Request</strong>: the author withdrew it, often because it is no longer maintained.</li>
            <li><strong>Licensing or trademark</strong> problems.</li>
          </ul>

          <p>Some closures are temporary and the plugin returns once fixed. Many are permanent.</p>

          <h2 id="check">How to check whether a plugin was closed</h2>

          <p>Ask the directory's public API, replacing the slug:</p>

          <pre><code>https://api.wordpress.org/plugins/info/1.2/?action=plugin_information&amp;request[slug]=PLUGIN-SLUG</code></pre>

          <p>A closed plugin answers with <code>"error":"closed"</code>, the <code>closed_date</code>, and a <code>reason_text</code> such as <code>Security Issue</code>. A plugin that is simply not in the directory answers <code>Plugin not found</code>.</p>

          <p>Doing that for every plugin, on every site, every week, is the part nobody manages.</p>

          <h2 id="what-to-do">What to do when one of yours is closed</h2>

          <ol>
            <li><strong>Read the reason.</strong> "Security Issue" means act today; "Author Request" usually means plan a replacement.</li>
            <li><strong>Turn off its automatic updates</strong>, so nothing new arrives if the listing changes hands or returns under someone else.</li>
            <li><strong>Find a maintained replacement</strong>, test it, and switch.</li>
            <li><strong>Remove the closed plugin</strong>, rather than leaving it deactivated: inactive code can still be reached on some servers.</li>
            <li><strong>Check its files</strong> against the last genuine release if the reason was security. <a href="https://ownertrail.decodeinfy.in/articles/wordpress-file-integrity-check/">How a file integrity check works</a>.</li>
          </ol>

          <h2 id="ownertrail">Let your site tell you</h2>

          <p><a href="https://ownertrail.decodeinfy.in/">OwnerTrail</a> asks the directory about every installed plugin each day. A closed plugin becomes a high-risk finding with the closure date and reason, even if it was closed before you installed OwnerTrail. From the same screen you can turn off its automatic updates in one click.</p>

          <aside class="article-note">
            <p><strong>About OwnerTrail.</strong> A free WordPress plugin that watches who controls every plugin on your site, flags plugins WordPress.org has closed, checks your code against WordPress.org's fingerprints, and asks your own pages as Googlebot to catch cloaked SEO spam. No telemetry. <a href="https://ownertrail.decodeinfy.in/">How it works</a>.</p>
          </aside>

          <p class="article-related">Related: <a href="https://ownertrail.decodeinfy.in/articles/the-essentialplugin-backdoor-replayed/">the EssentialPlugin backdoor, replayed</a> and <a href="https://ownertrail.decodeinfy.in/articles/ways-a-wordpress-plugin-can-change-hands/">every way a plugin can change hands</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How to check who owns a WordPress plugin</title>
      <link>https://ownertrail.decodeinfy.in/articles/how-to-check-who-owns-a-wordpress-plugin/</link>
      <guid isPermaLink="true">https://ownertrail.decodeinfy.in/articles/how-to-check-who-owns-a-wordpress-plugin/</guid>
      <pubDate>Sat, 26 Sep 2026 00:00:00 GMT</pubDate>
      <description>The manual method, properly: the directory page, the contributor list, and the SVN commit log - and why listed contributors are not the same as commit access.</description>
      <content:encoded><![CDATA[<p><img src="https://ownertrail.decodeinfy.in/images/articles/how-to-check-who-owns-a-wordpress-plugin.png" alt="A magnifying lens held over a stack of layered record cards, one card highlighted."></p>
<p><em>Everything you need is public. It takes about three minutes per plugin, and the part most guides skip is the part that matters.</em></p>

          <p>There is no button for this. WordPress.org publishes everything you need, in two places, and never joins them up for you. Here is the whole method.</p>

          <h2 id="directory">1. Read the directory page</h2>

          <p>Open <code>https://wordpress.org/plugins/&lt;slug&gt;/</code> and scroll to <strong>Contributors &amp; Developers</strong>. You get two things:</p>

          <ul>
            <li>The <strong>listed author</strong> - a display name, which is free text and can be changed at any time without any other change.</li>
            <li>The <strong>contributor usernames</strong> - actual WordPress.org accounts, linked to profiles.</li>
          </ul>

          <p>Write both down. The author line is the one that changes most visibly when a plugin is sold, and it is also the one that tells you least, because it is a label rather than a permission.</p>

          <h2 id="svn">2. Read the commit log</h2>

          <p>Open <code>https://plugins.svn.wordpress.org/&lt;slug&gt;/</code>. This is the plugin's actual repository, public, no account needed. The <code>trunk</code> directory is current development and <code>tags</code> holds released versions.</p>

          <p>What you want is the commit history: who committed, and when. The directory page also exposes this under its <strong>Development</strong> tab, which is easier to read if you are only checking one plugin.</p>

          <p>Note every username that appears, and the revision number of its earliest commit.</p>

          <h2 id="the-part-guides-skip">3. Compare the two lists - this is the step that matters</h2>

          <p><strong>Listed contributors and people with commit access are not the same set.</strong> Almost every guide to this treats them as interchangeable, and they are not.</p>

          <p>The contributor list is a directory display field. Commit access is the permission that actually ships code to your site. Someone can be added as a committer without appearing in the contributor list, and someone can sit in the contributor list for years having never committed anything.</p>

          <p>So when you compare, ask a specific question: <em>is there a username in the commit log that is not in the contributor list, and that has never committed to this plugin before?</em></p>

          <p>That is the signal. Not the author name changing, which is cosmetic and often lags. A new committer is the first moment at which someone new can ship code to every site running that plugin.</p>

          <h2 id="legit">4. Decide whether it is legitimate</h2>

          <p>Most transfers are entirely legitimate. Plugins are sold, maintainers hand over, agencies take on abandoned tools. A new name is a question, not a verdict. Three things usually settle it:</p>

          <ul>
            <li><strong>The changelog.</strong> A real handover is often announced there, or in a release post.</li>
            <li><strong>The support forum.</strong> Look for the new maintainer introducing themselves, or users asking who is running things now.</li>
            <li><strong>The new username's profile.</strong> Open <code>https://profiles.wordpress.org/&lt;username&gt;/</code>. What else do they commit to? How long has the account existed? An account created last month that now has commit access to a plugin with 90,000 installs is worth ten more minutes of your time.</li>
          </ul>

          <p>Then read the actual diff at that revision. Most of the time it is a version bump.</p>

          <h2 id="premium">What about premium plugins?</h2>

          <p>You cannot do any of this. A plugin distributed from a vendor's own site has no public directory page and no public commit history, so there is no record to compare against. That is not a gap in your process; it is a gap in what exists.</p>

          <p>It is worth being honest with yourself about that rather than assuming a premium plugin is safer because you paid for it. The June 2026 ShapedPlugin compromise was a premium product, shipped through the vendor's own pipeline, and no public record would have shown anything.</p>

          <h2 id="scale">Doing this at scale</h2>

          <p>Three minutes per plugin is fine once. A single WordPress site runs twenty to forty plugins. An agency with thirty client sites is looking at several hundred installs, and the check is only useful if you repeat it - a transfer you looked for last March tells you nothing about one that happened in June.</p>

          <p>Which is why almost nobody does it, and why the April 2026 backdoor sat in a portfolio of 31 plugins for eight months with the evidence public the entire time.</p>

          <aside class="article-note">
            <p><strong>About OwnerTrail.</strong> It does exactly the method above - reads the directory API and the SVN log for every plugin on your site, records who has committed, and compares that record daily. It reports only when something changed. It also checks every code file against WordPress.org&rsquo;s official fingerprints each day, reads files nothing vouches for for the shapes malware takes, asks your own pages as Googlebot to catch cloaked SEO spam, and can lock code changes so they happen only over FTP. It does not scan for malware or known vulnerabilities, so run it alongside a scanner rather than instead of one. <a href="https://ownertrail.decodeinfy.in/">How it works</a>.</p>
          </aside>

          <p class="article-related">Related: <a href="https://ownertrail.decodeinfy.in/articles/wordpress-plugin-supply-chain-attacks-2026/">the 2026 WordPress supply-chain attacks</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The 2026 WordPress supply-chain attacks: what happened, and what each one teaches</title>
      <link>https://ownertrail.decodeinfy.in/articles/wordpress-plugin-supply-chain-attacks-2026/</link>
      <guid isPermaLink="true">https://ownertrail.decodeinfy.in/articles/wordpress-plugin-supply-chain-attacks-2026/</guid>
      <pubDate>Sat, 26 Sep 2026 00:00:00 GMT</pubDate>
      <description>A dated, sourced account of the two 2026 WordPress plugin supply-chain compromises - the Flippa portfolio and ShapedPlugin - and why the defences differ.</description>
      <content:encoded><![CDATA[<p><img src="https://ownertrail.decodeinfy.in/images/articles/wordpress-plugin-supply-chain-attacks-2026.png" alt="A horizontal chain of connected software modules, one link in the middle broken and highlighted."></p>
<p><em>Two separate compromises hit WordPress plugins in 2026. They are usually discussed together, and they were not the same kind of attack at all.</em></p>

          <p>One came through a change of ownership. The other came through a vendor's own build pipeline. The difference matters, because the defences are different and no single tool covers both.</p>

          <p>This page is a dated record. Where something is disputed or unknown, it says so.</p>

          <h2 id="flippa">Incident one &mdash; the Flippa portfolio, April 2026</h2>

          <p>A buyer acquired a portfolio of more than thirty WordPress plugins through Flippa, the website marketplace, for a reported six-figure sum. The portfolio included the Essential Plugin range, with a combined install base reported at around 400,000 sites.</p>

          <p>The buyer's first commit after taking over was a PHP deserialization backdoor.</p>

          <p><strong>The dormancy is the part worth sitting with.</strong> The backdoor was planted in August 2025 and did nothing for roughly eight months. In April 2026 it activated, injecting cloaked SEO spam across every site running the affected plugins. On 7 April 2026 the WordPress Plugins Team closed all 31 plugins in a single day.</p>

          <h3>Why nobody noticed</h3>

          <p>Nothing about the transfer was announced. WordPress.org does not review plugin ownership transfers and does not notify the sites running a plugin when its ownership changes. The plugins kept their names, their directory listings, their install bases and their update channel. To every site running them, the malicious release arrived as an ordinary update.</p>

          <p>The ownership transfer itself was visible in public data from the day it happened &mdash; the listed author changed, the contributor list changed, and an unfamiliar username began committing. Anyone comparing that record against the previous week's would have seen it. Nobody was comparing.</p>

          <h2 id="shapedplugin">Incident two &mdash; ShapedPlugin Pro, June 2026</h2>

          <p>Attackers compromised ShapedPlugin's own build and distribution pipeline and shipped backdoored updates of its Pro plugins between April and June 2026. It was assigned CVE-2026-10735.</p>

          <p>The payload was considerably more aggressive than the first incident's: stolen credentials and 2FA codes, <code>wp-config.php</code> contents exfiltrated, WooCommerce order data taken. It hid itself from the WordPress admin plugin list, registered a REST API backdoor accepting arbitrary file writes, bundled Tiny File Manager and Adminer for direct file and database access, and installed a webshell driven by URL parameters with a hardcoded login bypass.</p>

          <h3>Ownership monitoring would not have caught this one</h3>

          <p>There was no transfer. The vendor did not change hands, the committer list did not change, and the people publishing releases were the same people as the month before. The provenance record looked entirely normal throughout, because the provenance was not what broke &mdash; the pipeline was.</p>

          <p>Being clear about this matters more than claiming broad coverage. A tool that monitors ownership has nothing useful to say about a compromised build server. <a href="https://ownertrail.decodeinfy.in/#trust">OwnerTrail would have shown nothing</a>, and says so on its own front page.</p>

          <h2 id="common">What the two have in common</h2>

          <p>Neither was a vulnerability. Nothing in either case was a bug a scanner could have matched against a database, because in both cases the code did precisely what its author intended.</p>

          <p>That is the structural problem. A vulnerability scanner compares your plugins against a catalogue of known-bad. Both of these arrived as <em>new</em> code, from the <em>expected</em> source, through the <em>ordinary</em> update channel, before any catalogue had heard of them. Most affected sites were running a scanner the entire time.</p>

          <p>The window in which either was preventable was before the malicious release installed itself &mdash; and in the first case, that window was eight months long.</p>

          <h2 id="gap">The gap WordPress already acknowledges</h2>

          <p>This is not an outside criticism. There is an open ticket on the WordPress meta tracker, <a href="https://meta.trac.wordpress.org/ticket/5509" target="_blank" rel="noopener">#5509, <em>Notify users of changes to plugin ownership</em></a>. It is filed, it is discussed, and it is unresolved. WP Tavern has covered the question editorially more than once.</p>

          <p>So the position today is: plugin ownership transfers are permitted, unannounced, unreviewed, and invisible to the sites affected. Everyone involved knows it.</p>

          <h2 id="what-to-do">What you can actually do</h2>

          <p><strong>For the ownership case.</strong> The data is public. Every plugin's directory page lists its author and contributors, and its SVN repository carries the full commit history including the username behind every commit. You can read both by hand. Doing it once for one plugin is easy. Doing it weekly for forty plugins across twelve client sites is not, which is why nobody does it, which is why the April incident ran for eight months.</p>

          <p><strong>For the pipeline case.</strong> Ownership data will not help you. What helps is staged updates rather than automatic ones, a delay between a release and its installation on production, file-integrity monitoring, and reading the changelog of anything that ships a surprise release.</p>

          <p><strong>For both.</strong> Reduce the plugin count. Every plugin is a party you have chosen to trust with code execution on your site, and the transfer of that trust does not require your consent or your knowledge.</p>

          <h2 id="timeline">Timeline</h2>

          <div class="table-wrap">
            <table class="article-table">
              <thead><tr><th>Date</th><th>Event</th></tr></thead>
              <tbody>
                <tr><td>August 2025</td><td>Backdoor committed to the acquired plugin portfolio</td></tr>
                <tr><td>April 2026</td><td>Backdoor activates; cloaked SEO spam injected</td></tr>
                <tr><td>7 April 2026</td><td>WordPress Plugins Team closes 31 plugins</td></tr>
                <tr><td>April&ndash;June 2026</td><td>ShapedPlugin Pro ships backdoored updates</td></tr>
                <tr><td>June 2026</td><td>ShapedPlugin compromise disclosed, CVE-2026-10735</td></tr>
              </tbody>
            </table>
          </div>

          <h2 id="sources">Sources</h2>

          <ul class="source-list">
            <li><a href="https://www.infoq.com/news/2026/05/wordpress-plugins-supply-chain/" target="_blank" rel="noopener">InfoQ &mdash; Attacker Bought 30 WordPress Plugins on Flippa and Backdoored All of Them</a></li>
            <li><a href="https://techcrunch.com/2026/04/14/someone-planted-backdoors-in-dozens-of-wordpress-plugins-used-in-thousands-of-websites/" target="_blank" rel="noopener">TechCrunch &mdash; Someone planted backdoors in dozens of WordPress plug-ins</a></li>
            <li><a href="https://thehackernews.com/2026/06/shapedplugin-wordpress-pro-plugins.html" target="_blank" rel="noopener">The Hacker News &mdash; ShapedPlugin WordPress Pro Plugins Backdoored in Supply Chain Attack</a></li>
            <li><a href="https://securityaffairs.com/194059/hacking/shapedplugin-supply-chain-attack-backdoors-pro-plugin-updates.html" target="_blank" rel="noopener">Security Affairs &mdash; ShapedPlugin Supply Chain Attack Backdoors Pro Plugin Updates</a></li>
            <li><a href="https://meta.trac.wordpress.org/ticket/5509" target="_blank" rel="noopener">WordPress meta trac #5509 &mdash; Notify users of changes to plugin ownership</a></li>
            <li><a href="https://developer.wordpress.org/plugins/wordpress-org/transferring-your-plugin-to-a-new-owner/" target="_blank" rel="noopener">Plugin Handbook &mdash; Transferring Your Plugin to a New Owner</a></li>
          </ul>

          <aside class="article-note">
            <p><strong>About OwnerTrail.</strong> It monitors the first of these two problems: it reads the public WordPress.org directory and SVN history for every plugin on your site and tells you when the ownership or committer record changes; <a href="https://ownertrail.decodeinfy.in/articles/the-essentialplugin-backdoor-replayed/">replayed against the Flippa portfolio, it warns on all 31 plugins</a>. It also checks every code file against WordPress.org&rsquo;s official fingerprints each day, reads files nothing vouches for for the shapes malware takes, asks your own pages as Googlebot to catch cloaked SEO spam, and can lock code changes so they happen only over FTP. It would not have detected the ShapedPlugin compromise, and it does not scan for malware or known vulnerabilities. Run it alongside a scanner, not instead of one. <a href="https://ownertrail.decodeinfy.in/">How it works</a>.</p>
          </aside>

          <p class="article-related">Related: <a href="https://ownertrail.decodeinfy.in/articles/the-essentialplugin-backdoor-replayed/">the Flippa backdoor, replayed against OwnerTrail</a>, <a href="https://ownertrail.decodeinfy.in/articles/how-to-check-who-owns-a-wordpress-plugin/">how to check who owns a plugin</a> and <a href="https://ownertrail.decodeinfy.in/articles/ways-a-wordpress-plugin-can-change-hands/">every way a plugin can change hands</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Every way a WordPress plugin can change hands</title>
      <link>https://ownertrail.decodeinfy.in/articles/ways-a-wordpress-plugin-can-change-hands/</link>
      <guid isPermaLink="true">https://ownertrail.decodeinfy.in/articles/ways-a-wordpress-plugin-can-change-hands/</guid>
      <pubDate>Sat, 26 Sep 2026 00:00:00 GMT</pubDate>
      <description>Sale, adoption, a contributor quietly added, a maintainer walking away - the six routes by which the person controlling a plugin on your site becomes someone else.</description>
      <content:encoded><![CDATA[<p><img src="https://ownertrail.decodeinfy.in/images/articles/ways-a-wordpress-plugin-can-change-hands.png" alt="A key travelling along a dotted path from one open container to another."></p>
<p><em>You are trusting whoever controls each plugin on your site today, not whoever wrote it. Here is every way that person changes.</em></p>

          <p>WordPress.org permits every route below, requires an announcement for none of them, and notifies the sites running the plugin about none of them either. They differ in how visible they are, and that turns out to matter more than how they happen.</p>

          <h2 id="sale">1. Outright sale</h2>

          <p>The most discussed route, because it is the one behind the April 2026 incident: a portfolio of 31 plugins bought through Flippa and backdoored across the lot. Marketplaces list WordPress plugins openly, priced on install count.</p>

          <p><strong>Visibility:</strong> good, after the fact. The listed author usually changes and new usernames appear in the commit log. Nothing announces it, but the public record does move.</p>

          <h2 id="adoption">2. Adoption of an abandoned plugin</h2>

          <p>WordPress has a formal process for taking over a plugin whose author has stopped responding. Someone asks the Plugins Team, the team tries to reach the original author, and if there is no response the plugin can be reassigned.</p>

          <p><strong>Visibility:</strong> good. This is the most legitimate route there is - it exists to keep useful code alive - and it still puts a stranger's commit access on your site without telling you.</p>

          <h2 id="contributor">3. A committer quietly added</h2>

          <p>The plugin owner grants commit access to another account. No sale, no transfer, no change to the listed author. The original maintainer is still there and still in charge.</p>

          <p><strong>Visibility:</strong> poor, and this is the important one. Nothing on the directory page need change at all. The only evidence is a username appearing in the commit log that was never there before. It is also the route that most resembles a compromised maintainer account, because from the outside those two look identical.</p>

          <h2 id="agency">4. The maintainer's company changes</h2>

          <p>The person is the same; the organisation behind them is not. An agency is acquired, a solo developer joins a company that takes over their plugins, a product is folded into somebody else's suite.</p>

          <p><strong>Visibility:</strong> mixed. The author string may change while the committers stay identical, or the reverse. Often the first public sign is a rebrand in the readme.</p>

          <h2 id="walkaway">5. The maintainer walks away</h2>

          <p>Nobody takes over. Commits stop, the plugin keeps working, and it stays installed on every site that had it. There is no transfer here at all - which is exactly the problem, because an unmaintained plugin with an install base is what the buyers in route 1 go shopping for.</p>

          <p><strong>Visibility:</strong> good, if you are looking at dates. A plugin with no release in eighteen months is telling you something.</p>

          <h2 id="compromise">6. The account is compromised</h2>

          <p>Not a transfer, but indistinguishable from one at the moment it happens. The credentials of someone with commit access are stolen and used.</p>

          <p><strong>Visibility:</strong> depends entirely on whether the attacker commits under the existing account or adds a new one. If they use the existing account, no provenance signal moves at all - which is what happened with ShapedPlugin in June 2026, where the build pipeline itself was breached and the committer record looked completely normal throughout.</p>

          <h2 id="ranking">What this ordering is actually telling you</h2>

          <p>Routes 1, 2 and 4 are reasonably visible in public data. Route 5 is visible if you watch dates. Route 3 is visible only if you are comparing committer lists over time. Route 6 may not be visible at all.</p>

          <p>So no amount of provenance monitoring gives you complete coverage, and anyone selling you that is overstating it. What it gives you is the four or five routes out of six where a public record does move - and in the April 2026 case, that record moved eight months before anyone noticed the payload.</p>

          <h2 id="what-to-do">What a site owner can do</h2>

          <ul>
            <li><strong>Know which plugins you would not notice losing.</strong> Those are the ones to remove. Every plugin is a standing grant of code execution to whoever holds commit access this week.</li>
            <li><strong>Watch committers, not author names.</strong> The author string is a label. Commit access is the permission.</li>
            <li><strong>Stage updates rather than applying them automatically</strong> on sites that matter. A delay of a few days costs little and is the only defence that also covers route 6.</li>
            <li><strong>Treat premium plugins as unmonitorable</strong>, because they are. No public record exists to compare.</li>
          </ul>

          <aside class="article-note">
            <p><strong>About OwnerTrail.</strong> It watches routes 1 to 5 by reading the public directory and SVN history for every plugin on your site and reporting when the record changes. It cannot see route 6 when the attacker uses an existing account. It also checks every code file against WordPress.org&rsquo;s official fingerprints each day, reads files nothing vouches for for the shapes malware takes, asks your own pages as Googlebot to catch cloaked SEO spam, and can lock code changes so they happen only over FTP. It does not scan code for malware. <a href="https://ownertrail.decodeinfy.in/">How it works</a>.</p>
          </aside>

          <p class="article-related">Related: <a href="https://ownertrail.decodeinfy.in/articles/how-to-check-who-owns-a-wordpress-plugin/">how to check who owns a plugin</a> and <a href="https://ownertrail.decodeinfy.in/articles/wordpress-plugin-supply-chain-attacks-2026/">the 2026 supply-chain attacks</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Reading a WordPress plugin’s SVN commit history</title>
      <link>https://ownertrail.decodeinfy.in/articles/reading-a-wordpress-plugin-svn-commit-history/</link>
      <guid isPermaLink="true">https://ownertrail.decodeinfy.in/articles/reading-a-wordpress-plugin-svn-commit-history/</guid>
      <pubDate>Sat, 26 Sep 2026 00:00:00 GMT</pubDate>
      <description>How the plugin SVN repository is laid out, how to read a commit log without checking anything out, and which parts of it actually indicate a change of control.</description>
      <content:encoded><![CDATA[<p><img src="https://ownertrail.decodeinfy.in/images/articles/reading-a-wordpress-plugin-svn-commit-history.png" alt="A vertical timeline of stacked commit nodes, the most recent one highlighted."></p>
<p><em>Every plugin in the directory has a public repository. Most people never open one. It answers questions the directory page cannot.</em></p>

          <p>WordPress.org hosts every directory plugin in Subversion, publicly readable, no account required. The URL is predictable:</p>

          <p><code>https://plugins.svn.wordpress.org/&lt;slug&gt;/</code></p>

          <p>You can open that in a browser. You do not need an SVN client for anything in this article.</p>

          <h2 id="layout">The layout</h2>

          <p>Three directories, and the convention is strict:</p>

          <ul>
            <li><strong><code>trunk/</code></strong> - current development. For most plugins this is what the next release will be built from.</li>
            <li><strong><code>tags/</code></strong> - one directory per released version. <code>tags/2.4.1/</code> is exactly what shipped as 2.4.1, frozen.</li>
            <li><strong><code>assets/</code></strong> - the banner, icon and screenshots for the directory listing. Not shipped to sites.</li>
          </ul>

          <p>The <code>Stable tag</code> line in a plugin's <code>readme.txt</code> decides which of those <code>tags</code> directories is actually served to users. This is the single most misunderstood mechanism in the directory: the version people install is whatever <code>Stable tag</code> points at, not the highest number in <code>tags/</code> and not <code>trunk</code>.</p>

          <h2 id="log">Reading the log</h2>

          <p>The easiest route is the directory page's <strong>Development</strong> tab, which renders the recent history with revision numbers, usernames and dates.</p>

          <p>Revision numbers are global across the whole plugin repository, not per plugin. A commit at r3318812 tells you when it happened relative to every other plugin, which is occasionally useful and often confusing the first time you see it.</p>

          <p>What you are reading for:</p>

          <ul>
            <li><strong>Which usernames appear</strong>, and when each first appears.</li>
            <li><strong>The gap between commits.</strong> Eighteen quiet months followed by sudden activity is worth a look, particularly if the committer is new.</li>
            <li><strong>What actually changed.</strong> A version bump and a readme edit is not the same as a new file in <code>includes/</code>.</li>
          </ul>

          <h2 id="first-time">Spotting a first-time committer</h2>

          <p>This is the signal worth the effort, and the log gives it to you directly: a username whose earliest revision in this plugin is recent.</p>

          <p>Be careful about one thing - the person may be well known elsewhere. A committer with ten years of history across core and forty plugins, appearing in this one for the first time, is a different proposition from an account created six weeks ago. Open <code>https://profiles.wordpress.org/&lt;username&gt;/</code> before drawing a conclusion.</p>

          <p>The question is never "is this person trustworthy". It is "did the set of people who can ship code to my site change, and do I know why".</p>

          <h2 id="diff">Reading an actual change</h2>

          <p>Browsing to a file in <code>trunk/</code> shows its current content. To see what a specific revision changed, an SVN client is genuinely easier:</p>

          <p><code>svn log -v -r 3318812 https://plugins.svn.wordpress.org/&lt;slug&gt;/</code><br>
          <code>svn diff -c 3318812 https://plugins.svn.wordpress.org/&lt;slug&gt;/</code></p>

          <p>The first lists the paths touched; the second shows the change. On a plugin you are worried about, the paths alone usually answer the question.</p>

          <h2 id="limits">What the log will not tell you</h2>

          <p>Three things, and they matter:</p>

          <ul>
            <li><strong>Who authorised the commit.</strong> SVN records the account that committed, not whether that account was in the right hands at the time.</li>
            <li><strong>Anything about premium plugins.</strong> Code distributed from a vendor's own site is not here at all.</li>
            <li><strong>Whether the code is malicious.</strong> You are reading provenance, not behaviour. A backdoor committed by the legitimate owner looks exactly like any other commit - which is the whole difficulty.</li>
          </ul>

          <h2 id="practice">Doing it in practice</h2>

          <p>For one plugin you are suspicious about, this takes five minutes and is worth doing properly. For forty plugins across a dozen client sites, repeated weekly, it is not a realistic manual task - and a check you do once is close to worthless, because it establishes a baseline and then never compares against it.</p>

          <aside class="article-note">
            <p><strong>About OwnerTrail.</strong> It reads this same log for every installed plugin - up to 200 commits of history on first scan - records each committer with their first and last revision, and re-reads it daily. It reports when the set changes. It also checks every code file against WordPress.org&rsquo;s official fingerprints each day, reads files nothing vouches for for the shapes malware takes, asks your own pages as Googlebot to catch cloaked SEO spam, and can lock code changes so they happen only over FTP. It does not read your diffs for you and does not scan for malware. <a href="https://ownertrail.decodeinfy.in/">How it works</a>.</p>
          </aside>

          <p class="article-related">Related: <a href="https://ownertrail.decodeinfy.in/articles/how-to-check-who-owns-a-wordpress-plugin/">how to check who owns a plugin</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>An agency’s plugin provenance checklist</title>
      <link>https://ownertrail.decodeinfy.in/articles/agency-wordpress-plugin-provenance-checklist/</link>
      <guid isPermaLink="true">https://ownertrail.decodeinfy.in/articles/agency-wordpress-plugin-provenance-checklist/</guid>
      <pubDate>Sat, 26 Sep 2026 00:00:00 GMT</pubDate>
      <description>A routine for agencies with client WordPress sites: what to record per site, what to check monthly, and what to tell clients when a plugin changes hands.</description>
      <content:encoded><![CDATA[<p><img src="https://ownertrail.decodeinfy.in/images/articles/agency-wordpress-plugin-provenance-checklist.png" alt="A grid of website tiles each carrying a tick, three of them highlighted."></p>
<p><em>You did not choose most of the plugins you maintain, and you will still be the one answering for them. This is a routine that fits in an hour a month.</em></p>

          <p>Written for the case where you carry ten to fifty client sites, inherited most of their plugins, and have no mandate to rip half of them out.</p>

          <h2 id="once">Once, per site</h2>

          <ul>
            <li><strong>List every plugin, with its slug and origin.</strong> Directory or premium. The split matters more than the count, because only one half has a public record to check.</li>
            <li><strong>Record the listed author and the contributor usernames</strong> for every directory plugin. This is your baseline. Without it, later checks compare against nothing.</li>
            <li><strong>Record the last release date.</strong> Anything past a year is already a candidate for replacement, whoever owns it.</li>
            <li><strong>Mark the plugins that could not be removed without a conversation.</strong> Usually far fewer than the number installed.</li>
          </ul>

          <p>This is the boring part and the part that makes everything after it possible. A provenance check with no baseline is just a description of today.</p>

          <h2 id="monthly">Monthly, per site</h2>

          <ul>
            <li><strong>Has any listed author changed?</strong></li>
            <li><strong>Has any username appeared in a commit log that was not there last month?</strong> This is the one that matters; see <a href="https://ownertrail.decodeinfy.in/articles/how-to-check-who-owns-a-wordpress-plugin/">the method</a>.</li>
            <li><strong>Has anything dormant suddenly shipped?</strong> Quiet for a year, then a release, is worth five minutes.</li>
            <li><strong>Has anything been removed from the directory?</strong> Closure is often a security action, and the plugin stays installed and working on the site regardless.</li>
          </ul>

          <h2 id="fired">When something fires</h2>

          <p>A new committer is a question, not an incident. In order:</p>

          <ol>
            <li><strong>Read the diff at that revision.</strong> Most of the time it is a version bump.</li>
            <li><strong>Open the new username's WordPress.org profile.</strong> What else do they commit to, and since when?</li>
            <li><strong>Check the changelog and support forum</strong> for an announced handover. Legitimate transfers are usually stated somewhere.</li>
            <li><strong>Then decide:</strong> accept it and record that you did, hold updates on that plugin for a fortnight, or start planning a replacement.</li>
          </ol>

          <p>Record the decision either way. The value of this routine is largely that you can show your working later.</p>

          <h2 id="client">Telling a client</h2>

          <p>Most of the time you should not. A legitimate transfer is not news, and an agency that reports every ownership change trains its clients to ignore them.</p>

          <p>Say something when there is a decision for them to make: you want to replace a plugin they rely on, or you are holding updates on something that matters, or a plugin they paid for has been closed. Lead with what you are doing about it. "Plugin X changed hands, we have held its updates for two weeks while we watch it" is a sentence that builds confidence. "Plugin X changed hands" on its own just moves your anxiety to them.</p>

          <h2 id="honest">What this routine does not cover</h2>

          <p>Being straight about the gaps, because they are real:</p>

          <ul>
            <li><strong>Premium plugins.</strong> No public record, nothing to compare. They are not safer for being paid; the June 2026 ShapedPlugin compromise was a premium product whose own build pipeline was breached.</li>
            <li><strong>A compromised maintainer account.</strong> If an attacker commits as the existing owner, no provenance signal moves at all.</li>
            <li><strong>Malicious code from a legitimate owner.</strong> You are checking who, not what. That is what your scanner is for.</li>
          </ul>

          <p>Provenance monitoring covers one layer. Run it beside vulnerability scanning and staged updates, not instead of either.</p>

          <h2 id="scale">The honest problem with doing this across a fleet</h2>

          <p>Everything above is per site. Thirty client sites means thirty baselines and thirty monthly passes, and the routine's whole value depends on doing it consistently rather than when you remember.</p>

          <p>That is the point at which people stop, and it is worth saying rather than pretending an hour a month scales linearly to thirty sites. If a single view across every site you manage is what you actually need, the honest answer today is that per-site tooling will not give you one.</p>

          <aside class="article-note">
            <p><strong>About OwnerTrail.</strong> It automates the baseline and the monthly pass on a single site - reading the public directory and SVN history daily and reporting only when the record changes - with an urgent email and a weekly summary per site. It also checks every code file against WordPress.org&rsquo;s official fingerprints each day, reads files nothing vouches for for the shapes malware takes, asks your own pages as Googlebot to catch cloaked SEO spam, and can lock code changes so they happen only over FTP. One view across every client site is the Agency tier, coming after Pro. It does not scan for malware or known vulnerabilities. <a href="https://ownertrail.decodeinfy.in/">How it works</a>.</p>
          </aside>

          <p class="article-related">Related: <a href="https://ownertrail.decodeinfy.in/articles/ways-a-wordpress-plugin-can-change-hands/">every way a plugin can change hands</a>.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
