🇰🇷 한글 설명
Symfony의 X509Authenticator와 X509AuthenticationListener에서 Subject DN을 정규식으로 파싱하는 방식의 결함으로 인해 인증 우회가 가능합니다. 신뢰된 CA에서 발급된 인증서를 가진 공격자가 CN을 조작하여 특권 사용자를 포함한 임의의 사용자로 인증할 수 있습니다. 이는 CVE-2026-45063 수정이 불완전했기 때문입니다.
💡 쉬운 설명
인증서의 이름 정보에 특수문자를 넣어 시스템이 다른 사용자의 이메일 주소로 잘못 인식하게 만드는 취약점입니다. 공격자는 이를 이용해 관리자 등 다른 사람의 계정으로 로그인할 수 있습니다.
🇺🇸 원문 (English)
Authentication bypass by spoofing in X509Authenticator and X509AuthenticationListener of Symfony versions prior to 5.4.56, 6.x prior to 6.4.50, 7.x prior to 7.4.23, and 8.x prior to 8.1.11 allows an attacker holding a certificate from the application's trusted CA who can influence the CN to authenticate as an arbitrary user of the application, including a privileged one, following an incomplete fix for CVE-2026-45063.
X509Authenticator extracts the user identifier from the Subject DN (Distinguished Name) that the web server passes in $_SERVER['SSL_CLIENT_S_DN']. The fix for CVE-2026-45063 anchored that extraction to an RDN (Relative Distinguished Name) boundary, but the regular expression used was not escape-aware. The expression runs against an already serialized DN, so it cannot tell an RDN separator from a separator character that occurs inside a value. Under RFC 2253, used by Apache and by nginx's $ssl_client_s_dn, a comma inside a value is escaped as \, and the expression reads it as a separator regardless. RFC 2253 also does not treat / as a separator, so it leaves it bare inside a value, while the expression treats every / as one. The legacy X509_NAME_oneline() format, used by Apache's LegacyDNStringFormat and by nginx's $ssl_client_s_dn_legacy, is the mirror image: it escapes / as \/ and leaves , bare. In that format, a certificate with no emailAddress attribute, or whose poisoned CN precedes it, authenticates as the smuggled address.
To cover both RFC 2253 and the legacy X509_NAME_oneline() format, X509Authenticator and X509AuthenticationListener now split the DN into RDNs before looking for the attribute, instead of matching the attribute against the serialized string. They select the separator from the serialization, split on unescaped occurrences of that separator only, unescape each RDN afterwards with the rules of its format, and require the attribute to span a whole RDN. The accepted value grammar is unchanged.
Applications that pass a per-attribute user key (such as SSL_CLIENT_S_DN_Email) and deployments whose CA generates or validates the subject are not affected by this vulnerability.
📍 영향받는 시스템
Symfony 5.4.56 미만, 6.x 6.4.50 미만, 7.x 7.4.23 미만, 8.x 8.1.11 미만 (X509 인증을 사용하는 애플리케이션)
⚔️ 공격 벡터
신뢰된 CA로부터 발급받은 인증서의 CN 필드에 쉼표나 슬래시 등 구분자를 삽입하여 다른 사용자(예: 관리자)의 이메일 주소로 위장 인증
🛡️ 대응 방법
Symfony를 5.4.56, 6.4.50, 7.4.23, 8.1.11 이상으로 업그레이드하고, 사용자 키로 SSL_CLIENT_S_DN_Email 등 속성별 키를 사용하도록 설정
🔧 검증 코드
출력된 버전이 해당 브랜치의 패치 버전(5.4.56, 6.4.50, 7.4.23, 8.1.11 등) 이상이면 패치된 것이며, 미만이면 취약합니다.
composer show symfony/security-http 2>/dev/null | grep -E 'versions'