Duty Analyst: Sara Ríos Sánchez

CVE-2025-66435

Published: 2025-12-15 17:15:54 | Last modified: 2026-06-17 09:56:50

MEDIUM CVSS 4.3
No EPSS data

Description

An SSTI (Server-Side Template Injection) vulnerability exists in the get_contract_template method of Frappe ERPNext through 15.89.0. The function renders attacker-controlled Jinja2 templates (contract_terms) using frappe.render_template() with a user-supplied context (doc). Although Frappe uses a custom SandboxedEnvironment, several dangerous globals such as frappe.db.sql are still available in the execution context via get_safe_globals(). An authenticated attacker with access to create or modify a Contract Template can inject arbitrary Jinja expressions into the contract_terms field, resulting in server-side code execution within a restricted but still unsafe context. This vulnerability can be used to leak database information.

CVSS details

Severity
medium
Score
4.3
Vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N

EPSS

This CVE is not currently listed in the EPSS dataset.

Show JSON
{
    "cve": {
        "id": "CVE-2025-66435",
        "cveTags": [],
        "metrics": {
            "ssvcV203": [
                {
                    "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
                    "ssvcData": {
                        "id": "CVE-2025-66435",
                        "role": "CISA Coordinator",
                        "options": [
                            {
                                "exploitation": "poc"
                            },
                            {
                                "automatable": "no"
                            },
                            {
                                "technicalImpact": "partial"
                            }
                        ],
                        "version": "2.0.3",
                        "timestamp": "2025-12-16T18:44:07.911988Z"
                    }
                }
            ],
            "cvssMetricV31": [
                {
                    "type": "Primary",
                    "source": "nvd@nist.gov",
                    "cvssData": {
                        "scope": "UNCHANGED",
                        "version": "3.1",
                        "baseScore": 4.3,
                        "attackVector": "NETWORK",
                        "baseSeverity": "MEDIUM",
                        "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N",
                        "integrityImpact": "NONE",
                        "userInteraction": "NONE",
                        "attackComplexity": "LOW",
                        "availabilityImpact": "NONE",
                        "privilegesRequired": "LOW",
                        "confidentialityImpact": "LOW"
                    },
                    "impactScore": 1.4,
                    "exploitabilityScore": 2.8
                },
                {
                    "type": "Secondary",
                    "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
                    "cvssData": {
                        "scope": "UNCHANGED",
                        "version": "3.1",
                        "baseScore": 4.3,
                        "attackVector": "NETWORK",
                        "baseSeverity": "MEDIUM",
                        "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N",
                        "integrityImpact": "NONE",
                        "userInteraction": "NONE",
                        "attackComplexity": "LOW",
                        "availabilityImpact": "NONE",
                        "privilegesRequired": "LOW",
                        "confidentialityImpact": "LOW"
                    },
                    "impactScore": 1.4,
                    "exploitabilityScore": 2.8
                }
            ]
        },
        "affected": [
            {
                "source": "cve@mitre.org",
                "affectedData": [
                    {
                        "vendor": "n/a",
                        "product": "n/a",
                        "versions": [
                            {
                                "status": "affected",
                                "version": "n/a"
                            }
                        ]
                    }
                ]
            }
        ],
        "published": "2025-12-15T17:15:53.853",
        "references": [
            {
                "url": "https://iamanc.github.io/post/erpnext-ssti-bug-2",
                "tags": [
                    "Exploit",
                    "Third Party Advisory"
                ],
                "source": "cve@mitre.org"
            },
            {
                "url": "https://www.notion.so/SSTI-bug-2-239e6086eadc80878e8fcc7b6c26a584?source=copy_link",
                "tags": [
                    "Exploit",
                    "Third Party Advisory"
                ],
                "source": "cve@mitre.org"
            }
        ],
        "vulnStatus": "Analyzed",
        "weaknesses": [
            {
                "type": "Primary",
                "source": "nvd@nist.gov",
                "description": [
                    {
                        "lang": "en",
                        "value": "CWE-94"
                    }
                ]
            },
            {
                "type": "Secondary",
                "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
                "description": [
                    {
                        "lang": "en",
                        "value": "CWE-1336"
                    }
                ]
            }
        ],
        "descriptions": [
            {
                "lang": "en",
                "value": "An SSTI (Server-Side Template Injection) vulnerability exists in the get_contract_template method of Frappe ERPNext through 15.89.0. The function renders attacker-controlled Jinja2 templates (contract_terms) using frappe.render_template() with a user-supplied context (doc). Although Frappe uses a custom SandboxedEnvironment, several dangerous globals such as frappe.db.sql are still available in the execution context via get_safe_globals(). An authenticated attacker with access to create or modify a Contract Template can inject arbitrary Jinja expressions into the contract_terms field, resulting in server-side code execution within a restricted but still unsafe context. This vulnerability can be used to leak database information."
            }
        ],
        "lastModified": "2026-06-17T09:56:50.127",
        "configurations": [
            {
                "nodes": [
                    {
                        "negate": false,
                        "cpeMatch": [
                            {
                                "criteria": "cpe:2.3:a:frappe:erpnext:*:*:*:*:*:*:*:*",
                                "vulnerable": true,
                                "matchCriteriaId": "DAA2FB4F-48C5-4BA5-A15F-175B8A752866",
                                "versionEndIncluding": "15.89.0"
                            }
                        ],
                        "operator": "OR"
                    }
                ]
            }
        ],
        "sourceIdentifier": "cve@mitre.org"
    }
}