<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.2.0">Jekyll</generator><link href="http://0.0.0.0:4000/blog/feed.xml" rel="self" type="application/atom+xml" /><link href="http://0.0.0.0:4000/blog/" rel="alternate" type="text/html" /><updated>2026-07-18T17:17:19-05:00</updated><id>http://0.0.0.0:4000/blog/feed.xml</id><title type="html">FullHunt Blog</title><subtitle>Expose Your Attack Surface</subtitle><entry><title type="html">wp2shell (CVE-2026-63030): Pre-Auth RCE Chain in WordPress Core</title><link href="http://0.0.0.0:4000/blog/2026/07/17/wp2shell-wordpress-core-pre-auth-rce-cve-2026-63030.html" rel="alternate" type="text/html" title="wp2shell (CVE-2026-63030): Pre-Auth RCE Chain in WordPress Core" /><published>2026-07-17T00:00:00-05:00</published><updated>2026-07-17T00:00:00-05:00</updated><id>http://0.0.0.0:4000/blog/2026/07/17/wp2shell-wordpress-core-pre-auth-rce-cve-2026-63030</id><content type="html" xml:base="http://0.0.0.0:4000/blog/2026/07/17/wp2shell-wordpress-core-pre-auth-rce-cve-2026-63030.html">&lt;p align=&quot;center&quot;&gt;CVE-2026-63030 is a pre-authentication remote code execution vulnerability in WordPress Core affecting versions 6.9.0 through 7.0.1. A single anonymous POST to the REST API batch endpoint reaches a SQL injection that leads to direct access to the WordPress and can be escalated to a pre-auth RCE.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dkh9ehwkisc4.cloudfront.net/static/files/62b9b146-d0c8-470b-ab54-94d0766afae6-wp2shell-banner.png&quot; alt=&quot;wp2shell CVE-2026-63030&quot; /&gt;&lt;/p&gt;

&lt;p&gt;WordPress patched it in 6.9.5 and 7.0.2, touching three files and sixteen lines. This post covers what broke, why the bugs connect, and what teams running WordPress need to do.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;background&quot;&gt;Background&lt;/h2&gt;

&lt;p&gt;The patch diff between 7.0.1 and 7.0.2 is three files. The batch REST API endpoint has been present since WordPress 5.6. The bugs were introduced when the endpoint landed in the 6.9 development branch, roughly a year before disclosure.&lt;/p&gt;

&lt;p&gt;Affected files:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;src/wp-includes/rest-api/class-wp-rest-server.php
src/wp-includes/class-wp-query.php
src/wp-includes/rest-api.php
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;identify-wp2shell-exposure-with-fullhunt&quot;&gt;Identify wp2shell Exposure with FullHunt&lt;/h2&gt;

&lt;p&gt;FullHunt fingerprints web technologies across every host it discovers, including WordPress. Look up &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tag:wordpress&lt;/code&gt; in the &lt;a href=&quot;https://console.fullhunt.io/search/&quot;&gt;FullHunt Console&lt;/a&gt; to list every WordPress asset already mapped across your attack surface, then cross-reference the results against the affected range (6.9.0 through 7.0.1) while you patch.&lt;/p&gt;

&lt;p&gt;FullHunt Enterprise customers get continuous monitoring, so newly discovered or newly exposed WordPress assets are flagged automatically as they appear on the perimeter, without re-running the search by hand.&lt;/p&gt;

&lt;p&gt;We’re also open-sourcing &lt;a href=&quot;https://github.com/fullhunt/wp2shell-scan&quot;&gt;wp2shell-scan&lt;/a&gt;, a scanner for CVE-2026-63030. It ships two non-destructive detection modes, time-based and error-based, for checking your own infrastructure at scale.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;the-vulnerability&quot;&gt;The vulnerability&lt;/h2&gt;

&lt;h3 id=&quot;bug-1-array-index-desynchronisation-in-serve_batch_request_v1&quot;&gt;Bug 1: Array index desynchronisation in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;serve_batch_request_v1&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;The batch endpoint at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/wp-json/batch/v1&lt;/code&gt; (also reachable via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;?rest_route=/batch/v1&lt;/code&gt;) accepts a single POST containing multiple sub-requests. Processing happens in two passes.&lt;/p&gt;

&lt;p&gt;In the first pass, WordPress parses each sub-request URL, matches it to a route handler, validates parameters, and sanitizes them. Results go into two arrays that are supposed to stay in lockstep:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$matches[$n]&lt;/code&gt; – the matched route and handler tuple&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$validation[$n]&lt;/code&gt; – &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;true&lt;/code&gt; if everything passed, or a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WP_Error&lt;/code&gt; describing what failed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the second pass, WordPress iterates &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$requests&lt;/code&gt; by integer index &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$i&lt;/code&gt; and cross-references &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$matches[$i]&lt;/code&gt; with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$validation[$i]&lt;/code&gt; to decide whether to execute the handler or return an error.&lt;/p&gt;

&lt;p&gt;The vulnerable code from 7.0.1:&lt;/p&gt;

&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$matches&lt;/span&gt;    &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$validation&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$has_error&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$requests&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$single_request&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// A request that couldn't be parsed becomes a WP_Error&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;is_wp_error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$single_request&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$has_error&lt;/span&gt;    &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$validation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$single_request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;// pushed to $validation&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;continue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;                           &lt;span class=&quot;c1&quot;&gt;// $matches NOT updated -- the bug&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;nv&quot;&gt;$match&lt;/span&gt;     &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;match_request_to_handler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$single_request&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$matches&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$match&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// ... allow_batch check, has_valid_params(), sanitize_params() ...&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$error&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$has_error&lt;/span&gt;    &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$validation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$validation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;When a sub-request is a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WP_Error&lt;/code&gt; (any time the URL can’t be parsed), the code pushes one entry into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$validation&lt;/code&gt; and zero into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$matches&lt;/code&gt;. One WP_Error is enough to permanently shift every subsequent &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$matches[$i]&lt;/code&gt; one slot ahead of where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$validation[$i]&lt;/code&gt; expects it.&lt;/p&gt;

&lt;p&gt;That misalignment shows up in the execution pass:&lt;/p&gt;

&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$requests&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$single_request&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;is_wp_error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$single_request&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// WP_Error sub-requests get handled here and skipped&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$responses&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;envelope_response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;error_to_response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$single_request&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;get_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;continue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;nv&quot;&gt;$match&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$matches&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;         &lt;span class=&quot;c1&quot;&gt;// WRONG index due to the shift&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$error&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;is_wp_error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$validation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;// WRONG validation result&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$error&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$validation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;nv&quot;&gt;$result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;respond_to_request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$single_request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$route&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$handler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$error&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;With three sub-requests (one benign, one WP_Error, one malicious) the array state after the validation pass looks like this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$requests:   [ benign_req,  err_req,    malicious_req  ]
             -----------------------------------------
$matches:    [ benign_hdl,              malicious_hdl  ]  indices 0, 1
$validation: [ true,        WP_Error,   WP_Error       ]  indices 0, 1, 2
                            ^-- shift applied here -----^
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In the execution pass, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$i = 2&lt;/code&gt; (malicious request slot): &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$matches[2]&lt;/code&gt; is the malicious handler but &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$validation[2]&lt;/code&gt; is a WP_Error, so the error gate fires. But at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$i = 1&lt;/code&gt; (benign request slot): &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$matches[1]&lt;/code&gt; is now the malicious handler and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$validation[1]&lt;/code&gt; is the WP_Error from the unparseable URL, not from any check on the malicious request.&lt;/p&gt;

