🇰🇷 한글 설명
Azure Active Directory(AAD) 인증 구현 내 OAuth 2.0 권한 부여 흐름에서 여러 보안 약점이 발견되었습니다. 세션 ID 노출, 세션 고정 공격 취약성, CSRF 보호 미흡, HTTPS 미강제 및 로그 주입 위험이 포함되어 있습니다.
💡 쉬운 설명
로그인 과정에서 사용하는 중요한 열쇠(세션 ID)가 외부로 유출되거나, 공격자가 미리 만든 가짜 로그인 세션을 강제로 사용하게 만들 수 있는 결함입니다. 또한 보안 연결(HTTPS)을 사용하지 않을 경우 로그인 정보가 중간에 탈취될 위험이 있습니다.
🇺🇸 원문 (English)
The Azure Active Directory (AAD) authentication implementation contained multiple weaknesses in its OAuth 2.0 authorization flow that could allow attackers to bypass important security guarantees provided by the protocol.
The application used the PHP session identifier (session_id()) as the OAuth state parameter. Because session identifiers are long-lived authentication credentials, exposing them in OAuth redirect URLs could leak valid session tokens through browser history, HTTP Referer headers, reverse proxies, access logs, or third-party infrastructure involved in the authentication flow. If obtained by an attacker, the leaked session identifier could potentially be used for session hijacking.
Additionally, the implementation did not regenerate the session identifier after successful authentication, leaving authenticated sessions susceptible to session fixation attacks where an attacker forces a victim to use a known session identifier before login and later reuses that identifier after authentication.
The OAuth state value was also not implemented as a dedicated, single-use nonce. This weakened CSRF protections and increased the risk of replay attacks against the OAuth callback process.
The authentication flow further failed to enforce HTTPS for the configured OAuth redirect URI. If a non-HTTPS redirect URI was used, OAuth authorization codes and access tokens could traverse the network in plaintext, exposing sensitive credentials to network attackers.
Finally, OAuth error responses containing attacker-controlled GET parameters were logged verbatim. An attacker could inject control characters or crafted log content, leading to log forging, log injection, or corruption of audit records.
The fix introduces:
*
A dedicated cryptographically random OAuth state value.
*
Single-use state validation and invalidation.
*
Constant-time state comparison using hash_equals().
*
Session identifier rotation after successful authentication.
*
Enforcement of HTTPS-only redirect URIs.
*
Sanitized and length-limited logging of OAuth error parameters.
AAD Authentication Plugin (OAuth 2.0 / Azure Active Directory integration)
📍 영향받는 시스템
AAD Authentication Plugin (OAuth 2.0 / Azure Active Directory integration)
⚔️ 공격 벡터
OAuth 리다이렉트 URL을 통한 세션 ID 탈취, 세션 고정, CSRF 및 네트워크 스니핑을 통한 인증 우회
🛡️ 대응 방법
무작위 OAuth state 값 사용, 인증 후 세션 ID 교체, HTTPS 리다이렉트 강제 및 로그 파라미터 정제 적용
🔧 검증 코드
명령어 결과가 'Fixed'로 나오면 보안 함수가 존재함을 의미하며, 실제 패치 여부는 플러그인 버전 및 세션 회전 로직 확인이 필요합니다.
php -r 'echo function_exists("hash_equals") ? "Fixed" : "Vulnerable";' 2>/dev/null