Skip to content
DelspoN
Go back

LG webOS TV Zero-Click RCE

Edit pageEnglish

LG webOS에서 발생한 제로클릭 취약점이다. Shodan 기준, 인터넷에 직접 노출된 LG webOS 기기는 약 42,000대에 달한다.

Shodan: 인터넷에 노출된 LG webOS 기기 약 42,136대 (한국 23,704, 홍콩 4,187 등)

대상 환경

Version: webOS 10.2.2-5901 (Build 33.31.23)

취약점 체인

  1. SSG R2R 페어링 우회 — 포트 3001로 보낸 PIN을 무조건적으로 정답 PIN으로 그대로 받아들임. 이를 통해 인증을 우회하여 페어링을 성립시킬 수 있으며, 앱 실행 권한을 얻을 수 있음.
  2. 네이티브 권한 획득 (미공개 — 미패치) — 권한 있는 네이티브 컨텍스트를 유지한 채 공격자 페이지를 로드시켜, 그 페이지가 네이티브 호출을 수행하게 만듦. 아직 수정되지 않아 상세는 비공개.
  3. 미서명 IPK 설치 — 디스크의 devmode 플래그 하나로만 게이팅되는 dev/install이 서명 검증을 건너뜀. 그 플래그마저 Luna 호출로 켤 수 있어, 미서명 IPK를 설치하고 임의 코드를 실행함.

코드 레벨 분석

1. SSG R2R 페어링 우회

파일: com.webos.service.secondscreen.gateway/helpers/system/pairing-manager.js

R2R 모드에서 서버는 클라이언트가 보낸 r2rPin존재길이(PIN_LENGTH = 8)만 확인한다. TV가 생성한 정답 PIN과 비교하는 단계가 없다:

if (!!options.r2rMode) {
    if (!!options.r2rPin === false) {
        return Q.reject("r2rPin does not exist");
    } else if (options.r2rPin.length !== this.PIN_LENGTH) {
        return Q.reject("r2rPin.length is not PIN_LENGTH");
    }
}

이후 그 값을 그대로 정답 PIN으로 저장하고, 사용자에게 보여줄 팝업은 R2R 모드에서 빈 문자열로 단락된다:

if (!!this.pairingRequests[pairingRequestId].r2rMode) {
    pin = this.pairingRequests[pairingRequestId].r2rPin;   // 공격자 제어
} else {
    pin = this.generatePin();                              // 정상: 랜덤 8자리
}
this.pairingRequests[pairingRequestId].pin = pin;          // 정답 PIN으로 저장

공격자는 register 때 보낸 값과 같은 PIN을 ssap://pairing/setPin으로 제출하면 페어링이 성립한다. 매니페스트의 signatures[].signature가 비어 있어도 통과해 PROTECTED 등급의 LAUNCH 권한까지 얻는다.

2. 네이티브 권한 획득 (미공개)

이 단계는 아직 패치되지 않아 상세를 공개하지 않는다.

취약점 1로 얻은 앱 실행 권한을 발판으로, 권한 있는 네이티브 IPC 컨텍스트를 유지한 채 공격자가 제어하는 외부 웹 페이지를 로드시키는 결함이다. 그 결과 공격자 페이지의 스크립트가 네이티브 호출을 직접 수행할 수 있게 되고, 이것이 취약점 3의 setDevMode·dev/install 호출로 이어진다. 영향받는 구체적 컴포넌트·권한·코드·재현 방법은 수정 전까지 비공개한다.

3. 미서명 IPK 설치

파일: usr/sbin/appinstalld

취약점 2로 얻은 권한 있는 네이티브 컨텍스트setDevMode로 devmode 플래그를 직접 켤 수 있다. 정상 사용 시 필요한 passphrase 입력은 LG Developer UI에만 있고 LS2 메서드 레벨엔 없다:

luna://com.webos.service.devmode/setDevMode {"enabled": true}

플래그가 켜지면 dev/install이 프로덕션 경로와 달리 서명 검증(pkgverifier/verifyIpk)을 부르지 않고 미서명 IPK를 state:"installed"로 수락한다. 설치된 type:"native" IPK를 실행하면 임의 코드 실행이 가능하다.

근본 원인 (Root Cause)

영향

데모

같은 네트워크의 공격자가 TV의 IP만으로, 사용자 조작 없이 원격 코드 실행에 성공하는 데모.

공개 타임라인

익스플로잇 코드와 상세 페이로드는 공개하지 않습니다. 필요한 경우 별도로 문의주시기 바랍니다.


Edit page
Share this post:

Previous Post
Christmas CTF 2019 / Christmas Pocket