<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged cve</title>
<link>https://coderlegion.com/tag/cve</link>
<description>Powered by Question2Answer</description>
<item>
<title>PHP2Shell: When a Simple Upload Feature Turns Into Remote Code Execution</title>
<link>https://coderlegion.com/33222/php2shell-when-a-simple-upload-feature-turns-into-remote-code-execution</link>
<description>&lt;p&gt;&lt;em&gt;Exploring CVE-2026-109618 and CVE-2026-109619 through a TryHackMe lab.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;introduction&quot;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;October is Cybersecurity Awareness Month, and honestly, this month has been quite interesting from a cybersecurity perspective. There have been plenty of vulnerabilities, attacks and security incidents worth paying attention to.&lt;/p&gt;
&lt;p&gt;But while going through TryHackMe, something particularly caught my attention: &lt;strong&gt;PHP2Shell&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;At first, I was interested in the upload exploitation technique. I mean, how does something as ordinary as a file upload eventually lead to remote code execution?&lt;/p&gt;
&lt;p&gt;That question made me curious enough to investigate further.&lt;/p&gt;
&lt;p&gt;On October 21, 2026, two critical vulnerabilities were disclosed in PHP: &lt;strong&gt;CVE-2026-109618&lt;/strong&gt; and &lt;strong&gt;CVE-2026-109619&lt;/strong&gt;. Together, they demonstrated how an unauthenticated attacker could potentially execute operating system commands on a vulnerable PHP server through specially crafted HTTP requests.&lt;/p&gt;
&lt;p&gt;And here's the part I found most interesting:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The application itself didn't even need to be vulnerable.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The weakness existed inside PHP's runtime, meaning that even an application with perfectly ordinary PHP code could potentially be affected.&lt;/p&gt;
&lt;p&gt;So, I decided to explore the vulnerability through a TryHackMe lab and understand what was actually happening behind the scenes.&lt;/p&gt;
&lt;p&gt;Let's break it down.&lt;/p&gt;
&lt;h3 id=&quot;1-first-what-exactly-is-php2shell-&quot;&gt;1. First, what exactly is PHP2Shell?&lt;/h3&gt;
&lt;p&gt;PHP2Shell is the name given to a pair of vulnerabilities affecting the PHP runtime.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;CVE &lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;CVE-2026-109618 &lt;/td&gt;&lt;td&gt;Remote code execution via out-of-memory (OOM) handling and request-state corruption&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CVE-2026-109619 &lt;/td&gt;&lt;td&gt;Remote code execution via stale global state and use-after-free&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Both vulnerabilities received a CVSS v4.0 score of 9.2 (Critical).&lt;/p&gt;
&lt;p&gt;The vulnerabilities involve PHP's internal request-processing and memory-management mechanisms.&lt;/p&gt;
&lt;p&gt;What makes this particularly concerning is that the vulnerable code isn't necessarily part of the application developers write. It exists deeper inside the PHP engine.&lt;/p&gt;
&lt;p&gt;So, updating your WordPress installation or fixing your Laravel application wouldn't automatically resolve the underlying problem.&lt;/p&gt;
&lt;p&gt;To understand why, I first needed to understand the PHP feature involved in the exploitation.&lt;/p&gt;
&lt;h3 id=&quot;2-the-interesting-part-php-upload-progress&quot;&gt;2. The interesting part: PHP Upload Progress&lt;/h3&gt;
&lt;p&gt;The TryHackMe exploitation scenario explores PHP's &lt;code&gt;session.upload_progress&lt;/code&gt; functionality as part of the attack path.&lt;/p&gt;
&lt;p&gt;PHP provides this feature to track file uploads.&lt;/p&gt;
&lt;p&gt;Imagine uploading a large file through a website. You might see a progress indicator showing how much of the file has been uploaded.&lt;/p&gt;
&lt;p&gt;PHP can help provide this information by tracking details such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uploaded file name.&lt;/li&gt;
&lt;li&gt;Total upload size.&lt;/li&gt;
&lt;li&gt;Amount of data received.&lt;/li&gt;
&lt;li&gt;Current upload progress.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The relevant configuration directive is:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;session.upload_progress.enabled = On&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And the default form field responsible for activating this functionality is:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;PHP_SESSION_UPLOAD_PROGRESS&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now, here's where things get interesting.&lt;/p&gt;
&lt;p&gt;PHP processes this upload-progress information while parsing an incoming multipart/form-data request.&lt;/p&gt;
&lt;p&gt;That happens before the application script actually starts executing.&lt;/p&gt;
&lt;p&gt;In simpler terms, PHP is already processing the upload before the website's own PHP code gets control.&lt;/p&gt;
&lt;p&gt;This means the relevant request-processing functionality can be reached without the target page necessarily implementing its own file-upload feature.&lt;/p&gt;
&lt;p&gt;I found this particularly interesting because it changes how we think about the attack surface.&lt;/p&gt;
&lt;p&gt;We normally think about vulnerabilities in terms of application code, authentication systems and user input validation.&lt;/p&gt;
&lt;h3 id=&quot;3-understanding-the-actual-memory-management-bug&quot;&gt;3. Understanding the actual memory-management bug&lt;/h3&gt;
&lt;p&gt;This was probably the part that required the most attention from me.&lt;/p&gt;
&lt;p&gt;To understand PHP2Shell, I needed to understand what happens when PHP runs out of memory.&lt;/p&gt;
&lt;p&gt;PHP has a configuration directive called &lt;code&gt;memory_limit&lt;/code&gt;, which restricts how much memory a request can consume.&lt;/p&gt;
&lt;p&gt;When a request exceeds that limit, PHP can trigger something called a bailout.&lt;/p&gt;
&lt;p&gt;Internally, the engine uses &lt;code&gt;longjmp()&lt;/code&gt; to escape the current execution path after certain fatal errors.&lt;/p&gt;
&lt;p&gt;Normally, software should clean up its resources properly when an operation finishes.&lt;/p&gt;
&lt;p&gt;However, an emergency bailout can interrupt normal request processing and leave internal state in an incomplete condition.&lt;/p&gt;
&lt;p&gt;This is where PHP2Shell becomes interesting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CVE-2026-109618: Out-of-memory handling&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this vulnerability, an out-of-memory condition can interrupt PHP while request data is only partially initialized.&lt;/p&gt;
&lt;p&gt;The bailout can leave PHP's internal request state inconsistent. When subsequent cleanup operations process that incomplete state, memory corruption can occur, potentially leading to remote code execution.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CVE-2026-109619: Stale global state and use-after-free&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The second vulnerability involves a different memory-management problem.&lt;/p&gt;
&lt;p&gt;Request-owned memory can be freed while stale global state continues to reference it.&lt;/p&gt;
&lt;p&gt;If a later request is handled by the same worker before that state is properly reinitialized, PHP may access memory that is no longer valid.&lt;/p&gt;
&lt;p&gt;This creates a use-after-free condition.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why is a use-after-free dangerous?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Think of memory as a collection of storage locations.&lt;/p&gt;
&lt;p&gt;A program allocates a location, stores information there and keeps a pointer to access it later.&lt;/p&gt;
&lt;p&gt;Now imagine that the location gets freed, but the program still has the old pointer.&lt;/p&gt;
&lt;p&gt;Another allocation might eventually reuse that same memory location.&lt;/p&gt;
&lt;p&gt;The original pointer now references something different from what it was supposed to reference.&lt;/p&gt;
&lt;p&gt;That's the fundamental problem behind a use-after-free scenario.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Apache worker connection&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The lab uses Apache with mod_php in a prefork configuration.&lt;/p&gt;
&lt;p&gt;In this setup, an Apache worker can process multiple requests during its lifetime.&lt;/p&gt;
&lt;p&gt;That means internal state left behind by one request can potentially affect a subsequent request handled by the same worker.&lt;/p&gt;
&lt;p&gt;This is particularly relevant when understanding the stale-state issue in CVE-2026-109619.&lt;/p&gt;
&lt;p&gt;So, the issue isn't simply that PHP encounters an error.&lt;/p&gt;
&lt;p&gt;The problem is that internal memory and request state can remain inconsistent or stale in ways that influence subsequent processing.&lt;/p&gt;
&lt;p&gt;And this is what makes the exploitation chain possible.&lt;/p&gt;
&lt;h3 id=&quot;4-understanding-the-two-vulnerabilities&quot;&gt;4. Understanding the two vulnerabilities&lt;/h3&gt;
&lt;p&gt;Now that we understand the different memory-management problems, let's look at how the two CVEs fit into the bigger picture.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CVE-2026-109618: RCE via Out-of-Memory Corruption&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This vulnerability involves PHP's handling of an out-of-memory condition during request processing.&lt;/p&gt;
&lt;p&gt;An OOM-related bailout can interrupt PHP while internal request data is only partially initialized.&lt;/p&gt;
&lt;p&gt;Subsequent cleanup may then operate on invalid or incomplete state, potentially resulting in memory corruption and remote code execution.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CVE-2026-109619: RCE via Stale Global State&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The second vulnerability involves stale internal state that survives after the memory backing it has been freed.&lt;/p&gt;
&lt;p&gt;When a later request is handled by the same worker, PHP may access that stale state before it has been properly reinitialized.&lt;/p&gt;
&lt;p&gt;This creates a use-after-free condition that can ultimately be exploited to achieve remote code execution.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where the lab's memory-disclosure stage fits&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the TryHackMe exploitation walkthrough, the exploit first obtains information about the PHP worker's memory layout.&lt;/p&gt;
&lt;p&gt;The interesting part is where this information gets returned.&lt;/p&gt;
&lt;p&gt;PHP uses the following HTTP response header:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Set-Cookie: PHPSESSID&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The resulting oversized session identifier can expose adjacent process memory.&lt;/p&gt;
&lt;p&gt;That memory may contain useful information, including heap and library addresses.&lt;/p&gt;
&lt;p&gt;Why does that matter?&lt;/p&gt;
&lt;p&gt;Because modern operating systems use a security mechanism called Address Space Layout Randomization (ASLR).&lt;/p&gt;
&lt;p&gt;ASLR randomizes memory locations to make exploitation more difficult.&lt;/p&gt;
&lt;p&gt;An attacker generally needs to know where important functions and memory regions are located to reliably manipulate execution.&lt;/p&gt;
&lt;p&gt;In the TryHackMe lab, the exploitation chain obtains two important addresses:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The PHP heap base address.&lt;/li&gt;
&lt;li&gt;The libphp base address.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This information becomes useful in the next stage.&lt;/p&gt;
&lt;p&gt;The important distinction is that this memory-disclosure stage is part of the exploitation chain demonstrated in the lab. It should not be confused with the primary vulnerability classification of CVE-2026-109618, which is remote code execution.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The HashTable and pDestructor technique&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is where things get considerably more interesting.&lt;/p&gt;
&lt;p&gt;The lab's exploitation chain uses a forged internal PHP structure called a HashTable.&lt;/p&gt;
&lt;p&gt;One of the important fields involved is:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pDestructor&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This field is associated with the function PHP calls when destroying certain values.&lt;/p&gt;
&lt;p&gt;The demonstrated exploitation technique manipulates this structure to redirect the cleanup process toward the &lt;code&gt;system()&lt;/code&gt; function inside PHP's library.&lt;/p&gt;
&lt;p&gt;Instead of executing the expected cleanup operation, PHP ends up invoking a function capable of executing operating-system commands.&lt;/p&gt;
&lt;p&gt;And that's how the memory manipulation in the demonstrated chain can ultimately result in remote code execution.&lt;/p&gt;
&lt;p&gt;What I found particularly interesting is that the normal cleanup process itself becomes part of the exploitation chain.&lt;/p&gt;
&lt;p&gt;Something designed to manage resources properly can become dangerous when the underlying memory state has been corrupted.&lt;/p&gt;
&lt;p&gt;It's worth remembering that these HashTable and &lt;code&gt;pDestructor&lt;/code&gt; details describe the exploitation technique demonstrated in the lab, rather than a universal explanation of the root cause of both CVEs.&lt;/p&gt;
&lt;h3 id=&quot;5-my-practical-investigation-on-tryhackme&quot;&gt;5. My practical investigation on TryHackMe&lt;/h3&gt;
&lt;p&gt;After understanding the concepts, I moved on to the practical investigation.&lt;/p&gt;
&lt;p&gt;The TryHackMe room provided a vulnerable PHP server running inside a Docker container.&lt;/p&gt;
&lt;p&gt;I connected to the machine using SSH with the provided credentials.&lt;/p&gt;
&lt;p&gt;The first thing I wanted to do was identify the running container and check its PHP version.&lt;/p&gt;
&lt;p&gt;I used:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;docker ps --format '{{.Names}}  {{.Image}}  {{.Status}}'&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The output showed:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;php2shell-target  php:8.4.26-apache  Up&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Next, I checked the PHP version inside the container:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;docker exec php2shell-target php -v&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The target was running:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;PHP 8.4.26
Zend Engine v4.4.26&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This was important because PHP 8.4.27 was the fixed release.&lt;/p&gt;
&lt;p&gt;So, the lab environment was running a vulnerable version.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Inspecting the application&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Next, I wanted to see what the actual website was returning.&lt;/p&gt;
&lt;p&gt;I executed:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;curl -s http://127.0.0.1:8088/index.php&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The response?&lt;/p&gt;
&lt;p&gt;&lt;code&gt;OK&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;That's it.&lt;/p&gt;
&lt;p&gt;I also inspected the PHP file:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;docker exec php2shell-target cat /var/www/html/index.php&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And found:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;?php echo &quot;OK\n&quot;; ?&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;At this point, I found the situation particularly interesting.&lt;/p&gt;
&lt;p&gt;There was no login system.&lt;/p&gt;
&lt;p&gt;There was no database.&lt;/p&gt;
&lt;p&gt;There was no application-level file-upload functionality.&lt;/p&gt;
&lt;p&gt;The application was literally printing OK.&lt;/p&gt;
&lt;p&gt;Yet the underlying PHP runtime was vulnerable.&lt;/p&gt;
&lt;p&gt;This reinforced one of the biggest lessons from the room: an application doesn't necessarily need to contain vulnerable code for its underlying server to be exploitable.&lt;/p&gt;
&lt;h3 id=&quot;6-observing-the-memory-disclosure&quot;&gt;6. Observing the memory disclosure&lt;/h3&gt;
&lt;p&gt;After confirming the target environment, I moved to the memory-disclosure stage.&lt;/p&gt;
&lt;p&gt;The lab provided an existing exploit repository:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;php2shell-bypass-aslr-exp&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I navigated into the directory:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cd ~/php2shell-bypass-aslr-exp&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The provided exploit handled the exploitation stages.&lt;/p&gt;
&lt;p&gt;I ran it against the local target:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;python3 exploit.py -u http://127.0.0.1:8088/index.php&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The output showed two particularly interesting stages:&lt;/p&gt;
&lt;p&gt;`[*] stage 1: heap leak&lt;br&gt;
[+] chunk base = 0x...&lt;/p&gt;
&lt;p&gt;[*] stage 2: libphp leak&lt;br&gt;
[+] libphp base = 0x...`&lt;/p&gt;
&lt;p&gt;These were the two memory addresses the exploitation chain needed.&lt;/p&gt;
&lt;p&gt;The first revealed the heap location, while the second revealed the PHP library's base address.&lt;/p&gt;
&lt;p&gt;I found this interesting because ASLR is specifically designed to make these locations unpredictable.&lt;/p&gt;
&lt;p&gt;Instead of simply guessing the addresses, the exploitation chain obtains information about the actual memory layout.&lt;/p&gt;
&lt;p&gt;This demonstrated how a memory disclosure stage can become a stepping stone toward something much more serious.&lt;/p&gt;
&lt;h3 id=&quot;7-from-memory-disclosure-to-remote-code-execution&quot;&gt;7. From memory disclosure to remote code execution&lt;/h3&gt;
&lt;p&gt;Now came the part I was particularly interested in: actually demonstrating command execution.&lt;/p&gt;
&lt;p&gt;After the memory disclosure stages, the exploit proceeded to the final stage involving the manipulated HashTable structure.&lt;/p&gt;
&lt;p&gt;The lab provided the following execution proof:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;PROOF: uid=33(www-data) gid=33(www-data) groups=33(www-data)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And there it was.&lt;/p&gt;
&lt;p&gt;The command had executed successfully under the www-data account, which is commonly used by web servers on Linux systems.&lt;/p&gt;
&lt;p&gt;This confirmed that the exploitation chain had achieved remote code execution in the lab environment.&lt;/p&gt;
&lt;p&gt;The next step was retrieving the flag.&lt;/p&gt;
&lt;p&gt;The lab's exploit used the following command:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;python3 exploit.py \
-u http://127.0.0.1:8088/index.php \
-c 'cat /f&amp;gt;/out/p1' \
--proof-file out/p1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The result returned the flag:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;THM{b4ilout_l3aves_th3_h3ap_dang1ing}&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;THM{b4ilout_l3aves_th3_h3ap_dang1ing}&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A pretty fitting flag for a vulnerability involving a bailout and a dangling pointer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What made this practical exercise memorable for me was the fact that the target application itself never changed.&lt;/p&gt;
&lt;p&gt;It continued to be a simple PHP page returning OK.&lt;/p&gt;
&lt;p&gt;The exploitation happened because of the vulnerable runtime underneath it.&lt;/p&gt;
&lt;h3 id=&quot;8-detection-and-mitigation&quot;&gt;8. Detection and mitigation&lt;/h3&gt;
&lt;p&gt;Understanding how an attack works is one thing.&lt;/p&gt;
&lt;p&gt;Knowing how to prevent or detect it is equally important.&lt;/p&gt;
&lt;p&gt;Since PHP2Shell affects the PHP runtime, updating the application alone isn't enough.&lt;/p&gt;
&lt;p&gt;The PHP installation itself needs to be patched.&lt;/p&gt;
&lt;p&gt;The fixed releases identified in the security advisory are:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;PHP branch &lt;/th&gt;&lt;th&gt;Fixed release&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;PHP 8.5 &lt;/td&gt;&lt;td&gt;8.5.12&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;PHP 8.4 &lt;/td&gt;&lt;td&gt;8.4.27&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;PHP 8.3 &lt;/td&gt;&lt;td&gt;8.3.36&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;PHP 8.2 &lt;/td&gt;&lt;td&gt;8.2.35&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Temporary risk reduction&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If immediate patching isn't possible, administrators can review their PHP request-handling configuration and apply temporary defensive measures, such as restricting request-body sizes at the reverse proxy or web-server level.&lt;/p&gt;
&lt;p&gt;Disabling &lt;code&gt;session.upload_progress&lt;/code&gt; may also reduce exposure to the specific upload-progress attack path demonstrated in the lab:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;session.upload_progress.enabled = 0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;However, these measures are only temporary risk-reduction steps. They do not fix the underlying vulnerabilities and should not be considered complete mitigations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The only safe solution is to update PHP to a fixed release.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After updating, restart PHP-FPM workers or reload/restart Apache when using &lt;code&gt;mod_php&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If PHP runs inside containers, rebuild or replace the affected containers so that no vulnerable runtime instances remain.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What should defenders monitor?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Some suspicious indicators worth investigating include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unusually large PHPSESSID values in Set-Cookie response headers.&lt;/li&gt;
&lt;li&gt;Suspicious multipart POST requests.&lt;/li&gt;
&lt;li&gt;Unexpected PHP worker crashes.&lt;/li&gt;
&lt;li&gt;Memory exhaustion errors.&lt;/li&gt;
&lt;li&gt;PHP processes unexpectedly spawning shell processes.&lt;/li&gt;
&lt;li&gt;Unusual command execution under the web server account.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One important lesson here is that monitoring only the application layer isn't sufficient.&lt;/p&gt;
&lt;p&gt;Because the vulnerability is triggered during PHP's internal request processing, detection and prevention need to account for activity happening before the application script executes.&lt;/p&gt;
&lt;p&gt;Patching the runtime remains the priority.&lt;/p&gt;
&lt;h3 id=&quot;9-what-i-learned-from-this-investigation&quot;&gt;9. What I learned from this investigation&lt;/h3&gt;
&lt;p&gt;This was more than just another TryHackMe room for me.&lt;/p&gt;
&lt;p&gt;It helped me connect several concepts that I had previously encountered separately.&lt;/p&gt;
&lt;p&gt;Some of the things I explored included:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How PHP processes multipart/form-data requests.&lt;/li&gt;
&lt;li&gt;What session.upload_progress actually does.&lt;/li&gt;
&lt;li&gt;How memory allocation and dangling pointers work.&lt;/li&gt;
&lt;li&gt;Why an out-of-memory bailout can become dangerous.&lt;/li&gt;
&lt;li&gt;What ASLR does and why attackers try to bypass it.&lt;/li&gt;
&lt;li&gt;How memory disclosure can assist remote code execution.&lt;/li&gt;
&lt;li&gt;How PHP's internal cleanup mechanisms can become part of an exploitation chain.&lt;/li&gt;
&lt;li&gt;Why securing the application doesn't necessarily secure the runtime.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But there's one thing that stood out above everything else.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sometimes, the vulnerability isn't in the code you wrote. It's in the code your code depends on.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As someone learning cybersecurity alongside software development and AI/ML, I find these investigations particularly valuable.&lt;/p&gt;
&lt;p&gt;I don't want to simply learn which command executes an exploit or how to retrieve a flag.&lt;/p&gt;
&lt;p&gt;I want to understand what happens underneath, why a vulnerability exists, how it can be abused and, most importantly, how defenders can prevent it.&lt;/p&gt;
&lt;p&gt;Because there's a difference between knowing that something works and understanding why it works.&lt;/p&gt;
&lt;p&gt;And I'm genuinely enjoying the process of learning that difference.&lt;/p&gt;
&lt;h3 id=&quot;final-thoughts&quot;&gt;Final thoughts&lt;/h3&gt;
&lt;p&gt;PHP2Shell was a great reminder that cybersecurity isn't just about finding vulnerabilities in websites.&lt;/p&gt;
&lt;p&gt;It's also about understanding the technologies, runtimes, libraries and systems that make those websites work in the first place.&lt;/p&gt;
&lt;p&gt;A seemingly harmless upload-progress feature, combined with a memory-management failure, demonstrated how something deep inside a runtime could eventually lead to remote code execution.&lt;/p&gt;
&lt;p&gt;And that's what makes cybersecurity so interesting to me.&lt;/p&gt;
&lt;p&gt;There's always another layer to investigate, another question to ask and another mechanism to understand.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stay curious. Keep learning. Keep breaking things in controlled environments, and most importantly, understand what you're doing.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: This investigation was conducted in an authorized TryHackMe lab environment. The exploit and command-execution results described above relate to that controlled environment.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/33222/php2shell-when-a-simple-upload-feature-turns-into-remote-code-execution</guid>
<pubDate>Sat, 31 Oct 2026 12:16:03 +0000</pubDate>
</item>
<item>
<title>What SafeLine's PHP Core Rule Actually Watches in the Request</title>
<link>https://coderlegion.com/32462/what-safelines-php-core-rule-actually-watches-in-the-request</link>
<description>&lt;p&gt;The PHP Core rule SafeLine shipped on 21 October is not a generic &quot;block all uploads&quot; switch. It is aimed at request features from the known chain behind CVE-2026-109618 and CVE-2026-109619.&lt;/p&gt;
&lt;p&gt;Four signs are called out in the rule note. A request that carries &lt;code&gt;PHP_SESSION_UPLOAD_PROGRESS&lt;/code&gt;. A &lt;code&gt;PHPSESSID&lt;/code&gt; that fits the characteristic pattern. A content type of &lt;code&gt;multipart/form-data&lt;/code&gt;. A body that combines abnormal form fields with suspicious content. Any one of those can appear in legitimate software. The rule is about the combination associated with the chain, which is why the first setting is observe, not drop.&lt;/p&gt;
&lt;p&gt;That focus follows from CVE-2026-109618, which is about multipart parsing and memory state. Upload and form posts are the traffic you should be able to name in a log: time, source address, site, path, and the rule name PHPCoreRCECVE-2026-109618/109619. The write-up is at &lt;a rel=&quot;nofollow&quot; href=&quot;https://rivers.chaitin.cn/discussion/dbc7qkj1s5rlia466a30&quot;&gt;the rule discussion&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;CVE-2026-109619 is the other half. Worker global state can linger between requests. The WAF rule will not print the worker's memory. It will tell you which HTTP client was sending the chain's request shape at the time a pool misbehaved. Use both logs.&lt;/p&gt;
&lt;p&gt;Import the rule from the SafeLine rule library. Set the action to blacklist. Enable observe mode. Review a sample of hits against a known-good upload from your own application. If your application itself sends &lt;code&gt;PHP_SESSION_UPLOAD_PROGRESS&lt;/code&gt; on a normal photo upload, you need that fact before you block, not after.&lt;/p&gt;
&lt;p&gt;When the hits are probes rather than product traffic, move the rule to an intercept action and keep the event record for the follow-up on disk and credentials.&lt;/p&gt;
&lt;h4 id=&quot;does-the-rule-fire-on-every-multipart-post-&quot;&gt;Does the rule fire on every multipart post?&lt;/h4&gt;
&lt;p&gt;It is built around the known chain's features, not every form on the internet.&lt;/p&gt;
&lt;h4 id=&quot;what-should-a-useful-hit-contain-&quot;&gt;What should a useful hit contain?&lt;/h4&gt;
&lt;p&gt;Time, source IP, site, path, and the rule name. Those are the fields worth capturing in the event view.&lt;/p&gt;
&lt;h4 id=&quot;can-i-skip-observe-mode-if-i-trust-the-signature-&quot;&gt;Can I skip observe mode if I trust the signature?&lt;/h4&gt;
&lt;p&gt;You can, but the published guidance is to observe first so a real upload path is not the thing you discover by outage.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32462/what-safelines-php-core-rule-actually-watches-in-the-request</guid>
<pubDate>Mon, 26 Oct 2026 04:17:15 +0000</pubDate>
</item>
<item>
<title>What to Inspect After a PHP Core Rule Hit</title>
<link>https://coderlegion.com/32463/what-to-inspect-after-a-php-core-rule-hit</link>
<description>&lt;p&gt;A SafeLine hit on the PHP Core rule is a starting point, not a closed case. CVE-2026-109618 and CVE-2026-109619 are serious because a crafted request can disturb the runtime or leave worker state behind. If the rule fires, or if the server looks wrong without a clean explanation, widen the search the same day.&lt;/p&gt;
&lt;p&gt;Start with the event SafeLine already stored: attack time, source address, site, path, and the rule name. The 21 October rule is documented at &lt;a rel=&quot;nofollow&quot; href=&quot;https://rivers.chaitin.cn/discussion/dbc7qkj1s5rlia466a30&quot;&gt;the rule page&lt;/a&gt;. Match that minute to the web access log and the PHP error log. You are looking for the same client, the same path, and a runtime fault.&lt;/p&gt;
&lt;p&gt;Then look at files. Check the web root, the upload directory, and the temporary directory PHP uses for multipart bodies. Look for PHP files that appeared or changed recently and that no deploy can explain. A new file next to an upload endpoint is more interesting than a hit with no file change, but both deserve a note.&lt;/p&gt;
&lt;p&gt;Process and network checks come next. Unknown processes, unexpected outbound connections, and cron entries you did not add are reasons to treat the host as suspect. If that bar is met, rotate high-privilege accounts, database accounts, and API keys. Do not rotate everything on the first observe-mode hit from a scanner. Do rotate when logs and files agree that something landed.&lt;/p&gt;
&lt;p&gt;Keep the rule in observe until you know your own upload traffic, then move it to block. Upgrade the PHP pool that served the hit. Restart that pool. Confirm the site still logs in and still accepts a normal file. The rule watches the chain. The upgrade removes the bug the chain is aimed at.&lt;/p&gt;
&lt;h4 id=&quot;what-is-the-minimum-record-to-keep-&quot;&gt;What is the minimum record to keep?&lt;/h4&gt;
&lt;p&gt;Time, source IP, site, path, rule name, and whether a file changed.&lt;/p&gt;
&lt;h4 id=&quot;should-every-hit-trigger-a-credential-rotation-&quot;&gt;Should every hit trigger a credential rotation?&lt;/h4&gt;
&lt;p&gt;No. Rotate when logs or files show more than a probe.&lt;/p&gt;
&lt;h4 id=&quot;does-blocking-replace-the-php-upgrade-&quot;&gt;Does blocking replace the PHP upgrade?&lt;/h4&gt;
&lt;p&gt;No. Blocking is a control at the proxy. The runtime still has to be patched.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32463/what-to-inspect-after-a-php-core-rule-hit</guid>
<pubDate>Mon, 26 Oct 2026 04:17:14 +0000</pubDate>
</item>
<item>
<title>How to Inventory Every PHP Version Before You Call the Estate Patched</title>
<link>https://coderlegion.com/32461/how-to-inventory-every-php-version-before-you-call-the-estate-patched</link>
<description>&lt;p&gt;The failure mode in this PHP advisory is not &quot;we upgraded PHP.&quot; It is &quot;we upgraded one PHP and left three others running.&quot; CVE-2026-109618 and CVE-2026-109619 are in PHP Core, so every branch on the host is its own decision.&lt;/p&gt;
&lt;p&gt;Build a table before you patch. Columns that earn their keep: site name, public host, PHP-FPM pool, binary path, version, owner, and status. Status should be one of upgraded, waiting, or cannot upgrade, with a reason in the last case. A shared server that still has an old pool for a forgotten landing page is still exposed.&lt;/p&gt;
&lt;p&gt;Do the upgrade in a quiet window. Back up site files, the database, and the pool config first. After the package change, restart PHP or PHP-FPM and prove the new version with the same binary the pool uses, not with a &lt;code&gt;php&lt;/code&gt; that happens to be first on a login shell.&lt;/p&gt;
&lt;p&gt;Then test the paths that exercise the bugs: home page, login, upload, and a normal form post. Read the PHP error log for a new exception. Walk the process list and confirm no pool is still bound to the old build.&lt;/p&gt;
&lt;p&gt;SafeLine does not replace that inventory. The 21 October rule gives you a place to watch suspicious multipart uploads while the list is incomplete. Set the action to blacklist, enable observe mode, and read hits instead of blocking the estate on hour one. The rule page is &lt;a rel=&quot;nofollow&quot; href=&quot;https://rivers.chaitin.cn/discussion/dbc7qkj1s5rlia466a30&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When the inventory shows a site that cannot move yet, keep that host's rule in observe, restrict who can reach the origin, and do not treat the WAF note as a permanent patch.&lt;/p&gt;
&lt;h4 id=&quot;how-do-i-know-which-version-a-vhost-uses-&quot;&gt;How do I know which version a vhost uses?&lt;/h4&gt;
&lt;p&gt;Read the pool config and the binary that pool executes, not the default CLI PHP.&lt;/p&gt;
&lt;h4 id=&quot;can-one-safeline-rule-cover-every-old-branch-&quot;&gt;Can one SafeLine rule cover every old branch?&lt;/h4&gt;
&lt;p&gt;It can watch the request pattern. It does not upgrade the branch.&lt;/p&gt;
&lt;h4 id=&quot;what-belongs-in-the-cannot-upgrade-note-&quot;&gt;What belongs in the &quot;cannot upgrade&quot; note?&lt;/h4&gt;
&lt;p&gt;The business reason and the compensating control, such as observe mode plus a closed origin.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32461/how-to-inventory-every-php-version-before-you-call-the-estate-patched</guid>
<pubDate>Mon, 26 Oct 2026 03:47:14 +0000</pubDate>
</item>
<item>
<title>Why Multipart Uploads Need a Separate Look After CVE-2026-109618</title>
<link>https://coderlegion.com/32460/why-multipart-uploads-need-a-separate-look-after-cve-2026-109618</link>
<description>&lt;p&gt;File upload is the practical entry for CVE-2026-109618. The weakness is in PHP's handling of &lt;code&gt;multipart/form-data&lt;/code&gt; and the memory state around that parse, not in a single shopping-cart plugin.&lt;/p&gt;
&lt;p&gt;An attacker does not need a valid image. They need a request that looks like a form upload and stresses the parser: odd boundaries, unexpected fields, or a progress token the application never meant to honor. The result called out in the advisory is service disruption or a runtime fault, which is enough to create a window for a follow-on web attack.&lt;/p&gt;
&lt;p&gt;SafeLine's 21 October rule looks for that shape on the wire. The signals called out in the rule note are a &lt;code&gt;PHP_SESSION_UPLOAD_PROGRESS&lt;/code&gt; parameter, a &lt;code&gt;PHPSESSID&lt;/code&gt; that matches the known pattern, a &lt;code&gt;multipart/form-data&lt;/code&gt; content type, and a body that pairs abnormal fields with suspicious content. Details are in the &lt;a rel=&quot;nofollow&quot; href=&quot;https://rivers.chaitin.cn/discussion/dbc7qkj1s5rlia466a30&quot;&gt;rule discussion&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Turn the rule action to blacklist and leave observe mode on. Observe mode writes the event and keeps the source and request. It does not drop the request. That matters on checkout, profile photo, and ticket-attachment routes, where a hard block on day one will page the wrong team.&lt;/p&gt;
&lt;p&gt;While the rule watches, do the origin work. Back up files, the database, and the PHP pool config. Upgrade the PHP branch that pool actually uses. Restart PHP-FPM. Then click through home, login, upload, and form submit. Read the PHP error log for a new fault, and confirm no second vhost is still pinned to the old binary.&lt;/p&gt;
&lt;p&gt;If the same address keeps changing the body of upload posts, treat that as probing even when the rule is still in observe. Only after that picture is stable should you switch the rule from record-only to block.&lt;/p&gt;
&lt;h4 id=&quot;is-every-upload-form-affected-&quot;&gt;Is every upload form affected?&lt;/h4&gt;
&lt;p&gt;Any PHP path that accepts multipart bodies is in scope until that site's runtime is confirmed current.&lt;/p&gt;
&lt;h4 id=&quot;will-observe-mode-stop-the-exploit-&quot;&gt;Will observe mode stop the exploit?&lt;/h4&gt;
&lt;p&gt;No. It records. Blocking is a later, separate change.&lt;/p&gt;
&lt;h4 id=&quot;what-should-be-upgraded-first-&quot;&gt;What should be upgraded first?&lt;/h4&gt;
&lt;p&gt;The PHP version serving the upload vhost, not the CMS theme.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SafeLine has surpassed 700,000 installations worldwide as of September 30, 2026. SafeLine Pro annual promotional pricing is $650-$880, compared with the regular $1,000 per year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SafeLine website: &lt;a rel=&quot;nofollow&quot; href=&quot;https://ly.cyberserval.tech/MqhYdmI&quot;&gt;https://ly.cyberserval.tech/MqhYdmI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://demo.waf.chaitin.com:9443/statistics&quot;&gt;https://demo.waf.chaitin.com:9443/statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official docs: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.waf.chaitin.com/en/home&quot;&gt;https://docs.waf.chaitin.com/en/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/chaitin/SafeLine&quot;&gt;https://github.com/chaitin/SafeLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro offer: &lt;a rel=&quot;nofollow&quot; href=&quot;https://cyberserval.tech/landing/lto&quot;&gt;https://cyberserval.tech/landing/lto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32460/why-multipart-uploads-need-a-separate-look-after-cve-2026-109618</guid>
<pubDate>Mon, 26 Oct 2026 03:44:13 +0000</pubDate>
</item>
<item>
<title>BackBox's Kilter AI Keeps Humans in the Loop While Automating Network Fixes</title>
<link>https://coderlegion.com/27090/backboxs-kilter-ai-keeps-humans-in-the-loop-while-automating-network-fixes</link>
<description>&lt;p&gt;As network vulnerabilities pile up faster than teams can patch them, most of the AI conversation in NetOps has centered on autonomy: letting AI agents make and execute changes on their own. BackBox is making a different bet. With the launch of its Kilter Platform — and Kilter AI, its new intelligence layer — the company is betting that NetSecOps teams want acceleration, not abdication.&lt;/p&gt;
&lt;p&gt;We asked Irfahn Khimji, CISSP, Field CTO at BackBox, to walk through how that actually works in practice: what a human reviews before anything runs, where the hard limits are, and what claims about AI-driven network automation deserve some skepticism.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Walk me through the actual flow: a vulnerability shows up in the Enriched Data Aggregation layer, and a &quot;CVE Workaround Chain&quot; gets generated. What does that chain actually look like, and what specifically does a human review before anything executes?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When a vendor issues an advisory, it includes remediation or mitigation guidance — upgrade to a specific version, or change a configuration — and every vendor presents it differently. Kilter AI parses that advisory, normalizes it, and identifies what needs to happen to the device.&lt;/p&gt;
&lt;p&gt;From there, the human-in-the-loop model requires a person to click a button before Kilter AI takes the next step: building the automation chain. Once built, that chain is tagged as AI-generated and still requires a human to review, verify, and approve it before it's scheduled to run.&lt;/p&gt;
&lt;p&gt;Chains also enforce best practices by default. A common pattern wraps AI-generated automations in a Backup–Run Automation–Backup cycle, so the network can always be restored if something goes wrong. As Khimji put it, &quot;The AI takes the coding out of the equation, but lets the human engineer decide whether to use it as-is or tweak it, and when to run it.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You describe Kilter AI as a &quot;trusted advisor&quot; rather than autonomous. Concretely, what decision has Kilter AI never been allowed to make on its own, even as trust builds over time? Where's the hard line?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Kilter AI is not allowed to take actions on customer networks, full stop. Its job is to aggregate data, generate recommendations, and surface insights — the research and development phase, not execution.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why hold that line while competitors race toward full autonomy?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;BackBox made a deliberate choice not to go fully autonomous, based directly on customer and prospect feedback. The sticking point is accountability: if an AI makes a mistake, the AI can't be held responsible for it — the person deploying it can. And accountability only works if the person carrying it has a very high level of confidence in the AI's output. &quot;As an industry and society, we're not yet at the point where AI models are 100% or even 99% trustworthy,&quot; Khimji said. &quot;Given that networks need more than 99% uptime, I'm not sure it's a risk worth taking just yet.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How much has the threat landscape actually accelerated?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Khimji pointed to a stack of external data supporting the urgency behind Kilter AI's design: over 49,000 CVEs published last year (a 20% increase over 2024, per NIST), with CVE.org projecting more than 60,000 by the end of 2026. The Global Incident Response Report 2026 found the fastest 25% of intrusions now reach exfiltration in 72 minutes, down from 285 minutes the year before. CrowdStrike's 2026 Global Threat Report logged an 89% year-over-year increase in attacks from AI-enabled adversaries, and IBM's X-Force Threat Intelligence Index flagged a 44% year-over-year increase in exploitation of public-facing applications, with 56% of disclosed vulnerabilities exploitable without authentication. IBM's Cost of a Data Breach Report also found that 97% of AI-related breaches trace back to inadequate guardrails.&lt;/p&gt;
&lt;p&gt;Mythos, the AI-driven exploit generation approach Khimji referenced, is part of what's compressed attacker timelines from months or years down to days — one of the pressures BackBox says is driving demand for guardrails rather than full autonomy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&quot;Automation Creation Assistance&quot; turns CLI input into production-ready automations without requiring scripting expertise. What happens when it gets that translation wrong? Is there a review step before it's saved or executed?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Every AI-created automation is tagged as such, and none of them can run without human approval. The underlying connect, authenticate, and disconnect commands are the same ones already used in BackBox's onboarding and inventory process — meaning they're proven, or the device wouldn't be in inventory in the first place.&lt;/p&gt;
&lt;p&gt;The final required step is verifying the commands entered into the automation. If they came from the vulnerability intelligence service, they're pulled directly from the manufacturer's site. If they came from the automation creation assistant, the user typed them. Kilter AI's target users are network professionals — engineers, architects — who are assumed to know the CLI for their own devices, though a more junior analyst can cross-reference against vendor documentation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You support 180+ vendors with 3,000+ pre-built automations. How much of that breadth is genuinely uniform versus vendor-specific quirks that still need manual tuning?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Not much of it is uniform. Every vendor has its own CLI dialect — a Cisco device takes &quot;show run,&quot; while the equivalent on Fortinet is &quot;show full-configuration.&quot; BackBox has spent more than 15 years building out that automation library manually, vendor command by vendor command.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For a NetSecOps team already drowning in tooling, what's the real integration lift? Does Kilter replace existing tools, or become one more thing to maintain?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It depends on where a team is starting from. Most prospects are either scripting manually with something like Python, using a vendor tool like Cisco's Catalyst Center, or handling the work by hand with no automation at all — and a smaller number do nothing and wait for the next hardware refresh.&lt;/p&gt;
&lt;p&gt;For teams doing it manually, Kilter is new tooling, but the ROI has been steep: one customer cut its upgrade cycle for an entire switching infrastructure from six months to six days. For teams on vendor tools, Kilter typically replaces them — BackBox has displaced as many as five other tools in a single deployment, though one or two is more typical. Teams that have built their own scripting stack with staff who know both networking and coding are the toughest fit; if that describes an organization, Kilter probably isn't the upgrade.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What's a claim about AI-driven network automation — yours or a competitor's — that teams should be skeptical of right now?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Khimji singled out vendor platforms that push users to build AI agents natively on their own systems: &quot;Users must learn to code on those platforms instead of in Python, etc., and those agents aren't portable outside those platforms.&quot; That lock-in, he argued, is worth questioning regardless of which vendor is offering it.&lt;/p&gt;
&lt;h3 id=&quot;the-bigger-picture&quot;&gt;The bigger picture&lt;/h3&gt;
&lt;p&gt;Kilter AI is the intelligence layer inside BackBox's broader Kilter Platform, which also includes Kilter ALM (lifecycle management — onboarding, backup, recovery, upgrades, and patching across 180+ vendors) and Kilter Enterprise (compliance, policy, and configuration integrity). BackBox frames Kilter AI as the foundation for what it calls &quot;agentic NetSecOps&quot; — networks that reason, adapt, and act with increasing independence — but insists that autonomy will be earned one deliberate capability at a time, not declared on day one.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Irfahn Khimji is Field CTO at BackBox. &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/in/irfahnkhimji/&quot;&gt;Connect with him on LinkedIn&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/27090/backboxs-kilter-ai-keeps-humans-in-the-loop-while-automating-network-fixes</guid>
<pubDate>Mon, 14 Sep 2026 14:00:00 +0000</pubDate>
</item>
</channel>
</rss>