<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>CrowdSec Blog</title>
        <link>https://crowdsec.net/blog</link>
        <description>Latest updates and insights from CrowdSec</description>
        <lastBuildDate>Wed, 28 Oct 2026 12:56:39 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>CrowdSec Blog</title>
            <url>https://cms.crowdsec.net/wp-content/uploads/2024/10/crowdsec-logo.png</url>
            <link>https://crowdsec.net/blog</link>
        </image>
        <item>
            <title><![CDATA[How to prioritise CVEs by real exploitation, beyond CVSS, EPSS and KEV]]></title>
            <link>https://crowdsec.net/blog/prioritise-cves-by-real-exploitation</link>
            <guid isPermaLink="false">https://crowdsec.net/blog/prioritise-cves-by-real-exploitation</guid>
            <pubDate>Tue, 27 Oct 2026 11:19:58 GMT</pubDate>
            <description><![CDATA[<p>CVSS, EPSS and KEV estimate risk. To prioritise patching, check if a CVE is exploited now, how targeted it is and whether it&#8217;s growing. A practical method.</p>
]]></description>
            <content:encoded><![CDATA[<p><em>By Thibault Koechlin, CTO at CrowdSec</em></p>
<p>Log4Shell has a CVSS score of 10. As of this writing, our network gives it a 3.</p>
<p>Meanwhile, a remote code execution in BeyondTrust&#8217;s remote support product scores 9 on the same scale: attackers are picking their targets carefully, and activity is above average. So you have both on your patch list and a single maintenance window: which one goes first?</p>
<p>Here&#8217;s the short answer: <strong>prioritise by what attackers are doing right now.</strong> Is the CVE exploited at all? Are attackers choosing their victims or spraying the whole internet? Is the activity growing or fading? CVSS, EPSS and KEV give you the theory and the history. Live exploitation data gives you today&#8217;s order.</p>
<p>Back to Log4Shell: the folks still scanning for it today are more likely to be laggards, CERTs or pentesting companies than real bad guys. The really dangerous exploitation happens in the first hours and days after release: it&#8217;s <a href="https://www.crowdsec.net/blog/cisa-bod-26-04-live-exploit-tracker" target="_blank" rel="noopener">the same window CISA now works with</a>, since <a href="https://www.cisa.gov/news-events/directives/bod-26-04-prioritizing-security-updates-based-risk" target="_blank" rel="noopener">BOD 26-04</a> gives US federal agencies 72 hours to fix publicly exposed, highest-risk exploited vulnerabilities. And if Log4Shell is still an issue at your workplace in 2026, well, digital Darwinism will kick in fairly quickly 😅</p>
<h2>What CVSS, EPSS and KEV actually tell you</h2>
<p>All three are useful. They just answer a different question than &#8220;what should I patch first this week?&#8221;</p>
<ul>
<li><strong>CVSS</strong> rates how bad a vulnerability <em>could</em> be, from its technical characteristics (attack vector, complexity, impact). It&#8217;s set at disclosure, so a 10 stays a 10 years after the attackers have moved on.</li>
<li><strong>EPSS</strong> estimates the probability that a vulnerability gets exploited in the wild in the next 30 days. It&#8217;s much closer to reality, but it&#8217;s a probability across everyone: it says little about who is being hit, or how. Don&#8217;t get me wrong, EPSS is useful: it&#8217;s a good complement to the existing scores.</li>
<li><strong>CISA KEV</strong> lists vulnerabilities with evidence of exploitation in the wild. Great for &#8220;must patch&#8221; lists, but it&#8217;s a yes/no with no sense of intensity or trend, and entries land after the evidence. The most important part, to me: things get <em>added</em> to KEV and practically never removed, so you end up with an ever-growing list, long after the attackers have moved on.</li>
</ul>
<p>Do any of them tell you whether attackers are going after organisations like yours <em>this week</em>? No, and that&#8217;s the gap we wanted to fill.</p>
<h2>Three signals that set the order</h2>
<p>When we built the Live Exploit Tracker, we boiled exploitation down to three questions, each answered from the more than 40 million attack signals a day sent by 250,000+ active Security Engines.</p>
<p><strong>1. Is it exploited now, and by how many IPs?</strong> Plenty of scary CVEs see little real exploitation, while some boring-looking ones get hammered. Counting the distinct IPs that exploited a CVE over the last few days is the first filter.</p>
<p><strong>2. Targeted or mass scanning?</strong> We call this the <em>Targeted</em> score (0 to 5). At 0, attackers hit IPs at random in automated sweeps: you&#8217;re one of millions. At 5, they select their victims based on exposure and configuration, and an alert on your systems likely means someone picked <em>you</em>. CVSS is blind here: a CVSS 7.5 hunted precisely can hurt you more than a CVSS 10 nobody bothers with.</p>
<p><strong>3. Growing or fading?</strong> The <em>Momentum</em> score (0 to 5) compares current volume with the CVE&#8217;s history. High momentum with low targeting usually means a new automated campaign: lots of noise, little signal per alert. High momentum with high targeting is the combination that should get you out of bed.</p>
<p>The tracker folds these into a <strong>CrowdSec Score from 0 to 10</strong>, and adds an <em>exploitation phase</em>, a plain-language label for where the CVE sits in its life. For a fresh CVE, things move fast:</p>
<table>
<thead>
<tr>
<th>Around</th>
<th>Phase</th>
<th>What it means for you</th>
</tr>
</thead>
<tbody>
<tr>
<td>day 0</td>
<td>Insufficient data</td>
<td>Too early to tell: fall back to CVSS and the vendor advisory</td>
</tr>
<tr>
<td>day 1</td>
<td>Early exploitation</td>
<td>First scans and small-scale attempts, often right after a public PoC: start prioritising</td>
</tr>
<tr>
<td>by day 2</td>
<td>Rapid escalation</td>
<td>Several actors weaponise it, volume climbs fast: patch now, block proactively</td>
</tr>
<tr>
<td>within weeks</td>
<td>Active exploitation</td>
<td>Exploited at scale by automated campaigns: emergency if you&#8217;re still exposed</td>
</tr>
<tr>
<td>after months</td>
<td>Background noise</td>
<td>Part of the internet&#8217;s weather: patch in your normal cycle, filter the noise</td>
</tr>
</tbody>
</table>
<p>Does every CVE follow that path? No, and that&#8217;s precisely why we watch it live.</p>
<h2>From score to decision</h2>
<p>Here&#8217;s the triage table we use in our own docs, slightly condensed:</p>
<table>
<thead>
<tr>
<th>What you see</th>
<th>What to do</th>
</tr>
</thead>
<tbody>
<tr>
<td>High score, targeted, growing</td>
<td>Emergency patch, block the exploiting IPs now, look for signs of compromise</td>
</tr>
<tr>
<td>High score, active exploitation</td>
<td>Urgent patch, block, check every instance of the affected software</td>
</tr>
<tr>
<td>Moderate score, background noise</td>
<td>Patch within days rather than weeks; blocking is optional</td>
</tr>
<tr>
<td>Low score, limited exploitation</td>
<td>Normal patch cycle, watch for a phase change</td>
</tr>
<tr>
<td>Insufficient data</td>
<td>Use CVSS and the vendor advisory, check back later</td>
</tr>
</tbody>
</table>
<p>Two more signals help break ties. The <strong>threat context</strong> tells you who is being targeted: attacker and victim countries, industries, and what the attackers seem to want (taking over infrastructure, stealing data, ransomware). And <a href="https://www.crowdsec.net/glossary/pre-nvd" target="_blank" rel="noopener"><strong>reconnaissance rules</strong></a> catch attackers probing a product (Exchange, F5, WordPress…) before any CVE is published, which often tells you where the next wave will land.</p>
<p>An example from our docs: for an authentication bypass in PAN-OS, the threat context showed mostly commercial and tech companies being targeted, with French and Hungarian organisations over-represented, and attackers going after control of the firewall management plane instead of data. If you run that product in a French tech company, that CVE goes to the top of the pile, whatever its rank in your scanner.</p>
<h2>Block while you patch</h2>
<p>Patching takes time, and some systems simply can&#8217;t be patched this week. The tracker lists the IPs exploiting each CVE, and you can subscribe a firewall to that list by CVE or by vendor (which also covers the vendor&#8217;s future CVEs). It works with Palo Alto, FortiGate, Check Point, Cisco, Juniper, Sophos, F5, pfSense, OPNsense, MikroTik, or any device that reads a plain IP list.</p>
<p>Large SOCs are rightly wary of broad blocklists they don&#8217;t control. A list scoped to the IPs exploiting the one CVE you can&#8217;t patch yet is an easier conversation, and it buys you time to patch properly.</p>
<h2>What it can&#8217;t see</h2>
<p>Is this a replacement for your vulnerability scanner or for CVSS? No. The tracker shows how a CVE is exploited in the wild; your scanner shows where you&#8217;re exposed. And we only see what hits internet-exposed systems: for products that are rare in our network, a CVE can sit in &#8220;insufficient data&#8221; for a while. The right move then is to fall back on CVSS and the vendor&#8217;s advisory until the data matures.</p>
<h2>Try it</h2>
<ul>
<li>Look up any CVE in the <a href="https://www.crowdsec.net/live-exploit-tracker" target="_blank" rel="noopener">Live Exploit Tracker</a> (book a demo to get your access key), or pull scores, phases and attacker IPs through the API and the Python SDK into your SIEM, SOAR or vulnerability-management workflow.</li>
<li>For the bigger picture, our <a href="https://www.crowdsec.net/vulnerability-exploitation-report" target="_blank" rel="noopener">vulnerability and exploitation report</a> covers the trends behind these scores.</li>
</ul>
<p>Spotted a CVE whose score surprised you? Let us know on <a href="https://discord.gg/crowdsec" target="_blank" rel="noopener">Discord</a>: that&#8217;s how the scoring gets better.</p>
]]></content:encoded>
            <category>Proactive Cybersecurity</category>
            <category>Thought Leadership</category>
            <category>Vulnerabilities</category>
            <enclosure url="https://cms.crowdsec.net/wp-content/uploads/2026/10/prioritise-cves-by-real-exploitation-featured.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[PHP2Shell Virtual Patching: Keep Your PHP Websites Online While You Upgrade]]></title>
            <link>https://crowdsec.net/blog/php2shell-virtual-patching</link>
            <guid isPermaLink="false">https://crowdsec.net/blog/php2shell-virtual-patching</guid>
            <pubDate>Fri, 23 Oct 2026 11:41:05 GMT</pubDate>
            <description><![CDATA[<p>PHP2Shell virtual patching: free CrowdSec WAF rules block known exploits for both CVEs, so your PHP sites stay online while you upgrade. How to set it up.</p>
]]></description>
            <content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>PHP powers roughly 70% of websites. When vulnerabilities like PHP2Shell emerge, virtual patching gives teams a fast way to block known exploit requests at the edge and a protection layer they can keep using as new vulnerabilities appear.</strong></p>



<p class="wp-block-paragraph"><strong>PHP2Shell</strong> is the name given to two critical vulnerabilities in PHP&#8217;s core, tracked as <strong>CVE-2026-109618</strong> and <strong>CVE-2026-109619</strong>. Because the flaws are in PHP itself, exposure is not limited to one CMS or framework.<br><a href="https://www.wiz.io/blog/php2shell-php-rce" target="_blank" rel="noreferrer noopener">Wiz Research estimates(*) that <strong>PHP powers 70% of websites worldwide</strong></a>, making the potential reach of these vulnerabilities unusually broad.</p>



<p class="wp-block-paragraph">Updating PHP to a fixed release is essential. But upgrades can take time: teams may need to test compatibility, coordinate a maintenance window, or wait for a hosting provider or vendor to ship an update. For older systems, a supported update may not be immediately available.</p>



<p class="wp-block-paragraph">If you have a healthy install of CrowdSec WAF already, you’re automatically protected via the automatic rules and scenario updates.</p>



<h2 class="wp-block-heading">Is PHP2Shell being exploited? What our network saw</h2>



<p class="wp-block-paragraph">Yes, and fast. CrowdSec&#8217;s network recorded <strong>450+ proven PHP2Shell attackers in the first 24 hours of observed exploitation</strong>. You can follow the activity live on the <a href="https://tracker.crowdsec.net/cves/CVE-2026-109618" target="_blank" rel="noreferrer noopener">Live Exploit Tracker</a>, and the IPs behind it are collected in the <a href="https://app.crowdsec.net/blocklists/6adb0eb5e63dd877df7987f4" target="_blank" rel="noreferrer noopener">PHP2Shell Attackers blocklist</a>, so your firewall can block them before they reach your servers.</p>



<h2 class="wp-block-heading">How long until you can actually upgrade?</h2>



<p class="wp-block-paragraph">The answer depends on which PHP version you run, and there are three tiers:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>Your PHP version</strong></td><td><strong>What&#8217;s available</strong></td><td><strong>Realistic timeline</strong></td></tr><tr><td>8.2, 8.3, 8.4, 8.5</td><td>Full official release (8.2.35, 8.3.36, 8.4.27, 8.5.12)</td><td>Package upgrade, today</td></tr><tr><td>7.4, 8.0, 8.1</td><td><a href="https://www.tenable.com/blog/php2shell-cve-2026-109618-cve-2026-109619-frequently-asked-questions-about-critical-php-remote" target="_blank" rel="noreferrer noopener">Minimal source backports</a><a href="https://www.wiz.io/blog/php2shell-php-rce">(*)</a> from the PHP security team</td><td>Build from source, or wait on your distro/LTS vendor</td></tr><tr><td>5.4.x – 7.3.x</td><td>Nothing from the PHP project</td><td>Vendor backport, or a major version upgrade</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><a href="https://w3techs.com/technologies/details/pl-php" target="_blank" rel="noreferrer noopener">W3Techs version data</a><a href="https://www.wiz.io/blog/php2shell-php-rce">(*)</a> puts 26.9% of PHP sites on PHP 7, 7.7% on PHP 5, and a further 21% of the PHP 8 population on 8.0 or 8.1. Combined, roughly <strong>48% of PHP sites have no full official release to upgrade to</strong>, they are waiting on a vendor, a rebuild, or a migration.</p>



<p class="wp-block-paragraph">Covering you while you patch, or when you can&#8217;t patch yet: that&#8217;s what virtual patching is for.</p>



<h2 class="wp-block-heading">Respond quickly with a layer at the edge</h2>



<p class="wp-block-paragraph">Virtual patching adds a WAF rule that identifies a known exploit request and blocks it before it reaches PHP or the vulnerable application. CrowdSec has published virtual patches for both CVEs:</p>



<ul class="wp-block-list">
<li><a href="https://app.crowdsec.net/hub/author/crowdsecurity/waf-rules/vpatch-CVE-2026-109618" target="_blank" rel="noreferrer noopener">vpatch-CVE-2026-109618</a> blocks multipart requests with form fields nested 12 levels or deeper, and multipart bodies with more than 50 file parts — the conditions needed to exhaust PHP&#8217;s memory during input parsing.</li>



<li><a href="https://app.crowdsec.net/hub/author/crowdsecurity/waf-rules/vpatch-CVE-2026-109619" target="_blank" rel="noreferrer noopener">vpatch-CVE-2026-109619</a> matches multipart requests carrying a <strong>php_session_upload_progress</strong> field, the route used to reach the stale-state bug. It inspects the raw body rather than parsed arguments to catch attempts a multipart parser would otherwise reject.</li>
</ul>



<p class="wp-block-paragraph">Both are distributed through CrowdSec&#8217;s Hub to protected servers and updated automatically.</p>



<p class="wp-block-paragraph">This gives teams a way to react quickly when a vulnerability becomes public and peace of mind thanks to the exceptional reaction time of CrowdSec vpatch releases. Depending on the application and the rule&#8217;s coverage, it may also support a risk-based decision to keep a service available while a permanent fix is planned and applied. Virtual patching is useful beyond a single incident: it provides an ongoing layer that can be updated as new exploit rules become available.</p>



<p class="wp-block-paragraph"><strong>Virtual patching is not a replacement for updating PHP, and it is not a guarantee against every exploit path.</strong> PHP&#8217;s security advisory<a href="https://www.wiz.io/blog/php2shell-php-rce">(*)</a> states plainly: &#8220;There are no complete mitigations; updating is the only safe choice.&#8221; A WAF also only inspects traffic that passes through it — if your origin is reachable directly, lock it down to your proxy. Use the WAF as an additional protection layer, and patch as soon as you can.</p>



<h2 class="wp-block-heading">Get started with CrowdSec open source WAF&nbsp;</h2>



<p class="wp-block-paragraph">CrowdSec WAF is open source. A basic deployment puts the CrowdSec Security Engine and AppSec component on the host, with a bouncer in Nginx, OpenResty, Apache, HAProxy, Envoy, or Traefik to inspect requests before they reach your PHP application.</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="2048" height="996" src="https://cms.crowdsec.net/wp-content/uploads/2026/10/image-6.png" alt="CrowdSec WAF virtual patching diagram: web traffic reaches your web server or reverse proxy, the CrowdSec bouncer checks it with the CrowdSec Security Engine, exploit attempts are blocked and clean requests continue to your application" class="wp-image-7031" style="aspect-ratio:2.060052219321149;width:789px;height:auto" srcset="https://cms.crowdsec.net/wp-content/uploads/2026/10/image-6.png 2048w, https://cms.crowdsec.net/wp-content/uploads/2026/10/image-6-300x146.png 300w, https://cms.crowdsec.net/wp-content/uploads/2026/10/image-6-767x373.png 767w, https://cms.crowdsec.net/wp-content/uploads/2026/10/image-6-1536x747.png 1536w" sizes="auto, (max-width: 2048px) 100vw, 2048px" /></figure>



<p class="wp-block-paragraph"><em>Request path: website traffic reaches your webserver/reverse-proxy, where the CrowdSec bouncer forwards it to the AppSec WAF for inspection. Allowed requests continue to the PHP application; requests matching a known exploit pattern are blocked at the edge.</em></p>



<ol class="wp-block-list">
<li><strong>Install the Security Engine</strong> on your Linux host using the <a href="https://docs.crowdsec.net/u/getting_started/installation/linux/" target="_blank" rel="noreferrer noopener">Linux installation guide</a>.</li>



<li><strong>Install a</strong> <strong>WAF-compatible bouncer</strong> for <a href="https://docs.crowdsec.net/u/bouncers/nginx/" target="_blank" rel="noreferrer noopener">Nginx</a>, <a href="https://docs.crowdsec.net/u/bouncers/openresty/" target="_blank" rel="noreferrer noopener">OpenResty</a>, <a href="https://docs.crowdsec.net/u/bouncers/apache_bouncer/" target="_blank" rel="noreferrer noopener">Apache</a>, <a href="https://docs.crowdsec.net/u/bouncers/haproxy_spoa/" target="_blank" rel="noreferrer noopener">HAProxy</a>, <a href="https://docs.crowdsec.net/u/bouncers/envoy/" target="_blank" rel="noreferrer noopener">Envoy</a>, or <a href="https://docs.crowdsec.net/u/bouncers/traefik/" target="_blank" rel="noreferrer noopener">Traefik</a></li>



