
CVE-2023-29689 - PyroCMS의 SSTI 취약점을 위한 드롭인 수정, 커스텀 Twig 샌드박스 구현을 통해
CVE-2023-29689를 위한 드롭인 보안 수정 - PyroCMS 3.9에서 원격 코드 실행으로 이어지는 서버사이드 템플릿 인젝션.
PyroCMS는 관리자 사용자가 데이터베이스에 저장된 템플릿을 편집할 수 있도록 합니다. 샌드박싱이 없으면 관리자 접근 권한을 가진 공격자가 악의적인 Twig 코드를 주입할 수 있습니다:
{{['id']|map('system')|join}}
이것은 임의의 시스템 명령을 실행합니다. 업스트림 유지관리자들은 관리자 사용자가 신뢰되므로 '의도대로 작동'한다고 간주하지만, 멀티 테넌트 또는 엔터프라이즈 환경에서는 '관리자' ≠ '쉘 접근이 신뢰됨'입니다.
이 패키지는 사용자 편집 가능한 템플릿을 자동으로 샌드박싱하면서 정당한 테마/애드온 템플릿은 제한 없이 둡니다. 이 패키지의 작성자가 업스트림에 기여한 Twig의 SourcePolicyInterface를 사용하여 선택적으로 제한을 적용합니다.
composer require ysaxon/pyrocms-ssti-fix
안타깝게도 PyroCMS가 자동 발견을 비활성화했기 때문에 serviceProvider를 직접 추가해야 합니다.
다음 명령으로 추가할 수 있습니다:
sed -i "/App\\\Providers\\\AppServiceProvider::class,/a \ YSaxon\\\PyroCmsSstiFix\\\SandboxServiceProvider::class," config/app.php
SourcePolicyInterface 지원을 위해)┌─────────────────────────────────────────────────────────────┐
│ Twig 렌더 요청 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 저장소 소스 정책 │
│ │
│ 템플릿이 저장소 경로(데이터베이스/사용자 편집 가능)에서 왔습니까?│
│ │
│ 예 ──────────────────► 샌드박스 활성화 │
│ │ - 차단: map, filter, reduce │
│ │ - 차단: 위험한 태그 │
│ │ - 허용 목록: 안전한 작업 │
│ │
│ 아니오 ───────────────────► 샌드박스 없음 │
│ (테마/애드온 템플릿이 정상적으로 │
│ 작동) │
└─────────────────────────────────────────────────────────────┘
기본 설정은 안전하며 대부분의 설치에서 작동합니다. 사용자 정의하려면:
php artisan vendor:publish --tag=pyrocms-ssti-fix-config
이 명령은 config/pyrocms-ssti-fix.php를 생성합니다:
return [
// Master switch
'enabled' => env('PYROCMS_SSTI_FIX_ENABLED', true),
// Override auto-detected storage path
'storage_path' => env('PYROCMS_SSTI_FIX_STORAGE_PATH', null),
// Customize allowed tags/filters/functions/methods/properties
'policy' => [
'tags' => [SecurityPolicyDefaults::INCLUDE_DEFAULTS],
'filters' => [SecurityPolicyDefaults::INCLUDE_DEFAULTS],
// ... see config file for full options
],
];
기본 보안 정책은 샌드박스 템플릿에서 다음과 같은 위험한 기능을 차단합니다:
map - {{['cmd']|map('system')}}는 쉘 명령을 실행합니다filter - 임의의 PHP 함수를 호출할 수 있습니다reduce - 임의의 PHP 함수를 호출할 수 있습니다include, extends, block, macro, import, embed, usesource - 임의의 파일 내용을 읽습니다include - 다른 템플릿을 포함합니다template_from_string - 문자열에서 템플릿을 생성합니다안전한 작업은 샌드박스 템플릿에서 계속 사용할 수 있습니다:
{# 변수 #}
{{ entry.title }}
{{ user.name|upper }}
{# 반복문과 조건문 #}
{% for item in items %}
{% if item.active %}
{{ item.name }}
{% endif %}
{% endfor %}
{# 안전한 필터 #}
{{ text|escape }}
{{ date|date('Y-m-d') }}
{{ items|length }}
{{ name|lower|trim }}
{# 안전한 함수 #}
{{ max(a, b) }}
{{ random(['red', 'blue', 'green']) }}
관리자 템플릿이 합법적으로 추가 기능을 필요로 하는 경우:
// config/pyrocms-ssti-fix.php
'policy' => [
'filters' => [
SecurityPolicyDefaults::INCLUDE_DEFAULTS,
'my_custom_filter', // 특정 필터 추가
],
'methods' => [
SecurityPolicyDefaults::INCLUDE_DEFAULTS,
'App\Models\Post' => ['getTitle', 'getSummary'],
],
],
설치 후 익스플로잇이 차단되었는지 확인하십시오:
{{['id']|map('system')|join}}수정 전: id 명령의 출력이 표시되거나 (또는 충돌)
수정 후: 오류가 표시되거나 [렌더링 실패: "map" 필터가 허용되지 않음.]이 표시됨
패키지가 Twig를 찾을 수 없습니다. 일반적으로 다음을 의미합니다:
세부 정보를 보려면 디버그 모드를 활성화하십시오:
PYROCMS_SSTI_FIX_DEBUG=true
관리자가 편집 가능한 템플릿이 이제 차단된 기능을 사용하는 경우:
패키지는 모든 경로 검사와 메서드/속성 조회를 캐시합니다. auto 모드에서는 저장소 경로 템플릿만 샌드박스 오버헤드가 발생합니다.
SourcePolicyInterface 기여자MIT 라이선스 - LICENSE 파일 참조