서비스 목록을 이름순으로 내려가다 C 에서 멈췄다. CrossEX Live Checker. 설명란에는 영어로 한 줄, CrossEXService 가 살아 있는지 확인한다고만 적혀 있었다. 그런데 정작 설치된 앱 목록에서 "CrossEX" 를 검색하면 아무것도 나오지 않았다. 서비스는 있는데 프로그램은 없는, 지우려 해도 어디서부터 손대야 할지 모르는 종류의 이름이다.

서비스가 프로세스를 띄운다

설치 폴더는 C:\Program Files (x86)\iniLINE\CrossEX\crossex 였다. 국내 회사 이니라인(iniLINE)의 제품이다. 폴더 안 파일은 다섯 개뿐이었고, 실행 파일 세 개 모두 iniLINE Co., Ltd. 서명이 유효했다.

파일 내용
ObCrossEXService.exe (106KB) CrossEX Live Checker, 서비스 본체
CrossEXService.exe (4.6MB) CrossEX Service 1.0.2.19
UnInstallCrossEXLocal.exe 제거 프로그램
rootCA.crt 루트 인증서 파일
CrossEXService.exe.sig 서명 정보로 보이는 작은 파일

서비스 CrossEX Live Checker 는 자동 시작, LocalSystem 계정으로 등록되어 있고 실행 파일은 ObCrossEXService.exe 다. 프로세스의 부모를 따라가 보니 이 서비스가 CrossEXService.exe 를 띄우고 있었다. 이름 그대로 Live Checker 가 본체를 지켜보는 구조다. 여기에 더해 현재 사용자의 시작 프로그램(HKCU 의 Run 키)에도 CrossEXService 가 따로 등록되어 있었다. 로그인할 때 한 번 더 띄우려는 장치로 보인다. 서비스 복구 설정(sc.exe qfailure)에는 재시작 동작이 걸려 있지 않았다. 1편의 안랩 서비스처럼 끄면 5초 뒤 살아나는 식은 아니다.

메모리는 작다. 작업 집합 기준으로 Live Checker 가 7MB, CrossEXService 가 12MB 정도였고, 개인 메모리는 둘 다 2~3MB 였다. CrossEXService.exe 는 127.0.0.1 의 34581 번 포트를 열고 기다리고 있었다. 단순한 TLS 접속으로는 이 포트에서 인증서를 받아 내지 못해서, 어떤 방식으로 말을 주고받는지까지는 확인하지 못했다.

무엇을 위한 다리인가

CrossEX 가 무엇을 하는지는 레지스트리에 더 분명하게 적혀 있었다. HKLM\Software\WOW6432Node\iniLINE\CrossEX\touchenex 키를 열면 기본값이 list:nxweb,nxfirewall,biz,nxkey 이고, 그 아래 네 항목이 각각 DLL 경로와 해시로 보이는 값을 갖고 있다.

nxweb      → C:\Program Files\RaonSecure\NxWeb\TWMain.dll
nxfirewall → C:\Program Files (x86)\RaonSecure\TouchEn nxFirewall\TFMain.dll
biz        → C:\Program Files (x86)\RaonSecure\biz\KSbizMain.dll
nxkey      → C:\Program Files (X86)\RaonSecure\TouchEn nxKey\TKMain.dll

전부 라온시큐어의 TouchEn 제품군이다. nxKey 는 9편의 키보드 보안, nxWeb 과 nxFirewall 은 다음 편에서 볼 프로그램, biz 는 같은 회사의 KeySharp biz 다. 키 이름 touchenex 는 이 모듈 묶음을 부르는 이름으로 보인다. 정리하면 CrossEX 는 혼자 무엇을 지키는 프로그램이 아니라, 은행 페이지가 이 TouchEn 모듈들을 부를 수 있게 해 주는 연결 장치다.

브라우저 쪽 연결도 찾았다. C:\Program Files (x86)\RaonSecure\bridge\CrossEX\touchenex\1.0.1.1604 폴더에 CrossEXChrome.exe 와 kr.co.raon.touchenex.json 이 있었다. 이 JSON 은 크롬의 네이티브 메시징 등록 파일이다. 브라우저 확장 프로그램이 PC 의 실행 파일과 표준 입출력으로 대화할 수 있게 해 주는 공식 통로인데, 파일 안 설명이 "CrossEX NativeMessagingHost" 였고 허용된 확장 프로그램 ID 가 세 개 적혀 있었다. 그중 하나가 실제로 크롬과 엣지 양쪽에 깔려 있었다. 이름은 "TouchEn PC보안 확장", 버전 1.0.2.6 이다. 파이어폭스용 등록 파일도 같은 폴더에 있었다.

