질리카 코인 해킹, 7년 묵은 렛저 지갑 버그가 진짜 원인이었다

질리카 해킹 사건 타임라인과 렛저 앱 논스 버그 핵심 요약 카드 - 2019년부터 7년간 방치, 서명 5회면 개인키 노출 가능

레이어1 블록체인 질리카(Zilliqa)에서 발생한 질리카 해킹 사고의 진짜 원인이 밝혀졌다. 지난 20일 거래소 파트너의 콜드월렛(오프라인 지갑)에서 ZIL 코인이 도난당했다는 소식이 처음 전해졌을 때만 해도 다들 거래소 보안 사고로 짐작했다. 하지만 22일 질리카 팀이 공식 발표한 조사 결과는 예상과 달랐다. 범인은 거래소가 아니라 2019년 출시 이후 7년째 방치돼 온 렛저(Ledger) 하드웨어 지갑 전용 앱의 서명 생성 버그였다.

질리카 해킹, 나흘 만에 벌어진 일

사건은 빠르게 전개됐다. 아래 표로 흐름을 정리했다.

날짜 내용
7월 20일 온체인 이상 거래 포착, 거래소 파트너 콜드월렛에서 ZIL 도난 정황 확인. 질리카가 공식 X 계정으로 입출금 일시 중단 요청
7월 20일(조사 중) 거래소 자체 문제라는 초기 의심 해소, 거래소 KuCoin과 공동 조사 착수
7월 21일 렛저 앱 서명 버그가 근본 원인으로 확인, 네이티브(비EVM) 트랜잭션 전면 중단
7월 22일 취약점 세부 내용 공식 공개, 수정된 렛저 앱 준비 완료(배포 시점은 별도 공지 예정)

이 과정에서 거래소 KuCoin의 역할이 컸다. KuCoin은 문제를 처음 보고하고, 공개된 온체인 데이터만으로 실제로 개인키를 복구해내는 방식으로 취약점을 재현해 질리카 팀의 원인 규명을 도왔다. 질리카는 공식 발표에서 KuCoin의 “전문성과 협조”에 감사를 표했다.

서명 5번이면 개인키가 새어나가는 구조

문제의 핵심은 렛저 앱이 질리카 네이티브 트랜잭션에 EC-슈노르(Schnorr) 서명을 생성하는 과정에 있었다. 정상적인 서명은 매번 256비트짜리 완전히 무작위한 임시값(논스)이 필요하다. 그런데 렛저 앱은 40바이트 난수를 만들어놓고, 이를 서명용 32바이트로 잘라 담는 과정에서 엉뚱한 구간을 복사하는 실수를 저질렀다. 그 결과 모든 논스의 상위 64비트가 항상 0으로 고정되는 구조적 결함이 발생했다.

64비트가 항상 같은 값이라는 건, 서명 하나하나가 개인키에 대한 단서를 흘린다는 뜻이다. 이런 서명이 다섯 개 이상 온체인에 쌓이면, ‘격자 축소(lattice reduction)’라는 수학 기법으로 일반 컴퓨터에서도 개인키를 역산할 수 있다. 더 심각한 건 이 서명들이 이미 블록체인에 영구히 기록돼 있다는 점이다. 렛저 앱을 아무리 업데이트해도 과거에 노출된 개인키 자체는 되돌릴 수 없다.

다만 모든 질리카 이용자가 위험한 건 아니다. 이번 버그는 렛저 지갑으로 EVM 방식이 아닌 ‘네이티브’ ZIL 트랜잭션을 서명한 경우에만 해당한다. 아래 표로 영향 범위를 정리했다.

구분 해당 여부
렛저로 네이티브(비EVM) ZIL 트랜잭션 5회 이상 서명 영향 있음, 개인키 노출 위험
렛저로 EVM 호환 방식 ZIL 트랜잭션만 서명 영향 없음 (다른 서명 로직 사용)
zilliqa-js·gozilliqa-sdk·pyzil 등 공식 SDK 이용 영향 없음
렛저 아닌 다른 지갑(소프트웨어 지갑 등) 이용 영향 없음

렛저로 질리카 지갑 쓴다면 지금 확인할 것

질리카 팀은 이미 노출된 것으로 의심되는 계정의 자산을 섣불리 옮기지 말라고 당부했다. 공격자가 이미 개인키를 확보한 상태라면, 자산을 옮기려는 시도 자체가 공격자에게 선점(프론트러닝)당할 위험이 있기 때문이다. 지금 시점에서 확인하고 실행할 수 있는 것은 다음과 같다.

  • 렛저 기기로 질리카 지갑을 관리해왔다면, 네이티브(비EVM) 트랜잭션을 몇 번 서명했는지 우선 점검한다.
  • 질리카 공식 X 계정과 공식 블로그를 구독해 후속 공지(수정 앱 배포, 자산 이전 절차 안내)를 놓치지 않는다.
  • 이미 여러 번 서명한 계정이라면 개인적으로 자금을 옮기려 하지 말고, 공식 구제 절차 발표를 기다린다.
  • 거래소를 통해 ZIL을 보유·거래했다면 이용 거래소의 입출금 재개 공지를 확인한다.
  • 수정된 렛저 앱이 배포되면 즉시 업데이트하되, 과거 서명 이력이 있는 지갑은 업데이트만으로 안전해지지 않는다는 점을 기억한다.

시사점

이번 사건이 씁쓸한 이유는 ‘하드웨어 지갑=안전’이라는 통념이 깨졌기 때문이다. 렛저 자체의 보안 칩이나 질리카 블록체인 코드에는 문제가 없었다. 문제는 그 사이를 연결하는 ‘동반 앱’ 한 겹의 코드, 그것도 40바이트를 32바이트로 자르는 아주 사소해 보이는 실수였다. 이 실수 하나가 7년 동안 아무에게도 들키지 않고 잠복해 있었다는 사실은, 감사(audit)와 코드 리뷰가 아무리 촘촘해도 사각지대는 늘 존재할 수 있다는 걸 보여준다.

크립토 보안에서 콜드월렛과 하드웨어 지갑은 흔히 ‘최후의 안전장치’로 여겨진다. 하지만 이번 사고는 그 안전장치를 구현하는 소프트웨어 자체에 결함이 있다면, 오프라인 보관이라는 물리적 안전성도 무력화될 수 있음을 보여준 사례다. 렛저로 다른 코인을 관리하는 이용자라도, 자신이 쓰는 지갑 앱이 서명 값을 어떻게 생성하는지까지 신경 쓸 필요는 없더라도 최소한 공식 채널의 보안 공지 정도는 챙겨볼 필요가 있어 보인다.

출처

함께 보면 좋은 글

댓글 남기기