1. IPinside

- (주)인터리젠에서 제작한 단말기 정보 수집 및 실시간 개인정보 유출탐지 및 차단 솔루션

- 접속자 단말기 정보 수집, 해외 IP 분석 및 차단, 부정 접속 등을 방지하기 위한 프로그램

 

1.1 IPinside 동작 방식

① IPinside LWS Agent 애플리케이션도 로컬 서버를 통해서 웹사이트와 통신

② 은행 웹사이트가 접속자에 대한 정보를 더 얻기 위해 localhost:21300로 JSONP 요청을 보냄

JSONP (JSON with Padding)
- 자바 스크립트는 서로 다른 도메인에 대한 요청을 보안상 제한 = 동일근원정책(Same-Origin Policy, SOP)
- 이러한 정책으로 인해 생기는 이슈를 cross-domain 문제
- JSONP은 각기 다른 도메인에 상주하는 서버로부터 데이터를 요청하기 위해 사용

③ 해당 요청 실패 시 은행 웹사이트는 접속을 거부 및 IPinside LWS Agent를 먼저 설치할 것을 요구

④ 애플리케이션이 실행되고 있다면 웹사이트는 wdata, ndata, udata 필드를 통해서 다양한 데이터를 받아 볼 수 있음

 

2. 취약점

- wdata, ndata, udata 필드를 통해서 다양한 데이터를 받아 볼 수 있으나 필요 정보보다 많은 데이터가 전송

[사진 1] localhost:21300로 JSONP 요청 결과

2.1 wdata

- 실행중인 프로세스에 대한 정보를 저장

- 난독화시 단지 무작위 바이트 하나만 사용

[사진 2] wdata 예시

- [사진 3]을 통해 wdata에는 다음과 같은 데이터 등이 저장됨

① IP 정보

c0 a8 7a 01 (실 IP 주소 192.168.122.1)

c0 a8 7a 8c (192.168.122.140, 첫 네트워크 카드의 IP 주소)

c0 a8 7a 0a (192.168.122.10, 두번째 네트워크 카드의 IP 주소)

② 운영체제 정보

65 (문자 e)는 GetProductInfo() 함수를 호출한 결과

※ GetProductInfo(): 로컬 컴퓨터의 운영 체제에 대한 제품 유형을 검색 및 반환

③ 하드드라이브 정보

하나는 시리얼 번호가 QM00001이고 다른 하나는 abcdef 

④ 실행중인 프로세스 정보

firefox.exe

⑤ 실행 플랫폼

가상 머신

⑥ 원격제어 프로그램 동작 정보

 

2.2 ndata

- 접속자의 IP 주소를 저장

- 난독화는 랜덤성도 없으며 데이터는 항상 동일

- 웹 사이트가 IPinside LWS Agent에 통신(응답)하는 과정에서 RESPONSE_IP의 값이 HDATAIP에 저장되며, 이는 접속자 IP주소

[사진 3] ndata 예시

2.3 udata 

- “u” 는 “unique”의 약자이며, 몇 가지 다른 아웃풋 타입이 있음

- 15개의 서로 다른 CPUID 명령호출의 결과를 합쳐서 만든 것

※ CPUID 명령어: 소프트웨어가 프로세서의 세부 정보를 검색할 수 있도록 하는 프로세서 보조 명령어

- 난독화는 랜덤성도 없으며 데이터는 항상 동일

- [사진 4]를 확인해보면 네트워크 카드, 하드 드라이브의 목록과 네트워크 카드의 MAC 주소도 목록에 포함

[사진 4] udata 예시

2.4 wdata, ndata, udata 보호

- 사용자를 비익명화하기 위한 여러 데이터가 사용

- 사용자의 H/W, S/W에 대한 데이터를 통해 시스템의 취약점 확인 > 잠재적으로 다른 공격으로 발전 할 가능성

- localhost:21300에서 동작하는 서버는 누가 응답하는지 상관하지 않음 > 어떤 웹사이트든 데이터 요청 가능

① wdata
- 3단계의 보호 장치가 적용_난독화, 압축, 암호화(공개키 암호화)
- 암호화에 사용된 RSA 암호화는 해당 테스트에서 2시간 36분 만에 비공개키를 계산

② ndata, udata
- 유일한 보호장치는 암호화(AES-256 기반의 대칭 암호화)
- 암호화 키는 애플리케이션 내에 하드코딩
- 실행 시마다 동일한 ciphertext를 생성_ CBC 블록 연쇄 모드를 사용하며, 초기회 백터 IV를 전달하지못해 항상 0으로 채움

 

> 재전송 공격을 통해 미리 저장한 유효한 응답을 웹 사이트에 보낼 수 있음

challenge-handshake scheme, 타임 스탬프(timestamp) 등 대응 방안이 확인되지 않음

 

∴ 데이터를 제대로 보호하고 있지 않으며, 어떤 임의의 웹사이트에서도 수집한 데이터에 접근할 수 있음

 

2.5 어플리케이션의 전반적인 보안성

- OpenSSL 라이브러리를 사용 > OpenSSL 1.0.1j 버전

※ 2015년 릴리즈, 2017년 OpenSSL 1.0.1에 대한 지원이 중단

 

- 단일 쓰레드로 동작 > 서비스 거부 공격에 취약

 

[사진 5] 코드 中 일부

- ssl_read 가 정확히 8192 바이트를 리턴해서 버퍼를 꽉 채울 수도 있음 > 이럴 경우 inputBuffer는 널문자로 종료되지 않음

- 이것을 복사한 request 도 마찬가지로 널문자로 종료되지 않음 > sprintf() 나 handle_request()에서 request를 널문자로 종료되는 문자열로 취급할 경우 버퍼를 초과해서 읽을 것

- 그렇게 되면 sprintf() 는 16384 바이트 이상의 데이터를 읽을 것 > 타깃 버퍼에 다 담기는 너무 큰 데이터

=> 스택오버플로우나 버퍼의 범위를 벗어난 읽기 등 발생가능

> 이 취약점 중 일부는 확실히 애플리케이션을 죽일 수도 있음 > 2개의 개념증명 웹페이지를 만들어서 여러 차례 확인

> 원격 코드 실행 취약점은 확인되지 않음 > StackGuard와 SafeSEH 기능이 효율적으로 동작하기 때문

 

3. 조치

- 블라디미르 팔란트

> 2022년 10월 21일 3건의 취약점 보고서를 KrCERT에 보고

> 11월 14일 KrCERT는 보고서를 인터리젠에 전달

- 인터리젠 관계자

> 보고서 중 하나만 2023년 1월 6일 전달 받음 주장

> 문제점에 대한 수정 버전은 2월에 배포할 예정 > 새로운 버전을 사용자에게 배포하는 것은 고객(은행 등)의 문제

 

- IPinside는 자동 업데이트 기능이 없음

> 사용자가 수동으로 업데이트를 다운로드하여 설치

> Wizvera Veraport와 같은 관리 애플리케이션을 통해 업데이트

> 은행에서 사용자에게 업데이트를 강제하지 않는 이상 둘 다 가능성이 작아 보임

 

4. 참고

https://palant.info/2023/01/25/ipinside-koreas-mandatory-spyware/

https://github.com/alanleedev/KoreaSecurityApps/blob/main/02_ipinside_lws_agent.md

+ Recent posts