<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://cve.radiocsirt.org</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Wed, 21 Oct 2026 12:52:16 +0000</lastBuildDate>
    <item>
      <title>EUVD-2026-292387</title>
      <link>https://cve.radiocsirt.org/vuln/euvd-2026-292387</link>
      <description>EUVD-2026-292387</description>
      <guid isPermaLink="false">https://cve.radiocsirt.org/vuln/euvd-2026-292387</guid>
    </item>
    <item>
      <title>fkie_cve-2026-41061</title>
      <link>https://cve.radiocsirt.org/vuln/fkie_cve-2026-41061</link>
      <description>&lt;p&gt;WWBN AVideo is an open source video platform. In versions 29.0 and below, the `isValidDuration()` regex at `objects/video.php:918` uses `/^[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}/` without a `$` end anchor, allowing arbitrary HTML/JavaScript to be appended after a valid duration prefix. The crafted duration is stored in the database and rendered without HTML escaping via `echo Video::getCleanDuration()` on trending pages, playlist pages, and video gallery thumbnails, resulting in stored cross-site scripting. Commit bcba324644df8b4ed1f891462455f1cd26822a45 contains a fix.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;WWBN AVideo is an open source video platform. In versions 29.0 and below, the `isValidDuration()` regex at `objects/video.php:918` uses `/^[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}/` without a `$` end anchor, allowing arbitrary HTML/JavaScript to be appended after a valid duration prefix. The crafted duration is stored in the database and rendered without HTML escaping via `echo Video::getCleanDuration()` on trending pages, playlist pages, and video gallery thumbnails, resulting in stored cross-site scripting. Commit bcba324644df8b4ed1f891462455f1cd26822a45 contains a fix.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://cve.radiocsirt.org/vuln/fkie_cve-2026-41061</guid>
    </item>
    <item>
      <title>GHSA-8pv3-29pp-pf8f — WWBN AVideo has Stored XSS via Unanchored Duration Regex in Video Encoder Receiver</title>
      <link>https://cve.radiocsirt.org/vuln/ghsa-8pv3-29pp-pf8f</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Packagist: wwbn/avideo&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;The `isValidDuration()` regex at `objects/video.php:918` uses `/^[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}/` without a `$` end anchor, allowing arbitrary HTML/JavaScript to be appended after a valid duration prefix. The crafted duration is stored in the database and rendered without HTML escaping via `echo Video::getCleanDuration()` on trending pages, playlist pages, and video gallery thumbnails, resulting in stored cross-site scripting.&lt;/p&gt;
&lt;p&gt;## Details&lt;/p&gt;
&lt;p&gt;**Input entry point:** `objects/aVideoEncoderReceiveImage.json.php:208`&lt;/p&gt;
&lt;p&gt;```php
// Line 203-211
if (!empty($_REQUEST[&amp;#39;duration&amp;#39;])) {
    $video-&amp;gt;setDuration($_REQUEST[&amp;#39;duration&amp;#39;]);
}
```&lt;/p&gt;
&lt;p&gt;**Insufficient validation:** `objects/video.php:918`&lt;/p&gt;
&lt;p&gt;```php
static function isValidDuration($duration) {
    // ...
    return preg_match(&amp;#39;/^[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}/&amp;#39;, $duration);
    //     Missing $ anchor here -----------------------------------^
}
```&lt;/p&gt;
&lt;p&gt;The regex matches `00:00:01` at the start of the string but ignores everything after it. A payload like `00:00:01&amp;lt;/time&amp;gt;&amp;lt;img src=x onerror=alert(1)&amp;gt;&amp;lt;time&amp;gt;` passes validation.&lt;/p&gt;
&lt;p&gt;**No sanitization in output function:** `objects/video.php:3463-3480`&lt;/p&gt;
&lt;p&gt;```php
public static function getCleanDuration($duration = &amp;#34;&amp;#34;) {
    $durationParts = explode(&amp;#34;.&amp;#34;, $duration);
    $duration = $durationParts[0];
    $durationParts = explode(&amp;#39;:&amp;#39;, $duration);
    if (count($durationParts) == 1) {
        return &amp;#39;0:00:&amp;#39; . static::addZero($durationParts[0]);
    } elseif (count($durationParts) == 2) {…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Packagist: wwbn/avideo&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;The `isValidDuration()` regex at `objects/video.php:918` uses `/^[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}/` without a `$` end anchor, allowing arbitrary HTML/JavaScript to be appended after a valid duration prefix. The crafted duration is stored in the database and rendered without HTML escaping via `echo Video::getCleanDuration()` on trending pages, playlist pages, and video gallery thumbnails, resulting in stored cross-site scripting.&lt;/p&gt;
&lt;p&gt;## Details&lt;/p&gt;
&lt;p&gt;**Input entry point:** `objects/aVideoEncoderReceiveImage.json.php:208`&lt;/p&gt;
&lt;p&gt;```php
// Line 203-211
if (!empty($_REQUEST[&amp;#39;duration&amp;#39;])) {
    $video-&amp;gt;setDuration($_REQUEST[&amp;#39;duration&amp;#39;]);
}
```&lt;/p&gt;
&lt;p&gt;**Insufficient validation:** `objects/video.php:918`&lt;/p&gt;
&lt;p&gt;```php
static function isValidDuration($duration) {
    // ...
    return preg_match(&amp;#39;/^[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}/&amp;#39;, $duration);
    //     Missing $ anchor here -----------------------------------^
}
```&lt;/p&gt;
&lt;p&gt;The regex matches `00:00:01` at the start of the string but ignores everything after it. A payload like `00:00:01&amp;lt;/time&amp;gt;&amp;lt;img src=x onerror=alert(1)&amp;gt;&amp;lt;time&amp;gt;` passes validation.&lt;/p&gt;
&lt;p&gt;**No sanitization in output function:** `objects/video.php:3463-3480`&lt;/p&gt;
&lt;p&gt;```php
public static function getCleanDuration($duration = &amp;#34;&amp;#34;) {
    $durationParts = explode(&amp;#34;.&amp;#34;, $duration);
    $duration = $durationParts[0];
    $durationParts = explode(&amp;#39;:&amp;#39;, $duration);
    if (count($durationParts) == 1) {
        return &amp;#39;0:00:&amp;#39; . static::addZero($durationParts[0]);
    } elseif (count($durationParts) == 2) {…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://cve.radiocsirt.org/vuln/ghsa-8pv3-29pp-pf8f</guid>
    </item>
  </channel>
</rss>
