NOW Briefing
/mics/api/v2/sentry/mics-config/handleMessage 접근 로그와 신규 관리자 계정 생성 흔적을 침해 가정으로 점검해야 합니다.
Ivanti Sentry 미인증 OS 커맨드 인젝션·인증 우회 (CVE-2026-10520, CVE-2026-10523)
■ 개요
Ivanti Sentry는 EMM(Enterprise Mobility Management, 기업 모바일 관리) 환경에서 단말과 사내 메일·캘린더·앱 서버 사이의 트래픽을 중계하는 게이트웨이 어플라이언스입니다. 이번 권고는 10.7.0 이하, 10.6.1 이하, 10.5.1 이하 LTS 분기 전체를 포괄하며, 인터넷에 노출된 관리 인터페이스가 공격 표면이 됩니다. Shadowserver 텔레메트리에서 식별된 노출 인스턴스 19대 중 다수는 권고 공개 직후 손상된 상태로 관측됐습니다.
노출된 관리 인터페이스에서 공격자는 인증 없이 /mics/api/v2/sentry/mics-config/handleMessage 엔드포인트로 POST 요청 한 번을 보내 root 권한 임의 OS 명령 실행을 트리거할 수 있습니다(CVE-2026-10520). 함께 공개된 CVE-2026-10523은 동일한 관리 인터페이스에서 인증 절차를 건너뛰고 관리자 계정을 임의로 생성하는 결함입니다. 핫픽스 적용 전에 만들어진 계정이 남아 있으면 지속 접근이 유지됩니다.
root 권한 명령 실행과 관리자 계정 생성이 결합되면, Sentry가 모바일 단말이 사내 시스템과 통신하는 길목에 위치한다는 점이 직접적인 침해 위험으로 이어집니다. root 셸을 장악당하면 어플라이언스 메모리에 상주하는 LDAP·Exchange·메일 서비스 자격증명과 세션 키가 그대로 노출됩니다. 권고 공개 24시간 내 PoC가 공개됐고 48시간 내 백도어 설치까지 확인된 만큼, 단순 패치 적용이 아니라 침해 가정 점검 단계까지 확인하여 처리해야 합니다.
■ 요약
| 항목 | 내용 |
|---|---|
| CVE ID | CVE-2026-10520 (OS Command Injection) CVE-2026-10523 (Authentication Bypass) |
| CVSS 점수 | CVSS v3.1 10.0 / Critical (CVE-2026-10520) CVSS v3.1 9.9 / Critical (CVE-2026-10523) |
| 취약점 유형 | CWE-78 OS Command Injection CWE-288 인증 우회(Alternate Path) |
| 영향/위험 |
• 미인증 원격 root 권한 OS 명령 실행 가능 • 임의 관리자 계정 생성으로 영구 접근 확보 • 게이트웨이가 중계하는 LDAP·Exchange·메일 자격증명 노출 • 공개 PoC 기반 실전 공격 진행 중, 백도어 사례 관측됨 |
| 취약 버전 | Ivanti Sentry 10.7.0 이하 / 10.6.1 이하 / 10.5.1 이하 |
| 패치 버전 | Ivanti Sentry 10.7.1 / 10.6.2 / 10.5.2 |
■ 기술 분석
미인증 POST 요청이 도달하는 취약 엔드포인트는 Sentry MICS(Management Interface Communication Service, 관리 인터페이스 통신 서비스) 모듈의 Spring Boot 컨트롤러 ConfigServiceController에 위치합니다. @RequestMapping("/api/v2/sentry/mics-config") 클래스 선언과 @PostMapping("/handleMessage") 메서드 매핑이 인증 필터 체인 바깥에 놓여 있어 외부 미인증 POST가 그대로 핸들러로 흘러들어갑니다.
핸들러는 폼 본문의 message 파라미터를 내부 설정 서비스의 handleMessage()로 그대로 전달합니다. 설정 파서는 메시지 문자열을 command·module·xpath·value 네 토큰으로 분해하고, command 값이 execute이면 CommonUtilities.executeNativeCommand()를 리플렉션으로 호출해 OS 명령을 실행하는 흐름입니다. XML 페이로드의 <reqandres> 태그가 실행 인자로 매핑되며, 중간 입력 검증이나 이스케이프는 없습니다.
/* [패치 전] ConfigServiceController */
@RequestMapping({"/api/v2/sentry/mics-config"})
public class ConfigServiceController {
@PostMapping({"/handleMessage"})
public ResponseEntity<?> handleMessage(@RequestParam("message") String message) {
// 외부 입력 message를 그대로 설정 파서에 전달
String result = this.configService.handleMessage(message);
return ResponseEntity.ok(result);
}
}
/* [패치 후] watchTowr 분석 기준 */
@PostMapping({"/handleMessage"})
public ResponseEntity<?> handleMessage(@RequestParam("message") String message) {
// 외부 입력 무시, DMI 제품 정보 조회 명령으로 고정
String result = this.configService.handleMessage(
"execute system /configuration/system/showDmiInfo");
return ResponseEntity.ok(result);
}
이 입력 경로를 차단하기 위해 Ivanti는 패치를 두 계층에 적용했습니다. 컨트롤러는 외부 message 변수를 폐기하고 DMI 제품 정보를 조회하는 고정 명령 문자열을 호출하도록 바꿨습니다. Apache 프런트엔드에는 미인증 요청을 로그인 페이지로 302 리다이렉트하는 정규식 기반 접근 통제를 더했습니다. 어느 한 계층만 우회해도 호출이 차단되는 다층 방어 구조입니다.
📘 INFO
Apache 단의 정규식 차단은 기존 인증 사용자만 통과시키는 구조입니다. 패치 적용 전 CVE-2026-10523으로 위조된 관리자 계정이 이미 존재한다면, 핫픽스 이후에도 합법적 경로로 그대로 인증을 통과합니다. 보강을 마친 뒤에도 침해 여부를 별도로 검증해야 하는 이유입니다.
■ PoC
이 호출 구조 때문에 공개 PoC는 단일 HTTP POST 요청으로 동작하며, Content-Type: application/x-www-form-urlencoded 헤더에 message=... 본문을 실어 보냅니다. message 값은 execute system /configuration/system/commandexec 명령과 <commandexec> XML 블록을 이어붙인 페이로드입니다. 응답에 Message handled successfully 문자열과 <result><success> 블록이 함께 반환되면 명령 실행 성공으로 판정합니다.
⚠️ WARN
아래 코드는 실제 익스플로잇이 아니라 공개 PoC의 검증 관점을 방어용으로 단순화한 예시입니다.
명령 인자는 무해한 진단 문자열로 치환했으며, 미인증 트리거 구조와 응답 판정 로직만 보여줍니다.
# 방어용으로 단순화한 예시
import requests
target = "https://<sentry-host>/mics/api/v2/sentry/mics-config/handleMessage"
# 미인증 POST 1회로 message 파라미터가 그대로 설정 파서에 전달됨
body = {
"message": (
"execute system /configuration/system/commandexec "
"<commandexec><index>1</index>"
"<reqandres>SAFE_PROBE</reqandres>" # ... 무기화 명령 생략 ...
"</commandexec>"
)
}
r = requests.post(
target,
data=body,
headers={"Content-Type": "application/x-www-form-urlencoded"},
verify=False,
)
# 응답에 <result><success> 블록과 명령 출력이 함께 포함되면 취약 판정
vulnerable = "Message handled successfully" in r.text and "<result><success>" in r.text
공격에는 자격증명, 세션, 사용자 상호작용이 필요하지 않습니다. 인터넷에 관리 인터페이스가 노출된 어플라이언스는 곧바로 공격 대상이 되며, 위 요청 한 번이 root 권한 셸 명령 실행과 같습니다.
■ 탐지 및 점검
• 위 PoC와 실제 공격 흔적은 우선 웹 액세스 로그에서 외부 IP가 POST /mics/api/v2/sentry/mics-config/handleMessage 엔드포인트를 호출한 이력이 있는지 조사해 확인합니다. 정상 운영에서 외부 클라이언트가 이 경로를 호출하는 경우는 없습니다.
• 응답 본문에 Message handled successfully 문자열 또는 <result><success> XML 블록이 반환된 트랜잭션을 식별해 명령 실행 성공 여부를 확인합니다.
• 어플라이언스의 /etc/passwd, /etc/shadow, /etc/cron*, /etc/sudoers.d/, ~/.ssh/authorized_keys의 변경 타임스탬프를 권고 공개일(2026-06-09) 이후로 점검합니다.
• 관리자 계정 목록과 신규 사용자 생성 감사 로그를 확인해 CVE-2026-10523을 악용한 영구 백도어 계정이 추가됐는지 검증합니다.
• 시스템 명령 감사 로그에서 uname -a, id, cat /etc/shadow, wget, curl 등 PoC 단계에서 관측된 정찰·다운로드 명령 실행 흔적을 조사합니다.
■ 대응 방안
• 탐지와 점검을 진행하면서 운영 분기에 맞춰 Ivanti Sentry 10.5.2 / 10.6.2 / 10.7.1 핫픽스를 즉시 설치합니다. 두 결함 모두 동일 핫픽스에서 해소됩니다.
• 패치 적용 전까지 인터넷에 노출된 Sentry 관리 인터페이스(기본 8443/TCP)는 관리망 IP 허용 목록으로 접근을 제한하거나 임시 격리합니다.
• 권고 공개일 이후 어플라이언스에 저장된 LDAP·Exchange·메일 서비스 계정의 자격증명·API 키·인증서를 교체합니다. 메모리에 상주하던 비밀값이 평문으로 추출됐을 수 있습니다.
• 침해 의심 어플라이언스는 기존 백업으로 복원하지 않고 출고 초기화 후 패치된 빌드로 재구성합니다. 백도어가 백업본 시점에 이미 심어졌을 가능성이 있습니다.
• Shadowserver Daily Network Reports 구독 또는 자체 외부 스캔으로 자사 ASN 범위 내 Sentry 인스턴스의 인터넷 노출 여부를 재점검합니다.
💡 TIP
게이트웨이 어플라이언스의 백도어는 정상 관리 트래픽 사이에 숨어 있어 일반 EDR로는 식별이 어렵습니다.
패치 적용 직전 어플라이언스 디스크 이미지를 별도 매체에 보존해 두면, 이후 침해가 확인됐을 때 포렌식 분석과 책임 추적의 근거로 활용할 수 있습니다.
[참고 자료]
Rapid7 — ETR: CVE-2026-10520, CVE-2026-10523 Affecting Ivanti Sentry
watchTowr Labs — Ivanti Sentry Pre-Auth OS Command Injection CVE-2026-10520
watchTowr Labs GitHub — Ivanti Sentry RCE Detection Artifact Generator



