본문으로 건너뛰기

Liquid 해킹: 해커와 Blockstream이 온체인에서 주고받은 대화 전문, 메시지 하나하나

9월 6일 이후 Liquid 익스플로이터와 Blockstream이 비트코인 트랜잭션 안에서 주고받은 모든 메시지를 코인 소유권과 PGP 서명으로 귀속해 정리했다. 먼저 요약, 그다음 전체 스레드.

  • Liquid 해커와 Blockstream은 OP_RETURN 메시지로 4,000 BTC 반환을 협상했다. 3,400 BTC는 9월 7일 돌아왔고 598.5 BTC는 아직 보유 중이다.
  • 지금까지 귀속된 항목 27건: 익스플로이터 12건, Blockstream 14건, 다수는 암호화, 여기에 반환 전송까지. 주소로 온 스팸은 제외.

9월 6일, 약 4,000 BTC, 대략 320백만 달러어치가 Blockstream의 비트코인 사이드체인인 Liquid Network를 뒷받침하는 지갑에서 빠져나갔다. 도난당한 키가 아니라 Elements 소프트웨어의 버그를 통해서였다. 같은 날 우리의 전망 글이 그 이야기를 다룬다. 이 페이지는 그다음에 일어난 일, 그리고 그것이 일어난 장소에 관한 것이다. 코인을 쥔 개인 또는 집단과 Blockstream은 비트코인 블록체인 그 자체에서, 트랜잭션에 써넣은 메시지로 서로 대화했고, 그 교환 전체가 공개되어 있다. 아래에서 이런 대화가 어떻게 작동하는지, 무엇이 오갔는지의 요약, 그리고 귀속된 모든 메시지를 순서대로, 각 메시지를 담은 트랜잭션 링크와 함께 볼 수 있다.

대화가 비트코인 트랜잭션 안에 담기는 방식

비트코인 트랜잭션은 OPRETURN이라는 출력 유형에 작은 임의 데이터를 실을 수 있다. 익스플로이터는 이를 우편함처럼 썼다. 각 메시지는 훔친 코인의 극히 일부를 지출하고, 상대에게 운반용으로 1,000 사토시를 보내며, OPRETURN 출력에 텍스트를 써넣는 트랜잭션이다. Blockstream도 같은 방식으로, 처음에는 연락용 주소에서, 이후에는 새 주소들에서 답했다. 일부 메시지는 평문이다. 일부는 Blockstream이 공개한 보안 키로 서명되어 있어 누구나 정말 회사에서 보낸 것인지 확인할 수 있다. 다수는 암호화되어 있다. 익스플로이터가 Blockstream에 보낸 메모는 회사의 공개 PGP 키로 암호화되었고, Blockstream이 익스플로이터에게 보낸 메모는 Electrum 지갑에 내장된 ECIES 방식으로 익스플로이터의 비트코인 주소 뒤에 있는 키로 암호화되었다. 암호화된 메시지는 체인 위에 누구나 볼 수 있게 존재하지만, 의도된 수신자만 열 수 있다. 우리는 이를 암호화됨으로 표시하고 크기를 적는다. 우리는 읽을 수 없고, 익스플로이터가 위협한 대로 개인키를 공개하지 않는 한 다른 누구도 읽을 수 없다.

귀속은 누구나 검증할 수 있는 두 가지 규칙을 따른다. 트랜잭션이 훔친 자금을 보유한 주소의 코인을 지출하면 그 메시지는 익스플로이터의 것이다. 코인이 곧 마이크다. 회사의 연락용 주소에서 지출되었거나, 텍스트가 blockstream.com에 공개된 키(지문 1176 542D A98E 71E1 3372 2EF7 4AC8 CC88 6844 A2D6)로 서명이 검증되는 PGP 클리어사인 메시지이면 Blockstream의 것이다. 우리가 검증한 연대기는 Bitcoin Core 기여자 Sjors Provoost가 공개한 독립 감사와 일치한다.

이 스레드에 없는 것

