연구 . 취약점
2013년 안드로이드 SecureRandom 취약점
‘약한 무작위성’ 연구의 일부입니다. ‘암호화폐 지갑의 약한 무작위성’ 개요를 참조하세요.
2013년, 안드로이드의 난수 생성기는 본래 그래야 할 만큼 무작위적이지 않았으며, 이를 신뢰했던 비트코인 지갑들은 서명된 거래 내역을 통해 자신의 개인 키가 유출되는 사태가 발생했습니다.
이는 직접적인 재정적 손실을 초래한 플랫폼 수준의 난수 생성 결함에 대한 대표적인 사례입니다. 2013년 8월, 안드로이드의 SecureRandom 구현에 존재하던 취약점으로 인해 예측 불가능하다고 여겨졌던 값들이 실제로는 예측 가능하게 되었으며, 이로 인해 영향을 받은 기기의 비트코인 지갑에서 키가 유출되었습니다. 이 페이지에서는 당시 발생한 사건과, 이 문제가 구형 안드로이드 지갑에 여전히 중요한 이유를 설명합니다.
서명에 무작위성이 필요한 이유
비트코인 지갑이 자금을 지출할 때마다 ECDSA를 사용하여 거래에 서명하며, 각 서명에는 예측할 수 없는 새로운 난수, 즉 “논스(nonce)” 또는 k 값이 필요합니다. ECDSA의 보안은 각 서명마다 이 숫자가 고유하고 비밀로 유지되는지에 전적으로 달려 있습니다. 두 서명에 동일한 k 값을 재사용하면, 수학적 원리에 따라 누구나 두 공개 서명으로부터 개인 키를 계산해 낼 수 있습니다. 이는 암호학에서 가장 극명한 “사소한 실수, 치명적인 결과”의 사례 중 하나입니다.
SecureRandom의 취약점
안드로이드 앱들은 시스템의 SecureRandom에서 이러한 난수 값을 가져왔습니다. 2013년에 특정 조건 하에서 안드로이드의 구현 방식이 제대로 시드(seed)가 설정되지 않아 예측 가능하거나 반복되는 출력값을 반환할 수 있다는 사실이 밝혀졌습니다. 비트코인 지갑의 경우, 이는 서명에 사용되는 중요한 k 값이 때때로 반복된다는 것을 의미했습니다. 동일한 지갑에서 k 값을 재사용한 두 건의 거래만으로도, 관찰자는 공개 블록체인에서 바로 개인 키를 도출하는 데 필요한 모든 정보를 확보할 수 있었습니다.
영향
비트코인 거래 내역은 공개되어 있기 때문에, 공격자들은 블록체인을 스캔하여 반복되는 논스(nonce)를 찾아내고, 노출된 지갑을 훑어볼 수 있습니다. 다수의 안드로이드 비트코인 지갑이 이 문제에 영향을 받았으며, 생태계가 대응하기 전에 자금이 도난당했습니다. 공식 대응 조치로 피해 사용자에게는 새로운 키를 생성하고 코인을 옮길 것을 권고했으며, 지갑 앱 개발사들은 수정 패치를 배포했지만, 이미 반복되는 논스로 서명된 거래의 경우 해당 키는 영구적으로 노출된 상태였습니다.
영향을 받은 지갑 식별하기
지문은 온체인에 남아 있습니다: 동일한 주소에서 논스(nonce)를 공유하는 두 개 이상의 서명이 바로 그것입니다. 2013년경의 구형 안드로이드 비트코인 지갑이 여러 건의 거래에 서명한 경우가 classic 사례입니다. 명백하게 자금이 모두 인출된 적이 없는 지갑이라 할지라도 취약한 거래에 서명했을 가능성이 있으며, 만약 여전히 자금이 남아 있다면 이 패턴을 알아차린 누구라도 해당 자금을 접근할 수 있습니다. 따라서 안전하다고 단정 짓기보다는 철저한 평가를 거치는 것이 중요합니다.
회복에 있어 이것이 의미하는 바는 무엇인가
소유자의 입장에서 볼 때, 이러한 결함은 양날의 검과 같습니다. 만약 본인의 오래된 안드로이드 지갑이 반복되는 논스(nonce)를 통해 키를 노출했다면, 공개된 거래 내역만으로도 개인 키를 도출할 수 있습니다. 이는 소유권 증명이 동반될 경우, 다른 방법으로는 더 이상 접근할 수 없는 자금을 복구할 수 있는 합법적인 경로가 됩니다. 우리는 이를 엄격히 ‘소유자 복구’로 간주합니다. 즉, 클라이언트가 명백히 소유하고 있음을 입증한 지갑의 서명을 바탕으로 키를 재구성하여, 접근 권한을 상실한 자금을 이동시키는 것을 말합니다.
더 넓은 의미에서 얻을 수 있는 교훈
안드로이드 SecureRandom 사건은 지갑의 보안 수준이 그 기반이 되는 난수 생성 기능의 보안 수준에 달려 있다는 점을 여실히 보여주는 대표적인 사례입니다. 이 사건은 Randstorm 및 MilkSad와 같은 부류에 속합니다. 즉, 예측 가능하거나 결함이 있는 난수 생성 소스로 인해 견고한 암호학이 훼손된 사례입니다. 여기서 다른 점은 이번 결함이 키 생성 단계가 아닌 서명 과정을 통해 키가 유출되었다는 점이지만, 그 원리와 소유자를 위한 복구 절차는 동일합니다.
2013년경의 안드로이드 지갑을 가지고 계셨다면
2013년경 안드로이드 지갑에 비트코인을 보관했었고, 해당 키 자료나 거래 내역을 아직 보유하고 있다면, 해당 지갑이 해킹당했을 가능성이 있다고 간주하십시오. 남아 있는 자금은 신뢰할 수 있는 난수 생성 방식을 기반으로 한 지갑으로 옮겨야 합니다. 만약 해당 지갑에 더 이상 접근할 수 없다면, ‘논스(nonce)’ 취약점이 오히려 소유자인 여러분이 다시 접근할 수 있는 길이 될 수도 있으니, 자금을 손실로 처리하기 전에 이를 검토해 볼 가치가 있습니다.
왜 수년이 지난 지금도 여전히 중요한가
2013년의 결함을 먼 옛날의 일로 치부하고 싶은 유혹이 들지만, 비트코인의 영속성 때문에 사정이 달라집니다. 과거에 전송된 모든 취약한 서명은 그대로 체인에 남아 있으므로, 10년 전 반복된 논스(nonce)로 인해 노출된 키는 영원히 노출된 상태로 남게 됩니다. 블록체인은 결코 잊지 않기 때문입니다. 이는 당시의 오래된 안드로이드 지갑들이 오늘날에도 여전히 유효한 고려 대상임을 의미합니다. 잔액이 남아 있는 지갑은 해당 패턴을 스캔하는 누구에게나 노출될 수 있으며, 소유자가 접근 권한을 상실한 지갑은 바로 그 취약점을 통해 잠재적으로 복구될 수 있습니다. 영구적이고 공개된 데이터의 결함은 결코 완전히 사라지지 않으며, 이것이 바로 이 내용이 2013년의 각주가 아닌 이와 같은 참고 자료에 포함되어야 하는 정확한 이유입니다.
당사의 문서
KeychainX는 이 내용을 Randstorm 및 MilkSad와 함께 진행한 ‘약한 무작위성’ 연구의 일환으로 기록하고 있습니다. 비트코인 커뮤니티에서 2013년에 발표된 초기 권고문에는 자세한 내용이 모두 포함되어 있으며, 저희는 해당 지갑의 정당한 소유주에게 지갑을 되돌려주는 데 중점을 두고 있습니다. 더 이상 접근할 수 없는 구형 안드로이드 비트코인 지갑을 가지고 계신다면, 이 내용을 한 번 확인해 보시기 바랍니다.
자주 묻는 질문
내 서명이 논스를 재사용했는지 어떻게 알 수 있나요?
온체인 상에서는 동일한 논스 값을 공유하는 하나의 주소에서 나온 두 개의 서명으로 나타납니다. 평가 과정의 일환으로 해당 주소의 거래 내역을 확인하여 이러한 패턴이 있는지 살펴볼 수 있습니다.
2013년 안드로이드 SecureRandom 결함은 무엇이었나요?
안드로이드의 SecureRandom에 존재하는 취약점으로 인해 예측 가능하거나 반복적인 출력이 발생했습니다. 이 기능을 사용한 비트코인 지갑의 경우, 여러 서명에서 ECDSA 논스를 재사용할 수 있었으며, 이로 인해 누구나 공개된 거래 내역을 통해 개인 키를 도출할 수 있게 되었습니다.
자금은 어떻게 도난당했나요?
공격자들은 블록체인에서 동일한 논스를 재사용한 서명을 스캔하여 이를 바탕으로 개인 키를 도출한 뒤, 지갑 자금을 모두 훔쳐갔는데, 이 모든 과정이 공개된 데이터만을 통해 이루어졌다.
제가 예전에 사용하던 안드로이드 지갑도 영향을 받을 수 있을까요?
2013년경에 생성된 지갑이고 여러 건의 거래에 서명했다면, 그럴 가능성이 있습니다. 이 위험은 온체인에서 서명 논스가 반복적으로 나타나는 형태로 드러납니다. 남아 있는 자금은 모두 이체해야 합니다.
이 방법으로 제 지갑을 복구할 수 있을까요?
만약 본인의 지갑이 반복되는 논스(nonce)를 통해 키를 노출했다면, 해당 키는 공개된 거래 내역에서 도출할 수 있습니다. 이는 소유권이 입증된 본인에게 있어 합법적인 복구 방법입니다.
회복 비용은 얼마인가요?
성과 기반: 지갑을 회수할 경우에만 회수 금액의 일정 비율을 수수료로 받으며, 선불 수수료는 없습니다.
접속할 수 없는 구형 안드로이드 비트코인 지갑이 있으신가요?
2013년경의 안드로이드 지갑은 논스(nonce) 취약점을 통해 복구될 수 있습니다 — 지갑 소유자인 여러분을 위해서 말이죠. 보유하고 계신 지갑을 알려주시면, 24시간 이내에 정직한 평가를 드리겠습니다.