<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Shelltrap</title><link>https://shelltrap.com/</link><description>Recent content on Shelltrap</description><generator>Hugo</generator><language>en-GB</language><lastBuildDate>Fri, 04 Sep 2026 12:00:00 +0200</lastBuildDate><atom:link href="https://shelltrap.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Moving from CXS to Shelltrap</title><link>https://shelltrap.com/product/cxs-migration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://shelltrap.com/product/cxs-migration/</guid><description>&lt;h2 id="what-actually-changed">What actually changed&lt;/h2>
&lt;p>ConfigServer eXploit Scanner was, for a long time, the pragmatic answer for operators who
wanted server-side malware scanning without a per-account enterprise licence. Its vendor, Way
to the Web, has discontinued sales. It was sold as a one-time licence per server
(&lt;a href="https://www.configserver.org/configserver-exploit-scanner/" rel="noopener">configserver.org&lt;/a>
, checked 4
September 2026), which is exactly why so many hosts still have it installed and running.&lt;/p>
&lt;p>Nothing breaks the day sales stop. That is the trap. A scanner that no longer receives new
signatures does not go red — it goes on reporting &lt;code>clean&lt;/code>, with steadily less right to. The
decay is invisible until the day somebody else finds the shell for you.&lt;/p></description></item><item><title>Imprint</title><link>https://shelltrap.com/legal/imprint/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://shelltrap.com/legal/imprint/</guid><description>&lt;p>shelltrap.com and the Shelltrap software are operated and published by Panomity GmbH. The
disclosure below applies to this website and to the Shelltrap product.&lt;/p>
&lt;h2 id="information-according-to--5-tmg">Information according to § 5 TMG&lt;/h2>
&lt;p>Panomity GmbH
Seilergasse 34
D-85570 Markt Schwaben&lt;/p>
&lt;p>Commercial register: HRB 264411
Register Court: Munich Local Court — Register Court —&lt;/p>
&lt;p>&lt;strong>Represented by:&lt;/strong>
Sascha Endlicher, M.A.&lt;/p>
&lt;h2 id="contact">Contact&lt;/h2>
&lt;p>Phone: &lt;a href="tel:&amp;#43;4981217607887">+49 8121-7607887&lt;/a>

Fax: +49 8121-7607920
E-mail: &lt;a href="mailto:hallo@panomity.de">hallo@panomity.de&lt;/a>
&lt;/p>
&lt;p>Security reports: &lt;a href="mailto:security@shelltrap.com">security@shelltrap.com&lt;/a>
&lt;/p>
&lt;h2 id="sales-tax-id">Sales tax ID&lt;/h2>
&lt;p>Sales tax identification number according to §27 a sales tax law: DE324810080&lt;/p></description></item><item><title>Installation and first run</title><link>https://shelltrap.com/docs/installation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://shelltrap.com/docs/installation/</guid><description>&lt;h2 id="requirements">Requirements&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Root access&lt;/strong>, or a package service account with full installation rights. The broker
&lt;code>shelltrapd&lt;/code> runs as root; the worker runs as &lt;code>shelltrap-scan&lt;/code>, a system user without a login
shell and without a home directory.&lt;/li>
&lt;li>&lt;strong>A supported CyberPanel operating system:&lt;/strong> Ubuntu 20.04, 22.04 or 24.04; AlmaLinux,
RockyLinux or RHEL 8, 9 or 10; CloudLinux 8; CentOS 9. Debian is only third-party supported by
CyberPanel and is not promised.&lt;/li>
&lt;li>&lt;strong>A Linux filesystem under the configured customer roots&lt;/strong> (&lt;code>/home&lt;/code> by default), enough
memory, and a kernel on which the installer can actually probe the fanotify and file-handle
capabilities.&lt;/li>
&lt;li>&lt;strong>For the Full profile:&lt;/strong> at least 1.5 GiB of &lt;code>MemAvailable&lt;/code> remaining &lt;em>after&lt;/em> the measured
reload reserve, which includes the observed clamd footprint plus a fixed safety margin. This
measurement must not be replaced by a global sysctl change.&lt;/li>
&lt;li>&lt;strong>For ClamAV in the Full profile:&lt;/strong> a running or installable &lt;code>clamd&lt;/code> and a Unix socket
reachable by the &lt;code>shelltrap-scan&lt;/code> user, &lt;code>/run/clamav/clamd.ctl&lt;/code> by default. A socket readable
only by root is not enough. If the service or the worker&amp;rsquo;s access is unavailable, the state
becomes &lt;code>degraded&lt;/code> and never &lt;code>clean&lt;/code>.&lt;/li>
&lt;li>&lt;strong>For the PHP upload adapter:&lt;/strong> a supported lsphp/LSWS installation. The adapter needs only the
local socket &lt;code>/run/shelltrap/upload.sock&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Tools:&lt;/strong> &lt;code>sha256sum&lt;/code>, GnuPG and either &lt;code>curl&lt;/code> or &lt;code>wget&lt;/code> for the host installer; &lt;code>unzip&lt;/code> in
addition for the CyberPanel package. The native package manager resolves dependencies.&lt;/li>
&lt;/ul>
&lt;h2 id="host-preflight">Host preflight&lt;/h2>
&lt;p>Before any download, the host installer prints read-only facts about the machine and changes
nothing:&lt;/p></description></item><item><title>How real-time file detection works</title><link>https://shelltrap.com/how-it-works/real-time-detection/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://shelltrap.com/how-it-works/real-time-detection/</guid><description>&lt;h2 id="the-problem-with-scheduled-scanning">The problem with scheduled scanning&lt;/h2>
&lt;p>A cron job that walks &lt;code>/home&lt;/code> at three in the morning has one virtue: it is simple. Everything
else about it is a compromise.&lt;/p>
&lt;p>A webshell uploaded at 09:15 has eighteen hours to be used before anything notices. In those
eighteen hours it can be used to send mail, host a phishing page, pivot to another account or
install a second backdoor somewhere the next scan will not look. By the time the scan reports,
the file it finds is often not the interesting one any more — it is the one the attacker left
behind on purpose.&lt;/p></description></item><item><title>Configuration and policies</title><link>https://shelltrap.com/docs/configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://shelltrap.com/docs/configuration/</guid><description>&lt;h2 id="the-policy-model">The policy model&lt;/h2>
&lt;p>Every setting that steers behaviour is a policy on three levels:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>global&lt;/strong> — the whole host&lt;/li>
&lt;li>&lt;strong>account&lt;/strong> — one CyberPanel user&lt;/li>
&lt;li>&lt;strong>domain&lt;/strong> — one website or child domain&lt;/li>
&lt;/ol>
&lt;p>The more specific level wins, and each level may inherit or override individual keys. Inside a
domain there can also be path rules using globs relative to the document root.&lt;/p>
&lt;p>Assignment works through a document-root index the broker keeps from the CyberPanel database
(website, child domain, document root, owner), refreshed on a timer and on panel changes.
fanotify events are mapped to an account and a domain by the longest matching document-root
prefix. The PHP adapter passes &lt;code>DOCUMENT_ROOT&lt;/code> and &lt;code>SERVER_NAME&lt;/code>; the document root decides and
the server name is only used as a plausibility check. Files outside every document root — mail,
backups, the home root — fall under the account policy.&lt;/p></description></item><item><title>Privacy statement</title><link>https://shelltrap.com/legal/privacy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://shelltrap.com/legal/privacy/</guid><description>&lt;p>This statement covers two separate things, and it is worth keeping them apart:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>This website&lt;/strong>, shelltrap.com — what happens when you read these pages.&lt;/li>
&lt;li>&lt;strong>The Shelltrap software&lt;/strong> — what the program on your own server transmits, and what it never
transmits.&lt;/li>
&lt;/ol>
&lt;h2 id="1-controller">1. Controller&lt;/h2>
&lt;p>Panomity GmbH
Seilergasse 34, 85570 Markt Schwaben, Germany
Phone &lt;a href="tel:&amp;#43;4981217607887">+49 8121-7607887&lt;/a>
 · &lt;a href="mailto:hallo@panomity.de">hallo@panomity.de&lt;/a>

