<?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>Fri, 02 Oct 2026 22:03:31 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-43891 — changedetection.io: Arbitrary Local File Read via crafted backup restore</title>
      <link>https://cve.radiocsirt.org/vuln/cve-2026-43891</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; dgtlmoon changedetection.io&lt;/p&gt;
&lt;p&gt;changedetection.io is a free open source web page change detection tool. Prior to 0.55.1, the vulnerability is caused by trusting attacker-controlled snapshot paths restored from backup files. The vulnerable flow starts in the backup restore logic. When a backup ZIP is restored, the application extracts the archive and copies each restored watch UUID directory directly into the live datastore using shutil.copytree(entry.path, dst_dir). This preserves attacker-controlled files inside the restored watch directory, including history.txt. After restore, the application parses history.txt in the watch history property and  returns the contents of the targeted local file. This vulnerability is fixed in 0.55.1.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; dgtlmoon changedetection.io&lt;/p&gt;
&lt;p&gt;changedetection.io is a free open source web page change detection tool. Prior to 0.55.1, the vulnerability is caused by trusting attacker-controlled snapshot paths restored from backup files. The vulnerable flow starts in the backup restore logic. When a backup ZIP is restored, the application extracts the archive and copies each restored watch UUID directory directly into the live datastore using shutil.copytree(entry.path, dst_dir). This preserves attacker-controlled files inside the restored watch directory, including history.txt. After restore, the application parses history.txt in the watch history property and  returns the contents of the targeted local file. This vulnerability is fixed in 0.55.1.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://cve.radiocsirt.org/vuln/cve-2026-43891</guid>
    </item>
    <item>
      <title>GHSA-8757-69j2-hx56 — changedetection.io has an Arbitrary Local File Read via a crafted backup restore</title>
      <link>https://cve.radiocsirt.org/vuln/ghsa-8757-69j2-hx56</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: changedetection.io&lt;/p&gt;
&lt;p&gt;### Details
The vulnerability is caused by trusting attacker-controlled snapshot paths restored from backup files.&lt;/p&gt;
&lt;p&gt;The vulnerable flow starts in the backup restore logic. When a backup ZIP is restored, the application extracts the archive and copies each restored watch UUID directory directly into the live datastore using `shutil.copytree(entry.path, dst_dir)`. This preserves attacker-controlled files inside the restored watch directory, including `history.txt`.&lt;/p&gt;
&lt;p&gt;Relevant code:
- [changedetectionio/blueprint/backups/restore.py](https://github.com/dgtlmoon/changedetection.io/blob/master/changedetectionio/blueprint/backups/restore.py#L132)
- [changedetectionio/blueprint/backups/restore.py](https://github.com/dgtlmoon/changedetection.io/blob/master/changedetectionio/blueprint/backups/restore.py#L141)&lt;/p&gt;
&lt;p&gt;After restore, the application parses `history.txt` in the watch `history` property. This is the core trust-boundary issue.&lt;/p&gt;
&lt;p&gt;Relevant code:
- [changedetectionio/model/Watch.py](https://github.com/dgtlmoon/changedetection.io/blob/master/changedetectionio/model/Watch.py#L460)
- [changedetectionio/model/Watch.py](https://github.com/dgtlmoon/changedetection.io/blob/master/changedetectionio/model/Watch.py#L471)
- [changedetectionio/model/Watch.py](https://github.com/dgtlmoon/changedetection.io/blob/master/changedetectionio/model/Watch.py#L478)&lt;/p&gt;
&lt;p&gt;The relevant logic is effectively:&lt;/p&gt;
&lt;p&gt;```python
if os.sep not in v and &amp;#39;/&amp;#39; not in v and &amp;#39;\\&amp;#39; not in v:
    v = os.path.join(self.data_dir, v)
el…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: changedetection.io&lt;/p&gt;
&lt;p&gt;### Details
The vulnerability is caused by trusting attacker-controlled snapshot paths restored from backup files.&lt;/p&gt;
&lt;p&gt;The vulnerable flow starts in the backup restore logic. When a backup ZIP is restored, the application extracts the archive and copies each restored watch UUID directory directly into the live datastore using `shutil.copytree(entry.path, dst_dir)`. This preserves attacker-controlled files inside the restored watch directory, including `history.txt`.&lt;/p&gt;
&lt;p&gt;Relevant code:
- [changedetectionio/blueprint/backups/restore.py](https://github.com/dgtlmoon/changedetection.io/blob/master/changedetectionio/blueprint/backups/restore.py#L132)
- [changedetectionio/blueprint/backups/restore.py](https://github.com/dgtlmoon/changedetection.io/blob/master/changedetectionio/blueprint/backups/restore.py#L141)&lt;/p&gt;
&lt;p&gt;After restore, the application parses `history.txt` in the watch `history` property. This is the core trust-boundary issue.&lt;/p&gt;
&lt;p&gt;Relevant code:
- [changedetectionio/model/Watch.py](https://github.com/dgtlmoon/changedetection.io/blob/master/changedetectionio/model/Watch.py#L460)
- [changedetectionio/model/Watch.py](https://github.com/dgtlmoon/changedetection.io/blob/master/changedetectionio/model/Watch.py#L471)
- [changedetectionio/model/Watch.py](https://github.com/dgtlmoon/changedetection.io/blob/master/changedetectionio/model/Watch.py#L478)&lt;/p&gt;
&lt;p&gt;The relevant logic is effectively:&lt;/p&gt;
&lt;p&gt;```python
if os.sep not in v and &amp;#39;/&amp;#39; not in v and &amp;#39;\\&amp;#39; not in v:
    v = os.path.join(self.data_dir, v)
el…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://cve.radiocsirt.org/vuln/ghsa-8757-69j2-hx56</guid>
    </item>
  </channel>
</rss>