<li><strong>Install the WAF collections and enable AppSec.</strong> The virtual patching collection is the key step:</li>
</ol>



<pre><code class="language-bash">sudo cscli collections install crowdsecurity/appsec-virtual-patching crowdsecurity/appsec-generic-rules</code></pre>



<ol start="4" class="wp-block-list">
<li>Then follow the <a href="https://docs.crowdsec.net/docs/next/appsec/intro/" target="_blank" rel="noreferrer noopener">WAF quickstart</a> to enable AppSec and connect the bouncer to it. The vpatch rules are distributed through the CrowdSec Hub and updated automatically.</li>
</ol>



<p class="wp-block-paragraph">CrowdSec WAF also supports <a href="https://docs.crowdsec.net/docs/next/appsec/bot_detection/intro/" target="_blank" rel="noreferrer noopener"><strong>bot detection</strong></a> as an additional feature. It is enabled separately from the virtual patching collection; see the <a href="https://www.crowdsec.net/blog/crowdsec-1-8-waf-bot-detection-kubernetes" target="_blank" rel="noreferrer noopener">CrowdSec 1.8 bot-detection overview</a>.</p>



<p class="wp-block-paragraph">For help with installation and troubleshooting, try the <a href="https://github.com/crowdsecurity/crowdsec-skill" target="_blank" rel="noreferrer noopener">official CrowdSec skill</a> for Claude Code and Codex.</p>



<h2 class="wp-block-heading">Block the attackers already exploiting PHP2Shell</h2>



<p class="wp-block-paragraph">Virtual patching stops the exploit pattern and is part of our open-source solution. There is also a proactive approach enabled by the knowledge brought by the community and validated by CrowdSec IP Reputation Consensus, allowing you to <strong>block the IPs already running the vulnerability.</strong></p>



<p class="wp-block-paragraph">Our detection network validated <a href="https://tracker.crowdsec.net/cves/CVE-2026-109618" target="_blank" rel="noreferrer noopener">450+ proven PHP2Shell attackers in the first 24 hours</a> of observed exploitation. They are published as a dedicated blocklist, <a href="https://app.crowdsec.net/blocklists/6adb0eb5e63dd877df7987f4" target="_blank" rel="noreferrer noopener">PHP2Shell Attackers — CVE-2026-109618 and CVE-2026-109619</a>, updated as new attackers are confirmed.</p>



<p class="wp-block-paragraph">This is where our two approaches meet, and they are deliberately different products. <strong>Detection is open source</strong>: the virtual patching rules shared in this article are free, auditable on GitHub, and yours to run on any host. <strong>Proactive blocking is commercial</strong>: the curated list of IPs already confirmed to be exploiting PHP2Shell is a paid blocklist. One tells you what the attack looks like; the other tells you who is already launching it.</p>



<p class="wp-block-paragraph">To get the blocklist on your engines, <a href="https://www.crowdsec.net/contact-blocklists" target="_blank" rel="noreferrer noopener">contact us for access</a>.</p>



<h3 class="wp-block-heading"><strong>References</strong></h3>



<ul class="wp-block-list">
<li><a href="https://www.wiz.io/blog/php2shell-php-rce" target="_blank" rel="noreferrer noopener">Wiz Research estimates</a></li>



<li><a href="https://www.tenable.com/blog/php2shell-cve-2026-109618-cve-2026-109619-frequently-asked-questions-about-critical-php-remote" target="_blank" rel="noreferrer noopener">Tenable &#8211; Minimal Source Backport</a></li>



<li><a href="https://w3techs.com/technologies/details/pl-php" target="_blank" rel="noreferrer noopener">W3Techs PHP data</a></li>



<li><a href="https://www.php.net/archive/2026.php" target="_blank" rel="noreferrer noopener">PHP Archives</a></li>
</ul>



<h3 class="wp-block-heading"><strong>More from CrowdSec</strong></h3>



<ul class="wp-block-list">
<li><a href="https://docs.crowdsec.net/u/bouncers/apache_bouncer/" target="_blank" rel="noreferrer noopener">CrowdSec Open Source WAF Bouncer for Apache</a></li>



<li><a href="https://docs.crowdsec.net/u/bouncers/nginx/" target="_blank" rel="noreferrer noopener">CrowdSec Open Source WAF Bouncer for NGINX</a></li>



<li><a href="https://docs.crowdsec.net/u/bouncers/openresty/" target="_blank" rel="noreferrer noopener">CrowdSec Open Source WAF Bouncer for OpenResty</a></li>



<li><a href="https://docs.crowdsec.net/u/bouncers/haproxy_spoa/" target="_blank" rel="noreferrer noopener">CrowdSec Open Source WAF Bouncer for HAProxy</a></li>



<li><a href="https://docs.crowdsec.net/u/bouncers/traefik/" target="_blank" rel="noreferrer noopener">CrowdSec Open Source WAF Bouncer for Traefik</a></li>
</ul>



<h2 class="wp-block-heading">Frequently asked questions</h2>



<h3 class="wp-block-heading">Does a WAF stop PHP2Shell, or do I have to patch PHP?</h3>



<p class="wp-block-paragraph">You have to patch PHP. A WAF is a stopgap while you update: CrowdSec&#8217;s two free virtual patching rules block the request patterns the known exploit relies on, which buys you time until you can move to a fixed PHP version. The rules are labeled &#8220;tentative&#8221; on the Hub, and they can&#8217;t protect a server that attackers can reach directly without going through the WAF. Updating PHP is what actually removes the bug.</p>



<h3 class="wp-block-heading">Is PHP2Shell being exploited in the wild?</h3>



<p class="wp-block-paragraph">Yes. CrowdSec&#8217;s network recorded 450+ proven PHP2Shell attackers in the first 24 hours of observed exploitation. The <a href="https://tracker.crowdsec.net/cves/CVE-2026-109618" target="_blank" rel="noreferrer noopener">Live Exploit Tracker</a> shows the latest activity, and the <a href="https://app.crowdsec.net/blocklists/6adb0eb5e63dd877df7987f4" target="_blank" rel="noreferrer noopener">PHP2Shell Attackers blocklist</a> collects the IPs behind it.</p>



<h3 class="wp-block-heading">How do I protect a PHP 5 server?</h3>



<p class="wp-block-paragraph">The PHP project won&#8217;t release a fix for PHP 5, so the long-term answer is a vendor backport (if your distribution or LTS vendor offers one) or a migration to a supported version. In the meantime, put a WAF in front of the server: the CrowdSec WAF inspects requests before they reach PHP, whatever the PHP version behind it, and the two free virtual patches block the known PHP2Shell exploit patterns. It&#8217;s a stopgap, not a fix, so plan the migration while the rules hold the door.</p>



<h3 class="wp-block-heading">Can I protect a PHP app in Docker without rebuilding the image?</h3>



