Your cryptocurrency wallet software is safe?

일부 암호화폐 지갑 프로그램의 아티팩트에서 중요한 정보를 획득할 수 있었던 사실에 대해 살펴본다.

1. 암호화폐 지갑 프로그램

암호화폐를 이용하는 사람들 중 대부분은 거래소를 이용해 자산을 관리하고 있을 것이다. 하지만 암호화폐를 관리하기 위한 목적으로 별도의 암호화폐 지갑 프로그램을 사용할 수도 있다. 암호화폐 지갑 프로그램은 형태에 따라 다음과 같이 구분할 수 있다.

  • 모바일 애플리케이션
  • 설치형 프로그램(Windows/Mac/Linux)
  • 웹 브라우저 확장 플러그인

암호화폐 지갑 프로그램은 어떤 아티팩트를 생성할까? 암호화폐 세계에서 주요 정보는 다음과 같다.

  • 니모닉 시드
  • 개인키
  • 공개키(주소)
  • 트랜잭션 ID/Hash
[그림 1] 암호화폐 주요 정보의 관계

주요 정보의 관계는 위 그림과 같이 표현해볼 수 있다. 니모닉 시드를 알면 개인키를 알 수 있고, 개인키를 알면 주소를 알 수 있다. 주소를 알면 그 주소를 포함하고 있는 트랜잭션 데이터를 조회할 수 있다.

따라서 니모닉 시드가 노출되면 시드에서 파생될 수 있는 모든 공개키와 개인키의 권한을 잃어버리는 것과 같다. 개인키가 노출되면 개인키에 매칭되는 공개키의 권한을 잃어버리는 것과 같다. 여기서 권한이라고 하는 것은 암호화폐에 대한 소유권을 의미한다. 공개키 또는 트랜잭션 ID가 노출되는 것으로는 암호화폐의 소유권에 영향을 주지 않는다.

[그림 2] Exodus 프로그램

위 그림은 암호화폐 지갑 프로그램 중 "Exodus" 라는 프로그램의 이더리움 지갑 화면을 캡처한 것이다. 화면을 보면 현재 이더리움 지갑의 잔액, 수신 트랜잭션 정보 등을 얻을 수 있다. 그리고 우측의 메뉴를 보면 개인키를 조회할 수 있는 "View Private Keys"라는 기능이 존재하는 것을 알 수 있다.

Exodus를 비롯한 많은 지갑 프로그램이 비수탁형이기 때문에 주요 데이터를 로컬 어딘가에 저장하고 있을 것이라는 것을 알 수 있다. 이는 암호화폐 지갑 프로그램의 아티팩트를 분석하면 이와 같은 데이터들을 획득할 수 있다는 의미와 같다.

💡
비수탁형은 제3자가 아닌 암호화폐 소유주가 직접 키를 관리하는 방식이다.

약 20종의 지갑 프로그램 아티팩트를 분석해본 결과 대부분의 프로그램에서 암호화폐 주소, 트랜잭션 ID에 대한 정보는 어렵지 않게 획득할 수 있었다. 반면, 니모닉 시드, 개인키와 같은 중요 데이터는 사용자의 패스워드 값으로 암호화해서 저장하는 것을 확인했다. 지갑 데이터가 온전히 남아 있다면 사용자의 패스워드를 통해 지갑에 접근할 수 있기 때문에 사용자의 패스워드도 니모닉 시드 만큼이나 중요한 확보 대상이다. 패스워드를 알아야 니모닉 시드를 알 수 있기 때문에 가장 중요하다고도 볼 수 있다.

지갑 프로그램의 아티팩트를 분석할 때, 수사 관점에서 주요 데이터를 획득하려는 목적은 두 가지로 구분할 수 있으며 각각의 요소는 다음과 같다.

  • 암호화폐 몰수에 필요한 요소 : 니모닉 시드, 개인키, 사용자 패스워드
  • 트랜잭션 모니터링에 필요한 요소 : 니모닉 시드, 개인키, 사용자 패스워드, 암호화폐 주소, 트랜잭션 ID

2. 안전하지 못했던 암호화폐 지갑 프로그램

그렇다면 안전한 지갑 프로그램은 니모닉 시드, 개인키와 같은 중요 데이터를 로컬에 저장하되, 암호화해서 저장해 사용자의 패스워드를 통한 복호화 과정 없이는 그 내용을 알기 어려워야 한다고 볼 수 있다. 하지만 일부 지갑 프로그램에서 이와 같은 중요한 규칙이 한 동안 지켜지지 않았던 사실을 확인했다.