공개적으로 거론되는 비트코인 주소에는 잡음이 모인다. 9월 6일 이후 익스플로이터의 주소에는 텍스트를 실은 다른 트랜잭션이 300건 가까이 들어왔다. 밈코인 광고, 코인을 나눠 달라는 호소, 개인 실명을 거론하며 이번 절도를 내부 소행으로 몰아가는 비난, 그리고 Blockstream 최고경영자를 자칭하는 메시지도 최소 하나 있었다. 어느 것도 훔친 코인을 지출하지 않고 어느 것도 유효한 Blockstream 서명을 담고 있지 않으므로, 어느 것도 대화의 일부가 아니며 우리는 이를 싣지 않는다.

논의 요약

첫 접촉, 9월 6일. 유출 네 시간 뒤, 코인을 쥔 주소가 "we are whitehats. contact us on chain"(우리는 화이트햇이다. 온체인으로 연락하라)이라고 썼다. Blockstream은 한 시간 안에 보안 이메일 주소로 답했다. 익스플로이터는 그 주소를 한 번도 쓰지 않았고, 이후의 모든 것은 체인 위에 머물렀다.

조건, 9월 7일 새벽. Blockstream이 첫 암호화 메모를 보냈다. 익스플로이터는 이어 평문으로 코인의 "most"(대부분)를 Liquid 연합 지갑으로 돌려보내겠다고 제안하며 괜찮은지 물었다. 몇 분 뒤 조건을 덧붙였다. 먼저 버그를 고치고, 모든 노드가 패치되었는지 확인하라, 그래야만 돈이 안전하게 움직인다는 것이었다. 결함의 기술적 세부는 Blockstream의 키로 암호화되어 뒤따랐다. Blockstream은 서명된 "Yes, thank you."(네, 감사합니다.)로 답했다.

패치, 그리고 반환. 09:41 UTC에 Blockstream이 서명된 메시지를 올렸다. 브리지 노드가 패치되었고 자금을 돌려보내도 안전하다는 내용이었다. 익스플로이터는 목적지 주소를 한 번 더 확인해 달라고 요청하고, 수정에 관한 추가 세부를 암호화해 보낸 뒤, 16:09 UTC에 단 한 건의 트랜잭션으로 3,400 BTC를 페그 지갑으로 옮겼다. 나머지 598.5 BTC, 약 15퍼센트는 익스플로이터의 주소에 남았다.

닫힌 문 뒤에서, 9월 7일에서 8일. 그날 저녁부터 교환은 어두워졌다. Blockstream은 서명되고 암호화된 메모를 연달아 보냈고, 그중에는 복호화 방법에 대한 짧은 안내도 있었으며, 익스플로이터도 같은 방식으로 답했다. 이 단계에서 익스플로이터가 남긴 유일하게 읽을 수 있는 줄은 9월 7일 늦게 올린 슬픈 얼굴이다.

평문, 그리고 최후통첩, 9월 8일에서 9일. 9월 8일 오후 익스플로이터는 이후 모든 메시지를 평문으로 보내겠다고 알렸다. 9월 9일에는 스레드에서 가장 긴 메시지가 왔다. Blockstream이 보안에 너무 적게 배정했다는 비난, 회사가 자기 돈으로 10퍼센트를 버그 바운티로 지급하라는 요구, 그러지 않으면 사용자들이 15퍼센트 손실을 떠안게 될 것이라는 위협, 그리고 암호화된 대화를 열어 줄 개인키를 공개하겠다는 약속이었다. Blockstream은 같은 시간 안에 암호화와 서명을 갖춰 답했고, 9월 10일 이른 시각에 다시 답했다. 회사는 체인 위에서든 다른 곳에서든 바운티라는 틀을 받아들이지 않았다.

대화 전문

시각은 UTC다. "익스플로이터"는 유출된 코인을 쥔 주소이며, 화이트햇이라는 꼬리표는 스스로 붙인 것이다. "Blockstream"은 회사의 연락용 주소에서 지출되었거나 공개된 키로 검증된 메시지를 표시한다. 따옴표 안의 텍스트는 체인에 쓰인 그대로 옮겼다.

9월 6일 18:30 UTC, 블록 965,818, 익스플로이터: "we are whitehats. contact us on chain" (트랜잭션)

