🇰🇷 한글 설명
Symfony UX는 Symfony용 JavaScript 생태계입니다. 2.8.0부터 2.36.0 미만 및 3.1.0 미만 버전에서, #[LiveProp]이 DateTimeInterface 타입으로 선언되고 명시적 포맷이 설정되지 않은 경우 LiveComponentHydrator::hydrateObjectValue()가 new $className($value)로 대체 처리되어, 클라이언트가 now, tomorrow, +10 years 같은 상대 시간 문자열을 보내 시간 기반 업무 로직 검증을 우회할 수 있습니다. 2.36.0 및 3.1.0에서 수정되었습니다.
💡 쉬운 설명
날짜를 입력받는 웹 화면의 값을 조작해 '지금', '내일', '10년 뒤' 같은 상대적 날짜를 넣으면 서버의 날짜 검사를 피할 수 있습니다. 이 문제는 수정 버전으로 업데이트하면 해결됩니다.
🇺🇸 원문 (English)
Symfony UX is a JavaScript ecosystem for Symfony. From 2.8.0 until 2.36.0 and 3.1.0, when a #[LiveProp] is typed as DateTimeInterface and no explicit format is configured, Symfony\UX\LiveComponent\LiveComponentHydrator::hydrateObjectValue() falls back to new $className($value), allowing client-supplied relative strings such as now, tomorrow, or +10 years to move a writable, format-less date prop past time-based business logic checks. This issue is fixed in versions 2.36.0 and 3.1.0.
📍 영향받는 시스템
Symfony UX LiveComponent 2.8.0 ~ 2.36.0 미만, 3.0.x 및 3.1.0 미만 버전을 사용하는 Symfony 애플리케이션
⚔️ 공격 벡터
쓰기 가능한 format 미지정 DateTimeInterface LiveProp에 클라이언트에서 'now', 'tomorrow', '+10 years' 등 상대 시간 문자열을 전송하여 시간 기반 비즈니스 로직 검증을 우회
🛡️ 대응 방법
symfony/ux-live-component를 2.36.0 또는 3.1.0 이상으로 업데이트하거나, 해당 LiveProp에 명시적 포맷을 지정하고 서버 측에서 날짜 값을 재검증
🔧 검증 코드
출력된 버전이 2.36.0 미만(2.x 계열) 또는 3.1.0 미만(3.x 계열)이면 취약하며, 2.36.0 이상 또는 3.1.0 이상이면 패치된 버전입니다.
composer show symfony/ux-live-component 2>/dev/null | grep -E '^versions'