그러니 길은 두 갈래다. 은행 페이지가 확장 프로그램에 말을 걸면 확장 프로그램이 네이티브 메시징으로 CrossEXChrome.exe 를 깨우고, 그 뒤에 TouchEn 모듈이 붙는다. 그리고 34581 번 포트의 CrossEXService.exe 가 따로 떠 있다. 둘이 어떻게 일을 나누는지는 공개된 설명을 찾지 못했다. 다만 2025년 3월 안랩 ASEC 의 보안 업데이트 권고에서 TouchEn nxKey 와 CrossEX 는 하나의 통합 설치 파일로 배포된다고 설명하고 있어서, 둘이 한 몸처럼 움직이는 구조라는 점은 분명하다.

루트 인증서는 2099년까지

설치 폴더의 rootCA.crt 를 열어 보았다. 주체는 CN=iniLINE CrossEX RootCA2, 자기 서명 인증서이고 유효 기간은 2018년 10월 10일부터 2099년 12월 31일까지다. 같은 인증서가 신뢰할 수 있는 루트 인증 기관 저장소에, 컴퓨터와 현재 사용자 양쪽 모두 들어 있었다.

4편의 위즈베라 루트는 발급일이 설치한 날과 같아서 PC 마다 새로 만드는 것으로 보였다. CrossEX 의 루트는 2018년에 만든 인증서 파일이 설치 폴더에 그대로 들어 있다. 이 PC 에서만 만든 것이 아니라 모든 설치본에 같은 루트가 들어가는 방식으로 보인다. 유효 기간도 80년이 넘는다. 루트로 신뢰받는 인증서는 어떤 사이트 이름으로든 인증서를 발급할 수 있는 지위라는 점, 이 연재에서 여러 번 짚었다.

버전도 한 번 확인할 만하다. 위의 ASEC 권고는 CrossEX 1.0.2.16 이하에 임의로 라이선스를 발급받을 수 있는 취약점이 있었고 1.0.2.17 에서 고쳐졌다고 밝혔다. 내 PC 의 1.0.2.19 는 그 뒤 버전이다. 같은 권고에서 nxKey 는 1.0.0.89 이하가 대상이었는데, 9편에서 본 1.0.0.90 이 수정 버전이다.

설치된 앱 목록에서 찾기 어려운 이유

"설치된 앱 목록에 CrossEX 가 없다"는 말에는 이유가 있었다. 제거 정보가 컴퓨터 전체 영역(HKLM)이 아니라 현재 사용자 영역(HKCU)에 등록되어 있고, 표시 이름도 "CrossEX" 가 아니라 iniLINE CrossEX Service 였다. 컴퓨터 전체 목록만 뒤지는 도구나 다른 Windows 계정에서 보면 아예 나오지 않고, 같은 계정에서도 이니라인이라는 회사 이름을 모르면 지나치기 쉽다.

지우는 방법은 이렇다.

  1. 설정 → 앱 → 설치된 앱에서 "iniLINE" 으로 검색해 iniLINE CrossEX Service 를 제거한다.
  2. 목록에 없으면 설치 폴더의 UnInstallCrossEXLocal.exe 를 직접 실행한다. 레지스트리에 등록된 제거 명령도 이 파일이다.
  3. 재부팅 뒤 서비스 목록에 CrossEX Live Checker 가 남아 있지 않은지 확인한다.
  4. certmgr.msc 와 certlm.msc 의 신뢰할 수 있는 루트 인증 기관에서 iniLINE CrossEX RootCA2 가 지워졌는지 확인하고, 남아 있으면 직접 지운다.

CrossEX 만 지우고 TouchEn 모듈을 남겨 두면, 은행 사이트에 들어갔을 때 설치 안내가 다시 뜰 것이다. 이 PC 처럼 nxKey 와 함께 들어온 경우라면 nxKey 를 지울 때 CrossEX 가 같이 정리되는지 먼저 보고, 남은 것만 위 순서로 지우는 편이 덜 번거롭다. 브라우저의 "TouchEn PC보안 확장"도 확장 프로그램 관리 화면에서 따로 지워야 한다.

다음 편은 CrossEX 의 모듈 목록에 같이 있던 두 이름, TouchEn nxWeb 과 서비스 이름에 오타가 그대로 남은 TouchEn nxFirewall 이다.