Scriban은 .NET에서 사용되는 템플릿 엔진입니다. MemberFilter를 통해 템플릿에서 접근 가능한 속성과 메서드를 제어하는 샌드박스 모델을 제공하지만, 7.0.0 미만 버전에서 TemplateContext를 재사용하는 경우 MemberFilter 변경이 내부 캐시에 반영되지 않아 필터링 대상이었던 멤버에도 접근할 수 있는 취약점이 발견되었습니다.
취약점 개요
이 취약점의 식별자는 CVE-2026-74790입니다. VulnCheck은 CVSS v4 평가 점수를 9.3(Critical)로 분류했으며, 벡터는 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입니다. 취약성 유형은 CWE-693(Protection Mechanism Failure)입니다. 발단자는 Zwique입니다.
네트워크 원격 공격 경로와 낮은 복잡도, 인증 불필요 조건이 조합되어 기밀성과 무결성에 고도 영향을 줄 수 있다고 평가되었습니다. 다만 해당 프로젝트 측의 독립적 Severity 검증은 진행되지 않았으며, 외부 출처의 CVSS 평가는 참고용입니다.
공식 보안 고지에서는 이를 '보호 메커니즘 우회'로 분류했습니다. MemberFilter를 샌드박스 또는 객체 노출 정책으로 사용하는 애플리케이션이 TemplateContext를 재사용할 때, 필터를 강화해도 이미 캐시된 어세스어를 통해 숨겨야 할 멤버가 그대로 노출될 수 있습니다.
영향 범위
취약점의 직접적 영향 범위는 다음과 같습니다:
- Scriban 0 이상 7.0.0 미만 버전
TemplateContext를 요청 간 또는 렌더 간 재사용하는 애플리케이션MemberFilter를 샌드박스 또는 객체 노출 정책으로 사용하는 애플리케이션
실제 영향의 깊이는 애플리케이션의 사용 패턴에 따라 달라집니다. TemplateContext를 요청 단위로 새 인스턴스를 생성한다면 취약패턴에 해당하지 않습니다. 반면 단일 인스턴스를 스레드 전체나 애플리케이션 스코프에서 재사용하면서 여러 사용자의 요청에 다른 MemberFilter를 적용하는 구조라면, 한 사용자의 느슨한 필터로 캐시된 어세스어가 이후 다른 사용자의 요청에서도 동작할 수 있어 크로스-리퀘스트 정보 유출이 발생할 수 있습니다.
Scriban을 간접 종속성으로 사용하는 상위 프레임워크의 영향 범위는 아직 명확히 파악되지 않았습니다. 직접 사용하는 애플리케이션뿐 아니라 간접 의존 체인을 함께 점검해야 합니다.
기술적 분석

발생 메커니즘
TemplateContext.GetMemberAccessor()는 타입별로 TypedObjectAccessor를 _memberAccessors 딕셔너리에 캐시합니다. 이때 캐시 키는 타입만 고려하고 MemberFilter 상태를 포함하지 않습니다.
구체적인 흐름은 다음과 같습니다:
- 첫 렌더에서 느슨한
MemberFilter(예: 모든 멤버 허용)로 특정 타입의 어세스어가 캐시됨 - 이후 같은
TemplateContext에서MemberFilter를 강화 (예: 일부 멤버만 허용) GetMemberAccessor()가 호출되면 타입 기반 캐시가 그대로 반환되며, 새로운 필터는 반영되지 않음- 템플릿이 이전에 숨겨야 했던 멤버에도 접근 가능
Scriban 7.0.0은 이 문제를 해결하기 위해 MemberFilter 변경 시 캐시를 리셋하는 로직을 추가했습니다. 해당 커밋 8180fb6에서 TemplateContext.Reset()도 이전 MemberFilter를 포함하는 캐시된 어세스어를 삭제하도록 개선되었습니다. 이는 NVD의 기록과 GitHub Security Advisory에서 설명하는 내용과 일치합니다.
운영상 의미
이 취약점의 위험도는 템플릿에 바인딩하는 객체의 민감도에 따라 결정됩니다. 객체가 시리얼라이징된 세션 데이터, 인증 정보, 내부 상태, 또는 운영 환경 설정을 포함한다면 우회를 통한 정보 유출의 영향이 큽니다. 반면 공개 정보만 바인딩하는 템플릿이라면 영향이 제한적입니다. 환경별 바인딩 객체의 민감도를 파악해 우선순위를 판단해야 합니다.
공개 PoC·익스플로잇 분석
공식 보안 고지에서 공개된 PoC는 캐시 메커니즘을 직접 증명하는 수준이며, exploit 코드나 wild에서의 실제 공격 활동은 현재 확인되지 않았습니다. 특정 환경의 설정과 바인딩 객체의 구성에 따라 실제 영향이 달라질 수 있습니다.
대응 방안
즉시 수행 조치
- 가능하면 즉시 Scriban 7.0.0으로 업그레이드
- 업그레이드가 당장 불가능할 경우,
TemplateContext를 요청 단위로 새로 생성하여 재사용하지 않도록 변경 (각 요청마다 새MemberFilter와 함께GetMemberAccessor()가 호출되도록 함) TemplateContext에 바인딩하는 객체의 민감 속성/필드를 최소화하여 노출 면적을 축소
지속적 구조 개선
TemplateContext를 요청 스코프로 관리해 재사용 패턴을 구조적으로 제거- Scriban의 sandbox execution model을 활용해 접근 허용 대상을 화이트리스트로 제한
한계
야생에서의 실제 공격 활동이나 구체적 공격 시나리오는 현재 확인되지 않았습니다. Scriban을 간접 종속성으로 사용하는 상위 프레임워크의 영향 범위는 별도 점검이 필요하며, 독립적 Severity 검증은 진행되지 않았습니다. CISA KEV 등 정부/산업 수준의 목록 포함 여부도 현재 확인되지 않았습니다.
참고자료
- CVE-2026-74790 (NVD)
- GitHub Security Advisory GHSA-5wr9-m6jw-xx44
- Scriban 7.0.0 릴리스
- Scriban 7.0.0 NuGet
- VulnCheck 고지
- 수정 커밋 8180fb6
- CVE-2026-74790 원본 (CVE Services)
함께 읽으면 좋은 글
- CVE-2026-5752: Cohere AI Terrarium 샌드박스 탈출 취약점 분석
- CVE-2026-5674 대응 가이드: PipeWire 샌드박스 탈출 취약점 점검 포인트
- CVE-2026-67340 대응 가이드: ArcadeDB JavaScript 트리거 기반 OS 명령 실행 점검 포인트
본 콘텐츠는 AI 기술로 작성된 분석 리포트를 포함하고 있습니다. 내용 중 사실과 다르거나 보완이 필요한 정보를 발견하셨으면 댓글을 통해 의견을 부탁드립니다. 여러분의 피드백은 더 정확한 보안 정보 공유에 큰 도움이 됩니다.
댓글 (0)
댓글을 작성하려면 로그인이 필요합니다.
로그인아직 댓글이 없습니다.
첫 번째 댓글을 작성해보세요!