
CVE-2026-100671에 대한 로컬 전용 개념 증명 검증기로, 루프백 대상에 대해 Grav Twig 페이지 캐시 세션 쿠키 노출 및 재생을 재현합니다.
Grav 2.0.25에서 수정된 Grav content-Twig/page-cache 세션 탈취에 대한 최소한의 로컬 전용 검증 도구입니다.
권고:
exploit.py는 의도적으로 루프백 대상으로 제한됩니다:
127.0.0.1::1localhost원격 호스트를 거부하고, 루프백 리다이렉트만 따르며, Python 표준 라이브러리 HTTP 클라이언트를 사용하고, 요청 타임아웃을 적용하며, bearer 토큰, 쿠키, 응답 본문을 절대 출력하지 않습니다.
소유하거나 테스트가 명시적으로 허가된 Grav 인스턴스에만 사용하십시오. 이 스크립트는 로컬 랩에 공개 증명 페이지를 생성합니다. 랩이 실행 간 콘텐츠를 유지하는 경우 테스트 후 해당 페이지를 제거하십시오.
get_cookie()가 방문하는 관리자의 세션 쿠키를 서버 측에서 읽습니다.페이지 작성 계정은 문서화된 낮은 권한의 쓰기 경로만 필요합니다. api.pages.read, admin.*, 또는 슈퍼 관리자 접근 권한은 필요하지 않습니다. 피해 관리자는 공개 페이지를 한 번 방문하기만 하면 됩니다.
2.0.19부터 2.0.24까지: 기본 제공되는 content-Twig 구성으로 취약합니다.2.0.0부터 2.0.18까지, 그리고 1.7.x: content Twig가 명시적으로 활성화된 경우에만 영향을 받습니다.2.0.25: 수정됨.다음을 갖춘 로컬 Grav 랩을 실행하십시오:
이 두 파일 저장소는 Grav, PHP, 플러그인 또는 계정을 프로비저닝하지 않습니다.
자격 증명을 환경 변수로 설정하여 소스 제어에 포함되지 않도록 하십시오:
export GRAV_BASE_URL=http://127.0.0.1:8080
export GRAV_WRITER_USERNAME=low
export GRAV_WRITER_PASSWORD='local-writer-password'
export GRAV_ADMIN_USERNAME=admin
export GRAV_ADMIN_PASSWORD='local-admin-password'
python3 exploit.py
기본 URL은 루프백으로 유지되어야 합니다. 기본 라우트는 무작위입니다. 실행 간 비교 시 고정 라우트를 선택할 수 있습니다:
python3 exploit.py --route /cookie-proof-24
예상되는 취약 결과:
page_create_status=201
admin_login_status=200
victim_page_status=200
attacker_page_status=200
cached_victim_cookie_visible_to_attacker=yes
admin_cookie_value_match=yes
replayed_cookie_api_status=200
result=VULNERABLE
이 명령은 예상 결과가 재현되면 0, 재현되지 않으면 1, 설정 또는 전송 오류의 경우 2로 종료됩니다.
Grav 2.0.25에 대해 동일한 명령을 실행하십시오:
python3 exploit.py --expect fixed
예상되는 수정 동작: 공격자가 볼 수 있는 세션 값이 없고 세션 재전송이 성공하지 않습니다. 깨끗한 수정 결과는 --expect fixed와 함께 0으로 종료됩니다.
Grav 2.0.25 이상으로 업그레이드하십시오. 이전 배포의 경우, 권고에서 다음과 같은 임시 제어를 나열합니다:
security.twig_content.process_enabled: false로 content Twig를 비활성화; 또는system.pages.never_cache_twig: true 설정;HttpOnly, Secure, 또는 SameSite를 수정으로 간주하지 마십시오: 취약한 쿠키 읽기는 Twig 렌더링 중 서버 측에서 발생합니다.
canhieu가 보고했습니다. 이 저장소는 이미 공개된 권고에 대한 재현 지원 도구이며, 원격 스캐너나 자격 증명 수집 도구가 아닙니다.