&lt;p&gt;The attacker controls sub-request ordering. By placing the WP_Error at the right position, they align the malicious handler with a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;true&lt;/code&gt; validation result from a different request’s clean pass, bypassing:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;has_valid_params()&lt;/code&gt; – REST schema type checking (e.g., &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;author_exclude&lt;/code&gt; must be &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;integer[]&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sanitize_params()&lt;/code&gt; – per-element sanitisation (e.g., &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;absint()&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;allow_batch&lt;/code&gt; route check&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The fix was one added line:&lt;/p&gt;

&lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  if ( is_wp_error( $single_request ) ) {
      $has_error    = true;
&lt;span class=&quot;gi&quot;&gt;+     $matches[]    = $single_request;   // keep arrays in sync
&lt;/span&gt;      $validation[] = $single_request;
      continue;
  }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Both arrays now receive an entry for every input. In the execution pass, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$matches[$i]&lt;/code&gt; for a WP_Error slot is itself a WP_Error, caught by the existing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;is_wp_error($match)&lt;/code&gt; check before any handler runs.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;bug-2-re-entrancy-in-serve_request-and-rest_api_loaded&quot;&gt;Bug 2: Re-entrancy in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;serve_request&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rest_api_loaded&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;WordPress loads the REST API through &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rest_api_loaded()&lt;/code&gt;, hooked to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;parse_request&lt;/code&gt;. It reads &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$wp-&amp;gt;query_vars['rest_route']&lt;/code&gt;, then calls &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$wp_rest_server-&amp;gt;serve_request($path)&lt;/code&gt;. This entry point is designed to run once per HTTP request.&lt;/p&gt;

&lt;p&gt;The batch controller dispatches sub-requests by calling &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dispatch()&lt;/code&gt; (the internal method), not &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;serve_request()&lt;/code&gt;. That’s the correct separation. But nothing in 7.0.1 prevented a hook or callback triggered during batch dispatch from calling &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rest_api_loaded()&lt;/code&gt; again. If any code path during dispatch caused WordPress to re-run the main query loop with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rest_route&lt;/code&gt; in the environment, a fresh &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;serve_request()&lt;/code&gt; would start. That nested cycle has no awareness of the outer batch context, no batch permission checks, and no knowledge of the sub-request currently being dispatched.&lt;/p&gt;

&lt;p&gt;This path is only reachable when a persistent object cache is not in use. With Redis or Memcached, early cache hits short-circuit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WP_Query&lt;/code&gt; execution, collapsing the hook surface that enables re-entrancy. Without a cache (the default for a stock WordPress install), the full &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_posts()&lt;/code&gt; path runs every time, firing all its hooks.&lt;/p&gt;

&lt;p&gt;The fix added an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;is_dispatching()&lt;/code&gt; guard to both entry points.&lt;/p&gt;

&lt;p&gt;In &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;serve_request()&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  public function serve_request( $path = null ) {
&lt;span class=&quot;gi&quot;&gt;+     if ( $this-&amp;gt;is_dispatching() ) {
+         return false;
+     }
+
&lt;/span&gt;      global $current_user;
      // ...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rest_api_loaded()&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gi&quot;&gt;+ if ( isset( $GLOBALS['wp_rest_server'] )
+     &amp;amp;&amp;amp; $GLOBALS['wp_rest_server'] instanceof WP_REST_Server
+     &amp;amp;&amp;amp; $GLOBALS['wp_rest_server']-&amp;gt;is_dispatching()
+ ) {
+     return;
+ }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;is_dispatching()&lt;/code&gt; reads a request stack maintained inside &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dispatch()&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$dispatching_requests&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;is_dispatching&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bool&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dispatching_requests&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;While any dispatch is in flight, the stack is non-empty. Any attempt to call &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;serve_request()&lt;/code&gt; from a nested hook returns immediately.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;bug-3-sql-injection-in-wp_query-via-string-author__not_in&quot;&gt;Bug 3: SQL injection in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WP_Query&lt;/code&gt; via string &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;author__not_in&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;The REST API Posts endpoint exposes an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;author_exclude&lt;/code&gt; parameter that maps directly to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;author__not_in&lt;/code&gt; in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WP_Query&lt;/code&gt;. The REST layer validates &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;author_exclude&lt;/code&gt; as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;type: array, items: { type: integer }&lt;/code&gt; and sanitises each element with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;absint()&lt;/code&gt;. Bug 1 bypasses that layer entirely.&lt;/p&gt;

&lt;p&gt;What &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WP_Query::get_posts()&lt;/code&gt; does with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;author__not_in&lt;/code&gt; in 7.0.1:&lt;/p&gt;

&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$query_vars&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'author__not_in'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;is_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$query_vars&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'author__not_in'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// Only sanitised when it's an array:&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$query_vars&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'author__not_in'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;array_unique&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;nb&quot;&gt;array_map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'absint'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$query_vars&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'author__not_in'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$query_vars&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'author__not_in'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// Always runs, even when the value is a raw string:&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$author__not_in&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;implode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;','&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$query_vars&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'author__not_in'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$where&lt;/span&gt;          &lt;span class=&quot;mf&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot; AND &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$wpdb&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;posts&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.post_author NOT IN (&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$author__not_in&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;) &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;is_array()&lt;/code&gt; check controls sanitisation but not execution. When the value is a string:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;is_array(&quot;payload&quot;)&lt;/code&gt; returns &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;false&lt;/code&gt;, sanitisation skipped entirely&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(array) &quot;payload&quot;&lt;/code&gt; produces &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[&quot;payload&quot;]&lt;/code&gt; – PHP’s cast puts the string in a single-element array&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;implode(',', [&quot;payload&quot;])&lt;/code&gt; returns &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;payload&quot;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;The string lands verbatim in the SQL query&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The fix replaces the entire block with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wp_parse_id_list()&lt;/code&gt;, which is safe regardless of input type:&lt;/p&gt;

&lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gd&quot;&gt;- if ( is_array( $query_vars['author__not_in'] ) ) {
-     $query_vars['author__not_in'] = array_unique( array_map( 'absint', $query_vars['author__not_in'] ) );
-     sort( $query_vars['author__not_in'] );
- }
- $author__not_in  = implode( ',', (array) $query_vars['author__not_in'] );
- $where          .= &quot; AND {$wpdb-&amp;gt;posts}.post_author NOT IN ($author__not_in) &quot;;
&lt;/span&gt;&lt;span class=&quot;gi&quot;&gt;+ $author__not_in_id_list = wp_parse_id_list( $query_vars['author__not_in'] );
+ if ( count( $author__not_in_id_list ) &amp;gt; 0 ) {
+     sort( $author__not_in_id_list );
+     $where .= sprintf(
+         &quot; AND {$wpdb-&amp;gt;posts}.post_author NOT IN (%s) &quot;,
+         implode( ',', $author__not_in_id_list )
+     );
+     $query_vars['author__not_in'] = $author__not_in_id_list;
+ }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wp_parse_id_list()&lt;/code&gt; handles both strings and arrays, and runs &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;absint()&lt;/code&gt; on every element without exception:&lt;/p&gt;

&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wp_parse_id_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$input_list&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$input_list&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;wp_parse_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$input_list&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;             &lt;span class=&quot;c1&quot;&gt;// splits a string into array if needed&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;array_unique&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;array_map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'absint'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$input_list&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// absint() every element&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;the-attack-chain&quot;&gt;The attack chain&lt;/h2&gt;

&lt;p&gt;An unauthenticated attacker sends a single POST to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/wp-json/batch/v1&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;POST&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;/wp-json/batch/v&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;Content-Type:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;application/json&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;validation&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;normal&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;requests&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/wp/v2/posts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;method&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;GET&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;://invalid-url&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;method&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;GET&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/wp/v2/posts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;method&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;GET&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;body&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;author_exclude&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&amp;lt;injection payload&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;What happens:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Sub-request 0 (benign &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GET /wp/v2/posts&lt;/code&gt;) passes validation. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$matches[0]&lt;/code&gt; is the posts handler, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$validation[0]&lt;/code&gt; is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;true&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Sub-request 1 (bad URL) becomes a WP_Error. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$validation[1]&lt;/code&gt; gets the error. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$matches&lt;/code&gt; skips an index.&lt;/li&gt;
  &lt;li&gt;Sub-request 2 (malicious &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;author_exclude&lt;/code&gt; string) fails schema validation at the REST layer. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$validation[2]&lt;/code&gt; is a WP_Error. But &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$matches[1]&lt;/code&gt; is now the posts handler pointed at sub-request 2’s body.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the execution pass, the index shift means the posts handler runs with sub-request 2’s payload but sub-request 1’s (empty) validation result. Schema checking is bypassed. The raw string reaches &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WP_Query::get_posts()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The re-entrancy path in Bug 2 provides an alternative route. The sub-request dispatch triggers &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rest_api_loaded()&lt;/code&gt; again through a hook, starting a fresh &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;serve_request()&lt;/code&gt;. That cycle processes the malicious &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;author_exclude&lt;/code&gt; as a top-level request, also bypassing REST layer validation. On a site without Redis or Memcached, this path is independently reachable.&lt;/p&gt;

&lt;p&gt;Either way, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_posts()&lt;/code&gt; receives a string &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;author__not_in&lt;/code&gt;. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;is_array()&lt;/code&gt; guard returns false, sanitisation skips, and the value interpolates directly into:&lt;/p&gt;

&lt;div class=&quot;language-sql highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;AND&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wp_posts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;post_author&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;your_string_here&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;what-determines-whether-sqli-becomes-rce&quot;&gt;What determines whether SQLi becomes RCE&lt;/h3&gt;

&lt;p&gt;The injection gives read access to the full database. Escalation depends on the MySQL configuration:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Condition&lt;/th&gt;
      &lt;th&gt;Impact&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;MySQL &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;FILE&lt;/code&gt; privilege granted to the WP DB user&lt;/td&gt;
      &lt;td&gt;Direct file write via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INTO OUTFILE&lt;/code&gt; is possible&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;secure_file_priv&lt;/code&gt; is empty or points to webroot&lt;/td&gt;
      &lt;td&gt;File can land in a web-accessible path&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Webroot writable by the MySQL process&lt;/td&gt;
      &lt;td&gt;Shell is reachable immediately&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;No &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;FILE&lt;/code&gt; privilege&lt;/td&gt;
      &lt;td&gt;RCE still possible via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UPDATE wp_options&lt;/code&gt; (auto-loaded PHP eval paths, malicious plugin data)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Stock shared hosting and self-managed single-server WordPress installs frequently have &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;FILE&lt;/code&gt; privilege enabled and the webroot writable by the database process. Managed cloud deployments with a separated DB and locked-down MySQL user are harder to escalate beyond data exfiltration, but the SQLi itself still works.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;why-these-bugs-existed&quot;&gt;Why these bugs existed&lt;/h2&gt;

&lt;p&gt;The parallel array bug is the simplest. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;serve_batch_request_v1&lt;/code&gt; assumes &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$matches&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$validation&lt;/code&gt; stay the same length. They grow through &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[]=&lt;/code&gt; assignments in different branches of the same loop, with nothing enforcing that both arrays are updated together. Whoever added the WP_Error branch would focus on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$validation&lt;/code&gt; (where the error just landed) and miss that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$matches&lt;/code&gt; needed an entry too. Using two parallel arrays instead of a single struct per sub-request is what made this possible to miss in the first place.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WP_Query&lt;/code&gt; is a different kind of problem. It was written expecting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;author__not_in&lt;/code&gt; to always be an integer array, because historically callers passed integer arrays. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;is_array()&lt;/code&gt; check ran &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;absint()&lt;/code&gt; per element. The else branch was not written with user-controlled strings in mind – &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(array)&lt;/code&gt; was a convenience cast before &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;implode&lt;/code&gt;, not a trust boundary. When the REST API started accepting JSON bodies, that assumption quietly broke. Nothing in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WP_Query&lt;/code&gt; was updated.&lt;/p&gt;

&lt;p&gt;The re-entrancy bug is the one that would be hardest to catch in review. The batch controller correctly calls &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dispatch()&lt;/code&gt; (internal) rather than &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;serve_request()&lt;/code&gt; (external). That’s the right separation. But WordPress’s hook system lets any action or filter run arbitrary code during execution, including inside &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_posts()&lt;/code&gt;. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rest_api_loaded()&lt;/code&gt; had no guard against being invoked from within an active dispatch, and for a year nothing triggered that path.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;affected-versions&quot;&gt;Affected versions&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Branch&lt;/th&gt;
      &lt;th&gt;Affected&lt;/th&gt;
      &lt;th&gt;Fixed&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Before 6.9&lt;/td&gt;
      &lt;td&gt;Not affected (batch endpoint absent)&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;6.8&lt;/td&gt;
      &lt;td&gt;6.8.0 through 6.8.5 (SQLi only, no full chain)&lt;/td&gt;
      &lt;td&gt;6.8.6&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;6.9&lt;/td&gt;
      &lt;td&gt;6.9.0 through 6.9.4&lt;/td&gt;
      &lt;td&gt;6.9.5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;7.0&lt;/td&gt;
      &lt;td&gt;7.0.0 through 7.0.1&lt;/td&gt;
      &lt;td&gt;7.0.2&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;7.1&lt;/td&gt;
      &lt;td&gt;7.1-beta1&lt;/td&gt;
      &lt;td&gt;7.1-beta2&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;WordPress auto-updates affected installs where automatic updates are enabled. Verify the version manually. Auto-update completion is not guaranteed on every host configuration.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;mitigation&quot;&gt;Mitigation&lt;/h2&gt;

&lt;p&gt;Patch first. Update to 6.9.5, 7.0.2, or 7.1-beta2. That’s the only complete fix.&lt;/p&gt;

&lt;p&gt;If patching isn’t immediately possible, block the batch endpoint at the WAF or load balancer:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Block requests where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http.request.uri.path&lt;/code&gt; contains &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/wp-json/batch/v1&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Block requests where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url_decode(http.request.uri.query)&lt;/code&gt; contains &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rest_route=/batch/v1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url_decode()&lt;/code&gt; step is necessary. Cloudflare’s URL normalization preserves reserved &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%2F&lt;/code&gt; escapes, so a raw string match on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rest_route=/batch/v1&lt;/code&gt; misses &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;?rest_route=%2Fbatch%2Fv1&lt;/code&gt;. Decoding before matching catches both forms.&lt;/p&gt;

&lt;p&gt;At the database layer:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Confirm the WordPress DB user does not have &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;FILE&lt;/code&gt; privilege&lt;/li&gt;
  &lt;li&gt;Confirm &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;secure_file_priv&lt;/code&gt; points to a non-webroot path in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;my.cnf&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These don’t prevent the SQLi but remove the direct file-write escalation path.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;indicators-of-compromise&quot;&gt;Indicators of compromise&lt;/h2&gt;

&lt;p&gt;If investigating whether a host was hit before patching, check:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Unexpected PHP files in the webroot, especially recently created ones&lt;/li&gt;
  &lt;li&gt;WordPress error logs with malformed batch API requests (entries containing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;://&lt;/code&gt; in sub-request paths)&lt;/li&gt;
  &lt;li&gt;MySQL general query log entries containing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INTO OUTFILE&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LOAD DATA&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;New rows in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wp_options&lt;/code&gt; with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;autoload = yes&lt;/code&gt; and suspicious serialized PHP content&lt;/li&gt;
  &lt;li&gt;Web access logs showing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;POST /wp-json/batch/v1&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GET /?rest_route=%2Fbatch%2Fv1&lt;/code&gt; from a single IP in a short window, followed by a request to a new PHP file&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;references&quot;&gt;References&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://searchlightcyber.com/research/wp2shell&quot;&gt;Searchlight Cyber / Adam Kues – wp2shell advisory&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.rapid7.com/blog/post/etr-cve-2026-63030-wp2shell-a-critical-remote-code-execution-vulnerability-in-wordpress-core/&quot;&gt;Rapid7 ETR – CVE-2026-63030&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://wordpress.org/news/2026/07/wordpress-7-0-2/&quot;&gt;WordPress 7.0.2 release notes&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/WordPress/wordpress-develop/compare/7.0.1...7.0.2&quot;&gt;GitHub diff: 7.0.1 to 7.0.2&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-core/wordpress-core-69-701-remote-code-execution-via-rest-api-batch-request-route-confusion&quot;&gt;Wordfence threat intel – CVE-2026-63030&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/fullhunt/wp2shell-scan&quot;&gt;FullHunt wp2shell-scan – open-source scanner for CVE-2026-63030&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Are you an enterprise looking to enhance your security posture with advanced attack surface management, vulnerability intelligence, and threat detection? Contact us at team@fullhunt.io or visit our &lt;a href=&quot;https://fullhunt.io/contact-us/&quot;&gt;contact page&lt;/a&gt; to learn how FullHunt can help secure your organization.&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;discover-unknown-assets-today-and-protect-your-organization&quot;&gt;&lt;a href=&quot;https://fullhunt.io/signup&quot;&gt;Discover unknown assets today and protect your organization&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Best regards,&lt;br /&gt;
Mazin Ahmed&lt;br /&gt;
The FullHunt Team&lt;/p&gt;

&lt;p&gt;#JoinTheHunt&lt;/p&gt;</content><author><name></name></author><category term="research" /><category term="wordpress" /><category term="cve" /><summary type="html">CVE-2026-63030 is a pre-authentication remote code execution vulnerability in WordPress Core affecting versions 6.9.0 through 7.0.1. A single anonymous POST to the REST API batch endpoint reaches a SQL injection that leads to direct access to the WordPress and can be escalated to a pre-auth RCE.</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://fullhunt.io/blog/assets/img/wp2shell-og.png" /><media:content medium="image" url="https://fullhunt.io/blog/assets/img/wp2shell-og.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">FullHunt Releases Agentic AI for Attack Surface Intelligence</title><link href="http://0.0.0.0:4000/blog/2025/10/16/fullhunt-releases-agentic-ai-for-attack-surface-intelligence.html" rel="alternate" type="text/html" title="FullHunt Releases Agentic AI for Attack Surface Intelligence" /><published>2025-10-16T00:00:00-05:00</published><updated>2025-10-16T00:00:00-05:00</updated><id>http://0.0.0.0:4000/blog/2025/10/16/fullhunt-releases-agentic-ai-for-attack-surface-intelligence</id><content type="html" xml:base="http://0.0.0.0:4000/blog/2025/10/16/fullhunt-releases-agentic-ai-for-attack-surface-intelligence.html">&lt;p align=&quot;center&quot;&gt;FullHunt launches Agentic AI capabilities for Attack Surface Mapping, Internet-Wide Assets Discovery, and Vulnerability Management to enable security teams to build Agentic AI workflows for securing external attack surfaces.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dkh9ehwkisc4.cloudfront.net/static/files/41db494e-b97d-4c68-a7cb-ca660910d7b5-FullHunt%20blog%20post%20design%20-%201%20(2).png&quot; alt=&quot;FullHunt Agentic AI Release&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;fullhunt-releases-agentic-ai-for-attack-surface-intelligence&quot;&gt;FullHunt Releases Agentic AI for Attack Surface Intelligence&lt;/h1&gt;

&lt;div style=&quot;display: flex; justify-content: center; margin: 2rem 0;&quot;&gt;
  &lt;div style=&quot;position: relative; width: 100%; max-width: 800px; aspect-ratio: 16/9; border-radius: 12px; overflow: hidden; box-shadow: 0 8px 32px rgba(0,0,0,0.3);&quot;&gt;
    &lt;iframe width=&quot;100%&quot; height=&quot;100%&quot; src=&quot;https://www.youtube.com/embed/BqX3wUnBMrY?rel=0&quot; title=&quot;FullHunt Agentic AI Release&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot; style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border-radius: 12px;&quot;&gt;
    &lt;/iframe&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;We’re launching &lt;strong&gt;FullHunt Agentic AI&lt;/strong&gt;, powered by the Model Context Protocol (MCP). Instead of writing scripts, clicking through dashboard tabs, or building custom integrations, you can request for a full attack surface analysis to any organization on the Internet, instantly.&lt;/p&gt;

&lt;p&gt;This is a major upgrade to today’s security testing workflows. With simple prompts, you can enumerate all internet-facing assets for “acme.com,” flag exposed admin panels, find vulnerable assets via FullHunt Vulnerability Intelligence, and surface exposures.&lt;/p&gt;

&lt;p&gt;In recent months, we focused on improving the user experience and exposing all of FullHunt’s APIs and capabilities. We’re excited to share this release.&lt;/p&gt;

&lt;h2 id=&quot;ask-in-simple-words&quot;&gt;Ask in Simple Words&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://dkh9ehwkisc4.cloudfront.net/static/files/107a6edf-a338-4f1b-b54c-154688fb2c52-mcp%20blog%20post%20-%201.png&quot; alt=&quot;FullHunt Agentic AI discovers attack surfaces of any org&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Investigate acme.com and flag exposed admin panels.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The agent discovers subdomains, inspects hosts, looks for admin indicators, correlates with vulnerability data, and returns an actionable report.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Find exploits for CVE-2025-1234 and check our exposure.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It pulls exploits and PoCs, checks your assets, references EPSS/CISA KEV, and prioritizes remediation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Is IP 8.8.8.8 malicious? Which domains point to it?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It runs IP reputation, Tor checks, reverse/passive DNS, and builds a concise threat profile.&lt;/p&gt;

&lt;p&gt;Behind the scenes, many actions run inside FullHunt to keep this simple. In fact, it takes &lt;strong&gt;10 seconds&lt;/strong&gt; to build a full analysis on your attack surface.&lt;/p&gt;

&lt;h2 id=&quot;40-ai-accessible-security-tools&quot;&gt;40+ AI-Accessible Security Tools&lt;/h2&gt;

&lt;p&gt;The FullHunt MCP Server exposes &lt;strong&gt;40+ production tools&lt;/strong&gt; the agent can call:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain &amp;amp; Host Intelligence&lt;/strong&gt;: domain/subdomain discovery, host tech, ASN/IP ranges, DNS &amp;amp; passive DNS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vulnerability Intelligence&lt;/strong&gt;: CVE + EPSS, exploit/PoC lookups, CISA KEV, auto-correlation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attack Surface Management&lt;/strong&gt;: on-demand scans (domains/IPs/CIDRs), continuous discovery, tech stack ID, cert monitoring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Threat Intelligence&lt;/strong&gt;: IP reputation/geo, Tor exit detection, passive DNS, domain collections.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dark Web Monitoring&lt;/strong&gt;: credential/breach intel, phishing and typosquat detection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enterprise&lt;/strong&gt;: orgs &amp;amp; tenants, real-time alerts, asset inventory, custom entity monitoring.&lt;/p&gt;

&lt;h2 id=&quot;available-on-fullhunt-professional-accounts&quot;&gt;Available on FullHunt Professional Accounts!&lt;/h2&gt;

&lt;p&gt;FullHunt Agentic AI is available for both professional and enterprise accounts. You can sign up for a professional plan instantly at &lt;a href=&quot;https://fullhunt.io/signup&quot;&gt;fullhunt.io/signup&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;integration-is-simple&quot;&gt;Integration is Simple&lt;/h2&gt;

&lt;p&gt;FullHunt Agentic AI is built on the Model Context Protocol (MCP), an open standard pioneered by Anthropic for AI tool integration. The following Claude Desktop configuration can be used directly to integrate with FullHunt Agentic AI.&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;mcpServers&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;fullhunt&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;transport&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;http&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;https://fullhunt.io/api/v1/mcp&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;headers&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;X-API-KEY&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;${env:FULLHUNT_API_KEY}&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Enterprise customers get dedicated Agentic AI tenants.&lt;/p&gt;

&lt;p&gt;Get started and contact us for support and integrations.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Are you an enterprise looking to enhance your security posture with AI-powered attack surface management, vulnerability intelligence, and threat detection? Contact us at team@fullhunt.io&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;discover-unknown-assets-today-and-protect-your-organization&quot;&gt;&lt;a href=&quot;https://fullhunt.io/signup&quot;&gt;Discover unknown assets today and protect your organization&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Best regards,&lt;br /&gt;
Mazin Ahmed&lt;br /&gt;
Founder, FullHunt&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;#JoinTheHunt&lt;/p&gt;</content><author><name></name></author><category term="announcement" /><category term="research" /><summary type="html">FullHunt launches Agentic AI capabilities for Attack Surface Mapping, Internet-Wide Assets Discovery, and Vulnerability Management to enable security teams to build Agentic AI workflows for securing external attack surfaces.</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://dkh9ehwkisc4.cloudfront.net/static/files/41db494e-b97d-4c68-a7cb-ca660910d7b5-FullHunt%20blog%20post%20design%20-%201%20(2).png" /><media:content medium="image" url="https://dkh9ehwkisc4.cloudfront.net/static/files/41db494e-b97d-4c68-a7cb-ca660910d7b5-FullHunt%20blog%20post%20design%20-%201%20(2).png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">FullHunt 💜 Open-Source: 39,408 Exploits from 0day.today is Back Online</title><link href="http://0.0.0.0:4000/blog/2025/09/28/fullhunt-releases-0day-today-archive.html" rel="alternate" type="text/html" title="FullHunt 💜 Open-Source: 39,408 Exploits from 0day.today is Back Online" /><published>2025-09-28T00:00:00-05:00</published><updated>2025-09-28T00:00:00-05:00</updated><id>http://0.0.0.0:4000/blog/2025/09/28/fullhunt-releases-0day-today-archive</id><content type="html" xml:base="http://0.0.0.0:4000/blog/2025/09/28/fullhunt-releases-0day-today-archive.html">&lt;p align=&quot;center&quot;&gt;FullHunt is rolling out the complete 0day.today archive, featuring 39,408 exploits and nearly three decades of vulnerability research.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dkh9ehwkisc4.cloudfront.net/static/files/ae8fafd2-1f6b-4f19-bc80-b7b7000d2f41-fullhunt-blog-post-oday-today-release.png&quot; alt=&quot;FullHunt 0Day Archive Release&quot; /&gt;&lt;/p&gt;

&lt;div style=&quot;display: flex; justify-content: center; margin: 2rem 0;&quot;&gt;
  &lt;div style=&quot;position: relative; width: 100%; max-width: 800px; aspect-ratio: 16/9; border-radius: 12px; overflow: hidden; box-shadow: 0 8px 32px rgba(0,0,0,0.3);&quot;&gt;
    &lt;iframe width=&quot;100%&quot; height=&quot;100%&quot; src=&quot;https://www.youtube.com/embed/XslyEr6JtMM?rel=0&quot; title=&quot;Introducing 0Day Archive&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot; style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border-radius: 12px;&quot;&gt;
    &lt;/iframe&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h1 id=&quot;open-source-release-0daytoday-exploits-archive&quot;&gt;Open-Source Release: &lt;a href=&quot;https://0day-archive.fullhunt.io/&quot;&gt;0day.today&lt;/a&gt; Exploits Archive&lt;/h1&gt;

&lt;p&gt;FullHunt is rolling out the complete 0day.today archive, featuring 39,408 exploits and vulnerability research from almost 30 years of security work.&lt;/p&gt;

&lt;p&gt;FullHunt launched &lt;a href=&quot;https://0day-archive.fullhunt.io/&quot;&gt;0day-archive.fullhunt.io&lt;/a&gt; to preserve the legacy of the 0day.today, 1337day, and milw0rm exploits databases.&lt;/p&gt;

&lt;p&gt;The database contains &lt;strong&gt;39,408 exploits&lt;/strong&gt; from 1996–2025, preserving decades of discoveries by the security community.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;what-is-the-0daytoday-archive&quot;&gt;What is the 0day.today Archive?&lt;/h2&gt;

&lt;p&gt;The 0day.today Archive recreates and preserves the classic 0day.today database, part of the Milw0rm legacy.&lt;/p&gt;

&lt;p&gt;Since the 2000s, Milw0rm was a key resource for security researchers, penetration testers, and cybersecurity professionals worldwide, hosting a vast collection of exploits, proof-of-concepts, and vulnerability research.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;credits&quot;&gt;Credits&lt;/h2&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;https://x.com/Junior_Baines/status/1948770840562061647&quot;&gt;Jacob Baines&lt;/a&gt; for cloning and open-sourcing the 0day.today content on GitHub. FullHunt analyzed the data against various open-source clones and restored the website thanks to this contribution.&lt;/p&gt;

&lt;h2 id=&quot;getting-started&quot;&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;Visit &lt;a href=&quot;https://0day-archive.fullhunt.io&quot;&gt;0day-archive.fullhunt.io&lt;/a&gt; to explore the complete archive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visit the archive&lt;/strong&gt;: &lt;a href=&quot;https://0day-archive.fullhunt.io&quot;&gt;0day-archive.fullhunt.io&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;GitHub repository&lt;/strong&gt;: &lt;a href=&quot;https://github.com/fullhunt/0day-today-archive&quot;&gt;github.com/fullhunt/0day-today-archive&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Are you an enterprise looking to enhance your security posture with advanced attack surface management, vulnerability intelligence, and threat detection? Contact us at team@fullhunt.io or visit our &lt;a href=&quot;https://fullhunt.io/contact-us/&quot;&gt;contact page&lt;/a&gt; to learn how FullHunt can help secure your organization.&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;discover-unknown-assets-today-and-protect-your-organization&quot;&gt;&lt;a href=&quot;https://fullhunt.io/signup&quot;&gt;Discover unknown assets today and protect your organization&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Best Regards,&lt;br /&gt;
Mazin Ahmed&lt;br /&gt;
Founder, FullHunt&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;#JoinTheHunt&lt;/p&gt;</content><author><name></name></author><category term="announcement" /><category term="research" /><summary type="html">FullHunt is rolling out the complete 0day.today archive, featuring 39,408 exploits and nearly three decades of vulnerability research.</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://dkh9ehwkisc4.cloudfront.net/static/files/0day-today-archive-release-announcement.png" /><media:content medium="image" url="https://dkh9ehwkisc4.cloudfront.net/static/files/0day-today-archive-release-announcement.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Introducing FullHunt Vulnerability Intelligence</title><link href="http://0.0.0.0:4000/blog/2025/09/18/introducing-fullhunt-vulnerability-intelligence.html" rel="alternate" type="text/html" title="Introducing FullHunt Vulnerability Intelligence" /><published>2025-09-18T00:00:00-05:00</published><updated>2025-09-18T00:00:00-05:00</updated><id>http://0.0.0.0:4000/blog/2025/09/18/introducing-fullhunt-vulnerability-intelligence</id><content type="html" xml:base="http://0.0.0.0:4000/blog/2025/09/18/introducing-fullhunt-vulnerability-intelligence.html">&lt;p&gt;&lt;img src=&quot;https://dkh9ehwkisc4.cloudfront.net/static/files/008706fc-32c3-448e-a549-aea3ea842fe9-vulnerabiliy-intelligence-product-release-post.png&quot; alt=&quot;FullHunt Vulnerability Intelligence&quot; /&gt;&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;FullHunt launches Vulnerability Intelligence - a comprehensive solution to understand and contextualize vulnerabilities at scale with enriched data and public exploits.&lt;/p&gt;

&lt;h1 id=&quot;introducing-fullhunt-vulnerability-intelligence&quot;&gt;Introducing FullHunt Vulnerability Intelligence&lt;/h1&gt;

&lt;p&gt;When I started FullHunt, one of my goals has been to build a centralized ecosystem to understand and secure Internet-facing assets. The journey continues, and today I’m excited to launch an innovation from the FullHunt team: &lt;strong&gt;FullHunt Vulnerability Intelligence&lt;/strong&gt;, and it’s now available to all FullHunt customers and community members.&lt;/p&gt;

&lt;h2 id=&quot;what-is-fullhunt-vulnerability-intelligence&quot;&gt;What is FullHunt Vulnerability Intelligence?&lt;/h2&gt;

&lt;p&gt;FullHunt Vulnerability Intelligence is a comprehensive solution to understand and contextualize vulnerabilities at scale. FullHunt aggregates vulnerability data from various sources, and continuously looks for new exploits, proof of concepts, research papers, and enriches vulnerabilities with various FullHunt sources to build enriched vulnerability data.&lt;/p&gt;

&lt;p&gt;FullHunt provides its Vulnerability Intelligence through the FullHunt console and APIs. You can also integrate it into your own tools, and test it with your free community account.&lt;/p&gt;

&lt;h2 id=&quot;key-features&quot;&gt;Key Features&lt;/h2&gt;

&lt;p&gt;With FullHunt Vulnerability Intelligence, you can:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Find exploits automatically&lt;/strong&gt; for any given CVE&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Get enriched details&lt;/strong&gt; about exploitability updated with EPSS scoring&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Access enrichments&lt;/strong&gt; whenever vulnerabilities are commonly exploited through CISA KEV feeds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;https://dkh9ehwkisc4.cloudfront.net/static/files/1964f583-b559-42f7-ac3d-df2ee1b1a508-exploit-search-2.png&quot; alt=&quot;FullHunt Exploit Search&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;available-through-console-and-apis&quot;&gt;Available Through Console and APIs&lt;/h2&gt;

&lt;p&gt;FullHunt provides its Vulnerability Intelligence through multiple channels:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;FullHunt Console&lt;/strong&gt;: Access vulnerability intelligence directly through our web interface&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;APIs&lt;/strong&gt;: Integrate vulnerability data into your existing security tools and workflows&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Free Community Access&lt;/strong&gt;: Test and explore the capabilities with your free community account&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;continuous-security-innovation&quot;&gt;Continuous Security Innovation&lt;/h2&gt;

&lt;p&gt;We’re continuously building security software, and we’re making it available through our APIs. If you’re a security researcher, consultant, engineer, or anyone interested in security automation, you should check out the &lt;a href=&quot;https://docs.fullhunt.io/&quot;&gt;FullHunt API&lt;/a&gt;!&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Are you an enterprise looking to solve Attack Surface Discovery, continuous monitoring, security scanning, and custom-developed tools and APIs? Please reach out to us at team@fullhunt.io or fill the out form on our &lt;a href=&quot;https://fullhunt.io/contact-us/&quot;&gt;contact page&lt;/a&gt;, and we will be happy to solve your challenges.&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;discover-unknown-assets-today-and-protect-your-organization&quot;&gt;&lt;a href=&quot;https://fullhunt.io/signup&quot;&gt;Discover unknown assets today and protect your organization&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Best Regards,&lt;br /&gt;
Mazin Ahmed&lt;br /&gt;
Founder, FullHunt&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;#JoinTheHunt&lt;/p&gt;</content><author><name></name></author><summary type="html"></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://dkh9ehwkisc4.cloudfront.net/static/files/008706fc-32c3-448e-a549-aea3ea842fe9-vulnerabiliy-intelligence-product-release-post.png" /><media:content medium="image" url="https://dkh9ehwkisc4.cloudfront.net/static/files/008706fc-32c3-448e-a549-aea3ea842fe9-vulnerabiliy-intelligence-product-release-post.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Introducing FullHunt’s OEM Intelligence API for Security Platforms</title><link href="http://0.0.0.0:4000/blog/2025/05/06/fullhunt-oem-api-release.html" rel="alternate" type="text/html" title="Introducing FullHunt’s OEM Intelligence API for Security Platforms" /><published>2025-05-06T00:00:00-05:00</published><updated>2025-05-06T00:00:00-05:00</updated><id>http://0.0.0.0:4000/blog/2025/05/06/fullhunt-oem-api-release</id><content type="html" xml:base="http://0.0.0.0:4000/blog/2025/05/06/fullhunt-oem-api-release.html">&lt;p align=&quot;center&quot;&gt;FullHunt released the OEM Intelligence API to enable seamless integration of attack surface intelligence into security platforms.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dkh9ehwkisc4.cloudfront.net/static/files/c4319b64-b4d0-4517-947a-4c2cdfeb3053-poster%20-%20Introducing%20FullHunt%E2%80%99s%20OEM%20Intelligence%20API%20for%20Security%20Platforms-min.png&quot; alt=&quot;FullHunt OEM Intelligence API&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;introducing-fullhunts-oem-intelligence-api-for-security-platforms&quot;&gt;&lt;strong&gt;Introducing FullHunt’s OEM Intelligence API for Security Platforms&lt;/strong&gt;&lt;/h1&gt;

&lt;p&gt;Today, we’re excited to announce the launch of FullHunt’s &lt;strong&gt;OEM Intelligence API&lt;/strong&gt;, a new offering that allows security platforms and service providers to integrate FullHunt’s dark web monitoring and attack surface intelligence directly into their own products. This initiative is a game-changer for MSSPs, XDR and SIEM vendors, GRC platforms, and any enterprise security solution provider looking to augment their platform with rich security insights. With the OEM API, FullHunt essentially becomes your “intel engine” in the backend – powering your features with our data, FullHunt is rolling out OEM APIs to let you &lt;em&gt;“integrate FullHunt’s discovery and vulnerability scanning into your own security platform,”&lt;/em&gt; offering your users a seamless extension of FullHunt’s attack surface management (ASM) datasets within your product.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dkh9ehwkisc4.cloudfront.net/static/files/80eaeb68-67ab-4e5e-b612-9888f2eb603f-org-db-request-api-min.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;what-does-the-oem-intelligence-api-include&quot;&gt;What Does the OEM Intelligence API Include?&lt;/h2&gt;

&lt;p&gt;The OEM Intelligence API encompasses three primary endpoints, each corresponding to a core FullHunt intelligence service:&lt;/p&gt;

&lt;h3 id=&quot;attack-surface-search-api&quot;&gt;&lt;strong&gt;Attack Surface Search API&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;This endpoint allows you to query FullHunt’s external asset database for information on a given target domain. Essentially, it performs an &lt;strong&gt;attack surface enumeration&lt;/strong&gt; – returning data on all subdomains and hosts related to the domain, along with metadata about each host (open ports, running services, technologies, SSL certificates, and more). Think of it as instantly running an internet-wide scan for your target, but with one API call. For example, if integrated into a security platform, a user who enters their company domain on your interface could receive within seconds a full list of discovered assets: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vpn.acme.com&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mail.acme.com&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dev.acme.com&lt;/code&gt;, etc., each with IP addresses and details like “this host is running nginx on port 443 with a certificate for *.acme.com, and has an HTTP title ‘Acme Corp – Login’”. FullHunt’s scanning engine constantly discovers and refreshes this data, so your platform leverages a living, up-to-date inventory. Use cases include continuous attack surface monitoring (alert when a new subdomain appears or an open port is found), asset inventory for IT/security teams, or even feeding this info into a vulnerability scanner or SOC automation. The key value is that &lt;strong&gt;your users gain immediate visibility into their external footprint&lt;/strong&gt; without running separate scans – it’s all integrated into your product workflow. You can also automate actions like creating tickets for newly exposed services or unsafe configurations detected via the data.&lt;/p&gt;

&lt;h3 id=&quot;organizations-search-api&quot;&gt;&lt;strong&gt;Organizations Search API&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;This endpoint provides &lt;strong&gt;organization intelligence&lt;/strong&gt;, essentially a knowledge base of company information and security-relevant facts. When integrated, it enables your platform to retrieve a profile of any organization by name or domain. The response includes company details (official name, industry, size, headquarters) and importantly, known security incidents (breaches) and related entities (subsidiaries, parent company, etc.). For a practical example, imagine a third-party risk management module in your GRC software: when onboarding a new vendor, you could call this API to automatically fill in the vendor’s profile and flag if that company has a history of breaches or cybersecurity incidents. Similarly, a threat intelligence platform might use it to enrich context around targets or adversaries (e.g. pulling up info on a company that a threat actor claims to have breached). All of this with one query. It adds a layer of situational awareness that can greatly aid decision-making in security operations and risk assessment. From a technical standpoint, this API is straightforward to use and the returned JSON is well-structured, so parsing out fields like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;estimated_employee_count&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;notable_breaches&lt;/code&gt; is trivial.&lt;/p&gt;

&lt;h3 id=&quot;dark-web-search-api&quot;&gt;&lt;strong&gt;Dark Web Search API&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;This endpoint gives your platform direct access to FullHunt’s dark web and breach intelligence database. You can search for compromised credentials and sensitive data exposures using a variety of identifiers. For example, you can query by an email address to find if that email (or accounts associated with it) have appeared in any data breaches, or search by a company domain to retrieve all credential leaks related to that organization. FullHunt’s dataset covers credentials and personal info leaked on underground forums, paste sites, dark web marketplaces, and public breach dumps. The API returns detailed records including exposed usernames, passwords (hashed or plaintext), names, contact info, and the source of the breach. By integrating this, an MSSP or XDR platform could automatically enrich an alert (e.g. “user account suspicious login”) with a check against dark web data – &lt;strong&gt;“has this user’s password been leaked online?”&lt;/strong&gt; – and immediately inform the analyst or end-customer if a compromise is found. It’s a powerful addition to threat intelligence feeds for incident response and identity protection. And because the search can be parameterized by different fields (username, IP, password, etc.), creative use cases abound – you might even integrate it into your vulnerability management workflow to see if any known exploits (by CVE) or specific indicators have associated leaked data. The possibilities for proactive threat hunting are huge.&lt;/p&gt;

&lt;p&gt;All three APIs support an optional &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;query_tags&lt;/code&gt; in the request, letting you attach metadata (like a customer ID or use-case tag) to each query for your own tracking. The responses also include metadata such as timestamps and result counts. Crucially, &lt;strong&gt;every request is authenticated with your API key and logged on FullHunt’s side&lt;/strong&gt;, providing traceability (FullHunt maintains audit logs for the OEM API usage). This means you can monitor how your integration is being used and ensure it’s in line with any usage quotas or compliance needs.&lt;/p&gt;

&lt;h2 id=&quot;integration-examples--workflows&quot;&gt;&lt;strong&gt;Integration Examples &amp;amp; Workflows&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;To illustrate how the OEM Intelligence API can be leveraged in real-world scenarios, let’s walk through a few example workflows that a security vendor might implement:&lt;/p&gt;

&lt;h3 id=&quot;continuous-attack-surface-monitoring-mssp-platform&quot;&gt;&lt;strong&gt;Continuous Attack Surface Monitoring (MSSP platform)&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;If you’re an MSSP managing dozens of clients, you can integrate the Attack Surface API to run on a schedule (say nightly or weekly) for each client’s domain. Each run fetches the latest external asset list. You can then automatically compare it to the last known list and detect changes. New host discovered? Your platform can raise an alert or open a ticket in the client’s queue: &lt;em&gt;“A new subdomain ‘staging.acme.com’ was detected this week, pointing to an IP in AWS – please verify if this is expected.”&lt;/em&gt; Likewise, if a previously seen host now has an open port 22 exposed where it didn’t before, that could indicate a security change worth investigating. Essentially, FullHunt’s data becomes the eyes on the outside of each client’s network, and your platform acts as the brain to decide what to do with that data. Multi-tenant tagging ensures each domain’s results are tracked to the right client. The outcome is a value-add service: &lt;strong&gt;Attack Surface Monitoring as a Service&lt;/strong&gt;, powered by FullHunt in the backend but delivered through your operations.&lt;/p&gt;

&lt;h3 id=&quot;third-party-risk-assessment-grc-workflow&quot;&gt;&lt;strong&gt;Third-Party Risk Assessment (GRC workflow)&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;In a GRC or vendor risk management application, assessing a new partner or vendor often requires gathering information about that organization’s size, industry, and any past breaches. By integrating the Organizations Search API, your platform can auto-populate these details. For example, when a user enters a vendor name, your system calls the API and fills out: Company X, ~1,200 employees, HQ in London, sector = Healthcare. It might also display a highlight: &lt;em&gt;“Security incidents: 1 – Data breach in 2019 exposing 200k patient records.”&lt;/em&gt; This equips the risk assessor with instant context, prompting deeper questions or controls if needed. It saves hours of manual research per vendor. Additionally, if you maintain a dashboard of all critical suppliers, you could periodically re-check each via the API to catch any newly reported breaches (e.g. if one of your suppliers gets hacked and it’s noted in the data, you’d want to know ASAP). This integration turns FullHunt’s intel into a proactive risk monitoring tool within your product.&lt;/p&gt;

&lt;h3 id=&quot;product-contextualization-security-analytics-platform&quot;&gt;&lt;strong&gt;Product Contextualization (Security Analytics platform)&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Imagine a security analytics platform that investigates threats across multiple companies. When an analyst is looking at a particular threat actor or campaign, they might have a list of target organizations. Using FullHunt’s APIs, the platform can provide one-click context: For each organization, fetch their profile (Org API) to see what that company does, and fetch their attack surface summary (Attack Surface API) to see what infrastructure they have exposed. This can help the analyst understand why that threat actor might be interested (e.g. targeting all fintech companies with open Jenkins servers). It’s an enrichment step that adds narrative and depth to threat intelligence reporting.&lt;/p&gt;

&lt;p&gt;These examples scratch the surface of what’s possible. The flexibility of FullHunt’s OEM API means if you can think of a security use-case involving external intelligence, you can likely implement it with a bit of API glue. From augmenting vulnerability scanners with external context, to feeding SOC runbooks, to enhancing security ratings, the integration potential is vast.&lt;/p&gt;

&lt;h3 id=&quot;breach-alert-enrichment-xdrsiem&quot;&gt;&lt;strong&gt;Breach Alert Enrichment (XDR/SIEM)&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Suppose your XDR platform generates an alert for unusual activity on an admin user account. Through the FullHunt OEM integration, your platform can automatically query the Dark Web API for that user’s email as soon as the alert triggers. If the API returns that this email appears in a recent credential dump with a known password, your platform could attach a note to the alert: &lt;em&gt;“Credentials for this user were found in a 2024 breach (password: Password123).”&lt;/em&gt; This gives the analyst immediate insight that the account may be compromised due to password reuse. Your platform could even automate a higher severity rating or prompt an on-demand password reset workflow. All of this happens seamlessly — the analyst doesn’t have to pivot to an external breach-check service; the intelligence is injected right into the alert timeline. Over time, such enrichment dramatically improves incident response by adding context. It also adds value for your customers, as they get proactive breach notification embedded in your service.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example of FullHunt’s data in action: Through the OEM Attack Surface API, you can retrieve this attack surface data (thousands of subdomains and hosts for a given domain, complete with IPs and metadata) in JSON format and integrate it into your own tools. In practice, this means within your platform, a client could enter a domain like “acme.com” and get an instant inventory of results just like the list shown above – enabling proactive management of external assets and exposures.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;seamless-integration-and-support&quot;&gt;&lt;strong&gt;Seamless Integration and Support&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Getting started with the FullHunt OEM Intelligence API is designed to be developer-friendly. If you’re familiar with RESTful APIs and JSON, you’ll find FullHunt’s API straightforward. You authenticate with an API key via a header, and then send &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;POST&lt;/code&gt; requests to specific endpoints under the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/api/v1/oem/&lt;/code&gt; path for the features described. FullHunt’s documentation site provides copy-pastable &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;curl&lt;/code&gt; examples for each endpoint, making initial testing a breeze. For instance, to search the attack surface data for a domain, you’d use an HTTP POST to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/oem/atack-surface/search&lt;/code&gt; with a JSON body like:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
 &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;domain&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;query&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;acme.com&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;query_tags&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;client&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ACME Corp&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;  
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And you’d receive back a JSON response containing an array of all matching leaked records related to “acme.com”. The patterns are similar for the other endpoints (with slight differences in required fields), so once you integrate one, adding the others is intuitive.&lt;/p&gt;

&lt;p&gt;FullHunt also ensures that OEM partners have the support they need. When you come on board as an OEM partner, you will coordinate with FullHunt’s team to get your API key provisioned with the proper access. Typically, this involves contacting FullHunt sales or support – as noted in the documentation, OEM access is enabled for partners by request. After that, you’re free to integrate and test. During integration, if you have questions, FullHunt’s technical support is available. They can help with optimizing queries, understanding the data schema, or troubleshooting any issues. Additionally, because OEM integrations can be complex, FullHunt is open to feedback – if you need a certain feature or data point exposed via the API to support your use case, we can accommodate it or put it on the roadmap.&lt;/p&gt;

&lt;p&gt;On the operational side, FullHunt’s OEM API comes with built-in &lt;strong&gt;user credit management&lt;/strong&gt; and audit logs for queries.&lt;/p&gt;

&lt;h2 id=&quot;ready-to-unlock-fullhunt-intelligence-in-your-platform&quot;&gt;&lt;strong&gt;Ready to Unlock FullHunt Intelligence in Your Platform?&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;The FullHunt OEM Intelligence API represents a bold step towards collaborative innovation in cybersecurity. By opening up our intelligence via OEM channels, we aim to empower other security providers to deliver better outcomes for end users. Whether you’re an MSSP looking to enhance your managed services or a security product company aiming to expand features, FullHunt’s data can become a force-multiplier for your offerings.&lt;/p&gt;

&lt;p&gt;We invite you to explore what FullHunt OEM Intelligence can do for your organization. &lt;strong&gt;Dive into our developer documentation (&lt;/strong&gt;&lt;a href=&quot;https://api-docs.fullhunt.io/&quot;&gt;api-docs.fullhunt.io&lt;/a&gt;) to see the technical details and example responses. If you’re interested in becoming an OEM partner, &lt;strong&gt;contact our team&lt;/strong&gt; (sales@fullhunt.io or via our website) to discuss access and partnership options – we’ll work with you to get the API enabled on your account and ensure a smooth onboarding.&lt;/p&gt;

&lt;p&gt;With FullHunt, you can deliver attack surface mapping, organization intelligence, dark web monitoring as an integrated part of your service – all backed by FullHunt’s proven technology and extensive data. We’re excited to see how you will innovate with these capabilities at your fingertips.&lt;/p&gt;

&lt;h3&gt;Download an in-depth documentation report about the OEM Intelligence API Product&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://fullhunt.io/reports/oem&quot;&gt;OEM Intelligence API - in-depth Product Documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unlock the power of FullHunt OEM Intelligence API today, and give your platform the definitive edge in security intelligence.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Best Regards,&lt;br /&gt;
Mazin Ahmed&lt;/p&gt;</content><author><name></name></author><category term="research" /><summary type="html">FullHunt released the OEM Intelligence API to enable seamless integration of attack surface intelligence into security platforms.</summary></entry><entry><title type="html">FullHunt Exciting New Features and Free APIs! 🚀</title><link href="http://0.0.0.0:4000/blog/2024/07/08/fullhunt-release-announcement.html" rel="alternate" type="text/html" title="FullHunt Exciting New Features and Free APIs! 🚀" /><published>2024-07-08T00:00:00-05:00</published><updated>2024-07-08T00:00:00-05:00</updated><id>http://0.0.0.0:4000/blog/2024/07/08/fullhunt-release-announcement</id><content type="html" xml:base="http://0.0.0.0:4000/blog/2024/07/08/fullhunt-release-announcement.html">&lt;p align=&quot;center&quot;&gt;Explore FullHunt's new features and free APIs. The FullHunt team has been working on exciting attack surface discovery and threat intelligence features - #JoinTheHunt.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dkh9ehwkisc4.cloudfront.net/static/files/6cd2472b-6804-476d-9d27-b1809fe7ca90-fullhunt%20announcement%20Exciting%20New%20Features%20and%20Free%20APIs.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;exciting-updates-from-fullhunt--new-features-and-free-apis-&quot;&gt;Exciting Updates from FullHunt – New Features and Free APIs! 🚀&lt;/h1&gt;

&lt;p&gt;We’ve got some exciting news to share. Over the past few months, we’ve been busy building awesome new products and features at FullHunt, and we can’t wait to tell you all about them.&lt;/p&gt;

&lt;h2 id=&quot;whats-coming-up&quot;&gt;What’s Coming Up?&lt;/h2&gt;

&lt;p&gt;We’ve been working on some exciting new products, features, and tools that will be rolling out in the next few weeks. Keep an eye out for our announcements — these updates are going to make a big difference in your attack surface discovery!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dkh9ehwkisc4.cloudfront.net/static/files/db08cab6-15e7-468f-93fd-867ee5132e4b-screenshot-7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;free-community-apis--now-available&quot;&gt;Free Community APIs – Now Available!&lt;/h2&gt;

&lt;p&gt;We’ve also launched new free community APIs to help you discover your external attack surface more effectively.&lt;/p&gt;

&lt;h2 id=&quot;introducing-data-intelligence-apis&quot;&gt;Introducing Data Intelligence APIs&lt;/h2&gt;

&lt;p&gt;Data Intelligence APIs are designed to help you run threat intelligence and large-scale internet investigations by querying the FullHunt Database for a wide range of use cases and characteristics.&lt;/p&gt;

&lt;p&gt;FullHunt runs one of the largest databases for attack surfaces on the Internet, and we’re happy to make it available to the community.&lt;/p&gt;

&lt;p&gt;We have rolled out the Data Intelligence product and APIs to a closed number of enterprise customers, and they’re already finding it useful in their security automation and investigations. The APIs are available now, and we think they’ll be a great addition to your security toolkit.&lt;/p&gt;

&lt;p&gt;The results are limited for community accounts. Enterprise accounts gain full access to Data Intelligence API.&lt;/p&gt;

&lt;p&gt;Check out the new APIs here: &lt;a href=&quot;https://api-docs.fullhunt.io/#data-intelligence-apis&quot;&gt;Data Intelligence APIs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We will announce it more in-depth in upcoming weeks.&lt;/p&gt;

&lt;h2 id=&quot;we-want-to-hear-from-you&quot;&gt;We Want to Hear from You&lt;/h2&gt;

&lt;p&gt;Your feedback is super important to us. We’d love to hear what you think about the new features and how we can keep improving.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://fullhunt.io/contact-us/&quot;&gt;Share your thoughts with us here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for being a part of the FullHunt community. We’re really excited about these new updates and can’t wait to support you even more.&lt;/p&gt;

&lt;p&gt;#JoinTheHunt&lt;/p&gt;

&lt;p&gt;Best Regards,&lt;br /&gt;
Mazin Ahmed&lt;br /&gt;
Founder &amp;amp; CTO, FullHunt&lt;br /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Are you an enterprise that is looking to solve Attack Surface Discovery, continuous monitoring, security scanning, and custom-developed tools and APIs? Please reach out to us at team@fullhunt.io, and we will be happy to solve your challenges.&lt;/strong&gt; Please request a FullHunt Enterprise trial and we will be happy to solve your challenges.&lt;/p&gt;

&lt;h3 id=&quot;discover-unknown-assets-today-and-protect-your-organization&quot;&gt;&lt;a href=&quot;https://fullhunt.io/&quot;&gt;Discover unknown assets today and protect your organization&lt;/a&gt;&lt;/h3&gt;</content><author><name></name></author><category term="announcement" /><summary type="html">Explore FullHunt's new features and free APIs. The FullHunt team has been working on exciting attack surface discovery and threat intelligence features - #JoinTheHunt.</summary></entry><entry><title type="html">Log4J-scan update: Detection for Apache Commons Text RCE (CVE-2022-42889)</title><link href="http://0.0.0.0:4000/blog/2022/10/20/apache-commons-text-rce.html" rel="alternate" type="text/html" title="Log4J-scan update: Detection for Apache Commons Text RCE (CVE-2022-42889)" /><published>2022-10-20T00:00:00-05:00</published><updated>2022-10-20T00:00:00-05:00</updated><id>http://0.0.0.0:4000/blog/2022/10/20/apache-commons-text-rce</id><content type="html" xml:base="http://0.0.0.0:4000/blog/2022/10/20/apache-commons-text-rce.html">&lt;p align=&quot;center&quot;&gt;FullHunt released an update to Log4J-Scan to detect Apache Commons Text RCE (CVE-2022-42889).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dkh9ehwkisc4.cloudfront.net/static/files/86be47af-e11a-4d36-a17e-e6fc5f18aaf9-Detecting%20Apache%20Commons%20Text%20RCE%20blog%20post.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;detecting-apache-commons-text-rce-cve-2022-42889&quot;&gt;Detecting Apache Commons Text RCE (CVE-2022-42889)&lt;/h1&gt;

&lt;p&gt;The Apache Commons Text RCE (CVE-2022-42889) is a critical vulnerability that is highly similar to Log4J RCE. Successful exploitation of this vulnerability allows full remote code execution on affected services. The vulnerability has been ranked a CVSS score of 9.8/10.&lt;/p&gt;

&lt;p&gt;We have tested the vulnerability in our local lab and confirmed the potential severity of this vulnerability.&lt;/p&gt;

&lt;p&gt;FullHunt released an update to identify Apache Commons Text RCE (CVE-2022-42889). We recommend patching it as soon as possible. If help is needed in scanning and discovering this vulnerability on your infrastructure, please get in touch at (team@fullhunt.io).&lt;/p&gt;

&lt;h1 id=&quot;demo&quot;&gt;Demo&lt;/h1&gt;

&lt;p&gt;&lt;img src=&quot;https://dkh9ehwkisc4.cloudfront.net/static/files/545a0960-3dc4-4157-bf82-c79d0b73a3e7-CVE-2022-42889-demo.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;log4j-scan-project-githubcomfullhuntlog4j-scan&quot;&gt;&lt;a href=&quot;https://github.com/fullhunt/log4j-scan&quot;&gt;log4j-scan Project: github.com/fullhunt/log4j-scan&lt;/a&gt;&lt;/h2&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Are you an enterprise that is looking for help with scanning for Apache Commons Text RCE (CVE-2022-42889), discovering all the external internet-facing assets, network services, applications, services, and endpoints?&lt;/strong&gt; Please request a FullHunt Enterprise trial and we will be happy to solve your challenges.&lt;/p&gt;

&lt;h3 id=&quot;discover-unknown-assets-today-and-protect-your-organization&quot;&gt;&lt;a href=&quot;https://fullhunt.io/signup/&quot;&gt;Discover unknown assets today and protect your organization&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Best regards,&lt;br /&gt;
Mazin Ahmed&lt;br /&gt;
The FullHunt Team&lt;/p&gt;</content><author><name></name></author><category term="research" /><summary type="html">FullHunt released an update to Log4J-Scan to detect Apache Commons Text RCE (CVE-2022-42889).</summary></entry><entry><title type="html">Detecting Spring4Shell RCE CVE-2022-22965 at scale</title><link href="http://0.0.0.0:4000/blog/2022/04/08/detecting-springshell-rce-at-scale.html" rel="alternate" type="text/html" title="Detecting Spring4Shell RCE CVE-2022-22965 at scale" /><published>2022-04-08T00:00:00-05:00</published><updated>2022-04-08T00:00:00-05:00</updated><id>http://0.0.0.0:4000/blog/2022/04/08/detecting-springshell-rce-at-scale</id><content type="html" xml:base="http://0.0.0.0:4000/blog/2022/04/08/detecting-springshell-rce-at-scale.html">&lt;p align=&quot;center&quot;&gt;FullHunt developed an open-source tool for discovering Spring4Shell RCE at scale.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dkh9ehwkisc4.cloudfront.net/static/files/1f91695e-02f8-4652-aba4-f447e35145be-spring4shell-scan-blog-header.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;detecting-java-spring-rce-at-scale&quot;&gt;Detecting Java Spring RCE at scale&lt;/h1&gt;

&lt;p&gt;The Spring4Shell RCE is a CVE-2022-22965 critical vulnerability that has been exploited by threat actors this weekend. At FullHunt, we developed, spring4shell-scan: a fully automated, reliable, and accurate scanner for finding Java Spring RCE (Spring4Shell). It was mainly available for our customers during the past days. We’re glad to be open-sourcing it now!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dkh9ehwkisc4.cloudfront.net/static/files/1e1ae28a-96f7-44b0-810b-977f78960dfe-github-repo.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;fullhunt-vs-spring4shell&quot;&gt;FullHunt vs. Spring4Shell&lt;/h1&gt;

&lt;p&gt;As soon as the Spring4Shell vulnerability was announced, we started investigating the exploitability of these vulnerabilities. The FullHunt platform already supports the discovery and automatic classification of Spring apps. This was a life-saver feature to be able to map all Spring apps within hundreds of thousands of assets while the vulnerability has been released.&lt;/p&gt;

&lt;p&gt;We focused on researching the detection of Spring4Shell CVE-2022-22965 vulnerability and the Spring Cloud RCE CVE-2022-22963.&lt;/p&gt;

&lt;h1 id=&quot;how-to-detect-spring4shell-and-spring-cloud-rce&quot;&gt;How to detect Spring4Shell and Spring Cloud RCE?&lt;/h1&gt;

&lt;p&gt;The Spring4Shell is essentially a Java Deserialization vulnerability that can be highly noisy and sensitive during its detection and exploitation. The current way that we observed to be used by threat actors makes use of the initially published Proof of Concept that was shared online. The initial Proof of Concept takes an unsafe approach where a JSP web-shell is uploaded when knowing the correct path (while being set to a default path). This is inaccurate, can be easily detected, can definitely be easy to evade.&lt;/p&gt;

&lt;p&gt;The approach that FullHunt has taken works by sending a corrupted raw object that triggers an exception when deserialized. Once an exception is detected, a check is sent to validate that the payload has effectively triggered an exception - so that if an API endpoint for instance is already returning 4XX or 5XX errors, it wouldn’t cause a False Positive. Additionally, within spring4shell-scan, payloads are tested in different HTTP methods, as we have higher accuracy in testing in different HTTP methods.&lt;/p&gt;

&lt;p&gt;This approach also applies to Spring Cloud CVE-2022-22963, where a malicious SpEL query can lead to remote code execution. We have found that sending corrupted SpEL queries can be a valid method for discovering the Spring Cloud CVE-2022-22963.&lt;/p&gt;

&lt;h1 id=&quot;waf-rules-we-bypassed-them-during-our-tests&quot;&gt;WAF rules? We bypassed them during our tests&lt;/h1&gt;

&lt;p&gt;The main approach that several companies have used to protect against the new Spring4Shell (CVE-2022-22965) and CVE-2022-22963 are through WAF rules provided by vendors. We have developed payloads that have been tested against several WAF vendors, and it was confirmed to be bypassing the majority of WAF rules during our tests. It’s advised to contact your WAF vendor to make sure that the new techniques developed by FullHunt are blocked.&lt;/p&gt;

&lt;p&gt;We mainly recommend that companies update their Spring setup and dependencies as the approach for remediating these sets of vulnerabilities. Virtual patching through WAF should be only taken as a temporary approach.&lt;/p&gt;

&lt;p&gt;As many companies are facing challenges discovering its Spring deployments. We have been helping companies map its Spring deployments, scan them for all of the released Spring vulnerabilities, and run continuous security scanning.&lt;/p&gt;

&lt;h1 id=&quot;demo&quot;&gt;Demo&lt;/h1&gt;

&lt;p&gt;&lt;img src=&quot;https://dkh9ehwkisc4.cloudfront.net/static/files/8b677a1b-7c53-40b1-933e-e10f571c8bb8-spring4shell-Demo.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;spring4shell-scan-project-githubcomfullhuntspring4shell-scan&quot;&gt;&lt;a href=&quot;https://github.com/fullhunt/spring4shell-scan&quot;&gt;spring4shell-scan Project: github.com/fullhunt/spring4shell-scan&lt;/a&gt;&lt;/h2&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Are you an enterprise that is looking for help with scanning for Spring4Shell, discovering all the externally public assets, network services, applications, services, and endpoints?&lt;/strong&gt; Please request a FullHunt Enterprise trial and we will be happy to solve your challenges.&lt;/p&gt;

&lt;h3 id=&quot;discover-unknown-assets-today-and-protect-your-organization&quot;&gt;&lt;a href=&quot;https://fullhunt.io/signup/&quot;&gt;Discover unknown assets today and protect your organization&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Best regards,&lt;br /&gt;
Mazin Ahmed&lt;br /&gt;
The FullHunt Team&lt;/p&gt;</content><author><name></name></author><category term="research" /><summary type="html">FullHunt developed an open-source tool for discovering Spring4Shell RCE at scale.</summary></entry><entry><title type="html">Detecting Log4j RCE CVE-2021-44228 at scale</title><link href="http://0.0.0.0:4000/blog/2021/12/13/detecting-log4j-rce-at-scale.html" rel="alternate" type="text/html" title="Detecting Log4j RCE CVE-2021-44228 at scale" /><published>2021-12-13T00:00:00-06:00</published><updated>2021-12-13T00:00:00-06:00</updated><id>http://0.0.0.0:4000/blog/2021/12/13/detecting-log4j-rce-at-scale</id><content type="html" xml:base="http://0.0.0.0:4000/blog/2021/12/13/detecting-log4j-rce-at-scale.html">&lt;p&gt;FullHunt developed an open-source tool for discovering Apache Log4j RCE CVE-2021-4428 at scale.&lt;/p&gt;

&lt;h2 id=&quot;detecting-apache-log4j-rce-at-scale&quot;&gt;Detecting Apache Log4J RCE at scale&lt;/h2&gt;

&lt;p&gt;The Apache Log4J RCE CVE-2021-4428 is a critical vulnerability that has been heavily exploited by threat actors this weekend. At FullHunt, we developed, log4j-scan: a fully automated, accurate, and extensive scanner for finding Apache Log4j RCE. It was mainly available for our customers during the past days. We’re glad to be open-sourcing it now!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dkh9ehwkisc4.cloudfront.net/static/files/f06756ae-b184-443f-a958-68162f4e62a0-FGde2icX0AEqWqf.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;how-log4j-scan-works&quot;&gt;How log4j-scan works?&lt;/h1&gt;

&lt;p&gt;Log4j-scan fuzzes HTTP request headers, POST data, JSON body, and all possible points where a Log4j entry can be generated from an HTTP request. It also has WAF bypass payloads that can be tested to evaluate the security of WAFs and make sure that WAFs are blocking Log4J variants.&lt;/p&gt;

&lt;p&gt;It uses DNS OOB callback to validate whether an host is affected, and it does not attempt to exploit the RCE vulnerability.&lt;/p&gt;

&lt;p&gt;FullHunt Enterprise customers have already been tested once the vulnerability was released, and all FullHunt Enterprise customers have this RCE resolved.&lt;/p&gt;

&lt;h2 id=&quot;demo&quot;&gt;Demo&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://dkh9ehwkisc4.cloudfront.net/static/files/80e52a5b-7d72-44c2-8187-76a2a58f5657-demo.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;log4j-scan-project-githubcomfullhuntlog4j-scan&quot;&gt;&lt;a href=&quot;https://github.com/fullhunt/log4j-scan&quot;&gt;log4j-scan Project: github.com/fullhunt/log4j-scan&lt;/a&gt;&lt;/h2&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Are you an enterprise that is looking for assets discovery, continuous monitoring, security scanning, better support, more features, and custom-developed tools?&lt;/strong&gt; Please reach out to us at team@fullhunt.io, and we will be happy to solve your challenges.&lt;/p&gt;

&lt;h3 id=&quot;discover-unknown-assets-today-and-protect-your-organization&quot;&gt;&lt;a href=&quot;https://fullhunt.io/signup/&quot;&gt;Discover unknown assets today and protect your organization&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Best regards,&lt;br /&gt;
Mazin Ahmed&lt;br /&gt;
The FullHunt Team&lt;/p&gt;</content><author><name></name></author><category term="research" /><summary type="html">FullHunt developed an open-source tool for discovering Apache Log4j RCE CVE-2021-4428 at scale.</summary></entry><entry><title type="html">FullHunt 💜 Open-Source: Integration with Amass + SpiderFoot</title><link href="http://0.0.0.0:4000/blog/2021/12/07/fullhunt-integration-with-amass-spiderfoot.html" rel="alternate" type="text/html" title="FullHunt 💜 Open-Source: Integration with Amass + SpiderFoot" /><published>2021-12-07T00:00:00-06:00</published><updated>2021-12-07T00:00:00-06:00</updated><id>http://0.0.0.0:4000/blog/2021/12/07/fullhunt-integration-with-amass-spiderfoot</id><content type="html" xml:base="http://0.0.0.0:4000/blog/2021/12/07/fullhunt-integration-with-amass-spiderfoot.html">&lt;p&gt;FullHunt Public API is now a data provider for Amass + SpiderFoot!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dkh9ehwkisc4.cloudfront.net/static/files/268878e6-d236-4e1d-acc5-5dd1f421e83f-fullhunt-integration-with-amass-spiderfoot.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;fullhunt--open-source&quot;&gt;FullHunt 💜 Open-Source&lt;/h2&gt;

&lt;p&gt;If there is one thing we’re excited about, it’s the Open-Source community. Today, we’re glad to announce the integration of FullHunt with two major security tools within the OSINT industry: Amass + SpiderFoot. FullHunt is now a data provider that powers the OSINT and passive scanning for Amass and SpiderFoot to discover attack surfaces. This comes in addition to TheHarvester too, which came last month.&lt;/p&gt;

&lt;h2 id=&quot;fullhunt-integration-with-amass-&quot;&gt;FullHunt integration with Amass 🚀&lt;/h2&gt;

&lt;p&gt;The new release of Amass includes the FullHunt API as a data source of the subdomain enumeration phase of Amass.&lt;/p&gt;

&lt;p&gt;I have been a big fan of Amass since its release a few years ago, I’m glad to see this happening!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dkh9ehwkisc4.cloudfront.net/static/files/1c890d05-0a54-42de-9262-5009251caf8d-screenshot-nov16-2-1.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dkh9ehwkisc4.cloudfront.net/static/files/dc5fd48a-afd8-4eaf-8214-09f68bfb1004-Screenshot-nov16-1-1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Tweet: &lt;a href=&quot;https://twitter.com/owaspamass/status/1459019750437236759&quot;&gt;https://twitter.com/owaspamass/status/1459019750437236759&lt;/a&gt;&lt;/p&gt;

&lt;h1 id=&quot;fullhunt-integration-with-spiderfoot-framework️&quot;&gt;FullHunt integration with SpiderFoot Framework🕷️&lt;/h1&gt;

&lt;p&gt;SpiderFoot was one of the first adopters to FullHunt. as soon as the FullHunt API reached beta, SpiderFoot has developed a module for FullHunt and a Pull Request was ready by &lt;a href=&quot;https://twitter.com/_bcoles&quot;&gt;@_bcoles&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It’s really exciting to see SpiderFoot integrating FullHunt for OSINT. I especially liked the use of several data points FullHunt is probing to build an OSINT interface.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dkh9ehwkisc4.cloudfront.net/static/files/9e01e74c-5671-4b51-a006-f36708ac246a-screenshot-nov16-3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;fullhunt-api-documentation&quot;&gt;&lt;a href=&quot;https://api-docs.fullhunt.io&quot;&gt;FullHunt API Documentation&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;You can find the API documentation for the public API at: &lt;a href=&quot;https://api-docs.fullhunt.io/&quot;&gt;api-docs.fullhunt.io&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;api-keys&quot;&gt;API Keys&lt;/h3&gt;

&lt;p&gt;You can obtain an API key by signing up for a free account at FullHunt. If you’re an enterprise customer, your account receives unlimited access to the FullHunt public API.&lt;/p&gt;

&lt;h1 id=&quot;this-is-just-the-beginning&quot;&gt;This is just the beginning…&lt;/h1&gt;

&lt;p&gt;We’re in the process of integrating FullHunt with the Metasploit framework to allow Attack Surface Discovery within seconds right from the Metasploit console.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dkh9ehwkisc4.cloudfront.net/static/files/f705e037-4085-4b5c-80e1-1eff6c3b4737-screenshot-nov16-4-1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;PR: &lt;a href=&quot;https://github.com/rapid7/metasploit-framework/issues/15857&quot;&gt;https://github.com/rapid7/metasploit-framework/issues/15857&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Would you like to contribute to the Metasploit and build an Auxiliary Module for discovering attack surfaces using FullHunt.io? This will be a great addition :)&lt;/p&gt;

&lt;h1 id=&quot;huge-thanks-to-the-amazing-open-source-contributors&quot;&gt;Huge Thanks to the amazing Open-Source contributors&lt;/h1&gt;

&lt;p&gt;This would not have been possible without the amazing Open-Source contributors:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://twitter.com/jeff_foley&quot;&gt;Jeff Foley&lt;/a&gt;: for building Amass, and developing the excellent integration of FullHunt on ADS language.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://twitter.com/_bcoles&quot;&gt;@_bcoles&lt;/a&gt;: for building the extensive SpiderFoot integration that utilizes several FullHunt datapoints on its OSINT gathering.&lt;/li&gt;
  &lt;li&gt;Everyone at SpiderFoot, theHarvester, and Amass for being awesome.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Are you an enterprise that is looking for more features, continuous monitoring, security scanning, better support, more features, and custom-developed tools?&lt;/strong&gt; Please reach out to us at team@fullhunt.io, and we will be happy to solve your challenges.&lt;/p&gt;

&lt;h3 id=&quot;discover-unknown-assets-today-and-protect-your-organization&quot;&gt;&lt;a href=&quot;https://fullhunt.io/signup/&quot;&gt;Discover unknown assets today and protect your organization&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Best regards,&lt;br /&gt;
Mazin Ahmed&lt;br /&gt;
The FullHunt Team&lt;/p&gt;</content><author><name></name></author><category term="announcement" /><category term="platform" /><category term="release" /><category term="assets-discovery" /><category term="api" /><category term="automation" /><category term="owasp" /><category term="amass" /><category term="spiderfoot" /><category term="attack-surface-management" /><summary type="html">FullHunt Public API is now a data provider for Amass + SpiderFoot!</summary></entry></feed>