I. 서론
국내외 전반에 걸쳐 COVID-19로 인한 비대면 문화가 자리 잡으며 사이버범죄 발생률이 증가하고있다. 특히 피해가 큰 분야는 피싱으로 경찰청에 따르면 최근 3년간 피싱 범죄 발생 건수는 2020년 18,726건, 2021년 20,402건으로 약 8.9% 증가했으며 그 피해액은 2020년 3,955억 원에서 2021년 5,006억 원으로 약 26.5% 증가했다[1]. 전체 피싱 범죄 피해의 절반 이상이 메신저 피싱으로, 메신저를 이용한 피싱은 2021년 상반기 11.2%에서 하반기 55.1%로 급증했다[2]. 이처럼 온라인 인스턴트 메신저를 이용한 사이버범죄는 꾸준히 증가해왔다.
하지만 개인정보보호를 목적으로 Kakao Talk, Line 등의 주요 메신저가 사용자 데이터를 암호화해 저장하기 시작하고 대화 내용 암호화, 종단 간 암호화, 화면캡처 차단 등의 보안 기능을 제공하는 Wickr me, Element 등의 인스턴트메신저가 등장하며 수사 과정에서 범죄사실 입증에 어려움을 겪고있다. E2EE(End-to-End Encryption)라고도 부르는 종단 간 암호화는 발신 원부터 수신 원까지의 모든 과정에서 데이터를 암호화 상태로 전송하는 방식으로 2014년 정부의 카카오톡 서버 감청 사건 이후 대중화된 개념이다. 디지털 포렌식 관점에서 주요 개인정보 및 대화 정보를 암호화하는 보안 메신저에 대한 복호화 방안 연구는 매우 중요하다. 보안 메신저는 피싱, 마약 유통, 기술 유출 등 범국가적 범죄에 악용되고 있지만 이에 대한 복호화 방안 연구는 필요하다. 따라서 본 논문에서는 종단 간 암호화 서비스를 제공하는 오픈 소스 인스턴스 메신저 Element를 대상으로 Windows PC 환경에서 수집할 수 있는 사용자 행위 관련 아티팩트를 정리하고 암호화된 데이터에 대한 복호화 방안을 제시한다.
2장에서는 관련 연구를 소개하고 3장에서 Element의 보안 채팅 기능과 관련 데이터의 암호화 프로세스를 분석하고 복호화 방안을 제안한다. 4장에서는 Element의 일반 및 보안 채팅 관련 데이터를 분석하고 디지털 포렌식 관점에서 유의미한 아티팩트를 정리한다. 마지막으로 5장에서는 향후 연구 계획을 제시하고 결론으로 마무리한다.
II. 관련 연구
보안 메신저상에서 암호화된 데이터를 복호화하는 연구 결과들이 있다. Jihun Son 외 3인[3]은 보안 메신저 앱 Signal, Wickr, Threema 앱을 역공학을 통해 암호화 메커니즘을 파악해서 암호화된 정보들을 복호화하거나 앱 설정 파일에 저장되어있는 암호화에 사용된 키를 추출하여 복구하는 방안을 소개했다. Guido Cornelis Schipper외 2인[4]은 Element와 같이 matrix 프로토콜을 사용하는 애플리케이션인 Riot.im에 대한 포렌식 분석을 제시하였으나 암호화된 채팅 기록에 대한 평문 복구 방안이 제시되지 않았다. 이처럼 기존 연구 중에는matrix 프로토콜을 사용하는 인스턴트메신저의 보안 채팅방의 대화 이력을 평문으로 확인할 방법은 없다. 따라서 본 연구에는 matrix 프로토콜을 사용하는 Element 메신저 앱에서 암호화된 채팅방 이력의 복호 방안과 연관된 아티팩트들을 정리한다.
III. Element 보안 채팅 데이터의 복호화 방안분석
Element는 matrix 프로토콜을 기반으로 동작하는 보안 메신저이다. matrix 프로토콜은 2014년에소개되었다. matrix는 “보안성, 탈중앙화, 실시간통신을 지향하는 오픈 소스 프로젝트”로 보안 메신저 구현을 위한 종단 간 암호화(End-to-End Encryption), 브릿징(Bridging) 등의 기능을 SDK로 제공한다[4]. Element는 사용자가 채팅방을 개설할 때 보안 채팅 기능을 설정하면 종단 간 암호화(End-to-End Encryption)가 적용된다. 종단간 암호화는 채팅방의 참여자만이 대화 이력을 확인할 수 있게 하는 기술이다.
Element의 보안 채팅은 보안 채팅방 내부 메시지에서 검색기능을 지원하기 위해 “C:\Users\user\AppData\Roaming\Element\EventStore” 하위에 'Events.db' 파일에 메시지 내용, 전송자, 전송 시각, 채팅방 ID 등이 평문으로 저장된다. 하지만 ‘Events.db’는 Element 앱 내부에서 생성된 임의의 키값을 이용하여 SQLCipher 모듈로 암호화하여 해당 파일을 보호한다. 따라서, 본 논문에서는 'Events.db' 파일의 암호화 프로세스를 분석하고 복호화하는 키를 찾는 방안을 제시한다.
3.1 Events. db 암호화 프로세스
해당 DB 파일에는 보안 채팅방과 관련된 정보만이 저장된다. Element는 github에 공개된 코드를분석해 데이터베이스의 암호화 프로세스를 확인할 수있다. 코드를 분석해 확인한 암호화 과정은 (Fig. 1)과 같다.
Fig. 1. Events.db encryption process
Element 앱 실행 후 로그인 시마다 32byte 길이의 임의의 값을 생성하고 Base64 인코딩한 후 패딩된 부분을 제거한다. 이 값을 사용해 Element는 SqlCipher 모듈의 AES-256으로 ‘Evnets.db’를 암호화한 후 자격 증명 관리자(Windows Credentials Manager)에 저장한다. 해당 값은 복호화를 할 때 사용하는 대칭키이다. ‘자격 증명 관리자’ 사용자가 지정한 사용자 이름 및 암호를 저장하기 위해 로컬 컴퓨터에 안전한 저장 공간을 만들고 이용할 수 있도록 하는 서비스이다. 제어판의 ‘자격 증명 관리자’가 관리하는 증명 정보는 (Fig. 2)와 같이 제어판, Windows API를 이용하여 접근할 수 있다.
Fig. 2. Encryption key stored in Windows Credential Manager
자격 증명관리자가 관리하는 증명정보는 키워드 문자열을 이용해 Windows API를 통해 획득할 수 있다. 자격 증명 관리자는 증명 정보와 관련한 네트워크 주소를 키워드로 증명들을 관리하고, 엘리먼트 키워드 문자열은 [element.io/seshat | @user_id | device_id]이다. user_id는 로그인한 사용자의 계정 id, device_id는 로그인 시마다 생성되는 무작위의 10글자 길이 영문 대문자 문자열이다.
3.2 Events. db 복호화 프로세스
본 연구에서 제안하는 'Events.db'의 복호화 방안 프로세스는 (Fig. 3)과 같다.
Fig. 3. Events.db Decryption process
(Fig. 3)의 1번은, “C:\Users\user\AppData\Roaming\Element\Local Storage\leveldb\”경로의 “.log” 확장자 파일 내부 ‘mx_device_id’,‘mx_user_id‘ 문자열 옆에 기록된 가장 최근에 로그인한 계정의 user_id, device_id 값을 확인하는 과정이다. 해당 값들을 확인하여 4.1절에서 확인한 “element.io/seshat | @user_id | device_id” 키워드 문자열을 확인한다.
(Fig. 3)의 2번은 생성한 키워드 문자열을 통해 Windows API로 자격 증명 관리자에게 쿼리를 보낸 과정이다. (Fig. 3)의 3번은 쿼리에 대한 요청으로 복호화키를 획득하고, (Fig. 3)의 4번에 DB파일 내부를 확인할 수 있는 “DB Browser for Sqlite” 도구에 복호화키 값을 전달하여 'Events.db'를 복호화한다.
3.3 시사점 및 한계
본 연구에서 제안하는 'Events.db'의 복호화 방안은 Windows API를 이용하여 복호화키를 획득해야 하므로, 활성화된 Windows 시스템상에서 획득해야한다.
또한, ‘Events.db’ 파일은 사용자 로그인 시 생성되고 로그아웃 시 자동으로 삭제되기 때문에 Element의 사용자가 앱에서 로그아웃하지 않아야 'Events.db' 파일이 로컬에서 확인할 수 있다. 하지만 Element 앱의 초기 설정으로는 ‘Events.db'를 생성하게 되어있다. 따라서 설정값에 변화를 주지 않으면, 보안 채팅방의 이력을 평문으로 확인할 수 있다.
IV. Element의 사용자 아티팩트 분석
4.1 보안 채팅 아티팩트
본 절에서는 Element 앱에서 사용자의 보안 채팅 기능 활용시 기록되는 아티팩트를 확인하여, 포렌식 수사관점에서 활용할 아티팩트와 앞의 복호화 된DB의 정보를 정리한다. Element 앱의 사용 이력은 “C:\Users\user\AppData\Roaming\Element” 경로에 기록된다. 해당 경로의 하위에서 확인할 수있는 아티팩트들을 정리한 것은 (Table 1)와 같다.
Table 1. Secure Chat Related Artifacts
(Table 1)의 ‘\Events\Events.db’는 앞장의 복호화 과정을 거친 후 확인할 수 있는 보안 채팅방의 이력이다. 보안 채팅방 상에서, 대화 참여자들이 실제로 주고받은 평문 메시지는 (Table 1)의 ‘events’ Table의 ‘source’ Feature에 기록된다. ‘source’ 서버로부터 전송받은 암호화된 이벤트를 복호화한 데이터로 json 형태로 저장된다. ‘body’에서 평문 형태의 메시지를 확인할 수 있다. 또한 ‘source’ Feature의 json 형태의 데이터에 (Table 1)의 ‘rooms’ , ‘profile’에 대응하는 데이터가 있다. 따라서 ‘source’ Feature의 데이터를 확인하면, 메시지가 어느 채팅방에서 어떤 대화 참여자에 의해 전송되었는지 확인할 수 있다.
4.2 일반 채팅 아티팩트
본 절에서는 Element 앱에서 보안기능 적용 없이 기록되는 아티팩트를 확인하여, 포렌식 관점에서 활용할 방안을 다룬다. 해당 사용자의 이력은 이전 절에서 확인한 경로에 기록된다. 해당 경로에서 확인할 수 있는 아티팩트들을 정리한 것은 (Table 2)와 같다.
Table 2. General Chat Related Artifacts
(Table 2)의 ‘\Session Storage\’ 하위 경로의 ‘.log’ 확장자 파일에는 앱상에서 발생하는 키보드 타이핑 이벤트, 클릭 이벤트 등의 기록이 존재한다.
키보드 타이핑 이벤트는 사용자가 채팅방에서 메시지를 작성하고 전송할 경우 기록되는 로그 파일로, 저장되는 형식은 (Table 3)과 같다.
Table 3. Example of a typing event log
사용자가 직접 타이핑한 경우뿐만 아니라 복사-붙여넣기 기능을 사용했을 때도 동일한 형식의 로그가 남는다. 채팅방 식별정보는 ‘room_id’로 기록되며 사용자가 실제로 입력한 메시지는 종단 간 암호화 지원 여부와 상관없이 ‘text’에 평문으로 저장된다. 따라서 Element 사용자의 가장 최근의 사용행위를 파악할 수 있다.
(Table 2)의 ‘\Cache\Cache_Data’ 에는 사용자가 암호화 설정을 하지 않은 일반 채팅방에서 내려받은 파일 캐시가 저장된다. 이미지, 영상, 영상 썸네일, 문서 파일 등이 여기에 해당된다. 이 때 저장된 캐시 파일의 이름이 임의로 생성되고 파일 확장자가 존재하지 않기 때문에 원본 데이터를 확인하기 위해서는 HxD 등의 Hex Editor가 필요하다. Hex Editor를 통해 파일 시그니쳐를 확인하고 이에 대응하는 확장자로 확장자명을 변경하면 원본 데이터를 확인할 수 있다.
4.2.1 일반 채팅 아트팩트 대화내역
본 절에서는 Element 메신저에서 효율적으로 로그를 저장하기 위해 사용하는 Indexed DB 상의 내용을 확인하는 방법을 다룬다. Indexed DB는 Google에서 개발한 데이터베이스로 여러 분야에 사용되고 있다. 해당 DB가 관리하는 내역은 모두 압축되어 저장한다. 따라서 DB파일을 직접 접근하는 경우, 압축된 내역에 접근하기에 읽을 수 없는 형태로 확인할 수 없다.
하지만 이 압축된 DB를 압축해제 하여 확인할 수 있는 파이썬 라이브러리[9]가 있다. 해당 라이브러리를 이용하여 내부의 내용을 확인할 수 있게 스크립트[8]를 작성했다. 주의할 점은 Indexed DB는 읽기전용 모드로 DB를 읽을 수 없다. 불가피하게 DB에 접근할때 DB 구성 파일에 대한 쓰기 작업이 일어난다. 따라서 Indexed DB 자체의 무결성을 보장하려면 복사본에서 진행할 것을 권한다. 해당 스크립트[8]로 (Table 2)의 Indexed DB를 압축해제하여 확인할 수 있었던 정보는 다음 (Table 4)와 같다.
Table 4. Artifacts found in indexedDB
(Table 4)에서 확인할 수 있는 정보 중에 일반 채팅 아티팩트정보를 획득 할 수 있는 정보는 DB Id 10의 matrix-js-sdk:rit-web-sync에 있다. 이는 element 서버 내에 저장하고 있던 보안 채팅방 및 일반채팅 방의 활동 내역을 디바이스에 설치되어 있는 element 메신저 애플리케이션에서 확인할 수 있도록 데이터를 가져올 때 남겨지는 값들이다. 여기에 남겨지는 데이터를 통해 일반 채팅방에서의 대화 내역들은 평문으로 확인할 수 있다. 하지만, 보안 채팅방의 대화내역들은 암호화가 적용되어 평문으로 확인할 수 없다. 다음 (Table 5)는 (Table 4)의 일반 채팅방 채팅 및 활동 내역에서 확인할 수 있는 정보들이다.
Table 5. General chat room history json keyword
(Table 4)에서 계정의 접근 권한을 취득 할 수 있는 정보가 있다. 해당 표의 Indexed DB가 가지고 있는 DB인 matrix-react-sdk에 저장된 access token 값이다. 값의 예시는 다음 (Table 6)와 같다.
Table 6. Access token value format
해당 값은 본래 element 메신저에서 채팅 봇 등 메신저 관련 자동화 서비스를 구축할 때 서비스에서 메신저로의 자원접근 권한을 취득하기 위해 사용하는 권한이다. 서비스를 구축하는 사용자의 계정의 권한을 서비스를 제공할 프로그램에 위임할 수 있도록 만든 역할이다. element 메신저에서 제공하는 api에는 해당 접근권한을 이용하여 메신저 내의 계정의 자원에 접근할 수 있다. 해당 자원들은 모두 json 형식으로 이루어진 정보들이다. 본 연구에서는 (Table 4)에서 확인한 계정권한을 이용하여 서버에 저장되어있는 채팅내역 및 활동내역을 조회할 수 있는 자바스크립트[9]를 작성하였다.
해당 스크립트[9]는 서버에서 보관하고 있던 계정이 참가한 채팅방의 타임라인 정보들을 획득하여 채팅 방에서의 활동내역을 확인할 수 있게한다. 확인가능한 이벤트의 종류는 다음 (Table 7)와 같다.
Table 7. Chat room timeline event type
(Table 7)이외에도 확인할 수 있던 이벤트 중에 암호화된 채팅내역도 확인할 수 있다. 암호화 채팅내역은 서버에서도 암호화되어 저장되어있음을 확인할수 있다. 하지만 암호화에 사용된 알고리즘의 정보와 암호화에 사용된 device_id, sender_key, session_id 정보를 같이 확인할 수 있다.
V. 결론 및 향후 과제
본 논문에서는 보안 메신저 중 하나인 Element를 대상으로 앱 사용 시 남는 아티팩트와 암호화된 db 파일을 복호화하는 방안을 찾았다. 또한, Wind ows API를 이용하여 복호화에 필요한 정보를 활성 시스템에서 획득할 수 있는 도구[6]를 개발하여 github에 공개하였다. 그 외에도 Indexed DB의 비직렬화를 지원하는 python 라이브러리[10]를 이용하여 로컬에 저장된 채팅내역을 확인할 수 있었다. 그에 따른 아티팩트를 분석하였고 디지털 포렌식 증거 수집에 도움을 줄 것으로 기대한다.
로컬에 저장된 아티팩트 중 서버에 계정이 가진 자원에 접근가능한 접근권한을 획득하여 해당 자원에 접근하는 스크립트[9]를 작성하여 공개했다. 해당 스크립트로 암호화 채팅방에서 대화내역을 암호화하여 송신할 때 사용하는 정보들을 확인할 수 있었다. 본 논문에서 제안된 방법은 로그인 정보가 남아있을 경우에 한하여 유효하다. 관련 정보없이 확인된 정보를 통해 추후에 matrix 프로토콜에서 사용하는 암호화 방식을 연구하여 암호화된 채팅 내역을 복호화 할 수 있는 방안을 찾을 예정이다.
참고문헌
- Public Data Portal, "Monthly Status of Voice Phishing at the National Police Agency" ,https://www.data.go.kr/data/15099013/fileData.do, 2022.11.07
- Financial Supervisory Service, "Analys is of damage from voice phishing in 2021", https://www.fss.or.kr/fss/bbs/B0000188/view.do?nttId=55444&menuNo=200218&pageIndex=1, 2022.11.07.
- Jihun Son, Yeong Woong Kim, Dong Bin Oh, Kyounggon Kim, "Forensic analysis of instant messengers: decrypt signal, wickr, and threema," Forensic Science International: Digital Investigation ,Volume 40, Mar. 2022, Article: 301347, ISSN 2666-2817
- Guido Cornelis Schipper, Rudy Seelt, Nhien-An Le-Khac, "Forensic analysis of matrix protocol and riot.im application," Forensic Science International: Digital Investigation, Volume 36, Supplement, Mar 2021, Article: 301118,ISSN 2666-2817
- vector-im, "element-desktop", https://github.com/vector-im/element-desktop, 2022.11.07
- loud11, "windows credential", "testrepo_for_credential_retrieve", https://github.com/loud11/testrepo_for_credential_retrieve/releases, 2022.11.07
- Matrix.org, "matrix protocol", https://matrix.org/, 2022.11.07
- loud11, "indexed DB", https://github.com/loud11/simple-tool/blob/main/deseiral.py, 2022.11.07
- loud11,"matrix", https://github.com/loud11/simple-tool/blob/main/matrix_communication.js, 2022.11.07
- obsidianforensics,"indexed DB", https://github.com/obsidianforensics/ccl_chrome_indexeddb, 2022.11.07.