로그인 열쇠를 응답에 그대로 돌려준 OTP 플러그인 — 검증 대신 비밀을 넘겨준 인증 우회
로그인 열쇠를 응답에 그대로 돌려준 OTP 플러그인 — 검증 대신 비밀을 넘겨준 인증 우회
분류: CVE · 웹·서버 · 인증우회(Auth Bypass) · CVE-2026-77264 · [표준]
덱. 워드프레스·우커머스용 OTP(일회용 비밀번호) 로그인 플러그인 하나가 “무인증 인증 우회” 결함으로 공개됐습니다. 문제의 이메일 OTP 처리부가 로그인에 쓰이는 비밀 매직 로그인 토큰(secret magic login token)을 응답에 그대로 되돌려준다는 것이 핵심입니다. 서버가 “이 사람이 맞다”를 확인하는 대신, 남을 로그인시킬 수 있는 열쇠를 요청한 쪽에 넘겨준 셈입니다.
개요
CVE-2026-77264는 “Automation Web Platform – Notifications and OTP for WooCommerce, Advanced Country Code” 워드프레스 플러그인의 **버전 4.8.6까지(포함)**에 영향을 주는 무인증 인증 우회(Authentication Bypass) 취약점입니다. 공개된 설명에 따르면, 이 플러그인의 handle_email_otp_return() 함수가 비밀 매직 로그인 토큰(secret magic login token)을 반환하며, 이 토큰이 노출되면 공격자가 이를 이용해 인증을 우회할 수 있습니다.
- 영향 제품: Automation Web Platform – Notifications and OTP for WooCommerce, Advanced Country Code (워드프레스 플러그인)
- 영향 버전: 4.8.6 이하(up to and including 4.8.6)
- 취약점 클래스: 무인증 인증 우회 — 로그인용 비밀 토큰이 응답으로 노출됨
- 핵심 지점:
handle_email_otp_return()함수가 비밀 매직 로그인 토큰을 반환 - CVSS 3.1: 9.8(CRITICAL), 벡터
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H— NVD 확정. - CWE: CWE-640(취약한 비밀번호 복구 메커니즘, Weak Password Recovery Mechanism) — NVD 확정. (인증 자체의 부재라기보다, 복구·매직로그인 토큰을 안전하지 않게 다룬 결함이라 이 CWE로 분류됩니다.)
- 패치 상태: 무패치(공식 fixed 버전 없음) — 워드프레스 SVN tags 디렉터리에 4.8.6을 넘는 태그가 없고, NVD 상태도 Deferred·영향범위가 “up to and including 4.8.6”으로 상한 없이 열려 있어 확정.
분석 배지. 아래 본문의 근본원인 서술은 워드프레스 SVN 4.8.6 원본 소스(
class-wawp-otp-login.php)에서handle_email_otp_return()함수(약 L1195–1230)가 매직 로그인 토큰(transient_key)을 응답 배열에 실어 반환하는 것을 직접 대조해 확인한 것입니다. 대상 계정을 지목하려면 대상 이메일 주소가 필요하며, 그렇게 얻은 토큰으로 관리자를 포함한 임의 사용자로 로그인할 수 있다는 것이 NVD 공개 설명의 확정 사실입니다.
기술 배경 (30초)
OTP(One-Time Password, 일회용 비밀번호) 로그인은 방문자가 비밀번호를 외우는 대신, 서버가 이메일·문자로 보낸 일회용 코드를 입력해 본인임을 증명하는 방식입니다. “매직 로그인 링크”도 같은 계열로, 서버가 만든 비밀 토큰을 담은 링크를 사용자에게 보내고, 그 토큰을 되가져오는 사람을 로그인시킵니다.
이 방식의 안전은 **“비밀 토큰은 정당한 사용자에게만, 정당한 경로(그 사람의 이메일함)로만 전달된다”**는 한 가지 전제에 달려 있습니다. 토큰 자체가 곧 로그인 열쇠이기 때문입니다. 그래서 이런 플러그인의 처리부는 다음을 지켜야 합니다.
- 사용자가 OTP/매직 로그인을 요청하면, 서버가 비밀 토큰을 만들어 그 사용자의 이메일함으로만 보낸다.
- 나중에 그 토큰이 되돌아오면, 서버가 토큰이 유효한지 확인하고 세션을 발급한다.
- 비밀 토큰은 절대 요청 응답 본문·화면에 그대로 드러나면 안 된다 — 드러나는 순간 이메일함을 거치지 않고 열쇠가 공격자 손에 들어간다.
CVE-2026-77264의 핵심은 3번이 깨졌다는 것입니다. 공개 설명은 handle_email_otp_return() 함수가 그 비밀 매직 로그인 토큰을 반환한다고 밝힙니다. 즉 이메일함이라는 정당한 경로 대신, 요청한 쪽이 받는 응답에 열쇠가 실려 나온 것으로 보입니다.
CVE 분석 요약
공개된 설명을 근거로 정리하면, 결함은 로그인 열쇠(비밀 토큰)를 “본인만 보는 경로”가 아니라 “요청한 자가 보는 경로”로 흘려보냈다는 데 있습니다.
- 비밀이 비밀로 남지 않음:
handle_email_otp_return()이 반환하는 값에 매직 로그인 토큰이 포함됩니다. 토큰은 그 자체로 로그인에 쓰이므로, 응답을 받은 누구든 그 토큰으로 인증을 통과할 수 있습니다. - 인증의 방향이 뒤집힘: 정상 흐름은 “서버가 사용자를 검증한다”인데, 이 결함에서는 “서버가 검증 열쇠를 먼저 내준다”가 됩니다. 검증 대신 비밀을 넘겨준 것입니다.
- 무인증 도달: 공개 분류가 “무인증(unauthenticated) 인증 우회”이므로, 이 토큰을 끌어내는 경로에는 사전 로그인이 필요 없습니다. 대상 계정을 지목하는 데 필요한 정보는 대상의 이메일 주소뿐입니다(NVD 확정: “if they possess the target’s email address”).
공통 골격을 개념 코드로 단순화하면 다음과 같습니다.
// 개념용 단순화 — 실제 소스/페이로드 아님
function handle_email_otp_return(request):
token = create_or_lookup_magic_login_token(...) // 로그인 열쇠(비밀)
// (정상) 이 토큰은 대상 사용자의 이메일함으로만 보내야 한다.
// (결함) 토큰을 응답 본문에 그대로 반환 → 요청한 쪽이 열쇠를 받음
return { ..., magic_login_token: token } // 비밀이 응답으로 새어나감
개념용 단순화 — 실제 페이로드/원본 코드 아님. 실제 반환 형식·파라미터·파일명·라인은 확인하지 않았습니다(⚠️미확인). 작동하는 요청/토큰 추출 절차는 싣지 않습니다.
빠진 것은 복잡한 방어가 아니라 “비밀 토큰은 응답으로 내보내지 않는다”는 원칙 한 줄입니다. 로그인 열쇠를 만들어 놓고 그것을 요청 응답에 실어 보내는 순간, 이메일함이라는 유일한 안전 통로가 무의미해집니다.
공격 시나리오 · 영향도 + 대응방안
시나리오(개념). ① 무인증 공격자가 이메일 OTP 반환 처리부(handle_email_otp_return()가 실행되는 엔드포인트)로 요청을 보냅니다. → ② 처리부가 비밀 매직 로그인 토큰을 만들거나 조회해 응답에 그대로 반환합니다. → ③ 공격자가 응답에서 그 토큰을 읽습니다. → ④ 공격자가 그 토큰으로 매직 로그인을 완료해 대상 계정의 세션을 얻습니다. 정당한 사용자의 이메일함을 거치지 않고 열쇠가 넘어갑니다. (작동하는 요청·토큰 추출 절차는 싣지 않습니다.)
영향도. 확정 범위는 대상의 이메일 주소만 알면 무인증 상태에서 그 계정(관리자 포함)으로 로그인입니다(NVD 확정: “log in as any user, including administrators”). 관리자 세션이 넘어갈 경우 워드프레스 특성상 플러그인/테마 편집을 통한 코드 실행, 콘텐츠·주문 데이터 위·변조, 고객 정보 접근으로 이어질 수 있습니다(합리적으로 예상되는 후속 영향 — 분석 추정). 우커머스(WooCommerce) 상점에 쓰이는 플러그인이라, 탈취 시 결제·주문·고객 데이터가 걸린다는 점이 위험을 키웁니다.
대응방안.
- 근본 — 즉시 비활성화 또는 제거. 공개 시점 기준 공식 패치가 존재하지 않습니다(무패치, 확정 — SVN tags 최고 버전이 4.8.6에서 멈춰 있음). “안전 버전으로 업데이트”는 현시점 가능한 처방이 아니며, 취약 버전을 쓰는 사이트는 해당 플러그인을 비활성화(가능하면 완전 제거) 하는 것이 유일한 근본 대응입니다. OTP/매직 로그인은 부가 인증 편의라, 끄더라도 상점 본체(표준 로그인)는 유지됩니다.
- 완화(업데이트·제거가 당장 어려울 때). 이메일 OTP 반환 엔드포인트로의 접근을 웹 방화벽(WAF)/서버 규칙으로 제한하고, 관리자 계정에 **2단계 인증(2FA)**을 걸어 토큰·세션 탈취만으로 실권을 못 쥐게 방어 심도를 더합니다. 다만 임시 완화일 뿐, 근본 대응을 대체하지 않습니다.
- 탐지 관점. OTP/매직 로그인 처리 엔드포인트로 들어온 요청 중 정상 로그인 UI 흐름을 거치지 않은 직접 호출, 그리고 이메일 발송 기록 없이 성립된 매직 로그인 세션을 로그에서 대조합니다. 짧은 시간에 여러 계정을 겨냥한 반복 호출도 신호입니다.
- 패치 감시. 현재 무패치이므로, 벤더 페이지·wordpress.org 플러그인 페이지·advisory에서 fixed 버전 출시 여부를 계속 확인해 나오는 즉시 적용합니다.
논평 — 왜 이 실수가 반복되나
이 결함은 인증의 근본 원리를 한 방향 뒤집은 사례입니다. 인증이란 “서버가 상대의 비밀을 확인하는” 일인데, 여기서는 서버가 상대에게 비밀을 내주는 일이 되어 버렸습니다. 로그인 토큰·비밀번호 재설정 토큰·매직 링크처럼 “그 자체가 곧 열쇠”인 비밀은, 반드시 **본인만 접근하는 사이드 채널(이메일함·문자)**로만 전달돼야 하고 요청-응답 본문에는 실리면 안 됩니다. 이 원칙이 깨지면 아무리 토큰이 길고 무작위여도 소용이 없습니다 — 열쇠가 문 앞에 걸려 있으니까요.
같은 뿌리는 여러 자리에서 반복됩니다. 비밀번호 재설정 토큰을 API 응답에 노출하는 결함, 이메일 확인 코드·초대 토큰을 클라이언트로 되돌려주는 결함, 우리가 앞서 다룬 소셜 로그인 플러그인들의 인증 우회(바깥 신원 주장을 서버가 재검증하지 않은 계열)와도 한 계열입니다. 표면의 기능(소셜 로그인·OTP·매직 링크)은 달라도, 공통 실수는 **“검증에 쓰여야 할 비밀을, 검증받아야 할 쪽에 넘긴 것”**입니다. 편의 기능을 붙이는 데 집중하다 보면 “이 값이 응답으로 나가도 되는가”라는 질문을 건너뛰기 쉽습니다.
결론
한 줄 요약. OTP·매직 로그인의 안전은 “비밀 토큰이 본인 이메일함에만 간다”는 전제 위에 서 있습니다. CVE-2026-77264는
handle_email_otp_return()이 그 로그인 열쇠를 응답에 그대로 돌려주면서 전제를 무너뜨린 사례입니다.
이 한 틈은 고쳐지겠지만, 똑같은 사고방식은 다음 OTP·매직 링크·토큰 발급 코드에서 또 나타납니다 — 그래서 우리는 개별 CVE가 아니라 “그 자체가 열쇠인 비밀이 요청한 쪽으로 새지 않는가”라는 방법을 남깁니다.
관련: 소셜 로그인 플러그인 인증 우회 계열 → infiltr8 Lab, “‘로그인했다고 하니까 믿었습니다’ — 소셜 로그인 플러그인 3종의 같은 구멍”(바깥 신원 주장 미검증 계열).
References / 참고자료
- NVD — CVE-2026-77264 (이 글이 재구성한 1차출처 메타). 영향 제품·버전·취약점 설명 근거. https://nvd.nist.gov/vuln/detail/CVE-2026-77264
- 공개 설명 요지: “Automation Web Platform – Notifications and OTP for WooCommerce, Advanced Country Code” 플러그인 4.8.6 이하가
handle_email_otp_return()함수에서 비밀 매직 로그인 토큰을 반환해, 무인증 공격자가 인증을 우회할 수 있음.
- 공개 설명 요지: “Automation Web Platform – Notifications and OTP for WooCommerce, Advanced Country Code” 플러그인 4.8.6 이하가
- NVD API — CVSS 3.1 9.8 (
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H), CWE-640, 상태 Deferred.services.nvd.nist.gov/rest/json/cves/2.0?cveId=CVE-2026-77264 - 워드프레스 플러그인 SVN 저장소 —
plugins.svn.wordpress.org/automation-web-platform/tags/4.8.6/includes/auth-services/class-wawp-otp-login.php—handle_email_otp_return()이 매직 로그인 토큰(transient_key)을 응답에 포함해 반환함을 직접 대조 확인(약 L1195–1230). tags 디렉터리에 4.8.6 초과 태그 없음(무패치 근거). - infiltr8 Lab, “‘로그인했다고 하니까 믿었습니다’ — 소셜 로그인 플러그인 3종의 같은 구멍” — “검증에 쓸 비밀을 검증받을 쪽에 넘긴” 같은 계열의 인증 우회를 다룬 우리 글.
이 글은 위 1차출처(NVD·워드프레스 SVN 원본 소스)를 우리 관점에서 다시 쓰고 논평을 더한 것입니다. 특정 문장·코드를 그대로 옮기지 않았으며, 작동하는 익스플로잇/페이로드는 싣지 않았습니다. 코드 예시는 개념 설명용입니다. 이 초안은 RN-11 독립 팩트체크(NVD API + 워드프레스 SVN 원본 직접 대조, 2026-08-31)를 통과했습니다.