9월 6일 19:31 UTC, 블록 965,822, Blockstream: "Please contact security@blockstream.com" (트랜잭션)

9월 7일 01:49 UTC, 블록 965,865, Blockstream: "Encrypted to the key behind bc1ql4mfu6aundtkksxklfajs2h3t9nzcd6gyqjlte (Electrum BIE1 ECIES):" 이어서 익스플로이터에게 보낸 암호화 메시지(ECIES, Blockstream의 PGP 서명, 1,297바이트). 제3자는 읽을 수 없음. (트랜잭션)

9월 7일 02:20 UTC, 블록 965,869, 익스플로이터: "sending most back to bc1qdlld6antmv4xug242ed83q7k4rqw50cwfns38szx4qu2f4jwaxxsuhwxxr, is that ok" (트랜잭션)

9월 7일 03:30 UTC, 블록 965,875, 익스플로이터: "Please fix the bug first. The chain is under risk at latest commit right now. Make sure every node is patched. Then we will transfer the money back safely after confirming the fix. The detail is as follows (encrypted using https://blockstream.com/pgp.txt)." 이어서 Blockstream을 위한 암호화 구간, 제3자는 읽을 수 없음. (트랜잭션)

9월 7일 03:30 UTC, 블록 965,875, Blockstream: "Yes, thank you." (PGP 서명, 검증됨) (트랜잭션)

9월 7일 09:41 UTC, 블록 965,912, Blockstream: "Bridge nodes are patched, safe to return the funds." (PGP 서명, 검증됨) (트랜잭션)

9월 7일 12:43 UTC, 블록 965,930, 익스플로이터: "plz confirm again that we are sending the coins back to bc1qdlld6antmv4xug242ed83q7k4rqw50cwfns38szx4qu2f4jwaxxsuhwxxr More details about the vuln fix:" 이어서 Blockstream을 위한 암호화 구간, 제3자는 읽을 수 없음. (트랜잭션)

9월 7일 15:31 UTC, 블록 965,948, 익스플로이터: Blockstream에 보낸 암호화 메시지(PGP, 979바이트). 제3자는 읽을 수 없음. (트랜잭션)

9월 7일 16:09 UTC, 블록 965,950, 익스플로이터: Liquid 페그 지갑으로 3,400 BTC 전송, 메시지 없음. (트랜잭션)

9월 7일 17:54 UTC, 블록 965,956, Blockstream: "To decrypt: this is Electrum BIE1 ECIES to your key. In Electrum, Tools > Encrypt/Decrypt Message, paste below, decrypt with the private key for bc1ql4mfu6aundtkksxklfajs2h3t9nzcd6gyqjlte. Or any ECIES/BIE1 library." 이어서 익스플로이터에게 보낸 암호화 메시지(ECIES, Blockstream의 PGP 서명, 1,408바이트). 제3자는 읽을 수 없음. (트랜잭션)

9월 7일 17:54 UTC, 블록 965,956, Blockstream: 익스플로이터에게 보낸 암호화 메시지(ECIES, Blockstream의 PGP 서명, 1,275바이트). 제3자는 읽을 수 없음. (트랜잭션)

9월 7일 17:54 UTC, 블록 965,956, Blockstream: 익스플로이터에게 보낸 암호화 메시지(ECIES, Blockstream의 PGP 서명, 1,211바이트). 제3자는 읽을 수 없음. (트랜잭션)

9월 7일 17:54 UTC, 블록 965,956, Blockstream: 익스플로이터에게 보낸 암호화 메시지(ECIES, Blockstream의 PGP 서명, 1,147바이트). 제3자는 읽을 수 없음. (트랜잭션)

9월 7일 18:35 UTC, 블록 965,962, Blockstream: 익스플로이터에게 보낸 암호화 메시지(ECIES, Blockstream의 PGP 서명, 1,275바이트). 제3자는 읽을 수 없음. (트랜잭션)

9월 7일 18:35 UTC, 블록 965,962, 익스플로이터: Blockstream에 보낸 암호화 메시지(PGP, 962바이트). 제3자는 읽을 수 없음. (트랜잭션)