<p class="wp-block-paragraph">Yes, for now. Run the CrowdSec WAF on the reverse proxy in front of the container: the rules inspect requests before they reach PHP, so the image itself doesn&#8217;t change. It&#8217;s a stopgap, so rebuild with a patched PHP image as soon as you can.</p>
]]></content:encoded>
            <category>Tutorial</category>
            <category>Vulnerabilities</category>
            <enclosure url="https://cms.crowdsec.net/wp-content/uploads/2026/10/waf-protection-php-final-1.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[What 300,000 Security Engines saw: exploitation in 2026]]></title>
            <link>https://crowdsec.net/blog/exploitation-2026-lessons-sans</link>
            <guid isPermaLink="false">https://crowdsec.net/blog/exploitation-2026-lessons-sans</guid>
            <pubDate>Tue, 20 Oct 2026 13:22:00 GMT</pubDate>
            <description><![CDATA[<p>36% of exploited CVEs were attacked within a day of publication. What 300,000 Security Engines saw at SANS 2026: borrowed cloud IPs, early zero-days, old CVEs.</p>
]]></description>
            <content:encoded><![CDATA[<p>At SANS in Brussels, I presented what CrowdSec&#8217;s network sees when vulnerabilities get exploited: more than 300,000 active Security Engines in 190 countries send more than 60 million signals a day from real production servers, not honeypots. The short version: defenders&#8217; window is shrinking to hours, attackers borrow the infrastructure they need and throw it away, and the IP (the vector) tells you more than the payload or the name behind it.</p>
<p>Here are the eight lessons, with the numbers behind them.</p>
<h2>Where the data comes from</h2>
<p>The CrowdSec Security Engine is free and open source. Each instance detects attacks locally (IDS, WAF, bot detection) and shares the metadata: which detection rule fired, when, and the attacking IP. When a new CVE gets a virtual patch, it goes out to hundreds of thousands of real servers, so we capture the exploitation momentum from the first attempts.</p>
<p>That&#8217;s also why VulnCheck&#8217;s <em>State of Exploitation 2026</em> report, which counted 118 sources that were first to report exploitation in 2025, wrote that &#8220;the most notable increases in sources that were first to report KEVs included CrowdSec, which was onboarded as a new source and scaled significantly in 2025&#8221; (<a href="https://www.vulncheck.com/blog/state-of-exploitation-2026" target="_blank" rel="noopener">source</a>).</p>
<p><figure id="attachment_6989" aria-describedby="caption-attachment-6989" style="width: 300px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="wp-image-6989 size-medium" src="https://cms.crowdsec.net/wp-content/uploads/2026/10/earliest-reporters-of-exploitation-vulncheck-2025-300x169.png" alt="Bubble chart of the earliest reporters of exploitation in the wild in 2025, source VulnCheck KEV, with CrowdSec among the largest" width="300" height="169" srcset="https://cms.crowdsec.net/wp-content/uploads/2026/10/earliest-reporters-of-exploitation-vulncheck-2025-300x169.png 300w, https://cms.crowdsec.net/wp-content/uploads/2026/10/earliest-reporters-of-exploitation-vulncheck-2025-768x432.png 768w, https://cms.crowdsec.net/wp-content/uploads/2026/10/earliest-reporters-of-exploitation-vulncheck-2025-1536x864.png 1536w, https://cms.crowdsec.net/wp-content/uploads/2026/10/earliest-reporters-of-exploitation-vulncheck-2025.png 1600w" sizes="auto, (max-width: 300px) 100vw, 300px" /><figcaption id="caption-attachment-6989" class="wp-caption-text">Source: VulnCheck KEV (2025)</figcaption></figure></p>
<h2>1. The defenders&#8217; window is now measured in hours</h2>
<p>Of the 332 exploited CVEs we tracked from Q4 2024 to Q2 2026, <strong>36% (121) were attacked within a day of publication</strong>, and 27% more within a week.</p>
<p>332 may look small next to the 9,000 to 15,000 new CVEs the NVD receives every month this year (NVD dashboard, October 2026). These are only the ones we saw actually exploited, and only those an attacker can reach on a server exposed to the internet: no Photoshop flaws, printer bugs, or obscure Windows local privilege escalations. That&#8217;s the short list that matters for anything you expose.</p>
<p>Since June 2026, CISA&#8217;s <a href="https://www.cisa.gov/news-events/directives/bod-26-04-prioritizing-security-updates-based-risk" target="_blank" rel="noopener">Binding Operational Directive 26-04</a> gives US federal agencies 72 hours to fix publicly exposed, highest-risk exploited vulnerabilities. Do the math: for more than a third of these vulnerabilities, the attack starts before the deadline clock has meaningfully run.</p>
<p>Early attackers are the most dangerous ones, because they hit before patches, signatures or blocklists exist.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-6985 size-full" src="https://cms.crowdsec.net/wp-content/uploads/2026/10/cve-time-to-first-attack-36-percent-within-a-day.png" alt="Bar chart: of 332 exploited CVEs tracked from Q4 2024 to Q2 2026, 36% were attacked within a day of publication, 27% within 2 to 7 days and 22% within 8 to 30 days" width="1600" height="900" srcset="https://cms.crowdsec.net/wp-content/uploads/2026/10/cve-time-to-first-attack-36-percent-within-a-day.png 1600w, https://cms.crowdsec.net/wp-content/uploads/2026/10/cve-time-to-first-attack-36-percent-within-a-day-300x169.png 300w, https://cms.crowdsec.net/wp-content/uploads/2026/10/cve-time-to-first-attack-36-percent-within-a-day-768x432.png 768w, https://cms.crowdsec.net/wp-content/uploads/2026/10/cve-time-to-first-attack-36-percent-within-a-day-1536x864.png 1536w" sizes="auto, (max-width: 1600px) 100vw, 1600px" /></p>
<h2>2. More CVEs get exploited, and faster</h2>
<p>Of the newly announced CVEs we track, the share exploited within 90 days of their announcement climbed from 8% in Q4 2024 to 67% in Q2 2026 (42 CVEs). CVE publication keeps accelerating, and so does the noise around it: scoring every CVE as urgent has stopped working.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-6990 size-full" src="https://cms.crowdsec.net/wp-content/uploads/2026/10/cves-exploited-within-90-days-by-quarter.png" alt="Share of newly announced CVEs exploited within 90 days, from 8% in Q4 2024 to 67% (42 CVEs) in Q2 2026" width="1600" height="900" srcset="https://cms.crowdsec.net/wp-content/uploads/2026/10/cves-exploited-within-90-days-by-quarter.png 1600w, https://cms.crowdsec.net/wp-content/uploads/2026/10/cves-exploited-within-90-days-by-quarter-300x169.png 300w, https://cms.crowdsec.net/wp-content/uploads/2026/10/cves-exploited-within-90-days-by-quarter-768x432.png 768w, https://cms.crowdsec.net/wp-content/uploads/2026/10/cves-exploited-within-90-days-by-quarter-1536x864.png 1536w" sizes="auto, (max-width: 1600px) 100vw, 1600px" /></p>
<h2>3. CVE-geddon is not (yet) upon us</h2>
<p>AI-driven vulnerability discovery makes headlines, but discovery is not exploitation. After Project Glasswing, VulnCheck&#8217;s Patrick Garrity looked at a sample: only 14 of 1,061 CVEs identified by Berkeley researchers had been exploited in the wild. His comparison also showed AI-rated severities running much hotter than maintainers&#8217; ratings: 74% &#8220;high&#8221; for the model against 40% for maintainers. More findings, more scary scores, a small fraction actually used by attackers.</p>
<h2>4. AI is making exploitation cheap, more than smart</h2>
<p>AI got better at reconnaissance and exploitation, but token costs kept it for targeted attacks: only worth the money against a valuable victim. That&#8217;s changing. Local models plus better tooling make tokens effectively free, and a free weapon gets used like a machine gun, against everyone but with a high level of &#8220;personalization&#8221;. Actually, scratch that machine gun image; it&#8217;s more like industrializing sniper rifles.</p>
<h2>5. Monster CVEs run on borrowed cloud IPs</h2>
<p>React2Shell (CVE-2025-55182) is the behemoth of the year: <strong>444,948 distinct IPs</strong> hunted it between 5 December 2025 and 8 September 2026, with a peak of 10,674 IPs on a single day, eight days after publication.</p>
<p>Two patterns stand out:</p>
<ul>
<li><strong>Attackers move to the cloud.</strong> In the week of disclosure, 3% of the exploiting IPs came from hyperscaler ranges. A week later, around 80% did.</li>
<li><strong>The infrastructure is disposable.</strong> Four in five of the early hunters&#8217; IPs were never seen again after day 1. Of that early cohort, only 5.3% were still reported a week later, and 0.2% after twelve weeks.</li>
</ul>
<p>The lesson for defenders: block fast, and make sure what you block expires. A blocklist that never forgets ends up blocking a cloud IP your next customer will use.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-6991 size-full" src="https://cms.crowdsec.net/wp-content/uploads/2026/10/react2shell-hyperscaler-ip-share.png" alt="Share of React2Shell attacking IPs from Amazon or Google Cloud: 3% in the week of disclosure, 79% the week after" width="1600" height="900" srcset="https://cms.crowdsec.net/wp-content/uploads/2026/10/react2shell-hyperscaler-ip-share.png 1600w, https://cms.crowdsec.net/wp-content/uploads/2026/10/react2shell-hyperscaler-ip-share-300x169.png 300w, https://cms.crowdsec.net/wp-content/uploads/2026/10/react2shell-hyperscaler-ip-share-768x432.png 768w, https://cms.crowdsec.net/wp-content/uploads/2026/10/react2shell-hyperscaler-ip-share-1536x864.png 1536w" sizes="auto, (max-width: 1600px) 100vw, 1600px" /><img loading="lazy" decoding="async" class="aligncenter wp-image-6992 size-full" src="https://cms.crowdsec.net/wp-content/uploads/2026/10/react2shell-early-exploiter-ips-decay.png" alt="Early React2Shell exploiter IPs still reported: 5.3% after one week, 0.2% after twelve weeks" width="1600" height="900" srcset="https://cms.crowdsec.net/wp-content/uploads/2026/10/react2shell-early-exploiter-ips-decay.png 1600w, https://cms.crowdsec.net/wp-content/uploads/2026/10/react2shell-early-exploiter-ips-decay-300x169.png 300w, https://cms.crowdsec.net/wp-content/uploads/2026/10/react2shell-early-exploiter-ips-decay-768x432.png 768w, https://cms.crowdsec.net/wp-content/uploads/2026/10/react2shell-early-exploiter-ips-decay-1536x864.png 1536w" sizes="auto, (max-width: 1600px) 100vw, 1600px" /></p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-6993 size-full" src="https://cms.crowdsec.net/wp-content/uploads/2026/10/react2shell-ips-attacks-by-period-table.png" alt="React2Shell exploitation by period: 887 IPs in the first 4 days, 308,473 IPs and 14.7 million attacks from 9 December to 31 May, 145,562 IPs since" width="1340" height="300" srcset="https://cms.crowdsec.net/wp-content/uploads/2026/10/react2shell-ips-attacks-by-period-table.png 1340w, https://cms.crowdsec.net/wp-content/uploads/2026/10/react2shell-ips-attacks-by-period-table-300x67.png 300w, https://cms.crowdsec.net/wp-content/uploads/2026/10/react2shell-ips-attacks-by-period-table-768x172.png 768w" sizes="auto, (max-width: 1340px) 100vw, 1340px" /></p>
<h2>6. Zero-days get exploited weeks before anyone writes about them</h2>
<p>On CVE-2025-2748, our network saw <strong>5 AWS IPs exploiting the vulnerability 42 days before</strong> watchTowr published their findings. We&#8217;ve seen similar patterns on SAP NetWeaver and Fortinet products. When a vulnerability is announced, assume someone has already used it. <strong>Spotting that activity before the CVE reaches the NVD is called <a href="https://www.crowdsec.net/glossary/pre-nvd" target="_blank" rel="noopener noreferrer">pre-NVD detection</a>.</strong></p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-6994 size-full" src="https://cms.crowdsec.net/wp-content/uploads/2026/10/cve-2025-2748-exploited-42-days-before-disclosure.png" alt="Five AWS IPs exploited CVE-2025-2748 42 days before the research was published; third byte of each IP redacted" width="1600" height="900" srcset="https://cms.crowdsec.net/wp-content/uploads/2026/10/cve-2025-2748-exploited-42-days-before-disclosure.png 1600w, https://cms.crowdsec.net/wp-content/uploads/2026/10/cve-2025-2748-exploited-42-days-before-disclosure-300x169.png 300w, https://cms.crowdsec.net/wp-content/uploads/2026/10/cve-2025-2748-exploited-42-days-before-disclosure-768x432.png 768w, https://cms.crowdsec.net/wp-content/uploads/2026/10/cve-2025-2748-exploited-42-days-before-disclosure-1536x864.png 1536w" sizes="auto, (max-width: 1600px) 100vw, 1600px" /></p>
<h2>7. Old vulnerabilities never die</h2>
<p>The 50 most exploited CVEs still include vulnerabilities from 2002, 2012, and 2013, and CVEs from 2021 and 2022 make up 19 of them. PHPUnit&#8217;s CVE-2017-9841 was still hunted by 88,428 IPs, and Apache&#8217;s CVE-2021-41773 by 89,127. Patching last year&#8217;s backlog is still a security strategy.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-6995 size-full" src="https://cms.crowdsec.net/wp-content/uploads/2026/10/old-cves-in-top-50-exploited-by-year.png" alt="Number of CVEs in the top 50 most exploited by year of publication: 8 from 2021, 11 from 2022, some from 2002 to 2013" width="1600" height="900" srcset="https://cms.crowdsec.net/wp-content/uploads/2026/10/old-cves-in-top-50-exploited-by-year.png 1600w, https://cms.crowdsec.net/wp-content/uploads/2026/10/old-cves-in-top-50-exploited-by-year-300x169.png 300w, https://cms.crowdsec.net/wp-content/uploads/2026/10/old-cves-in-top-50-exploited-by-year-768x432.png 768w, https://cms.crowdsec.net/wp-content/uploads/2026/10/old-cves-in-top-50-exploited-by-year-1536x864.png 1536w" sizes="auto, (max-width: 1600px) 100vw, 1600px" /></p>
<h2>8. Residential proxies, CGNAT, VPNs and cloud IPs blur the lines</h2>
<p>Of the IPs we see attacking, <strong>69% are residential</strong> addresses, and 25% are in data centers, with proxies/VPNs, AI services, and Tor making up the rest. Most attacks don&#8217;t come from &#8220;bad hosting providers&#8221; anymore: they come from addresses that look like your users. Telling them apart needs behavior and history per IP, beyond a hosting-provider list.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-6996 size-full" src="https://cms.crowdsec.net/wp-content/uploads/2026/10/attacking-ip-types-residential-datacenter.png" alt="Attacking IPs by type: 68.85% residential, 24.79% data center, the rest proxy/VPN, AI and Tor" width="1600" height="900" srcset="https://cms.crowdsec.net/wp-content/uploads/2026/10/attacking-ip-types-residential-datacenter.png 1600w, https://cms.crowdsec.net/wp-content/uploads/2026/10/attacking-ip-types-residential-datacenter-300x169.png 300w, https://cms.crowdsec.net/wp-content/uploads/2026/10/attacking-ip-types-residential-datacenter-768x432.png 768w, https://cms.crowdsec.net/wp-content/uploads/2026/10/attacking-ip-types-residential-datacenter-1536x864.png 1536w" sizes="auto, (max-width: 1600px) 100vw, 1600px" /></p>
<h2>Bonus: attribution? Really?</h2>
<p>A network of 300,000 Security Engines in 190 countries and 7,000 autonomous systems saw five disposable IPs exploit CVE-2025-2748 about 40 days before disclosure. For our friends who love attribution: who was it? And if you could tell, what would you do differently: let them in because they come from South Africa instead of North Korea?</p>
<p>Attribution matters for intelligence agencies and for reports. For the SOC on call, it changes nothing about the decision to block.</p>
<h2>Your sector has its own threat profile</h2>
<p>The weaknesses attackers go after aren&#8217;t spread evenly. In our data, organizations in industry see expression-language injection 3.8 times more than average, finance sees unrestricted file upload 2.7 times more, and government sees untrusted deserialization 2.1 times more. Prioritizing by &#8220;what&#8217;s exploited against organizations like mine&#8221; beats prioritizing by CVSS alone, and it&#8217;s why we build blocklists by industry and country.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-6997 size-full" src="https://cms.crowdsec.net/wp-content/uploads/2026/10/exploited-weakness-classes-by-industry.png" alt="Heat map of exploited weakness classes by industry: expression-language injection 3.8× in industry, unrestricted file upload 2.7× in finance, deserialization 2.1× in government" width="1600" height="900" srcset="https://cms.crowdsec.net/wp-content/uploads/2026/10/exploited-weakness-classes-by-industry.png 1600w, https://cms.crowdsec.net/wp-content/uploads/2026/10/exploited-weakness-classes-by-industry-300x169.png 300w, https://cms.crowdsec.net/wp-content/uploads/2026/10/exploited-weakness-classes-by-industry-768x432.png 768w, https://cms.crowdsec.net/wp-content/uploads/2026/10/exploited-weakness-classes-by-industry-1536x864.png 1536w" sizes="auto, (max-width: 1600px) 100vw, 1600px" /></p>
<h2>What to do with this</h2>
<p>The common thread: <strong>concentrate on the vector, not the payload</strong>.</p>
<ol>
<li>Prioritize patching by live exploitation (is it exploited now, how targeted, growing or fading), with CVSS as a tie-breaker.</li>
<li>Block the IPs exploiting the CVEs you can&#8217;t patch yet, at the edge, with lists that expire.</li>
<li>Check the IPs hitting you against behavior and history, beyond a yes/no reputation.</li>
<li>Stop waiting for attribution before acting.</li>
</ol>
<p>Want the slides? <a href="https://info.crowdsec.net/sans-2026-exploitation-slides">Download the SANS 2026 deck</a>. Want to check IPs you&#8217;ve seen? Run them through <a href="https://ipdex.crowdsec.net/" target="_blank" rel="noopener">IPDEX</a>. Want to track CVE exploitation live? Ask us for a <a href="https://www.crowdsec.net/live-exploit-tracker" target="_blank" rel="noopener">Live Exploit Tracker demo</a>.</p>
]]></content:encoded>
            <category>Proactive Cybersecurity</category>
            <category>Thought Leadership</category>
            <category>Vulnerabilities</category>
            <enclosure url="https://cms.crowdsec.net/wp-content/uploads/2026/10/cve-time-to-first-attack-36-percent-within-a-day.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[IP reputation vs full CTI: what your SOC actually needs]]></title>
            <link>https://crowdsec.net/blog/ip-reputation-vs-threat-intelligence</link>
            <guid isPermaLink="false">https://crowdsec.net/blog/ip-reputation-vs-threat-intelligence</guid>
            <pubDate>Mon, 19 Oct 2026 09:37:01 GMT</pubDate>
            <description><![CDATA[<p>Most SOCs need fast IP reputation in their SIEM before they need attribution-heavy CTI. How to tell them apart, and what to ask any IP reputation vendor.</p>
]]></description>
            <content:encoded><![CDATA[<p>It&#8217;s 2 a.m., the SIEM has fired 400 times since midnight, and the analyst on call is staring at one alert with one IP address in it. The question in their head is simple: is this IP dangerous, and what was it trying to do?</p>
<p>That question is answered by <strong>IP reputation</strong>. Most SOCs need a fast, contextual IP reputation lookup wired into their SIEM long before they need a full cyber threat intelligence (CTI) platform with actors, campaigns, and attribution. Full CTI earns its keep when you have the analysts to exploit it. IP reputation earns its keep on every single alert.</p>
<p>Let&#8217;s look at what each one actually gives you, where IP reputation runs out, and what to ask before you buy any feed (ours included).</p>
<h2>Two different questions</h2>
<p>The industry uses &#8220;threat intelligence&#8221; for everything from a text file of bad IPs to a team of analysts writing reports on a ransomware group. In practice, a SOC asks two very different questions.</p>
<table>
<thead>
<tr>
<th></th>
<th>IP reputation</th>
<th>Full CTI</th>
</tr>
</thead>
<tbody>
<tr>
<td>Question it answers</td>
<td>&#8220;Is this IP dangerous right now, and what has it been doing?&#8221;</td>
<td>&#8220;Who is behind this, what do they want, what will they do next?&#8221;</td>
</tr>
<tr>
<td>When you need it</td>
<td>On every alert, in seconds, ideally inside the SIEM or SOAR</td>
<td>During an investigation, a threat assessment, a board report</td>
</tr>
<tr>
<td>Who uses it</td>
<td>Tier-1 analysts, automation, firewalls</td>
<td>Tier-3 analysts, threat-intel teams, CISOs</td>
</tr>
<tr>
<td>What makes it good</td>
<td>Freshness, context per IP, very few false positives</td>
<td>Depth, attribution, analyst write-ups</td>
</tr>
<tr>
<td>Cost of using it</td>
<td>Low: a lookup or an enrichment rule</td>
<td>High: someone has to read it and act on it</td>
</tr>
</tbody>
</table>
<p>Both are useful. The trap is buying the second one when your day-to-day pain is the first.</p>
<h2>Where IP reputation earns its keep</h2>
<p>Few organizations send their raw internet-facing traffic (web server logs, firewall accepts) to the SIEM: it costs too much and drowns the signal. The IPs that reach the SOC arrive inside alerts instead: a VPN or Entra ID login from an odd place, an IDS or WAF event, an EDR flagging a connection, a spike on an API. For each of those, the useful answer is short. Is this IP malicious? What did it do elsewhere? Is it still active? Is it aimed at organizations like mine?</p>
<p>A good IP reputation source lets you:</p>
<ul>
<li><strong>Triage faster</strong>: the analyst sees &#8220;malicious, HTTP exploitation and SSH brute force, last seen 40 minutes ago, mostly targeting finance&#8221; next to the alert, instead of opening five tabs.</li>
<li><strong>Automate the boring part</strong>: enrichment rules can close or downgrade alerts on known mass-scanners and escalate the ones coming from IPs that pick their targets.</li>
<li><strong>Decide at the door</strong>: check an IP before you grant access to a VPN, an Entra ID login, an API, or a checkout page.</li>
<li><strong>Block before the alert exists</strong>: the internet-facing noise you never send to the SIEM still hits your servers. The same data, served as a blocklist, stops a chunk of it at the firewall.</li>
</ul>
<p>All it takes is good data in the right place, and no threat-intel team.</p>
<h2>Where full CTI earns its keep</h2>
<p>Does IP reputation replace a threat-intel platform? No. Nothing that looks at IP addresses alone can.</p>
<p>If you&#8217;re tracking a specific group, investigating a breach, or briefing your board on the threats to your sector, you need what IP reputation doesn&#8217;t carry: malware families, phishing infrastructure, actor profiles, the &#8220;why&#8221; behind a campaign. That&#8217;s where full CTI platforms and the people who run them shine.</p>
<p>Attribution is the part I&#8217;d spend the least on. Whether it&#8217;s a famous APT or a kid with a rented botnet behind that IP, will you let it in? Will it change the action you enforce at the door? Rarely. And in an AI era, where anyone can industrialize an attack, the &#8220;attribution game&#8221; makes less sense than ever.</p>
<p>The honest split for most organizations: IP reputation for the volume, full CTI for the few cases that deserve an investigation. And if you only have budget and staff for one, the volume is where the hours go.</p>
<h2>Not all IP reputation is equal: three questions to ask any vendor</h2>
<p><strong>1. Where does the data come from?</strong> A lot of IP reputation is built on honeypots: decoy machines that nobody legitimate talks to, so anything hitting them is suspicious. Fine for internet-wide scanning. But a honeypot has nothing worth stealing, so it rarely sees the attacks aimed at real businesses. Data that comes from production servers sees both the background noise and the targeted activity (we wrote about this trade-off <a href="https://www.crowdsec.net/blog/honeypots-vs-production-telemetry-what-cisos-should-trust" target="_blank" rel="noopener">here</a>).</p>
<p><strong>2. Do you get behavior, or just a verdict?</strong> &#8220;Malicious, score 87&#8221; is enough for a firewall. An analyst needs more: look for what the IP did (behaviors, ideally mapped to MITRE ATT&amp;CK), which CVEs it exploited, which countries and industries it targeted, and how its activity evolved over the last day, week, and month.</p>
<p><strong>3. How does an IP get off the list?</strong> IPs change hands. A residential address that was part of a botnet last month may be a customer today. Ask how false positives are handled, whether known-good services (CDNs, DNS resolvers, search engines) are excluded, and whether entries expire when the bad behavior stops. A feed that only ever grows will eventually block someone you care about.</p>
<h2>How we built CrowdSec&#8217;s IP reputation</h2>
<p>Since you&#8217;re reading this on our blog, here&#8217;s how we answer those three questions.</p>
<p><strong>The data comes from production servers.</strong> More than 250,000 active CrowdSec Security Engines (open source) protect over 500,000 servers worldwide, and together they send us more than 40 million signals a day. When one of them blocks an attack, it shares the metadata (which detection rule fired, when, and the attacking IP) and keeps the logs to itself. Only unmodified, versioned detection rules count, and an IP is only flagged once many independent machines across many different networks report it, which is our main defense against poisoning.</p>
<p><strong>You get the behavior.</strong> Over the past 3 months alone, more than 22 million IPs were reported, and every one of them comes with a verdict (malicious, suspicious, known, benign, safe) plus 30+ fields of context: behaviors and MITRE ATT&amp;CK techniques, CVEs exploited, targeted countries and industries, background-noise level, the reputation of its /24 range and AS, first and last seen, and scores for aggressiveness, threat, trust and anomaly over the last day, week and month.</p>
<p><strong>It&#8217;s early.</strong> 36% of the IPs on our high-threat list are exclusive to CrowdSec, compared with all other CTI sources, and we flag malicious IPs 1 to 10 weeks before other vendors. On the 2 a.m. alert, that&#8217;s the difference between &#8220;unknown&#8221; and &#8220;we&#8217;ve seen this one, here&#8217;s what it does&#8221;.</p>
<p><strong>IPs leave when the bad behavior stops.</strong> Known-good services are excluded, and entries expire when reports dry up, which is why the blocklists we build from this data are curated to zero false positives.</p>
<p>Now the candid part: we only see what hits internet-exposed servers. CrowdSec is IP reputation for ingress traffic, built from real attacks. Will it give you phishing domains, malware hashes, or an actor&#8217;s biography? No. If that&#8217;s what you need, pair it with a CTI platform: we integrate with MISP, OpenCTI, and the major SIEMs and SOARs for exactly that reason.</p>
<h2>Try it on your own data</h2>
<p>The fastest way to judge any IP reputation source is to throw your own logs at it.</p>
<ul>
<li><strong>One IP</strong>: paste it in the free <a href="https://app.crowdsec.net/cti" target="_blank" rel="noopener">CrowdSec IP lookup</a>.</li>
<li><strong>A whole log file</strong>: run <a href="https://ipdex.crowdsec.net/" target="_blank" rel="noopener">IPDEX</a> on it and see how many of the IPs hitting you we already know, and what they were doing.</li>
<li><strong>In your SIEM</strong>: a free CTI API key gives you 120 lookups a month to test an integration. Splunk, QRadar, Microsoft Sentinel, MISP, OpenCTI, Cortex XSOAR, and TheHive are covered in the <a href="https://docs.crowdsec.net/u/cti_api/api_integration/integration_intro" target="_blank" rel="noopener">integration docs</a>.</li>
</ul>
<p>Already doing this in your SOC? We&#8217;d love to hear how you split IP reputation and full CTI: hop onto our <a href="https://discord.gg/crowdsec" target="_blank" rel="noopener">Discord</a> and tell us.</p>
]]></content:encoded>
            <category>Proactive Cybersecurity</category>
            <category>Thought Leadership</category>
            <enclosure url="https://cms.crowdsec.net/wp-content/uploads/2026/10/ip-reputation-vs-full-cti-featured.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[5 years of CrowdSec Data Science: What Our Code Really Shows]]></title>
            <link>https://crowdsec.net/blog/5-years-of-crowdsec-data-science-what-our-code-really-shows</link>
            <guid isPermaLink="false">https://crowdsec.net/blog/5-years-of-crowdsec-data-science-what-our-code-really-shows</guid>
            <pubDate>Thu, 15 Oct 2026 11:20:51 GMT</pubDate>
            <description><![CDATA[<p>CrowdSec data scientist looks back on 5 years: how we count our network, why we run honeypots, canaries in blocklists, and what the code leak really shows.</p>
]]></description>
            <content:encoded><![CDATA[
<h2 class="wp-block-heading">What If CrowdSec Had Been Open Source From Day One?</h2>



<p class="wp-block-paragraph">Time flies! It has already been 5 years since I joined CrowdSec. The recent events about the <a href="https://www.crowdsec.net/blog/tanstack-supply-chain-attack-analysis" target="_blank" rel="noreferrer noopener">leakage of our codebase</a> led me to realize: what if we had been totally open source in the first place? Would we have done the work differently?</p>



<p class="wp-block-paragraph">Perhaps a bit in the formatting, I could have removed some stray comments in the Git history, but not much in the core work. The core responsibilities remain the same: accurately assessing network size, implementing safeguards against data poisoning, and training models to classify IP addresses based on behavior.</p>



<h2 class="wp-block-heading"><strong>The Internet never forgets</strong></h2>



<p class="wp-block-paragraph">But let’s be honest, the Internet never forgets, and the Internet likes gossip. There are already several curious souls trying to dissect our codebase to find the shammy commit where we take all the user data and sell it to Big Corp.</p>



<p class="wp-block-paragraph">Don’t waste your sweat (and your LLM tokens); you won’t find anything, not even close. If it were the case, the codebase would not have been published for free 4 months after the extraction. Instead, what you will learn about us:</p>



<h3 class="wp-block-heading"><strong>Our KPIs reflect real network growth</strong></h3>



<p class="wp-block-paragraph">KPIs are not emphasized; they are built methodically to reflect our network growth. Let’s be honest: every company has marketing claims, and most of the time figures are inflated by 10x (if not 1000x). However, I can confidently say that that is not our case. In the data science team, our goal is to explain why it makes no sense to claim 10 million installations (what is a <em>Docker pull</em> nowadays?) but to care about how many active watchers (Security Engines) report on a daily basis.</p>



<h3 class="wp-block-heading"><strong>Yes, there are canaries in our Blocklists</strong></h3>



<p class="wp-block-paragraph">We did put some canaries in our blocklists (and will continue to). Companies out there are indeed stealing our work by redistributing our IP reputation, hence violating our Terms of Service, and even taking profit out of it sometimes.</p>



<h3 class="wp-block-heading"><strong>Yes, we run honeypots (all 30 of them)</strong></h3>



<p class="wp-block-paragraph">We do run a network of honeypots (you can read more about <a href="https://www.crowdsec.net/glossary/honeypots-vs-crowdsourced-threat-intelligence" target="_blank" rel="noreferrer noopener">what a honeypot is here</a>). A whopping network of 30 machines, actually. It was necessary at the beginning to build a reputation system on signals we could trust. It then proved useful to test the load of our Console Organization and try alpha features in CrowdSec. It was never our intention to make it a cornerstone of our business model – and looking at some competitors turning back from this idea led me to believe it was the right decision. Now they are still up and running, yet they only represent a drop in the ocean. They produce 10,000 signals a day; that’s not even 0.001% of the total network traffic.</p>



<h3 class="wp-block-heading"><strong>Why we call malicious IPs “pokemons”</strong></h3>



<p class="wp-block-paragraph">We do call a “malicious-IP-reported-by-a-user” a “pokemon”. There are even around 1000 occurrences, according to GitHub. That’s shorter, and it makes the day-to-day work much more fun when you have to catch them all. We even built a Pokedex for that, but that’s only internal, of course.</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1893" height="1892" src="https://cms.crowdsec.net/wp-content/uploads/2026/10/image.jpeg" alt="" class="wp-image-6947" style="aspect-ratio:1.00253807106599;width:395px;height:auto" srcset="https://cms.crowdsec.net/wp-content/uploads/2026/10/image.jpeg 1893w, https://cms.crowdsec.net/wp-content/uploads/2026/10/image-150x150.jpeg 150w, https://cms.crowdsec.net/wp-content/uploads/2026/10/image-1536x1535.jpeg 1536w, https://cms.crowdsec.net/wp-content/uploads/2026/10/image-767x767.jpeg 767w, https://cms.crowdsec.net/wp-content/uploads/2026/10/image-300x300.jpeg 300w" sizes="auto, (max-width: 1893px) 100vw, 1893px" /></figure>



<h3 class="wp-block-heading"><strong>Our marketing is backed by real data</strong></h3>



<p class="wp-block-paragraph">We did produce marketing articles backed by genuine data analysis. When we released the article “<a href="https://www.crowdsec.net/blog/without-and-with-a-crowdsec-bouncer-a-tale-of-two-servers" target="_blank" rel="noreferrer noopener">With or Without CrowdSec: a tale of two servers</a>”, a kind of A/B experiment between 2 servers–one with CrowdSec, one without– it was based on authentic data. We don’t make numbers up when we say we have 250k machines live protected by CrowdSec. That’s not even accounting for log centralization: large organizations usually run one CrowdSec on top of 10 or 100 services.</p>



<h3 class="wp-block-heading"><strong>How we score IP reputation</strong></h3>



<p class="wp-block-paragraph">We evaluate the reliability of our IP reputation by aggregating statistics over pokemons and watchers. We score the watchers based on network contribution and longevity and integrate this with statistics aggregated over IP reports to determine a malevolence probability.</p>



<h3 class="wp-block-heading"><strong>What leaked, and what we reported</strong></h3>



<p class="wp-block-paragraph">We did leak 83 email addresses of Console users. This is unfortunate but rather marginal compared to the 150k user base. All the details were already reported to the relevant authorities and the affected users.</p>



<h3 class="wp-block-heading"><strong>How we use Console user data</strong></h3>



<p class="wp-block-paragraph">We do aggregate user data to identify segments inside our <a href="https://app.crowdsec.net/" target="_blank" rel="noreferrer noopener">Console</a> users. Sometimes we intend to figure out who the correct audience is to become beta testers for a new feature. Sometimes it’s protective: we do have free-riders trying to breach the rules (and license agreements) to avoid paying for our CTI access. Most of the time we engage in conversation with them and try to identify what limitation they found with our current pricing strategy. Hopefully, the more we correct the direction, the less of a necessity it becomes.</p>



<h2 class="wp-block-heading"><strong>What’s next for the data team</strong></h2>



<p class="wp-block-paragraph">All this retrospective is, in the end, very positive for me, as it revives new content ideas. What if we released an updated version of the Tale of Two Servers? Or an Internet IP reputation map,&nbsp; implementing geohash-like tiles for IP ranges 😉?</p>



<p class="wp-block-paragraph">There won’t be a best moment for a proposal, especially as I am pleased to announce that the team is expanding. Alexandre Monteil just joined to help me build more captivating stories about our network (and Pokemons).</p>



<p class="wp-block-paragraph">Stay tuned!</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="2048" height="1189" src="https://cms.crowdsec.net/wp-content/uploads/2026/10/image-3.png" alt="CrowdSec Internet Map" class="wp-image-6946" style="aspect-ratio:1.721627408993576;width:804px;height:auto" srcset="https://cms.crowdsec.net/wp-content/uploads/2026/10/image-3.png 2048w, https://cms.crowdsec.net/wp-content/uploads/2026/10/image-3-300x174.png 300w, https://cms.crowdsec.net/wp-content/uploads/2026/10/image-3-766x445.png 766w, https://cms.crowdsec.net/wp-content/uploads/2026/10/image-3-1536x892.png 1536w" sizes="auto, (max-width: 2048px) 100vw, 2048px" /></figure>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
            <category>CrowdSec</category>
            <category>Data Curation</category>
            <category>Inside CrowdSec</category>
            <enclosure url="https://cms.crowdsec.net/wp-content/uploads/2026/10/Blog-images-1575-%C3%97-871px-74.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[How MindMax Neutralized a Massive Bot Scraping Attack with CrowdSec WAF Bot Detection]]></title>
            <link>https://crowdsec.net/blog/mindmax-defeating-distributed-bot-networks-with-crowdsec</link>
            <guid isPermaLink="false">https://crowdsec.net/blog/mindmax-defeating-distributed-bot-networks-with-crowdsec</guid>
            <pubDate>Thu, 08 Oct 2026 08:02:02 GMT</pubDate>
            <description><![CDATA[<p>Discover how Finnish company MindMax used the new CrowdSec WAF bot detection feature to stop a massive, highly distributed residential botnet targeting their dictionary sites.</p>
]]></description>
            <content:encoded><![CDATA[
<p class="wp-block-paragraph">Recently, we published an article digging into bot signal data received from the early alpha release of <a href="https://docs.crowdsec.net/docs/next/appsec/bot_detection/intro/" target="_blank" rel="noreferrer noopener">CrowdSec WAF’s bot detection feature</a>. We highlighted the bot cluster we found and dubbed “paperphone”, a scraping network spanning 75,000 IPs across 43 countries (<a href="https://www.crowdsec.net/blog/the-paperphone-cluster-one-operator-80k-ips-43-countries" target="_blank" rel="noreferrer noopener">read the full story here</a>). None of these insights would have been possible without our brave early adopters who tested the feature live in production. Today, we’re excited to share the story of one such adopter: <strong>MindMax</strong>.</p>



<h2 class="wp-block-heading">The Challenge: A Stealthy, Highly Distributed Residential Botnet</h2>



<p class="wp-block-paragraph"><a href="https://www.mindmax.fi/" target="_blank" rel="noreferrer noopener">MindMax</a> is a small Finnish company running a handful of free consumer websites, including online dictionaries, a TV guide, a car marketplace, and a quiz platform. Run by a lean team of four, MindMax maintains a compact, self-hosted infrastructure dedicated to serving daily user needs seamlessly.</p>



<p class="wp-block-paragraph">In early September 2026, MindMax&#8217;s online dictionary sites were hit by a massive scraping network. The attack was extraordinarily sneaky: it utilized hundreds of thousands of residential IPs, with each IP making only a single request. Coupled with legitimate browser headers and constantly rotating user agents, traditional rate limiting and IP reputation checks were completely useless; no single IP ever triggered standard alarm thresholds.</p>



<p class="wp-block-paragraph">The persistent traffic spike threatened server performance and hurt MindMax’s ad-funded sites. CEO Juha and his team initially crafted custom Nginx rules, JavaScript cookie verification, and network fingerprint blocks. While these custom fixes provided temporary relief, the botnet rapidly adapted to every defense they threw at it.</p>



<h2 class="wp-block-heading">The Solution: Open Source Bot Detection</h2>



<p class="wp-block-paragraph">Already relying on the <a href="https://www.crowdsec.net/security-engine" target="_blank" rel="noreferrer noopener">CrowdSec Security Engine</a>, MindMax eagerly jumped at the chance to test CrowdSec’s new bot detection feature in alpha. The solution perfectly aligned with their architectural values: open source, lightweight, running entirely on their own infrastructure, and requiring zero third-party traffic routing.</p>



<p class="wp-block-paragraph">MindMax deployed the Security Engine alongside the <a href="https://docs.crowdsec.net/docs/next/appsec/intro/" target="_blank" rel="noreferrer noopener">CrowdSec WAF (AppSec component)</a> and bot detection, using an OpenResty bouncer situated in front of PHP. They piloted the setup on one dictionary site before expanding protection across three portals, taking care to exempt verified search engine crawlers so SEO remained completely unharmed.</p>



<h2 class="wp-block-heading">The Results: 99%+ Rejection Rate &amp; Uninterrupted UX</h2>



<p class="wp-block-paragraph">The impact was immediate and dramatic:</p>



<ul class="wp-block-list">
<li><strong>Massive Threat Neutralization:</strong> In the first week alone, roughly 1,000,000 challenges were served to suspicious clients.</li>



<li><strong>Over 99% Block Rate:</strong> More than 99% of non-human traffic failed or abandoned the challenge instantly.</li>



<li><strong>Zero Friction for Real Users:</strong> Genuine visitors passed challenges seamlessly in ~2 seconds, with search traffic remaining rock-solid.</li>



<li><strong>Accurate Targeting:</strong> Manual checks confirmed that only headless browsers and malicious crawlers were blocked; legitimate users experienced no interruption.</li>
</ul>



<h2 class="wp-block-heading">Looking Ahead</h2>



<p class="wp-block-paragraph">By stopping low-volume, highly distributed residential bots that traditional tools couldn&#8217;t touch, all while keeping full control of their self-hosted setup, MindMax successfully eliminated the bulk of their bot problem. CrowdSec continues to protect their infrastructure alongside custom rules, giving MindMax the peace of mind to focus on delivering great services to their users.</p>
]]></content:encoded>
            <category>Success Story</category>
            <enclosure url="https://cms.crowdsec.net/wp-content/uploads/2026/10/274.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[The PaperPhone Cluster: One Operator, 80K IPs, 43 countries]]></title>
            <link>https://crowdsec.net/blog/the-paperphone-cluster-one-operator-80k-ips-43-countries</link>
            <guid isPermaLink="false">https://crowdsec.net/blog/the-paperphone-cluster-one-operator-80k-ips-43-countries</guid>
            <pubDate>Tue, 29 Sep 2026 16:58:08 GMT</pubDate>
            <description><![CDATA[<p>CrowdSec bot detection uncovered PaperPhone, a coordinated headless browser network using 75,000 IPs across 43 countries and fabricated mobile identities.</p>
]]></description>
            <content:encoded><![CDATA[
<p class="wp-block-paragraph">On the 31st of August, we released CrowdSec 1.8.0 that included the bot detection feature. Despite the fact that the feature was (is) still tagged as <strong>alpha</strong>, some mad lads promptly slapped it on their production infrastructure. Thanks for the trust!</p>



<p class="wp-block-paragraph">This allowed us to progressively collect some bot signal data that we promptly started to investigate. Until the addition of bot detection features within CrowdSec, the <a href="https://docs.crowdsec.net/docs/next/intro/" target="_blank" rel="noreferrer noopener">Security Engine</a> and <a href="https://docs.crowdsec.net/docs/next/appsec/intro/" target="_blank" rel="noreferrer noopener">Web Application Firewall</a> have been nearly exclusively focused on “what is the IP doing?”, so being able to look into “what is the client behind this IP running?” is for us a whole new perspective, and we’re digging into the data like kids into a bag of unmonitored candies.&nbsp;</p>



<p class="wp-block-paragraph">So today, I’m super happy to present to you the first of an hopefully long series of investigations where we&nbsp;discover together the fantastic world of large-scale scrappers that might quickly turn into “What the actual F is m247 up to?”</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="345" height="338" src="https://cms.crowdsec.net/wp-content/uploads/2026/09/xTiN0CNHgoRf1Ha7CM.webp" alt="" class="wp-image-6901" style="aspect-ratio:1.0207538758730001;width:355px;height:auto" srcset="https://cms.crowdsec.net/wp-content/uploads/2026/09/xTiN0CNHgoRf1Ha7CM.webp 345w, https://cms.crowdsec.net/wp-content/uploads/2026/09/xTiN0CNHgoRf1Ha7CM-300x294.webp 300w" sizes="auto, (max-width: 345px) 100vw, 345px" /></figure>



<p class="wp-block-paragraph">Yes, we identified a cluster of bots that we dubbed “<strong>paperphone</strong>”; let me walk you through! But first, the “big numbers” headline:</p>



<h3 class="wp-block-heading">What CrowdSec bot detection revealed</h3>



<ul class="wp-block-list">
<li>75,000 IPs</li>



<li>Spread across 230 IP blocks</li>



<li>Located across 43 countries</li>



<li>Spotted over the course of two weeks</li>
</ul>



<h3 class="wp-block-heading">The timeline</h3>



<p class="wp-block-paragraph">The timeline itself is to be taken with a grain of salt, as the beginning of the identification of the cluster started when the feature was released: the infrastructure is likely to have been running for a while already.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2048" height="928" src="https://cms.crowdsec.net/wp-content/uploads/2026/09/cumulative-ip-address-in-use-2048x928.png" alt="" class="wp-image-6902" srcset="https://cms.crowdsec.net/wp-content/uploads/2026/09/cumulative-ip-address-in-use-2048x928.png 2048w, https://cms.crowdsec.net/wp-content/uploads/2026/09/cumulative-ip-address-in-use-300x136.png 300w, https://cms.crowdsec.net/wp-content/uploads/2026/09/cumulative-ip-address-in-use-768x348.png 768w, https://cms.crowdsec.net/wp-content/uploads/2026/09/cumulative-ip-address-in-use-1536x696.png 1536w" sizes="auto, (max-width: 2048px) 100vw, 2048px" /></figure>



<p class="wp-block-paragraph">We can, however, see that the IPs are progressively rallying the cluster as our users are deploying the feature and start to contribute to the detection. Unsurprisingly, we can also see the operator starting to rotate and cycle its IP addresses as they get banned left and right for failing the challenges too often:<br></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2048" height="556" src="https://cms.crowdsec.net/wp-content/uploads/2026/09/ip-rotation-1-2048x556.png" alt="" class="wp-image-6919" srcset="https://cms.crowdsec.net/wp-content/uploads/2026/09/ip-rotation-1-2048x556.png 2048w, https://cms.crowdsec.net/wp-content/uploads/2026/09/ip-rotation-1-766x208.png 766w, https://cms.crowdsec.net/wp-content/uploads/2026/09/ip-rotation-1-300x81.png 300w, https://cms.crowdsec.net/wp-content/uploads/2026/09/ip-rotation-1-1536x417.png 1536w" sizes="auto, (max-width: 2048px) 100vw, 2048px" /></figure>



<p class="wp-block-paragraph">But I’m already digressing; let’s look at what this cluster is made of, and how it’s distributed!</p>



<h3 class="wp-block-heading">Geographic diversity, or just a facade?</h3>



<p class="wp-block-paragraph">Very often “geoblocking” comes into people’s conversations when dealing with unwanted traffic. But as soon as you’re dealing with even remotely sophisticated (emphasis on the <em>remotely</em>) actors, it becomes very ineffective, as “it’s coming from everywhere!”</p>



<p class="wp-block-paragraph">In this specific case, the traffic from the cluster is originating from 43 distinct countries (if you trust geolocation, but we’ll come back to this later). However, the time of the requests doesn’t align with the time zones of the countries they claim to originate from</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>Country</td><td>Peak local time</td><td>Night share</td></tr><tr><td>🇯🇵 Japan</td><td><strong>05:00</strong></td><td>18.7%</td></tr><tr><td>🇮🇳 India</td><td><strong>01:00</strong></td><td>18.5%</td></tr><tr><td>🇲🇽 Mexico</td><td><strong>03:00</strong></td><td>17.4%</td></tr><tr><td>🇱🇹 Lithuania</td><td><strong>02:00</strong></td><td>16.6%</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">It goes further than having night-bird users. While the traffic is spread over days, synchronization regardless of the origin countries still shows up. For example, while <strong>Japan</strong> and the <strong>US</strong> are 13 hours apart, request spikes from both countries are highly correlated. And this pattern repeats over and over: <strong>Australia</strong> and <strong>Canada</strong> (14 hours apart) infrastructure wakes up at the same time.</p>



<p class="wp-block-paragraph">So, while this seems odd, if you look at it from a UTC time zone point of view, it makes a lot more sense:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2048" height="888" src="https://cms.crowdsec.net/wp-content/uploads/2026/09/time-distribution-1-2048x888.png" alt="" class="wp-image-6920" srcset="https://cms.crowdsec.net/wp-content/uploads/2026/09/time-distribution-1-2048x888.png 2048w, https://cms.crowdsec.net/wp-content/uploads/2026/09/time-distribution-1-300x130.png 300w, https://cms.crowdsec.net/wp-content/uploads/2026/09/time-distribution-1-768x333.png 768w, https://cms.crowdsec.net/wp-content/uploads/2026/09/time-distribution-1-1536x666.png 1536w" sizes="auto, (max-width: 2048px) 100vw, 2048px" /></figure>



<h3 class="wp-block-heading">Nationality is a field somebody types</h3>



<p class="wp-block-paragraph">The scraper network spreads over 230 distinct IP blocks (mostly /24’s) and 80 networks. But again, this apparent diversity is a mere facade. When looking more closely at the IP blocks, a lot of things start to stand out.</p>



<p class="wp-block-paragraph">Nearly every block involved shows some inconsistencies.</p>



<p class="wp-block-paragraph">For example, <strong>103.216.1.0/24</strong> was issued to APNIC (The Regional Internet Registry for Asia Pacific). But it’s registered to RIPE (The RIR for Europe, the Middle East, and Central Asia), meaning an inter-regional transfer happened (it was last transferred in 2025). The registrant itself is Lithuanian, while the country claimed by the WHOIS is “United States”. More concretely, it means that the range changed ownership during its lifetime (lastly in 2025) &#8211; which is fine &#8211; but more importantly, its registration region, the country of the organization managing it, and the claim geolocalisation all differ significantly.</p>



<p class="wp-block-paragraph">If you start to look closely within the ranges allocated, you can quickly see that the geolocation is to be taken with a grain of salt, as a lot of adjacent ranges are artificially located in various countries:</p>



<ul class="wp-block-list">
<li>62.105.200.0/22 : 🇧🇪 Brussels</li>



<li>62.105.204.0/23 : 🇹🇭 Bangkok&nbsp;</li>



<li>62.105.208.0/23 : 🇯🇵 Tokyo</li>



<li>62.105.210.0/23 : 🇫🇷 Paris</li>
</ul>



<p class="wp-block-paragraph">And this pattern is quite systematic when you look at the 230 address blocks involved. The good news is that it all boils down to a few entities that are controlling a significant portion of the involved IP ranges:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2048" height="1276" src="https://cms.crowdsec.net/wp-content/uploads/2026/09/heatmap-ips-2-2048x1276.png" alt="" class="wp-image-6921" srcset="https://cms.crowdsec.net/wp-content/uploads/2026/09/heatmap-ips-2-2048x1276.png 2048w, https://cms.crowdsec.net/wp-content/uploads/2026/09/heatmap-ips-2-300x187.png 300w, https://cms.crowdsec.net/wp-content/uploads/2026/09/heatmap-ips-2-767x478.png 767w, https://cms.crowdsec.net/wp-content/uploads/2026/09/heatmap-ips-2-1536x957.png 1536w" sizes="auto, (max-width: 2048px) 100vw, 2048px" /></figure>



<p class="has-text-align-center wp-block-paragraph">Note: The graph above shows ownership of IP ranges: organisation -&gt; country -&gt; AS -&gt; IP block.</p>



<p class="wp-block-paragraph">What all this shows is that the entities that are in control of the IP blocks deliberately obscure their geographic footprint, making it harder to detect and block. We’re not facing someone renting machines in 43 countries, but an organization artificially claiming to have a diverse geographic presence.</p>



<p class="wp-block-paragraph">Surprisingly, the name of M247 doesn’t appear in the graph above. Worry not, while none of the blocks belong to M247, it is still the transit provider for more than 20% of PaperPhone’s cluster.</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="500" height="667" src="https://cms.crowdsec.net/wp-content/uploads/2026/09/scoobydoo-1.png" alt="" class="wp-image-6912" srcset="https://cms.crowdsec.net/wp-content/uploads/2026/09/scoobydoo-1.png 500w, https://cms.crowdsec.net/wp-content/uploads/2026/09/scoobydoo-1-225x300.png 225w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<h3 class="wp-block-heading">iPhones, Android, and bot signals</h3>



<p class="wp-block-paragraph">These whopping 75 thousand IPs have been showing a very consistent behavior, meticulously cycling between thirteen different device identities, including 5 different Android devices and 7 variants of iOS.</p>



<p class="wp-block-paragraph">However, within the signals, there were some funny giveaways of obvious lies:</p>



<p class="wp-block-paragraph">An interesting inconsistency was that the viewport size &#8211; the effective visible rendering area &#8211; was <strong>375&#215;812</strong> for 100% of the bots. This matches the iPhone 10/11 (to my knowledge) viewport size, inconsistent with the claimed devices.</p>



<p class="wp-block-paragraph">All of them are also using <strong>Google SwiftShader</strong> as their WebGL renderer (<code>UNMASKED_RENDERER_WEBGL</code>), which is Google’s open-source CPU-based software renderer. This information means that the <strong>Chrome-based</strong> browser is running on hardware that doesn’t provide any hardware acceleration.</p>



<p class="wp-block-paragraph">The claimed Android devices (Pixel 9, Samsung Galaxy S25 Ultra, etc.) are all fairly recent Android devices, so the likelihood of them not having hardware acceleration is approximately zero.</p>



<p class="wp-block-paragraph">At the risk of stating the obvious, when it comes to iOS 14/15 triggering a SwiftShader signal, given that it’s running Apple’s WebKit, the likelihood of it happening is again zero.</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="500" height="500" src="https://cms.crowdsec.net/wp-content/uploads/2026/09/pdame-1.png" alt="" class="wp-image-6913" srcset="https://cms.crowdsec.net/wp-content/uploads/2026/09/pdame-1.png 500w, https://cms.crowdsec.net/wp-content/uploads/2026/09/pdame-1-150x150.png 150w, https://cms.crowdsec.net/wp-content/uploads/2026/09/pdame-1-300x300.png 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<h3 class="wp-block-heading">Maxing out available ranges</h3>



<p class="wp-block-paragraph">In this specific case, the IP ranges were mostly already flagged as being data centers and “known” in our CTI, so we’re not facing the more sneaky case of residential proxy abuse, as the density of IP addresses also shows:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="2397" height="1587" src="https://cms.crowdsec.net/wp-content/uploads/2026/09/block-densuty.png" alt="" class="wp-image-6924" srcset="https://cms.crowdsec.net/wp-content/uploads/2026/09/block-densuty.png 2397w, https://cms.crowdsec.net/wp-content/uploads/2026/09/block-densuty-300x199.png 300w, https://cms.crowdsec.net/wp-content/uploads/2026/09/block-densuty-767x508.png 767w, https://cms.crowdsec.net/wp-content/uploads/2026/09/block-densuty-1536x1017.png 1536w, https://cms.crowdsec.net/wp-content/uploads/2026/09/block-densuty-2048x1356.png 2048w" sizes="auto, (max-width: 2397px) 100vw, 2397px" /></figure>



<p class="wp-block-paragraph">Note: The graphic above shows the percentage of IPs in each block that were involved in the scraping actions.</p>



<p class="wp-block-paragraph">We can see that more of the blocks have been used to their full capacity during the scraping operation, and that all the “diversity” of the network (AS, ranges, countries) is a mere facade.</p>
]]></content:encoded>
            <category>CrowdSec</category>
            <enclosure url="https://cms.crowdsec.net/wp-content/uploads/2026/09/Blog-images-1575-%C3%97-871px-35.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[CrowdSec vs Suricata: Do You Need Both for Linux Servers?]]></title>
            <link>https://crowdsec.net/blog/crowdsec-vs-suricata-do-you-need-both-for-linux-servers</link>
            <guid isPermaLink="false">https://crowdsec.net/blog/crowdsec-vs-suricata-do-you-need-both-for-linux-servers</guid>
            <pubDate>Thu, 24 Sep 2026 08:04:43 GMT</pubDate>
            <description><![CDATA[<p>See if CrowdSec&#8217;s IP blocking or Suricata&#8217;s deep inspection fits your Linux server. Avoid alert fatigue with the right enforcement strategy.</p>
]]></description>
            <content:encoded><![CDATA[
<p class="wp-block-paragraph">For most Linux servers, CrowdSec and Suricata don’t need to run side by side, but knowing what each is built to do can help you decide when one is enough and when layering both makes sense. Let’s dive into it in this article.&nbsp;</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">You&#8217;ve deployed detection tooling, the alerts are flowing, and your dashboards are lit up. Yet your servers are still absorbing brute-force attempts, scanner traffic, and the occasional exploitation probe. The problem usually isn&#8217;t that you need <em>more</em> tools. It&#8217;s that detection without enforcement is just expensive logging.</p>



<p class="wp-block-paragraph">That&#8217;s the real framing for the CrowdSec vs Suricata question. Not &#8220;which is better&#8221; but &#8220;where do you want enforcement to happen, and what&#8217;s it going to cost you operationally?&#8221;</p>



<h2 class="wp-block-heading"><strong>What each tool actually does</strong></h2>



<p class="wp-block-paragraph"><a href="https://www.crowdsec.net/security-engine" target="_blank" rel="noreferrer noopener">CrowdSec&#8217;s Security Engine</a> is a collaborative <a href="https://www.crowdsec.net/glossary/intrusion-detection-prevention-system" target="_blank" rel="noreferrer noopener">IDS</a> that aggregates behavioral signals across its global network, produces alerts, and converts them into enforcement decisions. The key architectural detail: blocking isn&#8217;t automatic. Per our <a href="https://docs.crowdsec.net/docs/concepts/" target="_blank" rel="noreferrer noopener">Concepts documentation</a>, &#8220;Threat prevention (blocking) is enforced by Remediation Components (bouncers).&#8221; The Security Engine detects and decides; the bouncer (integrated with your <a href="https://www.crowdsec.net/glossary/what-does-a-firewall-do" target="_blank" rel="noreferrer noopener">firewall</a>, reverse proxy, or CDN) actually drops the traffic. No bouncer attached means no blocking, full stop.</p>



<p class="wp-block-paragraph"><a href="https://suricata.io/" target="_blank" rel="noreferrer noopener">Suricata</a> is a network traffic inspection engine. In passive IDS mode, it observes and alerts. In IPS mode, it becomes, as the <a href="https://docs.suricata.io/en/latest/" target="_blank" rel="noreferrer noopener">Suricata 9.0.0-dev documentation</a> puts it, &#8220;the Suricata mode that makes it act as a traffic filter,&#8221; sitting inline and enforcing drop decisions against matching traffic. Both tools can detect. The enforcement model, operational cost, and failure mode are where they diverge sharply.</p>



<h2 class="wp-block-heading"><strong>What CrowdSec is built for on internet-facing Linux servers</strong></h2>



<p class="wp-block-paragraph"><a href="https://docs.crowdsec.net/u/getting_started/installation/linux/" target="_blank" rel="noreferrer noopener">CrowdSec&#8217;s value on a Linux server is preemptive, IP-centric blocking at the perimeter.</a> Our signal network spans more than 190 countries and 7,000+ autonomous systems, processing over 50 million daily signals from production environments globally. At that scale, CrowdSec identifies known-bad IPs and distributes them as <a href="https://www.crowdsec.net/blocklists" target="_blank" rel="noreferrer noopener">collaborative threat intelligence blocklists</a> before they even touch your infrastructure.</p>



<p class="wp-block-paragraph">The alert-to-decision-to-bouncer chain matters here. When the Security Engine identifies an IP behaving aggressively (scanning, brute-forcing, exploiting CVEs), it produces a decision. A remediation bouncer then enforces that decision against your existing firewall rules or reverse proxy configuration. Roughly 92% of attacks get blocked at the border before they reach servers, with an <a href="https://www.crowdsec.net/blog/introducing-guide-to-cost-effective-security-operations" target="_blank" rel="noreferrer noopener">82% reduction in alert volume</a> as a downstream effect.</p>



<p class="wp-block-paragraph">For web-facing services, <a href="https://www.crowdsec.net/blog/crowdsec-waf-from-first-steps-to-advanced-deployments" target="_blank" rel="noreferrer noopener">CrowdSec&#8217;s AppSec component adds WAF capabilities, virtual patching, and OWASP CRS support directly into the enforcement chain</a>. That&#8217;s a meaningful addition if your threat surface includes web application exploitation rather than just network-layer abuse.</p>



<h2 class="wp-block-heading"><strong>What Suricata is built for (and why IPS mode is operationally expensive)</strong></h2>



<p class="wp-block-paragraph">Suricata&#8217;s strength is deep packet inspection: stream reassembly, application-layer protocol detection, and signature-based matching against specific exploit patterns. In IDS mode, it observes traffic passively and generates alerts, which is relatively safe to deploy and tune.</p>



<p class="wp-block-paragraph"><a href="https://docs.suricata.io/en/latest/ips/index.html" target="_blank" rel="noreferrer noopener">IPS mode</a> is different. It&#8217;s inline; it filters live traffic, and the consequences of misconfiguration are immediate. From the Suricata 9.0.0-dev documentation: &#8220;By default, when IPS mode is enabled, the exception policies are set to block (drop). This is to make sure rules cannot be bypassed due to&#8230;&#8221; edge cases in stream handling. Fail-closed behavior is a sound security default, but it means an under-tuned ruleset can start dropping legitimate traffic. CPU and latency overhead also increase with inline inspection, especially at higher throughput.</p>



<p class="wp-block-paragraph">That operational cost is significant for most lean security teams. IPS mode demands validated rulesets, performance testing, and ongoing tuning discipline before it&#8217;s safe to put in front of production traffic.</p>



<h2 class="wp-block-heading"><strong>Do you actually need both?</strong></h2>



<p class="wp-block-paragraph">For most internet-facing Linux server deployments, the honest answer is no, at least not simultaneously from day one.</p>



<p class="wp-block-paragraph">If your primary pain is commodity noise (mass scanning, credential stuffing, abusive bots, opportunistic exploit attempts), automated IP blocking via CrowdSec&#8217;s enforcement chain handles the bulk of it. The collaborative threat intelligence model means you&#8217;re blocking IPs that other organizations have already confirmed as aggressive, not waiting for those IPs to complete an attack against you.</p>



<p class="wp-block-paragraph">Add Suricata when you genuinely need packet-signature-driven detection for specific exploit classes, protocol compliance enforcement, or application-layer visibility that IP reputation alone can&#8217;t provide (<a href="https://www.crowdsec.net/blog/crowdsec-and-suricata-integration" target="_blank" rel="noreferrer noopener">see this article to learn how to set up the integration</a>). Even then, start in IDS mode. Observe for a week or two before considering inline IPS deployment. The Suricata <a href="https://docs.suricata.io/en/latest/ips/ips-concept.html" target="_blank" rel="noreferrer noopener">community&#8217;s own guidance supports this sequence</a>, and the performance and false-positive data you collect in passive mode are what make IPS tuning tractable.</p>



<p class="wp-block-paragraph">Running both makes sense in higher-maturity environments, but only with clear role boundaries: CrowdSec handles perimeter mitigation and noise reduction via collaborative threat intelligence; Suricata handles deep inspection for the residual traffic you want to analyze at the packet level.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Suricata sees deep. CrowdSec thinks broader. Together, they make a compelling combination. Suricata provides deep, signature-based network visibility, but typically requires additional tooling and administration to turn those signals into a complete detection and response workflow. CrowdSec takes a more all-in-one approach, combining behavioral detection, signal correlation, threat intelligence, and automated remediation in a single ecosystem.</strong> &#8211; Manuel Sabban, CrowdSec DevSecOps PHD. </p>
</blockquote>



<h2 class="wp-block-heading"><strong>A practical layering model</strong></h2>



<p class="wp-block-paragraph">Layer 1 is <a href="https://docs.crowdsec.net/docs/next/appsec/protocol/" target="_blank" rel="noreferrer noopener">CrowdSec bouncers integrated into your existing firewall or reverse proxy</a>. Known-bad IP traffic gets dropped before it consumes inspection resources. This also reduces the traffic volume Suricata needs to process, directly lowering IPS mode overhead.</p>



<p class="wp-block-paragraph">Layer 2 is <a href="https://docs.suricata.io/en/latest/ips/ips-concept.html" target="_blank" rel="noreferrer noopener">Suricata in IDS mode inspecting the remaining traffic</a>. Validate your ruleset here. Identify false positives. Measure CPU impact under realistic load before enabling any inline drop behavior.</p>



<p class="wp-block-paragraph">Before trusting any of this, verify your remediation components are actually active. CrowdSec&#8217;s <a href="https://docs.crowdsec.net/u/troubleshooting/intro/" target="_blank" rel="noreferrer noopener">troubleshooting documentation</a> is explicit that &#8220;a Security Engine that detects threats but has no Remediation Component attached cannot act on its decisions; attackers are detected but never blocked.&#8221; Detections without an enforcing bouncer attached are one of the most common reasons teams feel like their security stack isn&#8217;t working.</p>



<h2 class="wp-block-heading"><strong>The pitfalls that make teams think they need more tooling</strong></h2>



<p class="wp-block-paragraph">Two failure modes drive most &#8220;I need both&#8221; conversations. The first is a CrowdSec deployment where the Security Engine is running, but no bouncer is configured or connected. Alerts accumulate. Decisions get made. Nothing is blocked. Adding Suricata on top of an unfinished CrowdSec deployment doesn&#8217;t fix the enforcement gap; attaching the right <a href="https://docs.crowdsec.net/u/bouncers/intro/" target="_blank" rel="noreferrer noopener">remediation component</a> does.</p>



<p class="wp-block-paragraph">The second is Suricata deployed directly in IPS mode without baseline tuning. Exception policies fail closed by default, performance impact hits production, false positives surface, and the ops team spends the next month chasing rule noise instead of actual threats.</p>



<p class="wp-block-paragraph">Neither situation means you need both tools. Both situations mean you need to finish configuring the one you have.</p>



<p class="wp-block-paragraph">Start with CrowdSec in enforcement mode. Let it block the commodity noise and reduce your alert volume. Then, if packet-level inspection of residual traffic surfaces gaps you can&#8217;t close with <a href="https://www.crowdsec.net/ip-reputation" target="_blank" rel="noreferrer noopener">IP reputation</a> and behavioral signals alone, layer Suricata in, in IDS mode first, and graduate to IPS only once you&#8217;ve validated that your rules and performance headroom support it. That sequencing keeps the operational cost manageable and keeps each layer doing the job it&#8217;s actually suited for.</p>



<h3 class="wp-block-heading">FAQs</h3>



<p class="wp-block-paragraph"><strong>Do I need both CrowdSec and Suricata on my Linux server?</strong><strong><br></strong><em>TL;DR of the article:</em> Not necessarily. For most internet-facing Linux servers, CrowdSec alone can handle common threats such as brute-force attempts, scanning, and opportunistic attacks. Suricata can be added when you need deeper packet-level inspection or detection capabilities that CrowdSec doesn’t provide.</p>



<p class="wp-block-paragraph"><strong>What is the difference between CrowdSec and Suricata?</strong><strong><br></strong>CrowdSec focuses on behavioral detection, collaborative threat intelligence, and IP-based enforcement, while Suricata specializes in network traffic inspection and signature-based detection. CrowdSec can block malicious IPs through remediation components, while Suricata can inspect traffic at the packet and protocol level.</p>



<p class="wp-block-paragraph"><strong>Does CrowdSec block attacks automatically?</strong><strong><br></strong>Detection alone does not block traffic. CrowdSec&#8217;s Security Engine makes detection and enforcement decisions, but a <strong>remediation component (bouncer)</strong> must be configured to actually block malicious traffic.</p>



<p class="wp-block-paragraph"><strong>Can CrowdSec and Suricata work together?</strong><strong><br></strong>Yes. They can provide complementary layers of protection. CrowdSec can handle known malicious IPs and commodity attacks at the perimeter, while Suricata can inspect the traffic that remains for more specific network-level threats.</p>



<p class="wp-block-paragraph"><strong>Should I run Suricata in IDS or IPS mode?</strong><strong><br></strong>If you&#8217;re deploying Suricata for the first time, IDS mode is generally the safer starting point. It lets you observe alerts, tune rules, identify false positives, and measure performance before introducing inline blocking with IPS mode.</p>



<p class="wp-block-paragraph"><strong>Does running CrowdSec reduce the workload for Suricata?</strong><strong><br></strong>It can. By blocking known malicious IPs at the perimeter before they reach deeper inspection, CrowdSec can reduce the amount of traffic that Suricata needs to process.</p>



<p class="wp-block-paragraph"><strong>Why is CrowdSec detecting attacks but not blocking them?</strong><strong><br></strong>The most common issue is that no remediation component or bouncer is active. The Security Engine can detect threats and create decisions, but those decisions need an enforcement component connected to your firewall, reverse proxy, or other infrastructure to actually block traffic.</p>



<p class="wp-block-paragraph"><strong>When should I add Suricata to my security stack?</strong><strong><br></strong>Consider adding Suricata when you need packet-level visibility, protocol inspection, or signature-based detection for threats that IP reputation and behavioral detection alone cannot identify.</p>
]]></content:encoded>
            <category>Integrations</category>
            <enclosure url="https://cms.crowdsec.net/wp-content/uploads/2026/09/267.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Analyse de l’attaque de la supply chain TanStack]]></title>
            <link>https://crowdsec.net/blog/tanstack-supply-chain-attaque-analyse</link>
            <guid isPermaLink="false">https://crowdsec.net/blog/tanstack-supply-chain-attaque-analyse</guid>
            <pubDate>Mon, 21 Sep 2026 14:04:17 GMT</pubDate>
            <description><![CDATA[<p>Philippe Humeau, PDG de CrowdSec, revient en détail sur l&#8217;attaque de la chaîne d&#8217;approvisionnement de 2026, depuis la fuite du code source et l&#8217;enquête technique jusqu&#8217;aux enseignements tirés.</p>
]]></description>
            <content:encoded><![CDATA[
<h2 class="wp-block-heading">Version courte</h2>



<p class="wp-block-paragraph">CrowdSec utilise GitHub pour versionner son code, tant open source que privé. Le code source privé de la console et de certains outils satellites a été mis en ligne par des cybercriminels. Ce code a été volé en mai 2026. Aucune donnée client, utilisateur ou fournisseur n’a été impactée, c’est essentiellement le code source de la console SaaS qui a été publié. L’attaque a été menée concomitamment à celle de <a href="http://mistral.ai" target="_blank" rel="noreferrer noopener">Mistral.ai</a>, et elle a consisté en la compromission de l’entité TanStack par un groupe du nom de TeamPCP. Tanstack met à disposition des paquets NodeJS dans lesquels une porte dérobée a été introduite. Un de nos anciens employés, toujours membre de l’organisation github (pour finaliser un projet) a été infecté par la récupération d’une version compromise du paquet lui a été servie par TanStack. Celle-ci contenait une backdoor du nom de Shai Ulud qui a permis à TeamPCP d’obtenir un token API GitHub valide lui permettant de lire les bases de code non-publiques de CrowdSec sur GitHub.<br></p>



<h2 class="wp-block-heading">Contexte</h2>



<p class="wp-block-paragraph">Chaque hack intervient dans un contexte humain, business, technologique et sociologique en pleine évolution. Ce qui est douloureux pour CrowdSec aujourd’hui, c&#8217;est que beaucoup d&#8217;entre nous viennent du monde du test d’intrusion, ont fait des décennies de cybersécurité, et ont développé des réflexes « cybersec » dans leur travail quotidien. Dans ce contexte, découvrir que l’on “leak” du code privé prend une autre dimension.</p>



<p class="wp-block-paragraph">CrowdSec a trouvé son business model (PMF, ou Product-Market Fit pour les intimes), et notre modèle SaaS low-touch a commencé à prendre auprès des utilisateurs. La société prend son envol. Certes, l&#8217;équipe s’est un peu réduite, car nous avons dû maîtriser les coûts dans un environnement où l&#8217;accès au capital était plus contraint qu&#8217;avant, mais globalement, nous sommes une startup heureuse, voguant vers le break-even. Récemment, nous avions d’ailleurs entamé des discussions avec des gouvernements et des ministères dans pas moins de 7 pays, tandis qu’un profil “AAA” de l&#8217;industrie toquait à notre porte. Tout allait donc pour le mieux, c’est pourquoi le 16 septembre nous a pris par surprise.</p>



<p class="wp-block-paragraph">Que s’est-il passé, comment, quelle a été la réaction de l’équipe, la timeline, le point d’origine, comment réagir si quelque chose de similaire arrive à votre équipe, et que fera-t-on différemment à l’avenir ? Quel est l&#8217;impact réel derrière le gros titre ? Qu&#8217;est-ce qui est important, marginal, ou objectivement insignifiant ?</p>



<p class="wp-block-paragraph">Mais d&#8217;abord&#8230; que s&#8217;est-il passé ?</p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">The Timeline</h2>



<ul class="wp-block-list">
<li><strong>11 mai 2026</strong> : TeamPCP compromet un dépôt de paquets NPM célèbre nommé TanStack, largement utilisé par les développeurs pour créer des UI web basées sur Node.js. 42 packages sont backdoorés avec leur malware « Shai Hulud », spécialisé dans le vol de credentials et de tokens. </li>



<li><strong>22 mai 2026</strong> : TeamPCP (Threat Actor UNC6780) revendique le piratage de plusieurs dépôts de Mistral AI.</li>



<li><strong>22</strong> <strong>mai</strong> <strong>2026</strong> <strong>&#8211;</strong> <strong>05h52:29</strong> <strong>à</strong> <strong>06h01:33</strong> <strong>UTC</strong> : l’un des fondateurs de BreachForum et un membre, diencracked (a priori), télécharge le contenu de ~170 dépôts GitHub privés de CrowdSec depuis une adresse IP située à Toronto, au Canada (UTC-4). Le nombre de dépôts est relativement secondaire, tout comme leur taille absolue, puisque cela dit davantage de l&#8217;organisation du code et des images utilisées dans l&#8217;interface web qu&#8217;autre chose. Mais sur les forums de breach, les gros chiffres sont un argument de communication. Le point clé, c&#8217;est qu&#8217;il a eu accès à une base de code privée qui n&#8217;était pas censée être exposée, et ça, c&#8217;est un fait réel et vérifié par nos soins.</li>



<li><strong>25 mai 2026 &#8211; après-midi</strong> : L&#8217;accès GitHub du laptop de l&#8217;employé compromis est révoqué (tous les autres l&#8217;étaient déjà et on reviendra sur ce point) pour une raison sans lien avec l’incident de sécurité. On l&#8217;avait laissé actif parce qu&#8217;on s&#8217;était séparés en bons termes avec notre développeur, qui souhaitait finaliser certains travaux.</li>



<li><strong>17 août 2026</strong> : Le token AWS utilisé pour les notifications SNS (contenu dans le leak) est testé afin de vérifier ses autorisations exactes.</li>



<li><strong>16 sept. 2026 &#8211; 17h45</strong> : Publication sur le forum.</li>



<li><strong>16 sept. 2026 &#8211; 20h</strong> : Entre <a href="http://fuitesinfos.fr">fuitesinfos.fr</a> et CrowdSec, une cellule de crise est mise en place.</li>



<li><strong>16 sept. 2026 &#8211; nuit</strong> : Actions forensiques initiales, rotation des identifiants et des tokens clés.</li>



<li><strong>17 sept. 2026 &#8211; matin</strong>: Forensic, coordination, reporting, rotation des tokens/credentials restants.</li>



<li><strong>17 sept. 2026 &#8211; midi</strong> : Communication&nbsp; initiale exposant les faits dont on était déjà sûrs</li>



<li><strong>17 sept. 2026 &#8211; 18h</strong> : GitHub nous apporte une réponse sur le token incriminé, ce qui nous permet de retracer son cycle de vie (la clé API que MrWHO évoque sur le forum).</li>



<li><strong>18 sept. 2026</strong> : Publication de ce rapport en Anglais</li>



<li><strong>21 sept. 2026</strong> : Publication de ce rapport en Français.<br></li>
</ul>



<h2 class="wp-block-heading">Évaluation des risques post-incident</h2>



<p class="wp-block-paragraph">Lors d’une analyse d’incident cyber, on est toujours sous pression pour déterminer si seule la base de code a été touchée ou si les données connectées et l’infrastructure cloud l’ont également été. En « théorie », le scénario idéal en cybersécurité, c&#8217;est que les mécanismes d&#8217;authentification, les tokens, les identités, et toute forme de credentials soient absolument absents de toute base de code. Sauf qu&#8217;on ne vit pas dans cette belle « théorie » ; on vit sur Terre, avec des humains.</p>



<p class="wp-block-paragraph"><strong>Code</strong>:</p>



<p class="wp-block-paragraph"><strong><em>Console</em></strong> : Pour la petite histoire, nous avons longuement réfléchi à open-sourcer la console elle-même, mais nous ne l&#8217;avons pas fait (encore) pour trois raisons principales:&nbsp;</p>



<p class="wp-block-paragraph">1/ Cet outil n&#8217;est pas utilisable sans les microservices AWS qui tournent derrière</p>



<p class="wp-block-paragraph">2/ Structurellement, ce n&#8217;est pas réellement un projet où les utilisateurs peuvent contribuer, il est plus simple de demander une fonctionnalité que de l&#8217;ajouter soi-même&nbsp;</p>



<p class="wp-block-paragraph">3/ Le fait qu&#8217;une branche de code soit open source est délibérément planifié en amont. Même s&#8217;il est possible d&#8217;open-sourcer quelque chose a posteriori, les bases de code qui évoluent rapidement (comme la console SaaS) ne sont pas des candidats idéaux.&nbsp;</p>



<p class="wp-block-paragraph">Le réel problème, c&#8217;est que personne n&#8217;en aurait l’utilité. Ce code a-t-il de la valeur ? Oui, le temps que notre équipe a passé à coder, à réfléchir aux fonctionnalités, à leur agencement, aux interfaces de reporting, etc. Cela a-t-il de la valeur pour autrui ? Très probablement non, ce code est beaucoup trop contextuel. Contenait-il des secrets ? Non. La vraie question reste : la connaissance intime du code peut-elle aider à mener des attaques ultérieurement ? La sécurité par l&#8217;obscurité n&#8217;est jamais un bon modèle, mais avoir le code source complet en main peut accélérer la recherche de faiblesses potentielles, notamment à l&#8217;époque de l’IA-everywhere. Cela dit, CrowdSec a également accès à ces modèles d’IA et nous pouvons (et le faisons) évaluer la sécurité de notre propre code. Alors, est-ce idéal ? Non. Est-ce très grave ? Non. Nous continuerons à surveiller étroitement les diverses sources de logs, traces et audits à notre disposition, et à vérifier que rien ne dévie de la normale. De toute façon, cette base de code évolue rapidement, et 4 mois plus tard, elle est déjà significativement différente de ce qui a été publié.</p>



<p class="wp-block-paragraph"><strong><em>Traitement des données</em></strong> : Certains scripts et modèles de data science font partie du leak mais sans les données pour entraîner ces modèles ou alimenter ces scripts, ils n&#8217;ont que peu de valeur. L&#8217;« <em>algorithme de consensus</em> » faisait aussi partie du leak, mais nous avions déjà expliqué très clairement comment il a été conçu. L’idée de l’open sourcer nous a également effleuré plusieurs fois, mais, pour les mêmes raisons énoncées plus haut, nous avions renoncé à le faire. Est-ce que le Consensus (l&#8217;algorithme qui ajoute des adresses IP aux blocklists) peut être empoisonné ou compromis ? De notre point de vue et de notre compréhension de notre propre système, non. L&#8217;algorithme nécessite des dizaines de signalements provenant de dizaines de security engines vérifiés, répartis sur des dizaines d&#8217;Autonomous Systems différents. Ce qui n&#8217;était pas public, ce sont principalement les seuils que nous avons fixés pour la diversité et le nombre de détections avant de considérer une IP comme dangereuse. Même si ces “poids” sont ajustés régulièrement. Il faudrait un attaquant motivé, disposant d&#8217;une importante somme d&#8217;argent, pour instancier suffisamment de serveurs afin d&#8217;influencer le réseau et bannir une IP non fautive. La différence, c&#8217;est qu&#8217;avant ce leak, l&#8217;attaquant ne savait pas exactement combien ; maintenant, les seuils sont connus. Nous pouvons les ajuster (comme nous le faisons fréquemment) et rester très vigilants quant aux écarts par rapport à la norme, mais l&#8217;effet de réseau et sa taille font que les variations statistiques sont très visibles sur notre radar, puisque la « moyenne » est très solide.</p>



<p class="wp-block-paragraph"><strong><em>Scripts</em></strong> <strong><em>d&#8217;automatisation</em></strong> <strong><em>divers</em></strong> : Ce point couvre de nombreux scripts et contenus satellites. Des automatisations de robots Slack fournissant des statistiques ou des rappels, des sites pour publier des news ou du contenu, des scripts de déploiement pour les tests, la QC, la QA, etc. Les détails sont extrêmement ennuyeux, mais en résumé : aucune valeur, aucun risque pour les utilisateurs, les clients, le réseau ou l&#8217;intégrité des données, c’est essentiellement de la “plomberie digitale”.</p>



<p class="wp-block-paragraph"><strong>Credentials</strong> : Nous étions très proches de zéro leak ici. Le seul identifiant utile qui a fuité était un token pour utiliser un service AWS appelé SNS, correctement scopé (dans notre jargon, limité au strict minimum en termes de droits). Techniquement « vivant » et utilisable, mais uniquement pour envoyer des notifications simples. Quelques autres tokens (très peu) étaient soit déjà remplacés, soit inutilisables via Internet.</p>



<p class="wp-block-paragraph"><strong>Données</strong> : Ce n&#8217;est pas seulement critique pour la sécurité des clients, mais constitue également une violation du RGPD. Il n&#8217;y avait aucune information sur les clients ou partenaires dans le leak, à l&#8217;exception de 83 adresses e-mail utilisées spécifiquement par notre équipe Data Science pour suivre l&#8217;usage des projets, les réactions des utilisateurs à de nouvelles fonctionnalités ou des raisons statistiques. Cela reste peu, comparé aux ~150K utilisateurs (&lt;0,05%), et nous ne parlons que de l’adresse e-mail (essentiellement des e-mails génériques). Ces adresses ne proviennent pas d’un accès à une base de données mais d’un extrait analysé localement. Nous avons contacté les utilisateurs concernés pour leur expliquer la situation, mais cela n’affaiblira pas leur posture de sécurité, les cybercriminels savent juste qu&#8217;ils utilisent CrowdSec. Nous avons aussi involontairement divulgué les noms et prénoms de 51 investisseurs réels ou potentiels de 2020, leurs adresses e-mail et le contexte de l&#8217;investissement, ce que nous leur avons signalé ainsi qu&#8217;aux autorités compétentes, et ce qui est plus regrettable dans cette fuite.&nbsp;</p>



<h2 class="wp-block-heading">Quels sont les impacts ?</h2>



<p class="wp-block-paragraph">En tant que fondateur, voici mon analyse plus détaillée des impacts potentiels.</p>



<p class="wp-block-paragraph">La première chose qui m&#8217;est venue à l&#8217;esprit, était un sentiment d’injustice, lié à quelque chose hors de notre contrôle, qui allait avoir un impact négatif. La réalité m’apparaît assez différente 48 heures plus tard. En premier lieu, j&#8217;ai été bluffé par la compréhension et la bienveillance sincères de notre équipe, de nos clients, de nos partenaires et de nos prestataires.</p>



<p class="wp-block-paragraph">Nous avons reçu beaucoup de soutien de notre communauté, de nos partenaires, et de nos VC. Aikido, Fuitesinfos.fr et GitGuardian nous ont proposé leurs outils, et l&#8217;intervention de l’équipe de GitHub a été fondamentale pour nos recherches. Certains clients ont posé des questions légitimes, mais ils ont tous (à ce jour) compris la posture, apprécié le professionnalisme et la transparence, et attendu patiemment des réponses factuelles plutôt que hâtives.</p>



<p class="wp-block-paragraph">Et&#8230; notre équipe. Ce tango où tout le monde savait quoi faire, comment, de façon synchronisée, avec des recherches, des inspections, des introspections approfondies et des questions douloureuses, c&#8217;était impressionnant. Être le dirigeant d’une startup, c&#8217;est souvent un poste solitaire, mais ressentir tous ces experts construire ensemble une réponse professionnelle à un rythme soutenu, c&#8217;était aussi un moment de fierté, qui allégeait la douleur. Quant à mon cher réseau de professionnels sur LinkedIn, alumni et amis : merci beaucoup pour votre soutien. Enfin, on n&#8217;organise pas un effort aussi intense sans une équipe aussi professionnelle.</p>



<p class="wp-block-paragraph">Bien sûr, certains ont souligné : « <em>Ils prétendent savoir qui attaque sur Internet, mais n&#8217;arrivent pas à bloquer les attaques contre eux-mêmes</em> », sans savoir ce qu’est une supply-chain attack, d&#8217;autres ont envoyé des smileys un peu passifs-agressifs, mais une large majorité de la communauté des professionnels de la sécurité a été solidaire et compréhensive.</p>



<p class="wp-block-paragraph">Ne jamais gâcher une bonne crise… Nous avons amélioré notre temps de réaction : 48h pour couvrir l&#8217;inventaire complet, la rotation des tokens, le forensic et l&#8217;opération de communication, n&#8217;est pas un échec en soi. Mais si on devait faire face à une autre crise, cette timeline fondrait à 24 h, je pense, le vrai défi ici, est principalement d’éviter que d’autres supply chain attacks ne puissent se produire.</p>



<p class="wp-block-paragraph">Pour revenir à la question « à quel point est-ce grave » ? La réponse est que cet incident constitue un véritable stress-test pour notre système de réseau distribué et crowdsourcé. Par conception, il devrait être résilient à ce type d&#8217;événement, et cette épreuve du feu devrait nous le prouver. De ce que l’on sait à ce stade : la séparation stricte des privilèges, les tokens AWS scopés, et la révocation rapide de l&#8217;accès principal de l&#8217;employé parti signifient que l&#8217;attaquant a fini dans une impasse. La résilience du consensus du réseau est liée majoritairement à sa taille et son architecture plus qu’à son code en soi.&nbsp;</p>



<p class="wp-block-paragraph">Les experts en sécurité ne m’ont pas semblé soucieux, car ils comprennent que nous n’avons pas échoué dans notre mission, ni pris de raccourcis en matière de sécurité. Les clients peuvent se demander ce qui s&#8217;est passé, mais nous pouvons leur expliquer ce qui s&#8217;est passé. Les prospects peuvent être effrayés, mais nous vendons un produit plutôt technique, donc la plupart comprendront une fois la situation exposée. Cet incident n’est pas idéal, évidemment, mais pas fatal non plus, très loin de là.</p>



<p class="wp-block-paragraph">Mais ceux pour qui nous sommes le plus sincèrement désolés, ce sont nos premiers investisseurs, qu&#8217;ils aient concrétisé ou non. Divulguer vos noms et adresses e-mail est un problème que nous allons traiter directement avec vous et les autorités compétentes, et je m&#8217;en excuse personnellement. Le système qui, en 2020, rendait les interactions avec nous plus simples n&#8217;a jamais été conçu pour être public.</p>



<p class="wp-block-paragraph">Quiconque a subi un problème comme celui-ci a moins de chances de le revivre, en raison de la douleur qu&#8217;il a causée. Nous sortons donc de cette crise plus forts et plus affûtés qu&#8217;avant, avec une blessure de guerre et une autre d&#8217;ego, ce dernier point étant sans importance. Globalement, il semble que CrowdSec ne soit pas seulement un effet de réseau, mais bien une véritable communauté de professionnels solidaires, ce qui est appréciable.</p>



<h2 class="wp-block-heading"><strong>Méthode de l’attaque</strong></h2>



<p class="wp-block-paragraph">Le 16 septembre, un utilisateur a publié sur pwnforum une archive contenant du code source de l&#8217;organisation GitHub de CrowdSec, comme relayé par <a href="https://fuitesinfos.fr/article/2026-09-16-crowdsec" target="_blank" rel="noreferrer noopener">https://fuitesinfos.fr/article/2026-09-16-crowdsec</a></p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="1264" height="839" src="https://cms.crowdsec.net/wp-content/uploads/2026/09/image-3.png" alt="" class="wp-image-6865" style="aspect-ratio:1.5069252077562327;width:544px;height:auto" srcset="https://cms.crowdsec.net/wp-content/uploads/2026/09/image-3.png 1264w, https://cms.crowdsec.net/wp-content/uploads/2026/09/image-3-300x199.png 300w, https://cms.crowdsec.net/wp-content/uploads/2026/09/image-3-767x509.png 767w" sizes="auto, (max-width: 1264px) 100vw, 1264px" /></figure>



<p class="wp-block-paragraph">Pour situer les faits : une fois que Christophe de <a href="https://fuitesinfos.fr/">https://fuitesinfos.fr/</a> nous a donné l&#8217;information et l&#8217;archive, on a pu constater que celle-ci contenait crowdsec-ghsa-273h-gvwr-c3qj, un dépôt qui a été détruit le 27 mai. Le dernier commit présent dans tous les dépôts date du 22 mai 2026 à 01 h 24 UTC, et le timestamp de l&#8217;archive est fixé au 22 mai ; ça correspond.</p>



<p class="wp-block-paragraph">À ce stade, nous suspectons, avec un fort degré de confiance, que le leak est limité au code source de CrowdSecurity (dont 130+ des dépôts sur 300 étaient publics). L&#8217;infrastructure ou les bases de données de CrowdSec n&#8217;ont pas été accédées ou compromises. Aucun code n&#8217;a été altéré, ni dans le logiciel open source, ni dans notre code source privé, ni dans les pipelines de build, c’était de la “lecture uniquement”.</p>



<p class="wp-block-paragraph">Notre infrastructure AWS est serverless et nous utilisons largement SSM/Secrets Manager, donc le nombre de credentials présents est très faible, mais cela requiert une analyse. La plupart des tokens et secrets avaient été révoqués ou remplacés, mais celui qui était présent et viable a été sondé :</p>



<p class="wp-block-paragraph">Le dump incluait un secret AWS assertible-zapier-sns-sender, et quelqu&#8217;un a tenté de l&#8217;utiliser le 17 août 2026 depuis l&#8217;IP 23.234.84.102 pour effectuer un GetCallerIdentity et un ListTopics à la fois sur les topics dev et env. Ce rôle AWS était restreint à publier sur un seul topic SNS ; il n&#8217;a pas pu aller plus loin.</p>



<p class="wp-block-paragraph">L&#8217;archive <code>.github/.git/config</code> contient l&#8217;origine utilisée pour cloner les dépôts :<br></p>



<pre><code class="language-yaml">...
[remote "origin"]
	url = https://oauth2:gho_xxxxxxxxx@github.com/crowdsecurity/.github.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
	remote = origin
	merge = refs/heads/main
</code></pre>



<p class="wp-block-paragraph">Ceci nous indique que le token utilisé pour cloner les dépôts est un token OAuth (gho_xxx) ce qui semble réel car son checksum est correct [2]. La méthodologie est également alignée sur les tactiques du groupe de cybercriminels TeamPCP et sur son malware (Mini) Shai-Hulud.</p>



<p class="wp-block-paragraph">Cependant, nous ne trouvons aucune trace de ce token OAuth dans le journal d&#8217;audit de notre organisation, ni dans les journaux d&#8217;audit des membres actuels de notre organisation GitHub. Nous&nbsp; avons téléchargé ces journaux depuis l&#8217;interface web et recherché la version hachée du token (echo -n $token | openssl dgst -sha256 -binary | base64), sans succès.</p>



<p class="wp-block-paragraph">Nous avons aussi passé au peigne fin la liste des intégrations OAuth actives dans l&#8217;organisation (en mode « Accès restreint ») mais elle ne contenait rien de suspect non plus. Aucune des intégrations n&#8217;a subi de breach public dans la période concernée.</p>



<p class="wp-block-paragraph">Si c&#8217;était le jeton OAuth d&#8217;un utilisateur actif, on s&#8217;attendrait à voir une activité associée dans le journal d&#8217;activité. D&#8217;un autre côté, le journal d&#8217;audit de GitHub ne suit que des actions spécifiques [2.1], et seuls les plans entreprise (que nous n&#8217;avions pas) conservent l&#8217;activité git sur une fenêtre glissante de 7 jours.</p>



<p class="wp-block-paragraph">[2] <a href="https://github.blog/engineering/platform-security/behind-githubs-new-authentication-token-formats/">https://github.blog/engineering/platform-security/behind-githubs-new-authentication-token-formats/<br></a> [2.1] <a href="https://docs.github.com/en/organizations/keeping-your-organization-secure/managing-security-settings-for-your-organization/reviewing-the-audit-log-for-your-organization">https://docs.github.com/en/organizations/keeping-your-organization-secure/managing-security-settings-for-your-organization/reviewing-the-audit-log-for-your-organization</a></p>



<p class="wp-block-paragraph">La vraie complexité derrière cette analyse forensique, réside dans le fait que le token utilisé pour télécharger les dépôts privés n&#8217;existait plus quand nous avons eu connaissance de la fuite du code. Il a donc été créé, a vécu, et est mort sans laisser de traces au-delà de son usage.&nbsp;</p>



<p class="wp-block-paragraph">À ce stade de l’investigation, nous ne connaissions toujours pas l&#8217;origine de la compromission. Après avoir vérifié les tokens des utilisateurs et scanné les packages malveillants, les extensions de VS Code, etc., les machines de tous les développeurs sont officiellement propres.&nbsp;</p>



<p class="wp-block-paragraph">Nous avons enquêté sur l&#8217;historique Git de nos propres dépôts pour voir si certains packages backdoorés avaient touché nos dépôts à un moment donné, mais ça n&#8217;a rien donné de concluant. Bien que certains packages TanStack soient présents, aucun n&#8217;est sur la liste backdoorée. Par ailleurs, nous imposons un âge minimum aux packages Node afin d&#8217;éviter qu&#8217;une compromission récente ne passe sous le radar.</p>



<p class="wp-block-paragraph">Cependant, une chose qui nous intriguait, c’est que TeamPCP est connu pour ne pas se limiter aux identifiants GitHub, mais aussi pour rechercher d’autres tokens, comme les identifiants AWS, les clés SSH, etc. Alors que GitHub donne très peu de visibilité sur l&#8217;activité Git, nous avons une bonne visibilité sur les actions AWS, et rien de suspect ne s&#8217;est produit depuis les attaques de supply chain ou depuis que les identifiants du leak ont été sondés.</p>



<p class="wp-block-paragraph">C&#8217;est là que le support de GitHub a été inestimable car ils ont pu retracer le cycle de vie complet du token dont nous n’avions que la trace d’usage et confirmer nos suspicions initiales concernant TanStack.</p>



<p class="wp-block-paragraph">Avec le token OAuth et un créneau temporel précis pour l&#8217;activité, nous les avons contactés afin d&#8217;obtenir davantage d&#8217;informations. Ils ont pu nous fournir l&#8217;activité Git dans la fenêtre de 2 heures du dump. On a alors découvert qu&#8217;il s&#8217;agissait d&#8217;un employé qui venait juste de quitter l&#8217;entreprise, mais qui faisait toujours partie de l&#8217;organisation GitHub pour des raisons légitimes, et son compte a été utilisé pour dumper les dépôts :</p>



<p class="wp-block-paragraph"><strong>2026-05-22 05:52:32.138 UTC &#8211; fetch &#8211; crowdsecurity/XYX &#8211; &lt;redacted&gt; &#8211; 178.249.214.XX</strong></p>



<p class="wp-block-paragraph">D&#8217;après les informations Git dans l&#8217;archive leakée, l&#8217;IP du cybercriminel se situe à Toronto, Canada, en zone horaire UTC-4. L&#8217;ex-employé a été compromis par l&#8217;attaque de supply chain TanStack, ce qui correspond à la méthodologie. Son compte a été retiré de l&#8217;organisation GitHub le 25 mai 2026, 3 jours après l&#8217;incident…</p>



<p class="wp-block-paragraph">Ceci explique également pourquoi nous n&#8217;avons repéré aucune activité liée à AWS ou à l&#8217;infrastructure, puisque ses accès avaient déjà été révoqués.</p>



<p class="wp-block-paragraph">Après avoir identifié la source et poussé davantage l&#8217;audit de l&#8217;activité Git de l&#8217;utilisateur et des comptes existants, nous pouvons confirmer que son accès a été utilisé uniquement pour effectuer les clones Git qui ont mené au leak et qu’aucune altération du code, de l&#8217;infrastructure, ou du pipeline de CI/CD n&#8217;a eu lieu.</p>



<h2 class="wp-block-heading">Quelles actions ont été prises pour éviter tout nouvel incident</h2>



<p class="wp-block-paragraph">CrowdSec avait déjà de nombreux mécanismes de sécurité avant cet incident :</p>



<ul class="wp-block-list">
<li>Séparation stricte des privilèges (par exemple, en tant que CEO, je n&#8217;ai aucun accès aux comptes bancaires, aux outils d&#8217;admin de l&#8217;organisation, à la console AWS, etc., et c&#8217;est une bonne pratique appliquée à toutes et tous)</li>



<li>Scoping strict : ce qui s&#8217;applique aux droits utilisateurs s&#8217;applique tout autant aux apps, accès API, IA, aux routines cloud, et aux scripts, pour éviter d&#8217;accorder un droit au-delà de ce qui est strictement nécessaire pour remplir leur rôle</li>



<li>2FA sur chaque outil pour tout le monde, avec passkeys et dispositifs physiques (Titan Key)</li>



<li>Password wallet : évident, mais explicitement obligatoire</li>



<li>Phrases de sécurité : si un membre clé de l&#8217;organisation avec des droits étendus est physiquement compromis (ou sa famille), nous avons convenu de mots spécifiques à glisser dans la conversation pour alerter notre interlocuteur de la compromission</li>



<li>Audits : qu&#8217;ils soient internes, menés par IA, ou externes, ils font partie de notre hygiène</li>



<li>Logs partout : durant cette crise, nous avons appris que l’archivage plus poussé des actions GitHub nous aurait fait gagner du temps, mais les logs de nos toolchains, composants CI/CD, et AWS étaient très solides. Avoir des traces permet de remonter le fil et de réagir tôt, et après tout, on est CrowdSec, donc plutôt sensibles sur le sujet</li>



<li>Pentesting : À quelle fréquence les lancer, sous quelle forme, tout ça évolue dans le temps, mais tester les employés de l&#8217;entreprise et notre code source fait partie de nos habitudes</li>



<li>Monitoring de l&#8217;âge des packages NPM : pour s&#8217;assurer qu&#8217;on ne tourne pas sur une version trop récente pour être auditée, ou trop ancienne pour comporter un risque de sécurité.</li>



<li>Procédures d&#8217;onboarding/deboarding : le cycle de vie complet de vie des accréditations d&#8217;un employé, création et révocation (ou savoir pourquoi vous avez gardé). La conservation de toutes les traces d’usage une fois qu&#8217;il est parti compte encore plus.</li>



<li>Analyse automatisée du code : chaque commit est scanné automatiquement pour détecter d&#8217;éventuelles vulnérabilités ou failles logiques</li>



<li>Procédures et revues de publication, QA &amp; QC : qu&#8217;elles soient automatisées ou manuelles, ce sont des composants classiques de la boîte à outils d&#8217;un éditeur</li>



<li>Formation, et bien plus encore&#8230;</li>
</ul>



<p class="wp-block-paragraph">Pourtant, rien de tout ça n&#8217;a pu empêcher une attaque de chaîne d&#8217;approvisionnement, alors qu&#8217;est-ce qui aurait pu ?</p>



<p class="wp-block-paragraph"><strong>EDR</strong> : Au moment de l&#8217;incident, on n&#8217;imposait pas d&#8217;EDR sur les machines des développeurs, mais on utilise depuis une protection endpoint qui se concentre activement sur les packages malveillants, les extensions, etc. Alors que les attaques de la chaîne d&#8217;approvisionnement deviennent le nouveau fléau et que virtuellement n&#8217;importe qui peut se retrouver dans le viseur, cette ligne de défense supplémentaire pourrait peut-être aider dans certains cas.</p>



<p class="wp-block-paragraph">Les postes de travail/laptops des personnes interagissant avec notre code source ou notre infrastructure tournent maintenant sous un EDR pour réduire le risque d&#8217;attaques de supply chain, mais une analyse en mémoire et un monitoring runtime pourrait aussi couvrir les 0-days.</p>
]]></content:encoded>
            <category>Announcement</category>
            <enclosure url="https://cms.crowdsec.net/wp-content/uploads/2026/09/Blog-images-1575-%C3%97-871px-33.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[TanStack Supply Chain Attack Analysis]]></title>
            <link>https://crowdsec.net/blog/tanstack-supply-chain-attack-analysis</link>
            <guid isPermaLink="false">https://crowdsec.net/blog/tanstack-supply-chain-attack-analysis</guid>
            <pubDate>Fri, 18 Sep 2026 17:20:09 GMT</pubDate>
            <description><![CDATA[<p>CrowdSec CEO Philippe Humeau shares the full story behind the 2026 supply chain attack, from the source code leak and forensic investigation to the lessons learned.</p>
]]></description>
            <content:encoded><![CDATA[
<h2 class="wp-block-heading">Context</h2>



<p class="wp-block-paragraph">Every hack happens in a context where humans, business, technology, or society as a whole is evolving. What stings for CrowdSec is that many of us come from red-team pentesting backgrounds, have worked in cyber for decades, and have adopted a “cybersec” muscle memory in our daily work. So being caught leaking code is painful. </p>



<p class="wp-block-paragraph">CrowdSec is doing much better after we found deeper PMF (Product-Market Fit) for our data, and our low-touch SaaS model started to click with users. The team is a bit smaller because we had to keep costs under control in an environment where access to funds was more limited than before. Overall, we were a happy startup sailing toward break-even. We started discussing with governments and ministries in at least 7 countries. An industry AAA profile was knocking at the door; all was for the best until… September 16th happened and took us by surprise.</p>



<p class="wp-block-paragraph">Now, what happened, how, what was the team&#8217;s reaction, the timeline, the origin point, how to react if something similar happens to your team, and what will we do differently? What is the real impact beyond the big news title? What’s important, marginal, or objectively meaningless?</p>



<p class="wp-block-paragraph">But first things first… What happened?</p>



<h3 class="wp-block-heading">The Timeline</h3>



<ul class="wp-block-list">
<li><strong>May 11th, 2026</strong>: <a href="https://tanstack.com/blog/npm-supply-chain-compromise-postmortem" target="_blank" rel="noreferrer noopener">TeamPCP compromises a famous NPM package repository named TanStack</a>, widely used by developers to create Node-based web UI. 42 packages are backdoored with their malware “Shai Hulud”, specialized in credentials and token harvesting.</li>



<li><strong>May 22nd, 2026</strong>: TeamPCP (Threat Actor UNC6780) claimed responsibility for the hack of some Mistral AI repositories.</li>



<li><strong>May 22nd, 2026 &#8211; 05:52:29 until 06:01:33 UTC</strong>: one of the founders of BreachForum and a member, <code>diencracked</code> &lt;diencracked@cock.li> downloaded the content of ~170 private CrowdSec GitHub repositories from an IP address in Toronto, Canada, with a computer Timezone set to UTC-4. At least that&#8217;s what the Git data shows. The number of repositories is relatively irrelevant, as is their absolute size, since they speak more to code organization and images used in the Web interface than anything else. But on breach forums, numbers are the name of the game. The key point is that he had access to a private codebase that wasn&#8217;t supposed to be exposed, and that’s a fact.</li>



<li><strong>May 25th, 2026 &#8211; afternoon</strong>: Compromised employee&#8217;s laptop GitHub access is revoked (all others were already). We kept them alive because we parted on good terms with our developer, and he wanted to finalize some work.  </li>



<li><strong>Aug 17th, 2026</strong>: The AWS token used for SNS notifications is tested to see its precise authorizations</li>



<li><strong>Sept 16th, 2026 &#8211; 17h45</strong>: Publication on the forum</li>



<li><strong>Sept 16th, 2026 &#8211; 20h</strong>: contact between our team and the <a href="https://fuitesinfos.fr/" target="_blank" rel="noreferrer noopener">Fuites Info</a> staff; crisis cell is put together</li>



<li><strong>Sept 16th, 2026 &#8211; night</strong>: initial forensic actions, key credential and token rotation</li>



<li><strong>Sept 17th, 2026 &#8211; morning</strong>: forensic, coordination, reporting, remaining token/credentials rotation</li>



<li><strong>Sept 17th, 2026 &#8211; noon</strong>: initial PR explaining the facts we are already sure about</li>



<li><strong>Sept 17th, 2026 &#8211; 18h</strong>: GitHub to the rescue; they helped us identify the full story behind the token (the famous API key MrWHO talked about in the forum).</li>



<li><strong>Sept 18th, 2026</strong>: Wrap-up of the incident, release of this full final report.</li>
</ul>



<h3 class="wp-block-heading">Risk assessment</h3>



<p class="wp-block-paragraph">In any leak context, you&#8217;re always pressed to identify whether only the codebase was affected or whether connected data and cloud infrastructure were also affected. In “theory”, the ideal cybersecurity scenario is that authentication mechanisms, tokens, identities, and any form of credentials are absolutely absent from any codebase. Still, we don’t live in this beautiful “theory” world; we live on Earth, with humans.</p>



<p class="wp-block-paragraph">So the first step is to make sure that anything that has leaked doesn’t contain any “credentials” (in its larger acceptation), any sensitive data, and if that’s the case, that those are deprecated (in our lingo, “rotated” to indicate they are not usable any longer).</p>



<p class="wp-block-paragraph"><strong>Code</strong>:&nbsp;</p>



<ul class="wp-block-list">
<li><strong>Console</strong>: For the record, we thought a lot of time about open-sourcing the Console itself but didn’t do it (yet) for three main reasons. 
<ul class="wp-block-list">
<li>1/ It’s not something you can use without the AWS infrastructure and microservices running behind it. </li>



<li>2/ Structurally, it’s not really a project where users can propose PR/MR or contribute; it’s actually easier to ask for a feature than add it yourself</li>



<li>3/The code being open-sourced is always deliberately planned this way. <br>While it’s doable to open source something that wasn&#8217;t intended to be, fast-moving codebases (like the SaaS console) aren’t ideal candidates. Code quality isn&#8217;t the issue here; it’s that no one would care about it or replicate it at home. Now, does it have value? Yes, the time our team spent coding it. Is it valuable to someone else? We can confidently say not really; it’s far too contextual. Did it contain secrets? No. Maybe the codebase wouldn’t yet fully meet our open-sourcing standards, but that would be it. Can it lead to a security concern is the real question. Security by obscurity is never a good model; having the full source code in hand can eventually fast-track research into potential weaknesses, specifically in the AI-everything timeline. Now we do have access to those AIs too and can (and do) assess our source code security as well. So is it ideal? No. Is it very bad? No. We’ll still monitor tightly the various log sources, trails, and audits we have and check that nothing deviates from normal. Anyway, this codebase is changing extremely fast, and 4 months down the road, it’s already meaningfully different from what was released.</li>
</ul>
</li>



<li><strong>Data processing</strong>: Some data science scripts and models were part of the leak. Not ideal either, but honestly, without the data to train those models or feed those scripts, they have little value. The “Consensus Algorithm” was also part of the leak, but we already explained very transparently how it’s globally architected; we thought more than once about open-sourcing it, but for the same reasons stated above, we didn’t. Can the Consensus (the algorithm adding IP addresses to blocklists) be poisoned, compromised, or not? Well, to the best of our knowledge and understanding of our own system, no. The algorithm requires tens of sightings coming from at least tens of vetted security engines spread across tens of different Autonomous Systems. What isn&#8217;t public was mostly the thresholds we set for diversity and number of detections; still, those are moving targets. It would require a motivated attacker to spend an immense amount of money to instantiate enough servers to influence the network into banning a non-offending IP. The difference is that before this leak, the attacker wouldn’t know exactly how many; now, thresholds are known. Fine, we can adjust those thresholds (like we frequently do) and be very vigilant about discrepancies. Now the network effect and its sheer size make statistical variations very visible on our radar since the “mean” is very solid. </li>



<li><strong>Various automation scripts</strong>: That covers many different scripts. Slack bot automations to report, some sites to publish news or content, deployment scripts for test purposes, QC, QA, etc. It would be extremely boring to go through the details. &lt;TL/DR> no value, no risk for users, clients, or network, or data integrity.</li>
</ul>



<p class="wp-block-paragraph"><strong>Credentials</strong>: We were very close to clean. The useful “credential” leaked was a token to use an AWS service called SNS, and it was properly scoped (in our lingo, limited to just this), so it was “live” but not usable for anything beyond basic notifications. A few other tokens were either already rotated or not usable from the Internet, to our current knowledge.</p>



<p class="wp-block-paragraph"><strong>Data</strong>: This is not only critical for clients&#8217; safety but also reprehensible under the GDPR framework. There was no clients&#8217; or partners&#8217; information in the leak, except for a few email addresses used specifically by our Data Science team to monitor project usage, users&#8217; reactions to a new feature, and overall statistical reasons. Not many compared to ~150K users: 83 (&lt;0.05%), mostly Gmails. We’ll reach out to those users to explain the situation, but nothing in this can weaken their security posture except cybercriminals knowing they run CrowdSec. We also inadvertently disclosed the first/last names of 51 potential investors from 2020, their email addresses, and investment context, which we will report to them and the proper authorities.</p>



<h3 class="wp-block-heading">What are the impacts?</h3>



<p class="wp-block-paragraph">As CEO, I have to evaluate the full scope, and it’s more complex than the headline news shows.</p>



<p class="wp-block-paragraph">The first thing that popped into my head is, “It’s really unfair; we couldn’t do much about it, and it’ll have a negative impact on us.” The reality looks fairly different 48 hours later. First, I was astonished by how comprehensive and genuinely benevolent our team, clients, partners, and providers were. </p>



<p class="wp-block-paragraph">If anything, we’ve mostly received love and support from our community, partners, and VC alike. Aikido, <a href="https://fuitesinfos.fr/" target="_blank" rel="noreferrer noopener">Fuites Info</a>, and GitGuardian offered their support, and GitHub staff were very helpful. Some clients asked legitimate questions but mostly understood the posture, appreciated the professionalism and transparency, and patiently waited for factual answers rather than hasty ones.</p>



<p class="wp-block-paragraph">And… Our team. This tango where everyone knew what to do, how, synchronized, thoroughly searched, inspected, introspected, and asked painful questions was genuinely a blast. Being a CEO is often a lonely place, but feeling all those professionals building a professional response together at such a fast pace was a moment of pride. As for my beloved network of LinkedIn professionals, alumni, and friends, you know who you are; thanks a lot for the kind words. Last but not least, you don’t organize such an intense effort and carry it through the finish line.</p>



<p class="wp-block-paragraph">Of course, some asked, “<em>They claim to know who attacks us but cannot avoid them attacking themselves</em>”, while others sent passive-aggressive crying smileys, but an overwhelming part of the security professional community was supportive and understanding.</p>



<p class="wp-block-paragraph">Never let a good crisis go to waste. We&#8217;ve improved our reaction time: 48h to cover the full inventory, token rotation, forensic, and PR operation isn’t bad timing per se, but if we ever face another crisis, we can probably pack this timeline in under 24h. Now, preventing any other crisis from happening, specifically Supply Chain attacks, is the real challenge here.</p>



<p class="wp-block-paragraph">But I won’t dodge the question, and I owe you an answer on “<em>how</em> <em>bad</em> <em>is</em> <em>it</em>.” Simple answer: it’s a strong stress test for our distributed, crowdsourced network system. By design, it should be resilient to this type of event, but now it’s being battle-tested. To the best of our knowledge, strict privilege separation, scoped AWS tokens, and prompt revocation of the departed employee&#8217;s core access meant the attacker hit a dead end. Security experts won’t mind because they understand we didn’t fail our mission or cut corners on security. Clients may wonder what happened, but we can explain it in layman&#8217;s terms. Prospects may be spooked, but we sell a fairly technical product, so most will understand once we explain the situation. Not ideal, obviously, but not fatal by a long shot.&nbsp;</p>



<p class="wp-block-paragraph">But the ones we&#8217;re most genuinely sorry for are our early investors, whether potential or those who took the move. Leaking your names and email addresses is an issue we’ll discuss directly with you and the competent authorities, and for this I personally apologize. The system that, back then in 2020, made interactions with us easier was never intended to be public.</p>



<p class="wp-block-paragraph">Anyone who suffered an issue like this is less likely to face it again because of the pain it caused, so if anything, we walk out stronger and sharper from this crisis than before, with a brand and ego wound, the latter being irrelevant in the grand scheme of things. Overall, it seems CrowdSec isn&#8217;t just a network effect, but a real community of supportive professionals, which is heartwarming.&nbsp;</p>



<h3 class="wp-block-heading"><strong>How it happened exactly</strong></h3>



<p class="wp-block-paragraph">On the 16th of September, a user published on pwnforum an archive containing source code from the CrowdSec GitHub organization, as relayed by <a href="https://fuitesinfos.fr/article/2026-09-16-crowdsec" target="_blank" rel="noreferrer noopener">https://fuitesinfos.fr/article/2026-09-16-crowdsec</a></p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="1264" height="839" src="https://cms.crowdsec.net/wp-content/uploads/2026/09/image-3.png" alt="" class="wp-image-6865" style="aspect-ratio:1.5069252077562327;width:544px;height:auto" srcset="https://cms.crowdsec.net/wp-content/uploads/2026/09/image-3.png 1264w, https://cms.crowdsec.net/wp-content/uploads/2026/09/image-3-300x199.png 300w, https://cms.crowdsec.net/wp-content/uploads/2026/09/image-3-767x509.png 767w" sizes="auto, (max-width: 1264px) 100vw, 1264px" /></figure>



<p class="wp-block-paragraph">Timeboxing the facts: once Christophe from <a href="https://fuitesinfos.fr/" target="_blank" rel="noreferrer noopener">Fuites Info</a> gave us the information and archive, we could see that the archive contained <code>crowdsec-ghsa-273h-gvwr-c3qj</code>, a repository that was destroyed on May 27th. The latest commit present across all repositories is from May 22, 2026 01:24 UTC, and the archive timestamp is set to May 22; this lines up.</p>



<p class="wp-block-paragraph">At that point, we know with a high degree of certainty that the leak is limited to CrowdSecurity&#8217;s source code, including 130+ public repositories and many private ones. CrowdSec’s infrastructure or databases have not been accessed or compromised. No code was altered, whether in the open-source software, our private source code, or the build pipelines.</p>



<p class="wp-block-paragraph">Our infrastructure is AWS serverless, and we make heavy use of SSM/Secrets Manager, so the number of credentials present is very low but still warrants analysis. Most of the tokens and secrets present in the source code had been revoked or rotated before the leak, but we can see that the ones present and usable have been probed:</p>



<p class="wp-block-paragraph">For example, the dump included an AWS secret <code>assertible-zapier-sns-sender</code>, and someone tried to use it on 17 August 2026 from IP 23.234.84.102 to perform <code>GetCallerIdentity</code> and <code>ListTopics</code> on both <strong>dev</strong> and <strong>env</strong> topics. This AWS role was restricted to publishing on a single SNS topic; it didn’t go any further.</p>



<p class="wp-block-paragraph">The archive <code>.github/.git/config</code> contains the origin that was used to clone the repositories:</p>



<pre><code class="language-yaml">...
[remote "origin"]
	url = https://oauth2:gho_xxxxxxxxx@github.com/crowdsecurity/.github.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
	remote = origin
	merge = refs/heads/main
</code></pre>



<p class="wp-block-paragraph">This tells us the token used to clone the repositories is an <strong>OAuth</strong> token (<code>gho_xxx</code>), and the likelihood is higher because its checksum is correct [2]. The methodology is well aligned with the TeamPCP / Mini Shai-Hulud tactics.</p>



<p class="wp-block-paragraph">However, we couldn’t find any trace of this OAuth token in our organization’s audit log or in any of the current GitHub organization members&#8217; audit logs. You can download those from the web UI and look for the token&#8217;s hashed version (<code>echo -n $token | openssl dgst -sha256 -binary | base64</code>). This was a dead end.</p>



<p class="wp-block-paragraph">We also reviewed the list of active OAuth integrations in the organization (in “Access Restricted” mode) but didn’t find anything suspicious either; none of the integrations suffered public breaches in the relevant timeframe.</p>



<p class="wp-block-paragraph">If it was an active user’s OAuth token, we would expect to see related activity in the activity log. On the other hand, GitHub’s audit log only tracks specific actions [2.1], and only enterprise plans (which we’re not on) keep git activity on a rolling 7-day window.</p>



<p class="wp-block-paragraph">[2] <a href="https://github.blog/engineering/platform-security/behind-githubs-new-authentication-token-formats/" target="_blank" rel="noreferrer noopener">https://github.blog/engineering/platform-security/behind-githubs-new-authentication-token-formats/</a></p>



<p class="wp-block-paragraph">[2.1] <a href="https://docs.github.com/en/organizations/keeping-your-organization-secure/managing-security-settings-for-your-organization/reviewing-the-audit-log-for-your-organization" target="_blank" rel="noreferrer noopener">https://docs.github.com/en/organizations/keeping-your-organization-secure/managing-security-settings-for-your-organization/reviewing-the-audit-log-for-your-organization</a></p>



<p class="wp-block-paragraph">The real complexity behind this forensic analysis is that the token used to download the private repositories no longer existed when we became aware of the code leak. So it was created, lived, and died without leaving us any traces beyond its usage. This is where GitHub&#8217;s professional support was invaluable. They traced the token&#8217;s full lifecycle and confirmed our initial suspicions about TanStack.</p>



<p class="wp-block-paragraph">At that point, our main concern was that we still didn&#8217;t know the origin of the compromise. We checked for user tokens and scanned for malicious packages, VS Code extensions, etc. The developer machines came back clean.</p>



<p class="wp-block-paragraph">We promptly investigated our own repositories&#8217; Git history to see if some of the backdoored packages touched our repositories at some point, but this was inconclusive. While some TanStack packages were present, none were on the backdoored list. Finally, we enforce a minimum age on Node packages.&nbsp;</p>



<p class="wp-block-paragraph">One thing that puzzled us was that TeamPCP is known to not restrict itself to GitHub credentials, but also to look for other tokens such as AWS credentials, SSH keys, etc. While GitHub gives you very little visibility into git activity, we have good visibility and alerting on AWS, and nothing suspicious has happened since the supply chain attacks or since the credentials in the leak were probed.</p>



<p class="wp-block-paragraph">With the OAuth token and a precise timeframe for the activity, we reached out to GitHub support to see if we could get more information. They kindly provided the Git activity within the 2-hour timeframe of the dump. We then discovered that it was an employee who had just left the company, but that was still part of the GitHub organization for legitimate reasons, and his account was used to dump the repositories:</p>



<p class="wp-block-paragraph"><strong>2026-05-22 05:52:32.138 UTC &#8211; fetch &#8211; crowdsecurity/XYX &#8211; &lt;redacted&gt; &#8211; 178.249.214.XX</strong></p>



<p class="wp-block-paragraph">Based on the git information in the leaked archive, the IP is in Toronto, Canada, in the UTC -4 time zone. The ex-employee got compromised by the TanStack supply chain attack, matching the methodology. We removed his account from the GitHub organization on 25 May 2026, 3 days after the incident.</p>



<p class="wp-block-paragraph">This also explains why we didn’t see AWS or infrastructure-related activity, as we had already revoked the employee&#8217;s access.</p>



<p class="wp-block-paragraph">After identifying the root cause and further auditing the user&#8217;s Git activity and existing accounts, we confirmed that his account was used solely to perform the Git clones that led to the leak. No commit, no changes to the code, the infrastructure, or the CI was performed.&nbsp;</p>



<p class="wp-block-paragraph">What action we took to avoid any further incident</p>



<p class="wp-block-paragraph">We had a lot of security mechanisms and procedures in place prior to this incident:</p>



<ul class="wp-block-list">
<li><strong>Strict privilege separation</strong> (for example, as a CEO, I don’t have any access to bank accounts, organization admin tools, AWS console, etc., and this is best practice and applied to everyone, everywhere)</li>



<li><strong>Tight scoping</strong>: What applies to user rights equally applies to apps, AIs, cloud routines, and scripts, to avoid granting any right beyond what is strictly needed to fulfill their role.</li>



<li><strong>2FA</strong> everywhere, for every tool and everyone, along with passkeys and physical (Titan Key) devices</li>



<li><strong>Password wallets</strong>: obvious, but security should always be explicit</li>



<li><strong>Safety sentences</strong>: if a key member of the organization with extended rights is physically compromised (or his family), we have agreed on specific words to drop in the conversation to alert our interlocutor we are compromised.</li>



<li><strong>Audits</strong>: whether internal, AI-led, or external, they became a routine. </li>



<li><strong>Logs everywhere</strong>: During this crisis, we learned we want deeper logging of actions on GitHub, but the logs from our toolchains, CI/CD components, and AWS trails were very solid. Having traces allows us to trace but also to react early, and after all, we are CrowdSec, so pretty privy to the issue 🙂</li>



<li><strong>Pentesting</strong>: We come from this background, and we know how to value these. How frequently to run them, what form they should take- this all changes over time, but testing the company employees and our source code is part of what we do.</li>



<li><strong>NPM node age monitoring</strong>: to make sure we are not running on a version that is too recent to be audited or too old to carry security risk.</li>



<li><strong>Onboarding/deboarding procedures</strong>: The full lifecycle of an employee’s credentials matters, and removing (or knowing why you kept) all access once they are gone matters even more.</li>



<li><strong>Automated code analysis</strong>: Every commit is automatically scanned for potential vulnerabilities or logic flaws</li>



<li><strong>Publication, QA &amp; QC procedures &amp; reviews:</strong> whether automated or manual, these are classical components of an editor&#8217;s tool belt</li>



<li>And much more…</li>
</ul>



<p class="wp-block-paragraph">Yet, all of this couldn’t prevent a Supply Chain Attack, so what could have?</p>



<p class="wp-block-paragraph"><strong>EDRs</strong>: At the time of the incident, we didn’t enforce EDR on developers&#8217; machines, but we&#8217;ve since started using endpoint protection that actively focuses on malicious packages, extensions, etc. As supply chain attacks become the new plague and virtually anyone can get caught in them, we should have done this earlier.&nbsp;</p>



<p class="wp-block-paragraph">The workstations/laptops of people interacting with our codebase or infrastructure now run EDRs (the Aikido Security one) to reduce the risk of supply-chain attacks, but in-memory analysis and runtime monitoring with something like CrowdStrike’s EDR could further close the gap. However, because the employee had already left the company, the likelihood that he still had endpoint protection on his machine was low.</p>
]]></content:encoded>
            <category>Announcement</category>
            <enclosure url="https://cms.crowdsec.net/wp-content/uploads/2026/09/Blog-images-1575-%C3%97-871px-67.png" length="0" type="image/png"/>
        </item>
    </channel>
</rss>