Represented by the managing director Sascha Endlicher, M.A.
Register court Amtsgericht München, HRB 264411 · VAT ID DE324810080&lt;/p></description></item><item><title>How a synchronous upload gate works</title><link>https://shelltrap.com/how-it-works/upload-gate/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://shelltrap.com/how-it-works/upload-gate/</guid><description>&lt;h2 id="the-window-you-are-trying-to-close">The window you are trying to close&lt;/h2>
&lt;p>An attacker uploads a file through a vulnerable plugin at 09:15:02 and requests it at 09:15:04.
Two seconds. Any detection mechanism with a latency longer than that has, in this case,
documented an incident rather than prevented one.&lt;/p>
&lt;p>Asynchronous detection is genuinely valuable — most compromises are not exploited within seconds,
and finding the shell in five seconds instead of eighteen hours changes everything about the
cleanup. But if you want to &lt;em>stop&lt;/em> the upload, the check has to happen while the request is
still in flight.&lt;/p></description></item><item><title>The CyberPanel plugin</title><link>https://shelltrap.com/docs/plugin/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://shelltrap.com/docs/plugin/</guid><description>&lt;h2 id="before-you-install">Before you install&lt;/h2>
&lt;p>The Shelltrap broker must be running, &lt;code>/run/shelltrap/api.sock&lt;/code> must exist, and CyberPanel must
be installed. The plugin archive is built reproducibly and contains a single top-level directory
&lt;code>shelltrap/&lt;/code>, without caches or Python bytecode.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">cd /usr/local/CyberCP
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/usr/local/CyberCP/bin/python /usr/local/CyberCP/pluginInstaller/pluginInstaller.py \
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> install --pluginName shelltrap
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="why-the-install-is-so-careful">Why the install is so careful&lt;/h2>
&lt;p>The CyberPanel installer patches core files — &lt;code>CyberCP/settings.py&lt;/code>, &lt;code>CyberCP/urls.py&lt;/code> and the
sidebar template — by inserting lines, and its hook calls use &lt;code>subprocess.call&lt;/code> and &lt;strong>ignore
exit codes&lt;/strong>. A failed preflight therefore cannot stop the installation from claiming success.&lt;/p></description></item><item><title>Terms of business</title><link>https://shelltrap.com/legal/terms/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://shelltrap.com/legal/terms/</guid><description>&lt;h2 id="the-binding-documents">The binding documents&lt;/h2>
&lt;p>A contract for Shelltrap is concluded in our shop and client area at
&lt;a href="https://shop.shelltrap.com/clientarea/" rel="noopener">shop.shelltrap.com&lt;/a>
. The documents shown and accepted
there during checkout are the binding ones:&lt;/p>
&lt;ul>
&lt;li>the &lt;strong>general terms and conditions&lt;/strong> (Allgemeine Geschäftsbedingungen) of Panomity GmbH,&lt;/li>
&lt;li>the &lt;strong>licence terms&lt;/strong> for the Shelltrap software, of which an extract is published at
&lt;a href="https://shelltrap.com/legal/eula/">licence terms&lt;/a>
,&lt;/li>
&lt;li>the &lt;strong>product description and price&lt;/strong> as displayed at the moment of ordering.&lt;/li>
&lt;/ul>
&lt;p>If anything on this website contradicts those documents, those documents apply. If you would
like to read them before you start an order, ask us and we will send them:
&lt;a href="mailto:hallo@panomity.de">hallo@panomity.de&lt;/a>
.&lt;/p></description></item><item><title>Licence terms (extract)</title><link>https://shelltrap.com/legal/eula/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://shelltrap.com/legal/eula/</guid><description>&lt;h2 id="1-what-is-licensed">1. What is licensed&lt;/h2>
&lt;p>Shelltrap is &lt;strong>proprietary software of Panomity GmbH&lt;/strong>. What is delivered is:&lt;/p>
&lt;ul>
&lt;li>compiled, stripped Go binaries (the broker, the scanner worker and the CLI),&lt;/li>
&lt;li>the thin PHP upload adapter,&lt;/li>
&lt;li>the CyberPanel plugin (Python),&lt;/li>
&lt;li>the packaged configuration, systemd units, documentation and public keys.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>No source code is delivered.&lt;/strong> There is no source escrow arrangement in the standard licence.&lt;/p>
&lt;h2 id="2-scope-of-the-licence">2. Scope of the licence&lt;/h2>
&lt;p>A licence entitles you to install and operate the software on &lt;strong>one server&lt;/strong>, for an unlimited
number of domains, child domains and accounts on that server. The licence is bound at activation
to a server fingerprint derived from &lt;code>/etc/machine-id&lt;/code>; the standard licence permits one
simultaneous activation.&lt;/p></description></item><item><title>Signature feeds</title><link>https://shelltrap.com/docs/feeds/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://shelltrap.com/docs/feeds/</guid><description>&lt;figure class="figure">&lt;svg viewBox="0 0 900 400" role="img" aria-labelledby="feedTitle feedDesc">
 &lt;title id="feedTitle">The path of a signature generation from source to activation&lt;/title>
 &lt;desc id="feedDesc">Sources are filtered by licence, given provenance and built into an Ed25519-signed generation. The client verifies digest and signature, the corpus gate checks against known-good and known-bad sets, and only then is the switch made atomically. A quarantine storm across several accounts triggers an automatic rollback.&lt;/desc>
 &lt;defs>
 &lt;marker id="fdArrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
 &lt;path d="M0 1l8 4-8 4z" fill="var(--border-strong)"/>
 &lt;/marker>
 &lt;marker id="fdArrowD" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
 &lt;path d="M0 1l8 4-8 4z" fill="var(--danger)"/>
 &lt;/marker>
 &lt;/defs>&lt;text x="24" y="26" class="svg-label" fill="var(--accent)">BUILD AT PANOMITY&lt;/text>
 &lt;text x="470" y="26" class="svg-label" fill="var(--accent)">ON YOUR SERVER&lt;/text>
 &lt;line x1="452" y1="18" x2="452" y2="300" stroke="var(--border)" stroke-width="1" stroke-dasharray="4 5"/>
 &lt;rect x="24" y="40" width="196" height="92" rx="5" class="svg-panel-raised"/>
 &lt;text x="38" y="66" class="svg-label" fill="var(--accent)">01&lt;/text>
 &lt;text x="38" y="90" class="svg-title">Sources&lt;/text>
 &lt;text x="38" y="112" class="svg-label svg-label--sm">own rules · curated third-party rules&lt;/text>
 &lt;path d="M220 86h12" stroke="var(--border-strong)" stroke-width="1.4" marker-end="url(#fdArrow)" fill="none"/>
 &lt;rect x="238" y="40" width="196" height="92" rx="5" class="svg-panel-raised"/>
 &lt;text x="252" y="66" class="svg-label" fill="var(--accent)">02&lt;/text>
 &lt;text x="252" y="90" class="svg-title">Licence filter&lt;/text>
 &lt;text x="252" y="112" class="svg-label svg-label--sm">only DRL-1.1, BSD-3, Apache-2.0, MIT&lt;/text>
 &lt;path d="M434 86h12" stroke="var(--border-strong)" stroke-width="1.4" marker-end="url(#fdArrow)" fill="none"/>
 &lt;rect x="452" y="40" width="196" height="92" rx="5" class="svg-panel-raised"/>
 &lt;text x="466" y="66" class="svg-label" fill="var(--accent)">03&lt;/text>
 &lt;text x="466" y="90" class="svg-title">Provenance&lt;/text>
 &lt;text x="466" y="112" class="svg-label svg-label--sm">source, author, commit, licence per rule&lt;/text>
 &lt;path d="M648 86h12" stroke="var(--border-strong)" stroke-width="1.4" marker-end="url(#fdArrow)" fill="none"/>
 &lt;rect x="666" y="40" width="196" height="92" rx="5" class="svg-panel-raised"/>
 &lt;text x="680" y="66" class="svg-label" fill="var(--accent)">04&lt;/text>
 &lt;text x="680" y="90" class="svg-title">Signature&lt;/text>
 &lt;text x="680" y="112" class="svg-label svg-label--sm">Ed25519 · manifest.json &amp;#43; manifest.sig&lt;/text>
 &lt;rect x="24" y="156" width="196" height="92" rx="5" class="svg-panel-raised"/>
 &lt;text x="38" y="182" class="svg-label" fill="var(--accent)">05&lt;/text>
 &lt;text x="38" y="206" class="svg-title">Verification&lt;/text>
 &lt;text x="38" y="228" class="svg-label svg-label--sm">digest before signature, expiry, denylist&lt;/text>
 &lt;path d="M220 202h12" stroke="var(--border-strong)" stroke-width="1.4" marker-end="url(#fdArrow)" fill="none"/>
 &lt;rect x="238" y="156" width="196" height="92" rx="5" class="svg-panel-raised"/>
 &lt;text x="252" y="182" class="svg-label" fill="var(--accent)">06&lt;/text>
 &lt;text x="252" y="206" class="svg-title">Corpus gate&lt;/text>
 &lt;text x="252" y="228" class="svg-label svg-label--sm">known-good is hard, known-bad is a ratio&lt;/text>
 &lt;path d="M434 202h12" stroke="var(--border-strong)" stroke-width="1.4" marker-end="url(#fdArrow)" fill="none"/>
 &lt;rect x="452" y="156" width="196" height="92" rx="5" class="svg-panel-raised"/>
 &lt;text x="466" y="182" class="svg-label" fill="var(--accent)">07&lt;/text>
 &lt;text x="466" y="206" class="svg-title">Activation&lt;/text>
 &lt;text x="466" y="228" class="svg-label svg-label--sm">atomic symlink swap, cache invalidated&lt;/text>
 &lt;path d="M648 202h12" stroke="var(--border-strong)" stroke-width="1.4" marker-end="url(#fdArrow)" fill="none"/>
 &lt;path d="M866 86v46H98v18" stroke="var(--border-strong)" stroke-width="1.4" marker-end="url(#fdArrow)" fill="none"/>

 
 &lt;rect x="24" y="288" width="852" height="88" rx="5" class="svg-panel"/>
 &lt;rect x="24" y="288" width="4" height="88" fill="var(--danger)"/>
 &lt;text x="48" y="314" class="svg-title" fill="var(--danger)">Circuit breaker&lt;/text>
 &lt;text x="48" y="336" class="svg-label">last hour against the 24-hour mean: at least 50 quarantines and more than ten times the mean&lt;/text>
 &lt;text x="48" y="356" class="svg-label">and at least three accounts and at least 20 % of active accounts — a single account can never trigger a server-wide rollback&lt;/text>
 &lt;path d="M760 288v-24" stroke="var(--danger)" stroke-width="1.4" marker-end="url(#fdArrowD)" fill="none"/>
 &lt;text x="612" y="282" class="svg-label svg-label--sm" fill="var(--danger)">automatic rollback&lt;/text>
