서비스 목록을 이름순으로 내려가다 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 계정에서 보면 아예 나오지 않고, 같은 계정에서도 이니라인이라는 회사 이름을 모르면 지나치기 쉽다.
지우는 방법은 이렇다.
- 설정 → 앱 → 설치된 앱에서 "iniLINE" 으로 검색해
iniLINE CrossEX Service를 제거한다. - 목록에 없으면 설치 폴더의
UnInstallCrossEXLocal.exe를 직접 실행한다. 레지스트리에 등록된 제거 명령도 이 파일이다. - 재부팅 뒤 서비스 목록에
CrossEX Live Checker가 남아 있지 않은지 확인한다. certmgr.msc와certlm.msc의 신뢰할 수 있는 루트 인증 기관에서iniLINE CrossEX RootCA2가 지워졌는지 확인하고, 남아 있으면 직접 지운다.
CrossEX 만 지우고 TouchEn 모듈을 남겨 두면, 은행 사이트에 들어갔을 때 설치 안내가 다시 뜰 것이다. 이 PC 처럼 nxKey 와 함께 들어온 경우라면 nxKey 를 지울 때 CrossEX 가 같이 정리되는지 먼저 보고, 남은 것만 위 순서로 지우는 편이 덜 번거롭다. 브라우저의 "TouchEn PC보안 확장"도 확장 프로그램 관리 화면에서 따로 지워야 한다.
다음 편은 CrossEX 의 모듈 목록에 같이 있던 두 이름, TouchEn nxWeb 과 서비스 이름에 오타가 그대로 남은 TouchEn nxFirewall 이다.