9월 7일 18:35 UTC, 블록 965,962, 익스플로이터: Blockstream에 보낸 암호화 메시지(PGP, 1,052바이트). 제3자는 읽을 수 없음. (트랜잭션)

9월 7일 21:03 UTC, 블록 965,973, 익스플로이터: ":(" (트랜잭션)

9월 8일 00:11 UTC, 블록 965,992, Blockstream: 익스플로이터에게 보낸 암호화 메시지(ECIES, Blockstream의 PGP 서명, 1,120바이트). 제3자는 읽을 수 없음. (트랜잭션)

9월 8일 06:02 UTC, 블록 966,023, Blockstream: 익스플로이터에게 보낸 암호화 메시지(ECIES, Blockstream의 PGP 서명, 3,168바이트). 제3자는 읽을 수 없음. (트랜잭션)

9월 8일 09:41 UTC, 블록 966,052, 익스플로이터: Blockstream에 보낸 암호화 메시지(PGP, 2,019바이트). 제3자는 읽을 수 없음. (트랜잭션)

9월 8일 12:59 UTC, 블록 966,079, Blockstream: 익스플로이터에게 보낸 암호화 메시지(ECIES, Blockstream의 PGP 서명, 4,230바이트). 제3자는 읽을 수 없음. (트랜잭션)

9월 8일 14:25 UTC, 블록 966,087, 익스플로이터: Blockstream에 보낸 암호화 메시지(PGP, 1,356바이트). 제3자는 읽을 수 없음. (트랜잭션)

9월 8일 14:25 UTC, 블록 966,087, 익스플로이터: "All messages will be in plaintext." (트랜잭션)

9월 9일 11:45 UTC, 블록 966,199, 익스플로이터: "Your dereliction of duty is obvious that you allocated only $1.5M (maybe even 0) to secure $5B assets. This is a flagrant neglect of security and a sign of complete mismanagement. You SHALL pay 10% using your own money as bug bounty or you will cause all your holders a 15% loss for your irresponsibility and stinginess. Even companies that participate in bug bounty programs cannot guarantee complete security, let alone one like yours that remains delusional, greedy, and arrogant to this very day. Anyway we are going to publish the privatekey to decrypt our conversations afterwards." (트랜잭션)

9월 9일 11:45 UTC, 블록 966,199, Blockstream: 익스플로이터에게 보낸 암호화 메시지(ECIES, Blockstream의 PGP 서명, 2,222바이트). 제3자는 읽을 수 없음. (트랜잭션)

9월 10일 02:18 UTC, 블록 966,296, Blockstream: 익스플로이터에게 보낸 암호화 메시지(ECIES, Blockstream의 PGP 서명, 4,889바이트). 제3자는 읽을 수 없음. (트랜잭션)

직접 확인하기

위의 모든 항목은 mempool.space의 해당 트랜잭션으로 연결되며, 그곳에서 OP_RETURN 출력을 원시 스크립트에서 디코딩할 수 있다. 이 스레드의 실시간 버전은 우리 첫 페이지에서 새 블록이 확인될 때마다 갱신되어 돌아가고, 블록 조회 페이지는 귀속이 어떻게 이루어지는지와 무엇이 의도적으로 제외되는지를 설명한다. 암호화된 메시지는 그곳에서도 암호화됨으로 표시된다. 익스플로이터가 약속한 키를 공개하면 이 대화의 닫힌 부분이 읽을 수 있게 되며, 우리는 이 페이지를 갱신할 것이다.

본 게시물은 시장 분석이며, 매수 또는 매도 권유가 아닙니다.

관점을 바꿀 요인

  • 어느 쪽이든 새 평문 메시지, 특히 요구된 10퍼센트 바운티에 대한 Blockstream의 입장 표명.
  • 익스플로이터 주소에 아직 남아 있는 598.5 BTC의 이동, 방향을 불문하고.
  • 익스플로이터가 약속한 개인키의 공개. 그 경우 암호화된 메시지를 누구나 읽을 수 있게 된다.

출처