changedetection.io has a Server Side Template Injection using Jinja2 which allows Remote Command Execution

Description

Summary

A Server Side Template Injection in changedetection.io caused by usage of unsafe functions of Jinja2 allows Remote Command Execution on the server host.

Details

changedetection.io version: 0.45.20

docker images
REPOSITORY                            TAG       IMAGE ID       CREATED        SIZE
dgtlmoon/changedetection.io           latest    53529c2e69f1   44 hours ago   423MB

The vulnerability is caused by the usage of vulnerable functions of Jinja2 template engine.

from jinja2 import Environment, BaseLoader
...
    # Get the notification body from datastore
    jinja2_env = Environment(loader=BaseLoader)
    n_body = jinja2_env.from_string(n_object.get('notification_body', '')).render(**notification_parameters)
    n_title = jinja2_env.from_string(n_object.get('notification_title', '')).render(**notification_parameters)

PoC

  1. Create/Edit a URL watch item
  2. Under Notifications tab insert this payload:
{{ self.__init__.__globals__.__builtins__.__import__('os').popen('id').read() }}

Screenshot from 2024-04-19 15-46-04

  1. See Telegram (or other supported messaging app) notification

Screenshot from 2024-04-19 16-02-12

Impact

In the PoC I've used id as payload and Telegram to read the result.
Attackers can run any system command without any restriction and they don't need to read the result in the notification app (e.g. they could use a reverse shell).
The impact is critical as the attacker can completely takeover the server host.
This can be reduced if changedetection access is protected by login page with a password, but this isn't required by the application (not by default and not enforced).

References

  • https://www.hacktivesecurity.com/blog/2024/05/08/cve-2024-32651-server-side-template-injection-changedetection-io/
  • https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection/jinja2-ssti
  • https://www.onsecurity.io/blog/server-side-template-injection-with-jinja2/
  • https://docs.cobalt.io/bestpractices/prevent-ssti/

Credits

Edoardo Ottavianelli

Basic information

Type
reviewed
Severity
critical
Advisory on GitHub
Open advisory ↗
Repository advisory
Open repository advisory ↗
Source code
Browse source ↗
Published (advisory)
2024-10-15 18:05:15 UTC
Updated
2025-08-06 17:55:28 UTC
GitHub reviewed
2024-10-15 18:05:15 UTC
NVD published
2024-04-25

EPSS Score

Score Percentile
92.45% 99.73%

CVSS Scores

Base score Version Severity Vector
10.0 3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H Click to expand
Attack vector (AV:N)
Could be attacked over the internet or any normal routed network—not just someone sitting at the machine.
Attack complexity (AC:L)
Once they can reach the bug, pulling it off is straightforward—no weird race conditions or rare setup.
Privileges required (PR:N)
No account or special rights needed—anonymous or random user is enough.
User interaction (UI:N)
Nobody has to click “OK” or open a trap file; it can work without a victim helping.
Scope (S:C)
Breaking this can reach past the original component and bite other resources—bigger blast radius.
Confidentiality (C:H)
Serious risk that confidential data gets exposed in a big way.
Integrity (I:H)
They could widely tamper with or forge data—trust in the data is badly hurt.
Availability (A:H)
Could take the service down hard or make it unusable for people who depend on it.

Identifiers

CWEs

CWE id Name
CWE-1336 Improper Neutralization of Special Elements Used in a Template Engine

Credits

  • edoardottt (finder)
  • dgtlmoon (remediation_developer)

Affected packages (1)

Vulnerable version ranges and first patched releases as published by GitHub.

Ecosystem Package Vulnerable range First patched Vulnerable functions
pip changedetection.io <= 0.45.20 0.45.21

References

cvelogic Threat Intelligence