&lt;/svg>
&lt;figcaption>Nothing is activated that has not been signed, verified twice, gated against a known-good and a known-bad corpus, and made revocable.&lt;/figcaption>
&lt;/figure>

&lt;h2 id="generations-not-updates">Generations, not updates&lt;/h2>
&lt;p>A rule set is not a stream of edits; it is a &lt;strong>generation&lt;/strong>: an immutable, signed directory.
Vendor generation IDs are exactly &lt;code>YYYYMMDDTHHMMSSZ-NNNN&lt;/code>, for example
&lt;code>20260903T120000Z-0001&lt;/code>. Local overlays use &lt;code>local-&amp;lt;64 hex characters&amp;gt;&lt;/code>.&lt;/p></description></item><item><title>Licensing and activation</title><link>https://shelltrap.com/docs/licensing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://shelltrap.com/docs/licensing/</guid><description>&lt;h2 id="the-pieces">The pieces&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Term&lt;/th>
 &lt;th>Meaning&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Licence key&lt;/strong>&lt;/td>
 &lt;td>&lt;code>STL-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX&lt;/code> — Crockford Base32, 25 payload characters including two check characters. Generated when the licence is created and returned in clear text exactly once; the service stores only &lt;code>sha256(key)&lt;/code> plus the first nine characters as a display prefix.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Licence&lt;/strong>&lt;/td>
 &lt;td>The record: plan, maximum servers (1 by default), status (&lt;code>active&lt;/code>, &lt;code>suspended&lt;/code>, &lt;code>terminated&lt;/code>), expiry, and the link to your account.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Activation&lt;/strong>&lt;/td>
 &lt;td>Binding a licence to a server fingerprint. At most &lt;code>max_servers&lt;/code> at a time; &lt;code>deactivate&lt;/code> frees a slot.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Licence token&lt;/strong>&lt;/td>
 &lt;td>An Ed25519-signed document the daemon verifies &lt;strong>offline&lt;/strong>.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Server fingerprint&lt;/strong>&lt;/td>
 &lt;td>&lt;code>sha256&lt;/code> over a fixed prefix and the contents of &lt;code>/etc/machine-id&lt;/code>. The hostname is sent for information only.&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="activation">Activation&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">shelltrap license activate STL-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">shelltrap license status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">shelltrap license renew
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">shelltrap license deactivate
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The token lands in &lt;code>/etc/shelltrap/license.token&lt;/code>, root, mode &lt;code>0600&lt;/code>. The key itself is stored
only as a prefix in &lt;code>/etc/shelltrap/license.key&lt;/code>, also &lt;code>0600&lt;/code>, so renewals do not need you to
type it again. If you would rather not have the key on the server at all, delete that file and
renew manually.&lt;/p></description></item><item><title>Hash sets</title><link>https://shelltrap.com/rules/hashes/</link><pubDate>Fri, 04 Sep 2026 12:00:00 +0200</pubDate><guid>https://shelltrap.com/rules/hashes/</guid><description>&lt;p>Shelltrap ships two kinds of hash data in every signed generation:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Known-bad hashes&lt;/strong> (&lt;code>hashes/*.hsb&lt;/code>): exact SHA-256 matches of confirmed malware. A match produces a malicious verdict with confidence 100.&lt;/li>
&lt;li>&lt;strong>Allow sets&lt;/strong> (&lt;code>allow/*.sha256&lt;/code>): SHA-256 hashes of verified files, currently the WordPress core files of supported releases downloaded from wordpress.org and hashed by Panomity. A match suppresses heuristic signals for that file; signature and ClamAV hits still take precedence.&lt;/li>
&lt;/ul>
&lt;p>Hashes are data, not works; the allow sets are published under the MIT license by Panomity GmbH. False positives or missing versions: &lt;a href="mailto:hallo@panomity.de">hallo@panomity.de&lt;/a>
.&lt;/p></description></item><item><title>Heuristics engine</title><link>https://shelltrap.com/rules/heuristics/</link><pubDate>Fri, 04 Sep 2026 12:00:00 +0200</pubDate><guid>https://shelltrap.com/rules/heuristics/</guid><description>&lt;p>The heuristics engine (&lt;code>shelltrap:heuristics-v1&lt;/code>, proprietary, Panomity GmbH) scores files by combining independent signals: request-driven command execution, dynamic eval/assert, encoded payload layers, escape density, entropy and long lines.&lt;/p>
&lt;ul>
&lt;li>Weak statistical signals (entropy, long lines) never produce a suspicious verdict on their own; minified bundles and caches stay clean.&lt;/li>
&lt;li>Documented library files (PHP tag first, a &lt;code>@package&lt;/code>/&lt;code>@license&lt;/code> docblock in the first 2 KiB, no eval/base64_decode/gzinflate) are held below suspicious even with escape-heavy code.&lt;/li>
&lt;li>Verified WordPress core files are cleared by the allow sets before heuristics run.&lt;/li>
&lt;li>Per domain, &lt;code>heuristics.action&lt;/code> can be set to report, quarantine or off, and &lt;code>heuristics.threshold&lt;/code> raises the bar for suspicious findings.&lt;/li>
&lt;/ul>
&lt;p>Report false positives with finding ID and file hash to &lt;a href="mailto:hallo@panomity.de">hallo@panomity.de&lt;/a>
.&lt;/p></description></item><item><title>Known webshell families</title><link>https://shelltrap.com/rules/known-shells/</link><pubDate>Fri, 04 Sep 2026 12:00:00 +0200</pubDate><guid>https://shelltrap.com/rules/known-shells/</guid><description>&lt;p>Signature strings of well-known PHP webshells (c99, r57, b374k, WSO, FilesMan, p0wny), spam mailers and back-connect helpers. Every rule requires PHP context and at least two independent indicators.&lt;/p>
&lt;p>Source file: &lt;code>panomity_known_shells.yar&lt;/code> (license MIT, author Panomity GmbH). Scores range from 0 to 100; 85 and above marks a finding as malicious on its own, 40 to 84 as suspicious.&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Rule&lt;/th>
 &lt;th>Score&lt;/th>
 &lt;th>What it detects&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>Panomity_Shell_C99&lt;/code>&lt;/td>
 &lt;td>92&lt;/td>
 &lt;td>c99 PHP webshell family markers&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_Shell_R57&lt;/code>&lt;/td>
 &lt;td>92&lt;/td>
 &lt;td>r57 PHP webshell family markers&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_Shell_B374k&lt;/code>&lt;/td>
 &lt;td>92&lt;/td>
 &lt;td>b374k PHP webshell family markers&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_Shell_WSO&lt;/code>&lt;/td>
 &lt;td>90&lt;/td>
 &lt;td>WSO (Web Shell by oRb) family markers&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_Shell_FilesMan&lt;/code>&lt;/td>
 &lt;td>88&lt;/td>
 &lt;td>FilesMan file-manager webshell module marker&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_Shell_P0wny&lt;/code>&lt;/td>
 &lt;td>92&lt;/td>
 &lt;td>p0wny-shell single-file PHP shell markers&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_Shell_Generic_Mailer_Spam&lt;/code>&lt;/td>
 &lt;td>86&lt;/td>
 &lt;td>Bulk mailer spam kit markers (leaf/inbox mailer style), distinct from legitimate mail libraries&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_Shell_Generic_Uname_Backconnect&lt;/code>&lt;/td>
 &lt;td>87&lt;/td>
 &lt;td>Generic PHP shell exposing a back-connect helper driven by request input&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="reporting-a-false-positive">Reporting a false positive&lt;/h2>
&lt;p>Send the finding ID, the rule name and, if possible, the file (or its SHA-256) to &lt;a href="mailto:hallo@panomity.de">hallo@panomity.de&lt;/a>
 or open a ticket in the &lt;a href="https://shop.shelltrap.com/clientarea/" rel="noopener">client area&lt;/a>
. Confirmed false positives are fixed in the next signed generation; clients receive it automatically.&lt;/p></description></item><item><title>PHP obfuscation rules</title><link>https://shelltrap.com/rules/php-obfuscation/</link><pubDate>Fri, 04 Sep 2026 12:00:00 +0200</pubDate><guid>https://shelltrap.com/rules/php-obfuscation/</guid><description>&lt;p>Loader and obfuscation patterns: eval/base64 chains, assert and create_function loaders, preg_replace /e, str_rot13/gzinflate layers, hex and chr escape chains, goto obfuscation.&lt;/p>
&lt;p>Source file: &lt;code>panomity_php_obfuscation.yar&lt;/code> (license MIT, author Panomity GmbH). Scores range from 0 to 100; 85 and above marks a finding as malicious on its own, 40 to 84 as suspicious.&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Rule&lt;/th>
 &lt;th>Score&lt;/th>
 &lt;th>What it detects&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>Panomity_PHP_Eval_Base64_Chain&lt;/code>&lt;/td>
 &lt;td>90&lt;/td>
 &lt;td>eval() applied directly to a decode/inflate call, the classic packed PHP shell loader&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_PHP_Assert_Superglobal_Loader&lt;/code>&lt;/td>
 &lt;td>90&lt;/td>
 &lt;td>assert() used as a code-execution sink over request input&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_PHP_Assert_Decode_Loader&lt;/code>&lt;/td>
 &lt;td>88&lt;/td>
 &lt;td>assert() applied to a decode/inflate call used as an eval substitute&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_PHP_CreateFunction_Loader&lt;/code>&lt;/td>
 &lt;td>87&lt;/td>
 &lt;td>create_function() lambda body built from request input or a decode call&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_PHP_PregReplace_E_Modifier&lt;/code>&lt;/td>
 &lt;td>88&lt;/td>
 &lt;td>preg_replace() with the deprecated /e modifier, a code-execution primitive in old PHP shells&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_PHP_StrRot13_GzInflate&lt;/code>&lt;/td>
 &lt;td>90&lt;/td>
 &lt;td>Stacked str_rot13/gzinflate/base64 decode layers wrapping an executable payload&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_PHP_Hex_Escape_Chain&lt;/code>&lt;/td>
 &lt;td>85&lt;/td>
 &lt;td>PHP file whose executable identifiers are hidden as long \x hex escape runs&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_PHP_Chr_Concat_Chain&lt;/code>&lt;/td>
 &lt;td>85&lt;/td>
 &lt;td>PHP identifier assembled from a long chr() concatenation chain&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_PHP_Goto_Obfuscation&lt;/code>&lt;/td>
 &lt;td>85&lt;/td>
 &lt;td>PHP file flattened with many goto jumps to random labels, typical of automated shell packers&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_PHP_Concat_Eval_Obfuscation&lt;/code>&lt;/td>
 &lt;td>86&lt;/td>
 &lt;td>eval/assert identifier split across string concatenation to evade naive scanners&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_PHP_Variable_Function_Superglobal&lt;/code>&lt;/td>
 &lt;td>89&lt;/td>
 &lt;td>Variable-function dispatch where both callable and argument come from request input&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="reporting-a-false-positive">Reporting a false positive&lt;/h2>
&lt;p>Send the finding ID, the rule name and, if possible, the file (or its SHA-256) to &lt;a href="mailto:hallo@panomity.de">hallo@panomity.de&lt;/a>
 or open a ticket in the &lt;a href="https://shop.shelltrap.com/clientarea/" rel="noopener">client area&lt;/a>
. Confirmed false positives are fixed in the next signed generation; clients receive it automatically.&lt;/p></description></item><item><title>PHP remote code execution patterns</title><link>https://shelltrap.com/rules/php-rce/</link><pubDate>Fri, 04 Sep 2026 12:00:00 +0200</pubDate><guid>https://shelltrap.com/rules/php-rce/</guid><description>&lt;p>Direct command execution driven by request data: system/exec/passthru/shell_exec with superglobals, backtick execution, proc_open pipes and similar.&lt;/p>
&lt;p>Source file: &lt;code>panomity_php_rce.yar&lt;/code> (license MIT, author Panomity GmbH). Scores range from 0 to 100; 85 and above marks a finding as malicious on its own, 40 to 84 as suspicious.&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Rule&lt;/th>
 &lt;th>Score&lt;/th>
 &lt;th>What it detects&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>Panomity_PHP_Superglobal_Command_Exec&lt;/code>&lt;/td>
 &lt;td>90&lt;/td>
 &lt;td>OS command function fed directly from request input, including whitespace-padded variants&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_PHP_Superglobal_Eval&lt;/code>&lt;/td>
 &lt;td>90&lt;/td>
 &lt;td>eval() executed directly on request input&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_PHP_Backticks_Superglobal&lt;/code>&lt;/td>
 &lt;td>88&lt;/td>
 &lt;td>Shell backtick execution of request input inside a PHP file&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_PHP_Base64_Superglobal_Exec&lt;/code>&lt;/td>
 &lt;td>87&lt;/td>
 &lt;td>Command/eval sink taking base64_decode() of request input&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_PHP_Image_Polyglot_PHP_Payload&lt;/code>&lt;/td>
 &lt;td>90&lt;/td>
 &lt;td>Image file (JPEG/PNG/GIF/ICO magic) carrying an executable PHP payload appended to the pixels&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_PHP_Preg_Replace_Superglobal&lt;/code>&lt;/td>
 &lt;td>86&lt;/td>
 &lt;td>preg_replace() whose subject or replacement is request input combined with the /e modifier&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="reporting-a-false-positive">Reporting a false positive&lt;/h2>
&lt;p>Send the finding ID, the rule name and, if possible, the file (or its SHA-256) to &lt;a href="mailto:hallo@panomity.de">hallo@panomity.de&lt;/a>
 or open a ticket in the &lt;a href="https://shop.shelltrap.com/clientarea/" rel="noopener">client area&lt;/a>
. Confirmed false positives are fixed in the next signed generation; clients receive it automatically.&lt;/p></description></item><item><title>WordPress-specific droppers</title><link>https://shelltrap.com/rules/wordpress/</link><pubDate>Fri, 04 Sep 2026 12:00:00 +0200</pubDate><guid>https://shelltrap.com/rules/wordpress/</guid><description>&lt;p>Backdoors that hide inside WordPress structures: PHP in uploads, fake wp-config includes, mu-plugins backdoors, fake plugin headers with curl/eval, appended eval in index.php.&lt;/p>
&lt;p>Source file: &lt;code>panomity_wordpress_droppers.yar&lt;/code> (license MIT, author Panomity GmbH). Scores range from 0 to 100; 85 and above marks a finding as malicious on its own, 40 to 84 as suspicious.&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Rule&lt;/th>
 &lt;th>Score&lt;/th>
 &lt;th>What it detects&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>Panomity_WP_Uploads_PHP_Dropper&lt;/code>&lt;/td>
 &lt;td>88&lt;/td>
 &lt;td>PHP file dropped into wp-content/uploads that writes another PHP payload&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_WP_Config_Fake_Include&lt;/code>&lt;/td>
 &lt;td>87&lt;/td>
 &lt;td>Fake wp-config style loader that includes and evaluates a hidden payload file&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_WP_MuPlugins_Backdoor&lt;/code>&lt;/td>
 &lt;td>90&lt;/td>
 &lt;td>mu-plugins auto-loaded backdoor combining add_action with dynamic code execution on request input&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_WP_Fake_Plugin_Header_Backdoor&lt;/code>&lt;/td>
 &lt;td>89&lt;/td>
 &lt;td>File carrying a WordPress plugin header while fetching and evaluating remote code&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Panomity_WP_Index_Appended_Eval&lt;/code>&lt;/td>
 &lt;td>86&lt;/td>
 &lt;td>WordPress bootstrap file with an appended eval loader over request input&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="reporting-a-false-positive">Reporting a false positive&lt;/h2>
&lt;p>Send the finding ID, the rule name and, if possible, the file (or its SHA-256) to &lt;a href="mailto:hallo@panomity.de">hallo@panomity.de&lt;/a>
 or open a ticket in the &lt;a href="https://shop.shelltrap.com/clientarea/" rel="noopener">client area&lt;/a>
. Confirmed false positives are fixed in the next signed generation; clients receive it automatically.&lt;/p></description></item><item><title>ClamAV alone is not enough for webshells</title><link>https://shelltrap.com/articles/clamav-alone-is-not-enough-for-webshells/</link><pubDate>Fri, 04 Sep 2026 09:00:00 +0200</pubDate><guid>https://shelltrap.com/articles/clamav-alone-is-not-enough-for-webshells/</guid><description>&lt;!-- hero: four stacked detection layers — hashes, signatures, heuristics, known-good — with a single file descending through them and picking up a marker at each layer -->
&lt;p>&amp;ldquo;We run ClamAV&amp;rdquo; is the most common answer to &amp;ldquo;what scans your customers&amp;rsquo; files&amp;rdquo;, and it is a reasonable starting point. It is a poor finishing point, and the clearest statement of why comes from the ClamAV project itself.&lt;/p>
&lt;h2 id="clamavs-own-framing">ClamAV&amp;rsquo;s own framing&lt;/h2>
&lt;p>From &lt;a href="https://docs.clamav.net/" rel="noopener">the ClamAV documentation&lt;/a>
, verbatim:&lt;/p></description></item><item><title>CXS alternatives in 2026: the honest field guide</title><link>https://shelltrap.com/articles/cxs-alternatives-2026/</link><pubDate>Fri, 04 Sep 2026 09:00:00 +0200</pubDate><guid>https://shelltrap.com/articles/cxs-alternatives-2026/</guid><description>&lt;!-- hero: a shelf of labelled boxes representing scanner products, one box empty and outlined in dashes where cxs stood, an amber price tag lying beside it -->
&lt;p>ConfigServer&amp;rsquo;s eXploit Scanner is the product most CyberPanel and cPanel operators used for this job, and it no longer exists. This is the field as it stands on 4 September 2026: what actually happened, what a stalled cxs installation means in practice, and what the replacements cost.&lt;/p></description></item><item><title>CXS is gone: what CyberPanel operators should do next</title><link>https://shelltrap.com/articles/cxs-end-what-cyberpanel-operators-should-do/</link><pubDate>Fri, 04 Sep 2026 09:00:00 +0200</pubDate><guid>https://shelltrap.com/articles/cxs-end-what-cyberpanel-operators-should-do/</guid><description>&lt;!-- hero: a wall calendar with two torn-off pages, 30 July and 31 August 2025, and a server rack behind it; one rack unit still lit (csf, GPLv3 tag), the unit above it dark and sealed with a small padlock (cxs). Amber signal on the dark unit. -->
&lt;p>On 30 July 2025, Way to the Web Ltd published a short notice on its blog and on &lt;code>configserver.com&lt;/code>. A month later the company was gone, and with it the commercial exploit scanner that a generation of hosting operators had installed as a matter of routine.&lt;/p></description></item><item><title>CyberPanel malware scanner setup with Shelltrap</title><link>https://shelltrap.com/articles/cyberpanel-malware-scanner-setup-shelltrap/</link><pubDate>Fri, 04 Sep 2026 09:00:00 +0200</pubDate><guid>https://shelltrap.com/articles/cyberpanel-malware-scanner-setup-shelltrap/</guid><description>&lt;!-- hero: an isometric CyberPanel host outline with three stacked layers — kernel watcher, unprivileged worker, panel UI — connected by a single amber line marked "report only" -->
&lt;p>CyberPanel ships no malware scanner of its own, and the documented alternatives all come with a condition. This guide is the practical path to a host-level scanner on a stock CyberPanel box, in the order we actually do it: nothing enforcing on day one, everything visible.&lt;/p></description></item><item><title>CyberPanel's security history, and what it teaches operators</title><link>https://shelltrap.com/articles/cyberpanel-security-incidents-and-lessons/</link><pubDate>Fri, 04 Sep 2026 09:00:00 +0200</pubDate><guid>https://shelltrap.com/articles/cyberpanel-security-incidents-and-lessons/</guid><description>&lt;!-- hero: a timeline ribbon running left to right with four marked notches — Oct 2024, Nov/Dec 2024, an empty stretch labelled 2025, then a dense cluster in 2026. A small padlock icon sits at the 2024 notch; the 2026 cluster carries a port-8888 tag. -->
&lt;p>CyberPanel is our beachhead, and it is also a product with a documented security history. Writing honestly about both is the only version of this article worth publishing — the panel is a distribution channel for us, not a target, and the operators reading this are the people who had to clean up after October 2024.&lt;/p></description></item><item><title>False positives on WordPress core, and what to do</title><link>https://shelltrap.com/articles/false-positives-in-malware-scanning-wordpress-core/</link><pubDate>Fri, 04 Sep 2026 09:00:00 +0200</pubDate><guid>https://shelltrap.com/articles/false-positives-in-malware-scanning-wordpress-core/</guid><description>&lt;!-- hero: a grid of file tiles, most cool cyan, three amber; a magnified tile shows two heuristic signal bars — escape density and variable call — neither long enough on its own to cross a marked threshold line -->
&lt;p>Every discussion of malware scanners is about detection. Every actual deployment is about false positives, because that is the failure mode your customers experience. This article is about which files trip generic heuristics on a WordPress host, why that happens, and what the tuning path looks like.&lt;/p></description></item><item><title>fanotify vs inotify for file monitoring</title><link>https://shelltrap.com/articles/fanotify-vs-inotify-for-file-monitoring/</link><pubDate>Fri, 04 Sep 2026 09:00:00 +0200</pubDate><guid>https://shelltrap.com/articles/fanotify-vs-inotify-for-file-monitoring/</guid><description>&lt;!-- hero: two parallel pipelines from a mount point to a listener — the upper one a single wide channel labelled mount-wide with a gate symbol, the lower one a fan of many thin channels each labelled with a directory, several of them dropping events -->
&lt;p>If a scanner claims real-time detection, it is using one of two kernel interfaces, and the difference between them decides what it can promise. Both are documented in detail by the kernel&amp;rsquo;s own man pages, which is a pleasant change from a field where most architecture claims are marketing.&lt;/p></description></item><item><title>Find webshells on a CyberPanel server manually</title><link>https://shelltrap.com/articles/find-webshells-on-a-cyberpanel-server-manually/</link><pubDate>Fri, 04 Sep 2026 09:00:00 +0200</pubDate><guid>https://shelltrap.com/articles/find-webshells-on-a-cyberpanel-server-manually/</guid><description>&lt;!-- hero: a terminal window whose scrollback is a column of file paths; three paths are highlighted amber and joined by a thin line to a magnifier over a directory tree on the right -->
&lt;p>This is the sweep we run before anything else when a CyberPanel host is suspected of hosting a webshell. Everything below uses tools that are already on the box. Everything below also has a limit, and the limits are the reason the article is longer than the command list.&lt;/p></description></item><item><title>GDPR and data residency in malware scanning</title><link>https://shelltrap.com/articles/gdpr-data-residency-malware-scanning/</link><pubDate>Fri, 04 Sep 2026 09:00:00 +0200</pubDate><guid>https://shelltrap.com/articles/gdpr-data-residency-malware-scanning/</guid><description>&lt;!-- hero: a server outline inside a dashed EU border; three arrows leave the server — two blocked and greyed, one thin amber arrow labelled licence and signatures leading to a small building marked Germany -->
&lt;p>Buying a malware scanner is a data-protection decision as much as a security one, because the product&amp;rsquo;s job is to read every file your customers put on your server. Whether those bytes stay on the machine decides how much paperwork, and how much risk, comes with the purchase.&lt;/p></description></item><item><title>How the PHP upload gate works (auto_prepend_file)</title><link>https://shelltrap.com/articles/php-upload-gate-auto-prepend-file/</link><pubDate>Fri, 04 Sep 2026 09:00:00 +0200</pubDate><guid>https://shelltrap.com/articles/php-upload-gate-auto-prepend-file/</guid><description>&lt;!-- hero: a PHP request drawn as a horizontal lane; at the point where the temp file is handed over, a narrow amber gate with two exits marked allow and deny, and a dotted line back to a policy card -->
&lt;p>The most useful moment to look at an uploaded file is before the application accepts it. At that point the file is still a temporary file, nothing has been moved into a document root, and refusing it costs one HTTP 403 instead of an incident.&lt;/p></description></item><item><title>How webshells get into WordPress uploads</title><link>https://shelltrap.com/articles/how-webshells-get-into-wordpress-uploads/</link><pubDate>Fri, 04 Sep 2026 09:00:00 +0200</pubDate><guid>https://shelltrap.com/articles/how-webshells-get-into-wordpress-uploads/</guid><description>&lt;!-- hero: cross-section of a WordPress uploads directory drawn as stacked folder layers; an image file descends normally while a second file, half image and half code, is intercepted at the boundary line and lit amber -->
&lt;p>Almost every webshell on a shared host arrives through the same short story: a plugin accepts a file it should have rejected, the file lands somewhere the web server will execute it, and an HTTP request turns it into a shell. The details are worth knowing, because each step has a different control.&lt;/p></description></item><item><title>Imunify360 vs Shelltrap on CyberPanel: a fair comparison</title><link>https://shelltrap.com/articles/imunify360-vs-shelltrap-for-cyberpanel/</link><pubDate>Fri, 04 Sep 2026 09:00:00 +0200</pubDate><guid>https://shelltrap.com/articles/imunify360-vs-shelltrap-for-cyberpanel/</guid><description>&lt;!-- hero: two balance pans on a plain beam. Left pan holds a stack labelled OS + licence + cloud arrow pointing off-server; right pan holds a single server outline with a closed loop arrow inside it. The beam is level, not tipped — the point is a comparison, not a verdict. -->
&lt;p>Both products scan a Linux hosting server for malware in real time. They are not the same purchase, and the differences that matter to a CyberPanel operator are not the ones on either vendor&amp;rsquo;s feature grid.&lt;/p></description></item></channel></rss>