Tornado 개인정보 보호 관찰 보고서: 정말 100% 발견되지 않을 수 있을까?
출처: 창우 블록체인 보안 연구소
서문
Tornado.Cash는 이더리움 네트워크에서 가장 인기 있는 탈중앙화 프라이버시 솔루션으로, 예치자와 인출자 주소 간의 온체인 연결을 끊어 거래의 기밀성을 유지하고 사용자 프라이버시를 보호합니다.
프라이버시(세탁) 수요가 있는 사용자들이 Tornado.Cash를 사용하기 시작하면서, Tornado.Cash의 진정한 프라이버시 수준은 과연 얼마나 안전할까요?
창우 블록체인 보안 연구소는 Tornado.Cash에 대한 다각적 분석을 통해 Tornado.Cash의 진정한 프라이버시 신뢰성을 탐구할 것입니다.
Tornado.Cash 작동 원리
Tornado.Cash를 분석하기 전에, Tornado.Cash의 작동 원리를 알아야 합니다.
Tornado.Cash는 스마트 계약(익명 풀)을 사용하여 한 주소에서 토큰을 예치받고, 다른 주소에서 인출할 수 있도록 하며, 제로 지식 증명을 통해 예치 주소와 인출 주소 간의 연결을 차단하여 프라이버시를 보호합니다.
여기서 익명 풀의 크기는 Tornado.Cash의 프라이버시 신뢰성의 높낮이를 직접적으로 결정합니다. 만약 익명 풀에 단 한 건의 예치만 있다면, 어떤 주소에서 인출하더라도 반드시 예치 주소와 동일한 사람일 것입니다.
관심 있는 독자는 공식 문서를 읽어볼 수 있습니다: how-does-tornado.cash-work.
사전 준비
Tornado.Cash는 현재 ETH 및 ERC20 토큰(DAI, cDAI, USDC, USDT, WBTC)의 예치 및 인출 거래를 지원합니다. 우리는 거래량이 가장 많은 ETH를 선택하여 프라이버시 분석을 진행했으며, 2021-11-04 이전의 모든 Tornado.Cash 계약의 거래 기록을 추출했습니다. 데이터는 아래 표와 같습니다:
보시다시피, 프록시 계약을 활성화한 후 대량의 거래가 프록시를 통해 이루어졌으며, 익명 풀 거래량 비율 차트(아래 표)를 보면 1 ETH 익명 풀(33%)과 10 ETH 익명 풀(30%)이 가장 많이 사용되고 있음을 알 수 있습니다.
거래 분석
거래 분류
모든 거래를 예치 및 인출로 분류한 후, 각 주소의 예치/인출 총액(단위 ETH), 횟수, 최대 예치/인출 금액, 최소 예치/인출 금액을 통계했습니다. 총 22714개의 예치 주소와 31737개의 인출 주소를 얻었으며, 예치/인출 총액 Top 10 데이터는 다음과 같습니다:
예치 총액 Top 10
인출 주소 총액 Top 10
보시다시피, 예치 주소와 인출 주소는 일대일 대응이 아니며, 예치 주소와 인출 주소 간의 관계를 알 수 없습니다.
채굴 주소 필터링
Tornado.Cash는 익명 채굴 인센티브 조치를 도입하여(참조: anonymity-mining) 익명 풀 내 거래 수를 증가시키고 Tornado.Cash의 전반적인 프라이버시 신뢰성을 높이고자 합니다.
따라서 첫 번째 단계로 익명 풀 내의 채굴 거래를 필터링하여 익명 풀 내 거래 수를 크게 줄일 수 있습니다.
분석 결과, 채굴 주소는 다음과 같은 특징을 가지고 있습니다:
채굴 주소는 Tornado.Cash 채굴 풀 계약 주소 0x746aebc06d2ae31b71ac51429a19d54e797878e9에서 TRON 토큰을 인출합니다;
채굴 주소는 프라이버시 보호 수요가 없으며, 인출 시 일반적으로 자신의 지갑 주소를 사용하여 수수료를 지불합니다;
채굴 주소는 일반적으로 자주 사용되며 거래가 많은 오래된 주소입니다;
이 방법을 사용하여 1051개의 조건을 충족하는 채굴 풀 주소를 확보했습니다. 채굴 주소를 제외한 후, 예치 및 인출 주소 수는 다음과 같이 변화했습니다:
채굴 주소를 제외한 예치 총액 Top 10
채굴 주소를 제외한 인출 주소 총액 Top 10
동일 주소 필터링
예치 주소와 인출 주소가 동일한 거래는 거래 프라이버시가 없으므로 모두 필터링할 수 있습니다(이 부분은 대개 채굴 또는 초보 사용자일 가능성이 높습니다). 필터링 후 데이터는 다음과 같이 변화했습니다:
예치 주소 총액 Top 10
인출 주소 총액 Top 10
중계 주소 필터링
인출 주소의 프라이버시 안전성을 극대화하기 위해 대부분의 사용자는 인출 시 중계기를 사용하여 수수료를 지불합니다. 따라서 한 번의 인출 작업에는 두 개의 거래가 발생합니다.
그 중 하나는 중계기에게 지불하는 소액 수수료이고, 다른 하나가 실제 인출 거래입니다. 아래 그림과 같습니다:
우리는 필터링 조건: max > 0.8 | (max <= 0.1 & max >= 0.08)를 사용하여 중계기 거래를 필터링하였으며, 필터링 후 데이터는 다음과 같이 변화했습니다:
중계 주소를 제외한 인출 주소 횟수 Top 10:
동일 사용자 연관 주소 관계
다음으로 Tornado 거래 풀 내 주소 간의 연관 관계를 분석합니다. 분석 전에 우리는 먼저 채굴 풀 주소와 중계기 주소를 제외한 후 분석을 진행합니다.
분석 방법은 직접 거래 상대방 분석 방식을 사용합니다. A가 충전 주소이고 B가 인출 주소라고 가정할 때, A와 B 간에 직접적인 관계가 없지만 C 주소가 A의 직접 거래 상대방이고 C 주소가 B의 직접 거래 상대방이라면, 우리는 A와 B가 연관되어 있다고 판단할 수 있습니다. 직접 거래 상대방 데이터는 체인 탐색을 통해 조회하여 얻습니다.
주소 유형에 따라 관계를 충전 주소와 충전 주소, 인출 주소와 인출 주소, 충전 주소와 인출 주소의 세 가지 관계로 구분할 수 있으며, 이 세 가지 연관 관계는 서로 다른 상황에 적용됩니다.
- 충전 주소와 충전 주소 간의 관계
Tornado는 0.1ETH, 1ETH, 10ETH, 100ETH만 예치할 수 있으므로 실제 송금 과정에서 자금 분배, 수수료 분배 또는 예치 후 주소에 남은 ETH의 집합 등이 발생할 수 있습니다.
- 인출 주소와 인출 주소 간의 관계
인출이 필요할 때, 인출 주소 간에도 집합이 발생할 수 있습니다. 예를 들어 거래소로 집합될 수 있습니다.
- 충전 주소와 인출 주소 간의 관계
충전 주소와 인출 주소 간에 여전히 연관이 존재하는지가 핵심입니다. 만약 매우 프라이버시 거래에 익숙한 해커라면, 그는 중요한 주소 간의 연결을 끊기 위해 모든 방법을 동원할 수 있지만, 실제 작업 과정에서 사람의 작업이기 때문에 실수나 누락이 발생할 수 있으며, 이는 흔적을 남길 수 있습니다.
위의 세 가지 시나리오와 연관 유형에 대한 추측을 바탕으로, 우리는 100ETH 거래 풀을 분석합니다. 직접 거래 상대방 데이터를 기반으로 해당 연관도를 생성합니다(그림에서 주소 뒤의 d는 충전 주소, w는 인출 주소를 나타냅니다).
첫 번째 경우
충전 주소와 충전 주소 간에 연관 관계가 존재합니다. 예를 들어 0x0022d8bda338fd7e5c7248f32090252fd6dc11ef를 살펴보면:
해당 주소는 여러 충전 주소 간에 거래 상대방 중복이 발생한 경우입니다. 체인 분석을 통해 이 주소가 Tornado에 100ETH와 10ETH를 충전한 후 남은 ETH가 0x6bafcd65f9ad3a99509d8d7d987acfa393db7c39 주소로 집합되었고, 해당 주소는 남은 0.1ETH도 Tornado 거래 풀에 충전했습니다.
두 번째 경우
인출 주소와 인출 주소 간에 연관 관계가 존재합니다. 예를 들어 0x9c67d8383f1eeb6e2ff2b0d296aa6a51ea2858a1을 살펴보면:
해당 주소는 여러 인출 주소 간에 연관 관계가 발생했으며, 이 주소들은 Tornado 100ETH 거래 풀에서 인출 행동을 시작했으며, 각 주소는 1000ETH를 인출했습니다.
인출 후 이들은 모두 0x120cffb605c8127442c2f8515eb25749cce52947 주소로 집합되었습니다.
후속 경로를 계속 분석하면 0x120cffb605c8127442c2f8515eb25749cce52947가 ETH를 여러 번 회전시켜 결국 0x32e9dc9968fab4c4528165cd37b613dd5d229650 등 주소로 이동했으며, 최종적으로 Swap을 통해 ETH를 다른 토큰으로 교환하여 바이낸스와 같은 거래소로 전송되었습니다.
위의 두 가지 경우에서 프라이버시 거래는 충전 측 또는 인출 측에서만 연관이 발생했으며, 일부 정보를 추적할 수 있지만 충전과 인출 간의 연결은 여전히 끊어져 있습니다. 이제 세 번째 경우를 탐색해 보겠습니다.
사람은 완벽할 수 없으며, 아무리 치밀한 계획도 흔적을 남길 수 있습니다. 만약 Tornado 사용자가 주소를 완전히 분리하지 않았다면, 거래 상대방의 관계를 통해 연관될 가능성이 있습니다. 예를 들어 0x167ae15b74cd20482e80f7e425b4ae6d2cc631c4를 살펴보면:
위의 연관 관계에서 다섯 개의 주소가 직접 거래 상대방 0x4278314c1a50da6014e580cbff34fc383b335049를 통해 연관되어, 어느 정도 이 다섯 개 주소의 입출금 관계를 구축할 수 있습니다. 만약 금액과 후속 자금 흐름 관계를 더 깊이 파고든다면, 추가적인 추적을 시도할 수 있습니다.
전체 실험에서 100ETH 풀에는 4132개의 충전 주소가 있으며, 703개의 인출 주소가 있습니다. 직접 거래 상대방 중복이 있는 연관 주소는 2859개로, 전체 주소의 약 59%를 차지합니다. 이는 대부분의 사람들이 Tornado 프라이버시 프로토콜을 사용할 때 사용상의 실수로 인해 100% 프라이버시를 달성하지 못했음을 나타냅니다.
연관 주소를 발견하는 것은 Tornado의 추적 가능성을 의미합니다(이 문서의 샘플은 직접 거래 상대방만 포함되었으며, 더 깊은 거래 상대방을 포함하면 정확도가 더 높아질 것입니다). 대량의 연관 주소를 확보한 후 거래소 주소의 KYC 또는 ENS 트위터 등의 채널을 통해 실제 정보를 추가로 발굴할 수 있습니다.
사례 검증 결과 데이터
우리는 체인 탐색의 해킹 사건 데이터베이스에서 과거에 발생한 몇 가지 보안 사건을 발굴하고, 사건에서 Tornado를 사용한 관련 주소를 필터링하여 위의 이론에 따라 분석했습니다.
KuCoin 해킹 사건 분석
직접 거래 상대방 연관 주소 분석
해커는 8개의 주소를 통해 ETH를 Tornado 100ETH 거래 풀에 예치했으며, 이 8개의 충전 주소는 직접 거래 상대방 0x23156749a0acefc8f07b9954d181d50084c1519e와 0x82e6b31b0fe94925b9cd1473d05894c86f277398을 통해 연관되었습니다.
위의 연관도에서 볼 수 있듯이 해커의 실수로 인해 충전 주소 0x34a17418cec67b82d08cf77a987941f99dc87c6b가 직접 거래 상대방 주소 0x82e6b31b0fe94925b9cd1473d05894c86f277398과 인출 주소 0xc609b3940be560c8c00e593bea47fb6ecef6b2c6과 연관되었습니다.
0xc609b3940be560c8c00e593bea47fb6ecef6b2c6는 2900ETH만 인출했습니다(8개의 충전 주소가 예치한 ETH 총량의 일부에 해당).
해커는 0x82e6b31b0fe94925b9cd1473d05894c86f277398에서 충분한 수수료가 없었기 때문에, 차례로 0xc609b3940be560c8c00e593bea47fb6ecef6b2c6와 0x23156749a0acefc8f07b9954d181d50084c1519e에서 수수료를 전송했습니다.
충전 주소의 수수료도 이 두 주소에서 전송되었기 때문에, 인출 주소와 충전 주소 간의 연관이 형성되었습니다.
계속해서 추적해보면, 인출된 ETH가 다른 주소로 전송되었고, 전체 체인에서 더 깊이 들어가면 ETH가 여러 주소로 분산되었으며, 많은 ETH가 바이낸스의 충전 주소 0x28c6c06298d514db089934071355e5743bf21d60으로 전송되었습니다.
이로써 전체 체인 추적이 바이낸스에서 끊어졌으며, 바이낸스 KYC 정보를 확보할 수 있다면 특정 인물을定位할 수 있습니다.
거래소 Liquid 해킹 사건
네 개의 충전 주소가 100ETH 풀에 예치한 것으로 확인되었으며, 직접 거래 상대방 0x5578840aae68682a9779623fa9e8714802b59946을 통해 연관되었습니다.
FinNexus DeFi 프로젝트 해킹 사건
두 개의 충전 주소가 연관되어 있으며, 0x5271b379f3e1954e20791142d734596a3de28efd와 0x5ebc7d1ff1687a75f76c3edfabcde89d1c09cd5f가 100ETH 풀에 ETH를 예치했으며, 직접 거래 상대방 0xfe381bc045b85e0acd93e85ecfe65ecb0fec2a44을 통해 연관되었습니다.