Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSubmit template to reused sandbox context
-
DeliveryReference previously permitted member
-
ExploitStale cached accessor bypasses tightened filter
-
ExecutionRead hidden property/field
-
ImpactExfiltrate cross-tenant secret
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V15 - Secure Coding and Architecture Protection mechanism completeness
|
| Exploitation Conditions | Exploitation requires that the host application reuse a single TemplateContext instance across more than one render AND tighten TemplateContext.MemberFilter (or otherwise rely on it as a sandbox) between renders for the same .NET Type, while EnableRelaxedMemberAccess/MemberFilter is the mechanism controlling member exposure. The vulnerable member is any property or field of a type whose permissive accessor was cached during an earlier, looser render; calling TemplateContext.Reset() between renders does not remediate it because Reset() leaves _memberAccessors populated. Limiting factors that reduce real-world risk: applications that instantiate a fresh TemplateContext per render, that never tighten MemberFilter on a reused context, or that do not use MemberFilter as their trust boundary are not exposed; the attacker must also be able to influence or supply the template (or the members referenced) in the later, more-restricted render. |
| Impact | The signals partly conflict and should be weighed honestly. The published CVSS 4.0 vector (9.3; AV:N/AC:L/PR:N/UI:N/VC:H/VI:H) portrays this as a trivially exploitable, unauthenticated, network-facing critical, but the described mechanism is conditional: it only bites applications that reuse one TemplateContext across renders AND tighten the MemberFilter between them, which is a specific developer usage pattern rather than a default remote attack surface - so real-world exploitability is narrower than AC:L implies, and the VI:H (integrity) rating is questionable since the flaw exposes members for reading rather than writing. No EPSS score and no CISA KEV entry were supplied, so there is no evidence of mass or active exploitation; however, a complete proof-of-concept is published in the GHSA advisory, so weaponization effort is low for anyone targeting a known-vulnerable multi-tenant deployment. Net assessment: a genuine and high-value bug for multi-tenant SaaS or template-sandbox use cases where MemberFilter is the trust boundary - such an operator should treat cross-tenant data leakage as urgent and patch promptly - but a low-to-moderate practical concern for apps that create a fresh context per render or do not rely on MemberFilter for isolation. |
| Exploit ScenarioDerived | A multi-tenant .NET service reuses one TemplateContext and, for a privileged first render, sets MemberFilter to allow all members of a model exposing a Secret property; it then tightens MemberFilter to allow only Public before rendering a second, lower-trust tenant's template. Because the permissive TypedObjectAccessor for that model type is already cached, the second render of '{{ model.secret }}' still returns the hidden value, leaking cross-tenant data. A public proof-of-concept demonstrating exactly this two-render leak is included in the vendor advisory. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 16, 2026
Sandbox escape in the Scriban .NET templating engine (all versions before 7.0.0) lets attacker-influenced templates read object members that a tightened MemberFilter was meant to hide, because type accessors are cached by Type alone and survive both filter changes and TemplateContext.Reset(). Applications that reuse a single TemplateContext across requests or tenants and rely on MemberFilter as a security boundary can leak filtered properties and fields to a later, more-restricted render. Reported by VulnCheck with a working proof-of-concept in the vendor advisory; not listed in CISA KEV, and no EPSS score was provided in the source data.
RemediationAI
Upgrade to Scriban 7.0.0, which is the vendor-released patch (NuGet packages 'scriban' 7.0.0 and 'Scriban.Signed' 7.0.0); this is the primary and recommended fix. If an immediate upgrade is not possible, the most reliable compensating control is to stop sharing TemplateContext instances across renders that use different MemberFilter settings - construct a new TemplateContext per request or per tenant so no stale TypedObjectAccessor can be reused; note that TemplateContext.Reset() does NOT clear the accessor cache, so relying on Reset() as a workaround will not help. Alternatively, keep the MemberFilter constant (never tighten it on a reused context) and instead avoid exposing sensitive types at all, or wrap exposed models in purpose-built ScriptObject/DTO projections that contain only safe members, removing dependence on MemberFilter as a runtime gate. The trade-off of per-render contexts is loss of accessor-cache reuse (minor performance cost) in exchange for correct isolation. See the advisory at https://github.com/scriban/scriban/security/advisories/GHSA-5wr9-m6jw-xx44 for details.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in nuget
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Scriban is a fast, sandbox-capable text templating engine for .NET, widely embedded in apps that render user- or tenant-supplied templates. Exposure of arbitrary .NET objects is meant to be constrained by TemplateContext.MemberFilter (and MemberRenamer), which the Scriban documentation explicitly recommends for indirect object exposure. Internally, TemplateContext.GetMemberAccessor() caches a TypedObjectAccessor per .NET Type in _memberAccessors (TemplateContext.cs ~L850-863), and the accessor precomputes its exposed-member set in its constructor/PrepareMembers() using whatever MemberFilter was active at creation time (TypedObjectAccessor.cs ~L33-40, L119-179). Because the cache key is Type only, a later MemberFilter change is ignored for any type already cached, and TemplateContext.Reset() (L877-902) does not clear _memberAccessors. This is a CWE-693 Protection Mechanism Failure: the sandbox control exists but is silently bypassed by stale caching rather than a memory-safety or injection flaw.
Know when Scriban gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N
AC:H because it needs the specific reuse-then-tighten-filter pattern; S:C and C:H for sandbox escape leaking host data; I:N/A:N since members are only read, not modified.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
Lifecycle Timeline
2DescriptionCVE.org
Scriban before 7.0.0 caches TypedObjectAccessor by Type only without considering MemberFilter changes, allowing reused TemplateContext instances to expose members that should be hidden. Attackers can access filtered properties and fields by reusing a TemplateContext after tightening its MemberFilter, bypassing sandbox policies across requests or tenants.
Executive ViewAI
Scriban .NET templating engine (before version 7.0.0) contains a critical vulnerability with publicly available exploit code that could allow attackers to access sensitive data in multi-tenant deployments. The flaw bypasses security filters intended to isolate tenant data, creating direct risk to confidentiality and compliance. Immediate patching is essential to prevent cross-tenant information disclosure incidents.
Apply vendor patch.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.
Arbitrary CLR property writes in Scriban (the .NET templating engine) before 7.2.2 allow template code to mutate live ho
Information disclosure and authorization bypass in Scriban (the .NET text templating engine) before 7.0.0 lets attackers
Scriban template engine versions 3.0.0 through 7.2.5 expose any application accepting untrusted templates to complete CP
Uncontrolled resource consumption in Scriban's .NET templating engine allows any party who can submit template input to
Remote denial of service in Scriban before 6.6.0 allows unauthenticated attackers to crash the entire .NET hosting proce
Process-terminating stack overflow in Scriban's template parser affects all versions before 7.0.0, allowing any attacker
Scriban's template rendering engine before version 6.6.0 crashes the entire .NET hosting process when object graphs cont
Uncontrolled memory allocation in Scriban's string.pad_left and string.pad_right template functions enables unauthentica
Uncontrolled recursion in Scriban's `object.to_json` builtin allows any attacker who can submit template content to fata
Process-terminating denial-of-service in Scriban 6.6.0-7.2.0 allows any network-reachable attacker to crash a host .NET
Resource exhaustion in Scriban 3.0.0 through 7.2.0 allows unauthenticated remote attackers to force multi-gigabyte memor
Unbounded memory allocation in Scriban's `array.insert_at` built-in function allows any template author to crash the hos
EUVD-2026-59956
GHSA-6w6f-93jg-2qf5
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB