MISP CVE-2026-85216: LDAP 로그인에서 빈 또는 null 비밀번호로 인증 우회되는 원인

CVE-2026-85216은 MISP 2.5.45 이하 버전에서 LDAP 또는 LinOTP 인증 구성을 사용할 때 발생하는 취약점이다. 유효한 디렉터리 사용자의 이메일 주소만 아는 공격자가 빈 비밀번호를 제출하면 해당 사용자로 인증을 우회할 수 있다. 이 취약점은 2026-09-03에 CIRCL이 CVE 레코드를 공시했으며, CVSS v4.0 기준 9.5(Critical)로 평가된다.

CVE-2026-85216 개요: 영향 버전 2.5.45 이하와 심각도 CVSS 9.5

CVE 레코드에 따르면 이 취약점은 MISP의 LDAP 및 LinOTP 인증 컴포넌트가 사용자가 제공한 자격 증명을 충분히 검증하지 않아 생겼다. MISP가 자체 LdapAuthenticate와 LinOTPAuthenticate 커스텀 인증 클래스로 CakePHP 표준 FormAuthenticate를 대체하면서 원본 플러그인의 자격 증명 검사를 복제하지 않아서, 빈 값이나 문자열이 아닌 값이 인증 메커니즘에 그대로 전달될 수 있는 상태로 남았다.

아래 표에 CVE 레코드와 패치 커밋에서 확인한 핵심 메타데이터를 정리했다.

항목 근거
CVE 식별자 CVE-2026-85216
영향 버전 MISP 0 ~ 2.5.45 (semver lessThanOrEqual)
CVSS v4.0 9.5 (Critical) — AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H
문제 유형 CWE-521 (Weak Password Requirements)
공시 정보 2026-09-03T13:59:35Z, CNA: CIRCL, 상태 PUBLISHED
패치 커밋 0ee058548
CISA ADP Exploitation none (Automatable: no, Technical Impact: total)
적용 인증 경로 LDAP, LinOTP

CISA ADP 부가 정보(SSVC v2.0.3)에서는 Exploitation 항목이 “none”으로 기록돼 있어, 기준일(2026-09-05) 시점까지 공개된 실전 악용 사례는 확인되지 않는다. 다만 Automatable: no, Technical Impact: total로 분류돼 있어서 기술적 영향은 전체 수준이며, 자동화 없이도 공격이 가능하다는 평가다.

LDAP 인증 우회의 원리: 빈 비밀번호와 미인증 바인드(RFC 4513 5.1.2)

우회의 핵심 메커니즘은 RFC 4513 섹션 5.1.2에 정의된 “미인증 바인드(unauthenticated bind)” 동작에 근거한다. 패치 커밋의 코드 주석은 이를 직접 인용하고 있다: “유효한 DN과 빈 비밀번호를 가진 바인드 요청은 미인증 바인드이며, 많은 디렉터리 서버가 이를 성공으로 응답한다”.

구체적인 공격 흐름은 다음과 같다.

  1. 공격자는 MISP에 존재하는 디렉터리 관리 사용자의 이메일 주소(= 유효 DN)를 파악한다. 패치 커밋 주석에 따르면 “사용자의 이메일 주소만 아는 사람이 MISP에 대해 인증을 우회할 수 있다”.
  2. 공격자는 그 이메일에 빈 비밀번호('')를 제출한다.
  3. MISP의 LdapAuthenticate는 이 자격 증명을 검증 없이 ldap_bind()에 전달한다.
  4. 배후 LDAP 서버가 미인증(익명) 바인드를 허용하는 구성이라면, 유효 DN + 빈 비밀번호 조합에 대해 성공 결과를 반환한다.
  5. MISP는 이를 “인증 성공”으로 간주해 공격자를 해당 디렉터리 사용자로 취급한다. 비밀번호 검증이 전무하다.

IONIX 위협 센터도 이를 교차 확인하며, 공격자가 “유효한 디렉터리 관리 사용자의 이메일 주소를 알아야 또는 추측해야 한다”는 트리거 조건과 “배후 LDAP 서버가 미인증(익명) 바인드를 허용하는 구성”이라는 선행 요건을 명시한다.

ldap_bind()의?string 타입 문제: null과 false가 빈 비밀번호 검사를 우회하는 이유

단순히 비밀번호가 ''인지만 검사하는 것은 불충분하다. 패치 커밋의 코드 주석이 설명하듯, ldap_bind()의 PHP 시그니처는 ?string을 파라미터로 받으므로, 아래 두 가지 부수 경로가 있다.

  • null: ?string은 null을 허용하는 타입이므로, null 값은 빈 비밀번호 변환 없이 그대로 미인증 바인드로 처리된다.
  • false: PHP의 강제 변환 규칙에 따라 false''로 변환돼, === '' 비교를 우회하면서도 ldap_bind() 내부에서는 다시 빈 비밀번호로 취급된다.

if ($password === '') 한 줄의 검사만으로는 null이나 false가 전달되는 경로를 막지 못한다. 기존 MISP 코드에서 검증 가드 없이 인증이 우회되게 된 직접적 원인이 바로 이것이다.

LinOTP 인증 경로의 취약점: mixed 인증과 빈 로컬 비밀번호 해시