[그림 3] Blockstream Green의 로그 저장 경로
  • %UserProfile%\AppData\Local\Blockstream\Green\logs\[version].txt

"Blockstream Green"이라는 지갑 프로그램은 프로그램 사용 중 발생하는 로그를 위와 같은 경로에 저장하고 있다. 기존에는 프로그램 버전이 업데이트 되면 새 버전 값으로 로그 파일이 새로 생성되어 추가되는 형식으로 동작했다.

[그림 4] 로그 파일 중 일부1

"Blockstream Green" 1.1.x 버전 대에서는 위 그림과 같이 암호화폐 주소와 트랜잭션 ID값을 로그로 기록하고 있기 때문에 사용자의 패스워드 없이 획득할 수 있는 중요한 아티팩트 중 하나였다.

[그림 5] 로그 파일 중 일부2

그 외에도 사용자가 암호화폐 지갑에 접근하기 위해 로그인을 시도했다는 사실도 로그 파일에 기록하는 것을 알 수 있다.

[그림 6] Blockstream Green 1.2.0 버전 릴리즈 로그

1.1.x 대 버전에서 1.2.0 버전으로 업데이트하는 과정에서 GUI와 관련해서 많은 업데이트가 이뤄졌는데, 여기서 큰 문제가 발생한다.

[그림 7] 1.2.0 버전의 로그 중 일부1

사용자가 지갑을 생성할 때 제공되는 니모닉 시드 값이 로그에 그대로 기록되고 있었다. 이 말은 1.2.0 버전을 이용하고 있는 사람의 PC에 접근만 할 수 있다면 패스워드를 몰라도 로그 파일을 읽어서 지갑의 전권을 탈취할 수 있다는 뜻이다.

[그림 8] 1.2.0 버전의 로그 중 일부2

심지어 지갑에 접근하기 위해 입력했던 pin 번호(Blockstream Green은 패스워드 대신 핀 번호를 사용한다.)까지 로그에 기록되고 있었다.

[그림 9] Blockstream Green 1.2.7 버전 릴리즈 로그

GUI 패치를 하는 과정에서 디버그 로그를 로그 파일에 기록하는 것을 수정하지 않았던 것이 문제였던 것으로 보이며, 이러한 현상은 테스트해 본 결과 1.2.0 버전부터 1.2.6 버전까지 지속되었다. 중대한 내용임에도 불구하고 1.2.7 업데이트 릴리즈 노트에는 해당 문제 해결에 관한 언급이 없는 것으로 보아 실수를 드러내고 싶지 않았던 의도로 해석된다.

그리고 이전에는 프로그램 버전이 업데이트 되면 기존 로그 파일은 그대로 두고 새 로그 파일을 생성해서 로그가 쌓이는 방식이었는데, Blockstream 측에서 로그 파일에 문제가 있다는 것을 인지하고 난 1.2.7 버전부터는 버전 업데이트 후 프로그램 첫 실행 시 기존 로그 파일을 삭제하는 것으로 변경됐다.

[그림 10] 문제 제보 트윗

이 문제를 1.2.2 버전에서 처음 확인했었고 6월에 트위터(현 X)를 통해 제보했었다. 하지만 아무런 답변이 없었고, 문제가 해결됐던 1.2.7 버전의 릴리즈 날짜가 9월 11일 인 것을 보면 트위터는 확인도 하지 않은 것 같다. 지금 생각해보면 고객센터에다 문의할 걸 그랬다.

암호화폐 지갑 프로그램에 대한 연구 중에는 다음과 같은 것도 있다.

https://cer.live/post/crypto-wallet-security-rating-report-key-insights-findings


3. 결론

  1. 널리 알려진 암호화폐 지갑 프로그램이라고 해서 무조건 안전한 것은 아닐 수 있다.
  2. 개발자의 실수가 치명적인 보안 위험을 불러올 수 있다.
  3. Blockstream Green 1.2.0 ~ 1.2.6 버전을 사용 중이라면 최신 버전으로 업데이트하자.
You've successfully subscribed to PLAINBIT
Great! Next, complete checkout to get full access to all premium content.
Error! Could not sign up. invalid link.
Welcome back! You've successfully signed in.
Error! Could not sign in. Please try again.
Success! Your account is fully activated, you now have access to all content.
Error! Stripe checkout failed.
Success! Your billing info is updated.
Error! Billing info update failed.