CVE-2026-74790 reveals that Scriban's MemberFilter is a security illusion in cached execution paths. The vulnerability sits at the intersection of caching and access control: when you set MemberFilter to restrict what properties a template can access, Scriban's TypedObjectAccessor cache memoizes the accessibility decision against the Type object alone, ignoring the filter state that should govern each individual lookup. Once an accessor is cached under a permissive filter, all subsequent accesses — regardless of the current MemberFilter configuration — bypass the restriction permanently.
This is a revocation-after-caching flaw that violates the object-capability model. The model assumes that if you hold a reference, access is governed by the policy in force at access time — not policy at cache-population time. Scriban converts revocable capabilities into irrevocable ones the moment they're cached, which is exactly backwards for a security boundary.
The practical exposure depends entirely on whether TemplateContext objects are pooled or reused. In ASP.NET Core applications using DI-scoped contexts, or in multi-tenant SaaS platforms that pool contexts as a parsing-cost optimization, an attacker who obtains a context with a loosened filter can permanently poison the cached accessor for subsequent legitimate users. This shifts the vulnerability from a theoretical information disclosure bug to a potential cross-tenant data leak.
What you should audit: First, identify every code path where TemplateContext objects escape a single request boundary — look for static holders, pooled object queues, or DI scopes that retain context across calls. Second, examine whether your application sets MemberFilter and relies on it as a security control — if so, verify that no context reuse occurs in your hosting pattern. Third, when upgrading to 7.0.0, confirm whether the patch invalidates existing cached accessors or only prevents new contamination; long-running processes may carry poisoned caches into the patched version.
The deeper systemic issue is that Scriban's documentation presents MemberFilter as a first-class security primitive, but the implementation makes it advisory rather than enforced in cached paths. This created false confidence for developers who tested in isolation — where context reuse doesn't occur — and deployed into production environments where pooling makes the vulnerability exploitable.