REPORT / 01

Analysis Report · Folder Analysis cache/wp-rss-aggregator_5.0.10 → cache/wp-rss-aggregator_5.0.11 — CVE-2025-14745

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-2025-14745 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
core/src/Display/LayoutTrait.php AI: 2 vulnerabilities 2 true positives CVE-2025-14745
--- cache/wp-rss-aggregator_5.0.10/core/src/Display/LayoutTrait.php	2026-01-16 00:19:53.339210757 +0000+++ cache/wp-rss-aggregator_5.0.11/core/src/Display/LayoutTrait.php	2026-01-16 00:21:25.056966156 +0000@@ -131,7 +131,7 @@  		return sprintf( 			'<span class="feed-author">%s</span>',-			rtrim( $this->ds->authorPrefix ) . ' ' . $authorName+			esc_html( rtrim( $this->ds->authorPrefix ) . ' ' . $authorName ) 		); 	} @@ -207,10 +207,17 @@ 		}  		$tag = $block ? 'div' : 'span';+		$prefix = esc_html( $this->ds->sourcePrefix );++		// $srcName is already HTML from renderLink, so it doesn't need escaping again.+		// If linking is disabled, $srcName is just the source name string, which needs escaping.+		if ( ! ( $this->ds->linkSource && $links && ! empty( $url ) ) ) {+			$srcName = esc_html( $srcName );+		}  		return <<<HTML             <{$tag} class="feed-source">-                {$this->ds->sourcePrefix} {$srcName}+                {$prefix} {$srcName}             </{$tag}>         HTML; 	}
AI Analysis
Let me analyze the provided diff directly based on the security fix patterns shown:

---

**Vulnerability 1:**

Vulnerability Existed: yes
TRUE POSITIVE

Cross-Site Scripting (XSS) - CWE-79 - core/src/Display/LayoutTrait.php Lines 134

**Old Code:**
```php
rtrim( $this->ds->authorPrefix ) . ' ' . $authorName
```

**Fixed Code:**
```php
esc_html( rtrim( $this->ds->authorPrefix ) . ' ' . $authorName )
```

**Explanation:**
The original code concatenated `$this->ds->authorPrefix` and `$authorName` without HTML escaping before outputting them in an HTML `<span>` tag. If either variable contained user-controlled or untrusted data with HTML/JavaScript content, it could lead to stored or reflected XSS attacks. The fix wraps the entire concatenation with `esc_html()`, which escapes HTML special characters, preventing script injection.

---

**Vulnerability 2:**

Vulnerability Existed: yes
TRUE POSITIVE

Cross-Site Scripting (XSS) - CWE-79 - core/src/Display/LayoutTrait.php Lines 210-220

**Old Code:**
```php
$tag = $block ? 'div' : 'span';

return <<<HTML
            <{$tag} class="feed-source">
                {$this->ds->sourcePrefix} {$srcName}
            </{$tag}>
         HTML;
```

**Fixed Code:**
```php
$tag = $block ? 'div' : 'span';
$prefix = esc_html( $this->ds->sourcePrefix );

// $srcName is already HTML from renderLink, so it doesn't need escaping again.
// If linking is disabled, $srcName is just the source name string, which needs escaping.
if ( ! ( $this->ds->linkSource && $links && ! empty( $url ) ) ) {
    $srcName = esc_html( $srcName );
}

return <<<HTML
            <{$tag} class="feed-source">
                {$prefix} {$srcName}
            </{$tag}>
         HTML;
```

**Explanation:**
The original code directly interpolated `$this->ds->sourcePrefix` and `$srcName` into HTML without escaping. The fix addresses two concerns: (1) `$this->ds->sourcePrefix` is now always escaped with `esc_html()` before interpolation, preventing XSS from this source. (2) `$srcName` is conditionally escaped—it remains unescaped when it's already HTML from `renderLink()`, but is escaped with `esc_html()` when it's a plain source name string that could contain unescaped user input. This prevents XSS while maintaining proper HTML rendering for linked sources.
CVE Analysis Results:
CVE-2025-14745: Yes
View CVE Description
The RSS Aggregator – RSS Import, News Feeds, Feed to Post, and Autoblogging plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the plugin's 'wp-rss-aggregator' shortcode in all versions up to, and including, 5.0.10 due to insufficient input sanitization and output escaping on user supplied attributes. This makes it possible for authenticated attackers, with contributor-level access and above, to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page.
core/src/Display/ListLayout.php AI: 1 vulnerabilities 1 true positive CVE-2025-14745
--- cache/wp-rss-aggregator_5.0.10/core/src/Display/ListLayout.php	2026-01-16 00:19:53.339210757 +0000+++ cache/wp-rss-aggregator_5.0.11/core/src/Display/ListLayout.php	2026-01-16 00:21:25.064966657 +0000@@ -2,10 +2,10 @@  namespace RebelCode\Aggregator\Core\Display; -use RebelCode\Aggregator\Core\Display\DisplayState;-use RebelCode\Aggregator\Core\Display\LayoutInterface;-use RebelCode\Aggregator\Core\Display\LayoutTrait; use RebelCode\Aggregator\Core\IrPost;+use RebelCode\Aggregator\Core\Display\LayoutTrait;+use RebelCode\Aggregator\Core\Display\LayoutInterface;+use RebelCode\Aggregator\Core\Display\DisplayState;  class ListLayout implements LayoutInterface { @@ -33,9 +33,10 @@  		$listStart = ( $state->page - 1 ) * $this->ds->numItems + 1; 		$listItems = $this->renderItems( $posts, fn ( IrPost $post ) => $this->item( $post ) );+		$htmlClass = esc_attr( $this->ds->htmlClass );  		return <<<HTML-            <div class="wp-rss-aggregator wpra-list-template {$this->ds->htmlClass}">+            <div class="wp-rss-aggregator wpra-list-template {$htmlClass}">                 <{$listType} class="rss-aggregator wpra-item-list {$listClass}" start="{$listStart}">                     {$listItems}                 </{$listType}>@@ -44,8 +45,10 @@ 	}  	private function item( IrPost $post ): string {+		$htmlClass = esc_attr( $this->ds->htmlClass );+ 		return <<<HTML-            <li class="wpra-item feed-item {$this->ds->htmlClass}">+            <li class="wpra-item feed-item {$htmlClass}">                 {$this->renderTitle($post)}                  <div class="wprss-feed-meta">
AI Analysis
Vulnerability Existed: yes
TRUE POSITIVE
Cross-Site Scripting (XSS) - CWE-79 - core/src/Display/ListLayout.php Lines 36-40, 48-51

Old Code:
```php
return <<<HTML
            <div class="wp-rss-aggregator wpra-list-template {$this->ds->htmlClass}">
```

and

```php
return <<<HTML
            <li class="wpra-item feed-item {$this->ds->htmlClass}">
```

Fixed Code:
```php
$htmlClass = esc_attr( $this->ds->htmlClass );

return <<<HTML
            <div class="wp-rss-aggregator wpra-list-template {$htmlClass}">
```

and

```php
$htmlClass = esc_attr( $this->ds->htmlClass );

return <<<HTML
            <li class="wpra-item feed-item {$htmlClass}">
```

Explanation:
The vulnerability existed because `$this->ds->htmlClass` was being directly interpolated into HTML attributes without sanitization. An attacker who could control the `htmlClass` property could inject malicious JavaScript through event handlers (e.g., `" onclick="alert('xss')"`). The fix applies the `esc_attr()` WordPress sanitization function to escape the value before inserting it into the HTML attribute, preventing XSS attacks. The `esc_attr()` function properly escapes quotes and special characters that could break out of the attribute context.
CVE Analysis Results:
CVE-2025-14745: Yes
View CVE Description
The RSS Aggregator – RSS Import, News Feeds, Feed to Post, and Autoblogging plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the plugin's 'wp-rss-aggregator' shortcode in all versions up to, and including, 5.0.10 due to insufficient input sanitization and output escaping on user supplied attributes. This makes it possible for authenticated attackers, with contributor-level access and above, to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page.
Showing 1 to 2 of 2 results