<?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://db.gcve.eu</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>Thu, 01 Oct 2026 03:12:18 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-53500 — Thumbor treats ALLOWED_SOURCES string patterns as unescaped regex, allowing hostname bypass via wildcard dot</title>
      <link>https://db.gcve.eu/vuln/cve-2026-53500</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; thumbor&lt;/p&gt;
&lt;p&gt;Thumbor is an open-source photo thumbnail service by globo.com. Prior to 7.8.0, the ALLOWED_SOURCES configuration passes plain strings to re.match() without escaping dots, so a hostname differing at dot positions can match the allowlist. This issue is fixed in 7.8.0.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; thumbor&lt;/p&gt;
&lt;p&gt;Thumbor is an open-source photo thumbnail service by globo.com. Prior to 7.8.0, the ALLOWED_SOURCES configuration passes plain strings to re.match() without escaping dots, so a hostname differing at dot positions can match the allowlist. This issue is fixed in 7.8.0.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/cve-2026-53500</guid>
    </item>
    <item>
      <title>PYSEC-2026-3617 — Thumbor treats ALLOWED_SOURCES string patterns as unescaped regex, allowing hostname bypass via wildcard dot</title>
      <link>https://db.gcve.eu/vuln/pysec-2026-3617</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: thumbor&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;The `ALLOWED_SOURCES` configuration is meant to restrict which hosts Thumbor&amp;#39;s HTTP loader may fetch images from. Plain-string entries in that list (the overwhelming majority of real-world and documented configurations) are passed directly to `re.match()` without escaping. Because `.` is a regex wildcard, every dot in a domain name becomes a bypass vector: `s.glbimg.com` silently matches `sXglbimgYcom`, `sAglbimg.com`, and any other hostname that differs only at a dot position. This undermines the primary SSRF defence that `ALLOWED_SOURCES` is intended to provide.&lt;/p&gt;
&lt;p&gt;## Affected component&lt;/p&gt;
&lt;p&gt;`thumbor/loaders/http_loader.py` — `validate()`&lt;/p&gt;
&lt;p&gt;## Proof of concept&lt;/p&gt;
&lt;p&gt;```python
import re
from thumbor.config import Config
from thumbor.context import Context
from thumbor.loaders import http_loader as loader&lt;/p&gt;
&lt;p&gt;config = Config()
config.ALLOWED_SOURCES = [&amp;#34;s.glbimg.com&amp;#34;]   # typical user config
ctx = Context(None, config, None)&lt;/p&gt;
&lt;p&gt;# These should be blocked — both return True due to the unescaped dot
print(loader.validate(ctx, &amp;#34;http://sXglbimgYcom/secret.jpg&amp;#34;))  # True ← bypass
print(loader.validate(ctx, &amp;#34;http://sAglbimg.com/secret.jpg&amp;#34;))  # True ← bypass&lt;/p&gt;
&lt;p&gt;# Legitimate origin — correctly allowed
print(loader.validate(ctx, &amp;#34;http://s.glbimg.com/logo.jpg&amp;#34;))    # True ← correct
```&lt;/p&gt;
&lt;p&gt;## Root cause&lt;/p&gt;
&lt;p&gt;`thumbor/loaders/http_loader.py` (before fix):&lt;/p&gt;
&lt;p&gt;```python
for pattern in context.config.ALLOWED_SOURCES:
    if isinstance(pattern, Pattern):
        match = url
    else:
        pattern = f&amp;#34;^…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: thumbor&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;The `ALLOWED_SOURCES` configuration is meant to restrict which hosts Thumbor&amp;#39;s HTTP loader may fetch images from. Plain-string entries in that list (the overwhelming majority of real-world and documented configurations) are passed directly to `re.match()` without escaping. Because `.` is a regex wildcard, every dot in a domain name becomes a bypass vector: `s.glbimg.com` silently matches `sXglbimgYcom`, `sAglbimg.com`, and any other hostname that differs only at a dot position. This undermines the primary SSRF defence that `ALLOWED_SOURCES` is intended to provide.&lt;/p&gt;
&lt;p&gt;## Affected component&lt;/p&gt;
&lt;p&gt;`thumbor/loaders/http_loader.py` — `validate()`&lt;/p&gt;
&lt;p&gt;## Proof of concept&lt;/p&gt;
&lt;p&gt;```python
import re
from thumbor.config import Config
from thumbor.context import Context
from thumbor.loaders import http_loader as loader&lt;/p&gt;
&lt;p&gt;config = Config()
config.ALLOWED_SOURCES = [&amp;#34;s.glbimg.com&amp;#34;]   # typical user config
ctx = Context(None, config, None)&lt;/p&gt;
&lt;p&gt;# These should be blocked — both return True due to the unescaped dot
print(loader.validate(ctx, &amp;#34;http://sXglbimgYcom/secret.jpg&amp;#34;))  # True ← bypass
print(loader.validate(ctx, &amp;#34;http://sAglbimg.com/secret.jpg&amp;#34;))  # True ← bypass&lt;/p&gt;
&lt;p&gt;# Legitimate origin — correctly allowed
print(loader.validate(ctx, &amp;#34;http://s.glbimg.com/logo.jpg&amp;#34;))    # True ← correct
```&lt;/p&gt;
&lt;p&gt;## Root cause&lt;/p&gt;
&lt;p&gt;`thumbor/loaders/http_loader.py` (before fix):&lt;/p&gt;
&lt;p&gt;```python
for pattern in context.config.ALLOWED_SOURCES:
    if isinstance(pattern, Pattern):
        match = url
    else:
        pattern = f&amp;#34;^…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/pysec-2026-3617</guid>
    </item>
  </channel>
</rss>
