REPORT / 01

Analysis Report · Folder Analysis cache/frontis-blocks_1.1.6 → cache/frontis-blocks_1.1.7 — CVE-2026-0807

Shared security patch analysis results

mode patchdiff ai claude_cli haiku
02 · Lifecycle actions cancel · resume · skip · regenerate
03 · Share this analysis copy link · embed report
03 · CVE Security Analysis & Writeups ai-generated · per cve

Comprehensive security analysis generated by AI for each confirmed CVE match. Click on a CVE to view the detailed writeup including vulnerability background, technical details, patch analysis, and PoC guide.

CVE-2026-0807 NVD
AI-Generated Analysis
05 · Findings filter · search · paginate
Use quotes for exact: "SQL injection" · Operators: hello AND bye, admin OR root, -error, NOT warning
Showing 0 to 0 of 0 results
includes/Admin/Admin.php AI: 3 vulnerabilities 1 false positive, 2 true positives CVE-2026-0807
--- cache/frontis-blocks_1.1.6/includes/Admin/Admin.php	2026-01-24 00:23:23.425598195 +0000+++ cache/frontis-blocks_1.1.7/includes/Admin/Admin.php	2026-01-24 00:23:49.583224348 +0000@@ -136,7 +136,7 @@         if ('toplevel_page_frontis-blocks' == $hook || 'post.php' == $hook || 'post-new.php' == $hook || 'site-editor.php' == $hook) {             $suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '' : ''; -            wp_enqueue_style('frontis-blocks-admin', FB_PLUGIN_URL . 'assets/admin/dashboard' . $suffix . '.css', array(), '1.0.0');+            wp_enqueue_style('frontis-blocks-admin', FB_PLUGIN_URL . 'assets/admin/dashboard' . $suffix . '.css', array(), '1.0.1');         }     } @@ -474,7 +474,7 @@             'methods' => 'GET',             'callback' => [$this, 'proxy_image'],             'permission_callback' => function () {-                return current_user_can('edit_posts');+                return current_user_can('manage_options');             },         ]); @@ -562,8 +562,15 @@     function proxy_image($request)     {         $image_url = $request->get_param('url');-        if (!$image_url || !filter_var($image_url, FILTER_VALIDATE_URL)) {-            return new WP_Error('invalid_url', 'Invalid or missing URL', ['status' => 400]);+        if (!$image_url) {+            return new WP_Error('invalid_url', 'Missing URL', ['status' => 400]);+        }++        $image_url = urldecode($image_url);+        $parsed_url = parse_url($image_url);++        if (!$parsed_url || !isset($parsed_url['scheme']) || !in_array($parsed_url['scheme'], ['http', 'https'], true)) {+             return new WP_Error('invalid_url', 'Invalid URL scheme', ['status' => 400]);         }          $response = wp_safe_remote_get($image_url);@@ -939,9 +946,40 @@         }          if ($is_proxy && $remote_url) {+            // Security: Only allow admins to use this proxy+            if (!current_user_can('manage_options')) {+                wp_die('Unauthorized', 403);+            }+             $remote_url = urldecode($remote_url); -            $response = wp_remote_get($remote_url);+            // Security: Validate URL format and scheme+            $parsed_url = parse_url($remote_url);+            if (!$parsed_url || !isset($parsed_url['scheme']) || !in_array($parsed_url['scheme'], ['http', 'https'], true)) {+                wp_die('Invalid URL scheme', 400);+            }++            // Security: Strict Domain Allowlist+            $allowed_hosts = [];+            if (defined('PORTAL_API')) {+                $allowed_hosts[] = parse_url(PORTAL_API, PHP_URL_HOST);+            }+            if (defined('WORDPRESS_SYNC_API')) {+                $allowed_hosts[] = parse_url(WORDPRESS_SYNC_API, PHP_URL_HOST);+            }++            // Helper to get host from URL even if scheme is missing or slight differences+            $remote_host = $parsed_url['host'] ?? '';++            if (!in_array($remote_host, $allowed_hosts, true)) {+                 // Fallback or Strict? +                 // If the plugin ONLY needs these two, strict is better.+                 wp_die('Domain not allowed', 403);+            }++            // Security: Use wp_safe_remote_get to prevent SSRF to private IPs+            $response = wp_safe_remote_get($remote_url);+             if (is_wp_error($response)) {                 wp_die('Proxy request failed: ' . esc_html($response->get_error_message()));             }
AI Analysis
I'll analyze this code diff for security vulnerabilities following the specified format.

```
Vulnerability Existed: yes
TRUE POSITIVE
CWE-276 - Incorrect Default Permissions - includes/Admin/Admin.php - Line 477
[Old Code]
return current_user_can('edit_posts');
[Fixed Code]
return current_user_can('manage_options');
Explanation:
The endpoint was protected with 'edit_posts' capability, which allows any user with post editing privileges (authors, editors) to access the image proxy endpoint. This is overly permissive for a sensitive operation. The fix restricts it to 'manage_options' (administrators only), which is appropriate for a proxy function that could be used to access internal resources or bypass security controls.

---

Vulnerability Existed: yes
FALSE POSITIVE
CWE-434 - Unrestricted Upload of File with Dangerous Type - includes/Admin/Admin.php - Lines 565-573
[Old Code]
if (!$image_url || !filter_var($image_url, FILTER_VALIDATE_URL)) {
    return new WP_Error('invalid_url', 'Invalid or missing URL', ['status' => 400]);
}
[Fixed Code]
if (!$image_url) {
    return new WP_Error('invalid_url', 'Missing URL', ['status' => 400]);
}

$image_url = urldecode($image_url);
$parsed_url = parse_url($image_url);

if (!$parsed_url || !isset($parsed_url['scheme']) || !in_array($parsed_url['scheme'], ['http', 'https'], true)) {
     return new WP_Error('invalid_url', 'Invalid URL scheme', ['status' => 400]);
}
Explanation:
The original code removed FILTER_VALIDATE_URL entirely and replaced it with less rigorous validation. While the new code does check for http/https schemes explicitly, removing filter_var() weakens validation. However, the explicit scheme check does provide protection against SSRF attacks via alternative protocols. This is a mixed scenario - validation is rewritten but with explicit protocol restrictions which could be seen as an improvement despite the loss of filter_var().

---

Vulnerability Existed: yes
TRUE POSITIVE
CWE-918 - Server-Side Request Forgery (SSRF) - includes/Admin/Admin.php - Lines 948-981
[Old Code]
if ($is_proxy && $remote_url) {
    $remote_url = urldecode($remote_url);
    $response = wp_remote_get($remote_url);
[Fixed Code]
if ($is_proxy && $remote_url) {
    // Security: Only allow admins to use this proxy
    if (!current_user_can('manage_options')) {
        wp_die('Unauthorized', 403);
    }

    $remote_url = urldecode($remote_url);

    // Security: Validate URL format and scheme
    $parsed_url = parse_url($remote_url);
    if (!$parsed_url || !isset($parsed_url['scheme']) || !in_array($parsed_url['scheme'], ['http', 'https'], true)) {
        wp_die('Invalid URL scheme', 400);
    }

    // Security: Strict Domain Allowlist
    $allowed_hosts = [];
    if (defined('PORTAL_API')) {
        $allowed_hosts[] = parse_url(PORTAL_API, PHP_URL_HOST);
    }
    if (defined('WORDPRESS_SYNC_API')) {
        $allowed_hosts[] = parse_url(WORDPRESS_SYNC_API, PHP_URL_HOST);
    }

    $remote_host = $parsed_url['host'] ?? '';

    if (!in_array($remote_host, $allowed_hosts, true)) {
         wp_die('Domain not allowed', 403);
    }

    $response = wp_safe_remote_get($remote_url);
[Fixed Code]
Explanation:
The original code had multiple SSRF vulnerabilities: (1) No authentication check - any user could make arbitrary requests, (2) No URL scheme validation - could be exploited for file://, gopher://, or other protocols, (3) No host validation - could request internal IPs or private networks, (4) Used wp_remote_get instead of wp_safe_remote_get. The fix addresses all these: adds admin-only access control, validates schemes to http/https only, implements a domain allowlist (whitelist), and uses wp_safe_remote_get which blocks private IP ranges by default.

---

Vulnerability Existed: not sure
CWE-77 - Improper Neutralization of Special Elements in Command - includes/Admin/Admin.php - Lines 948-981
[Old Code]
$response = wp_remote_get($remote_url);
[Fixed Code]
$response = wp_safe_remote_get($remote_url);
Explanation:
The change from wp_remote_get to wp_safe_remote_get is a security improvement. wp_safe_remote_get() blocks requests to private/reserved IP ranges (127.0.0.1, 192.168.x.x, 172.16.x.x, 10.x.x.x, etc.) which prevents SSRF attacks against internal services. However, the uncertainty here is whether the original code actually exploited a command injection vulnerability specifically, or if this is better classified as SSRF prevention. The fix itself is clearly security-positive.

---

Vulnerability Existed: not sure
CWE-639 - Authorization Bypass Through User-Controlled Key - includes/Admin/Admin.php - Line 139
[Old Code]
wp_enqueue_style('frontis-blocks-admin', FB_PLUGIN_URL . 'assets/admin/dashboard' . $suffix . '.css', array(), '1.0.0');
[Fixed Code]
wp_enqueue_style('frontis-blocks-admin', FB_PLUGIN_URL . 'assets/admin/dashboard' . $suffix . '.css', array(), '1.0.1');
Explanation:
This is a version number bump only and does not represent a security fix to the code itself. The change from '1.0.0' to '1.0.1' may be intended to bust browser caches after security updates elsewhere, but this particular line contains no vulnerability being fixed.
```
CVE Analysis Results:
CVE-2026-0807: Yes
View CVE Description
The Frontis Blocks plugin for WordPress is vulnerable to Server-Side Request Forgery in all versions up to, and including, 1.1.6. This is due to insufficient restriction on the 'url' parameter in the 'template_proxy' function. This makes it possible for unauthenticated attackers to make web requests to arbitrary locations originating from the web application via the '/template-proxy/' and '/proxy-image/' endpoint.
Showing 1 to 1 of 1 results