LinOTP 인증 경로에는 LdapAuthenticate와 별도로 두 가지 요소가 더 있다.

첫째, LinOTPAuthenticate의 mixedauth 분기에서 빈 비밀번호가 별도로 처리되지 않는 문제다. 패치는 이 분기에 $password === ''인 경우를 명시적으로 거부하는 분기를 추가했으며, 주석에는 “PIN이 없는 토큰을 위해 최상단이 아닌 mixedauth 분기에 배치한 이유”가 설명돼 있다.

둘째, LDAP로 프로비저닝된 MISP 로컬 계정의 비밀번호 저장 문제다. 기존 코드는 계정 생성 시 'password' => ''로 저장했으며, User::beforeValidate()가 원래 빈 비밀번호를 랜덤 비밀번호로 대체했지만 해당 저장 경로에서는 검증을 의도적으로 건너뛰어 그 함수가 실행되지 않았다. 그 결과 ''의 해시가 로컬 데이터베이스에 기록됐고, 사용자가 LDAP에서 더 이상 조회되지 않으면 로컬 폴백 인증(mixedAuth fallback)으로 빈 비밀번호 로그인이 가능해지는 상태였다.

패치 커밋 0ee058548가 변경한 검증 단계

CVE 기록의 patch reference에 커밋 0ee058548이 연결돼 있으며, 해당 커밋은 “fix: [security] Reject empty and non-string credentials in the LDAP a…”라는 제목으로 LdapAuthenticate.php와 LinOTPAuthenticate.php를 변경한다.

변경 사항은 크게 세 단계로 나뉜다.

  1. 자격 증명 타입·공백 가드 추가 (LdapAuthenticate): 이메일과 비밀번호가 모두 is_string()을 통과하고 !== ''인지 검사하는 분기를 메서드 상단에 배치했다. 검증을 통과하지 못하면 [LdapAuth] Rejected login attempt with a missing or invalid email or password. 에러 로그를 남기고 false를 반환한다.

  2. LinOTP mixedauth 빈 비밀번호 거부: mixedauth 분기에 $password === ''인 경우를 별도 거부 분기로 처리하며, PIN 없는 토큰 상황과 충돌하지 않도록 해당 분기 안에 위치시켰다.

  3. LDAP 프로비저닝 계정의 랜덤 비밀번호 저장: 계정 생성 시 'password' => '' 대신 $userModel->generateRandomPassword()를 호출해 무작위 비밀번호를 저장하도록 변경했다. 커밋 주석은 “빈 문자열의 해시가 빈 비밀번호와 검증되므로, 사용자가 LDAP에서 더 이상 조회되지 않는 순간 mixedAuth 폴백이 이를 로컬 자격증명으로 받아들이게 된다”고 원인을 명시한다.

검증을 통과한 정상 로그인 시도에서는 기존처럼 [LdapAuth] Login attempt with email: $email 디버그 로그가 기록돼 운영 모니터링 시 정상/비정상 시도를 구분할 수 있다.

적용 여부 점검과 대응: 업그레이드, 플러그인 제한, 익명 바인드 거부

MISP 2.5.45 이하를 LDAP 또는 LinOTP 인증 구성으로 쓰는 조직이라면 아래 순서로 적용 여부를 점검하고 대응을 진행하면 된다.

  1. 로그인 경로 확인: MISP 설정에서 LDAP 또는 LinOTP 인증 플러그인이 활성화돼 있는지 확인한다.
  2. 커밋 포함 여부 확인: 현재 설치된 MISP 빌드가 커밋 0ee058548을 포함하는지 git log 또는 릴리스 노트로 확인한다. CVE 레코드와 커밋 어디에도 패치가 포함된 정식 릴리스 버전 번호(예: 2.5.46)가 명시돼 있지 않아, 커밋 해시 포함 여부로만 확인 가능하다.
  3. 업그레이드: 커밋 0ee058548이 포함된 MISP 릴리스로 업그레이드한다.
  4. 즉시 패치가 어려울 경우:
  • LDAP·LinOTP 인증 플러그인을 비활성화하거나 제한한다.
  • 배후 LDAP 디렉터리에서 익명(미인증) 바인드 요청을 거부하도록 구성해서, 이 취약점이 의존하는 근본 조건을 제거한다.

CISA ADP 기준으로 Exploitation이 none이므로 공개된 활성 악용은 확인되지 않는다. 그러나 CVSS v4.0에서는 Attack Requirements가 PRESENT, Privileges Required가 NONE으로 기록돼 있다. 네트워크 접근만 있으면 추가 권한 없이 인증 우회가 가능하다는 뜻이다. Technical Impact가 total로 평가된 점까지 고려하면 LDAP 또는 LinOTP 인증을 사용하는 환경에서는 우선적으로 패치를 적용하는 것이 바람직하다.


본 초안은 2026-09-05 기준 CVE 레코드(CIRCL 공시, 2026-09-03), 패치 커밋 0ee058548 코드 주석, CISA ADP 부가 정보, IONIX 위협 센터 교차 확인, SecurityDesk 원문(2026-09-05)을 근거로 작성됐다. 패치가 포함된 MISP 정식 릴리스 버전 번호는 아직 확인되지 않은 상태이며, MISP 공식 보안 권고 페이지 본문도 직접 확인하지 못했다.

댓글 남기기