연구 . 개요

암호화폐 지갑의 취약한 난수 생성 기능

지난 10년 동안 지갑 소프트웨어 분야에서 같은 실수가 반복되어 왔습니다. 암호화 자체는 견고했지만, 그 기반이 되는 난수 생성 과정에는 문제가 있었던 것입니다. 이 글은 이러한 일련의 실패 사례를 살펴보고, 소유자들에게 있어 ‘예측 가능성’이 왜 복구로 이어지는 길인지 설명합니다.

2026년 7월 업데이트 · KeychainX — 2017년부터 지갑 복구 서비스 제공

지갑 손실 사고의 대부분은 암호화 시스템의 결함이 아니라 난수 생성 과정의 문제에서 비롯됩니다. 지갑의 보안은 전적으로 예측 불가능한 숫자에 달려 있으며, 이러한 숫자가 예측 가능해지는 순간 아무리 강력한 알고리즘을 사용하더라도 전체 시스템은 무너지고 맙니다. 이 페이지에서는 저희가 조사한 주요 사례들을 종합하여 소개하며, 각 사례에 대한 자세한 내용은 해당 사례별 페이지에서 확인할 수 있습니다. 또한 이러한 사례들이 공유하는 공통된 패턴과 이것이 복구에 어떤 의미를 지니는지 설명합니다.

무작위성은 지갑의 기초입니다

모든 지갑은 비밀, 즉 개인 키나 시드(seed)로 시작됩니다. 이 비밀은 이상적으로는 그 누구도 추측하거나 열거할 수 없을 만큼 광대한 공간에서 선택되어야 합니다. 이러한 예측 불가능성은 전적으로 무작위성에서 비롯됩니다. 키를 생성하는 데 사용된 무작위성이 진정으로 예측 불가능하다면, 아무리 무한한 연산 능력을 동원하더라도 지갑은 안전합니다. 만약 그렇지 않다면 — 즉, “무작위” 숫자가 시계나 결함이 있는 생성기처럼 예측 가능한 출처에서 나온 것이라면 — 그 광대한 공간은 검색 가능한 작은 공간으로 축소되며, 세상에서 가장 강력한 암호화 기술로도 이를 보호할 수 없습니다.

무작위성이 실패하는 두 가지 경우

약한 무작위성은 지갑에 두 가지 뚜렷한 측면에서 해를 끼칩니다. 첫 번째는 키 생성 단계입니다. 시드나 개인 키가 예측 가능한 엔트로피를 기반으로 생성된 경우, 공격자는 정확한 키를 재구성할 수 있습니다. 두 번째는 서명 단계입니다. 모든 거래 서명에는 새로운 난수 값(ECDSA 논스)이 필요하며, 이 값이 예측 가능하거나 반복된다면 블록체인상의 공개 거래 내역만으로도 개인 키를 직접 계산해 낼 수 있습니다. 두 가지 모두 치명적인 문제이며, 실제 사례들 중 각 범주에 해당하는 사례들이 존재합니다.

Randstorm — 예측 가능한 브라우저 지갑 키

Randstorm은 2011년경부터 2015년경까지 BitcoinJS 라이브러리를 사용하여 브라우저에서 생성된 수백만 개의 지갑에 영향을 미쳤는데, 이 라이브러리의 SecureRandom 루틴이 예상보다 훨씬 적은 엔트로피를 수집했기 때문입니다. 그 결과, 지나치게 축소된 공간에서 키가 생성되었습니다. 이는 키 생성 오류이며, 초기 지갑 사용자 대다수에게 영향을 미칩니다. 자세한 내용은 당사의 Randstorm 연구 자료를 참조하십시오.

MilkSad — 시계에서 나온 씨앗, 혹은 그보다 더 나쁜 것

MilkSad (CVE-2023-39910)는 libbitcoin-explorer의 bx seed 명령어를 통해 시드를 생성한 지갑에 영향을 미쳤는데, 이 명령어는 32비트 시스템 시간을 사용하여 Mersenne Twister를 초기화했습니다. 이로 인해 가능한 시드의 수는 약 40억 개에 불과하며, 생성 시점이 대개 알려져 있기 때문에 실제로는 그보다 훨씬 적은 경우가 많습니다. 널리 사용되는 도구에서 발생한 또 다른 키 생성 오류입니다. 당사의 MilkSad 연구 자료를 참고하시기 바랍니다.

Android SecureRandom — 서명 시 키 유출

2013년 안드로이드 SecureRandom 결함은 classic 오류 사례입니다. 안드로이드의 난수 생성기가 중복된 값을 반환할 수 있었기 때문에, 비트코인 지갑이 여러 서명에 걸쳐 ECDSA 논스를 재사용하게 되었고, 이로 인해 누구나 두 건의 공개 거래 내역만으로도 개인 키를 계산할 수 있게 되었습니다. 그 결과 자금이 체인 밖으로 바로 유출되었습니다. 당사의 안드로이드 SecureRandom 연구 보고서를 참조하십시오.

트러스트 월렛 — 현대적인 재해석

‘약한 난수성’은 단순히 오래된 문제만은 아닙니다. 2023년에는 트러스트 월렛(Trust Wallet) 브라우저 확장 프로그램이 예측 가능한 의사난수 생성기를 사용하여 니모닉을 생성하는 것으로 밝혀졌는데, 이로 인해 해당 창에서 생성된 키를 모두 열거할 수 있었습니다. 이는 10년 후 발생한 Randstorm과 MilkSad 사례와 동일한 키 생성 오류였습니다. 이는 개발자가 편리하지만 암호학적으로 안전하지 않은 난수 소스를 사용할 때마다 이러한 유형의 버그가 반복적으로 발생한다는 사실을 상기시켜 줍니다.

2014년 사전 판매 PRNG 관점

저희의 자체 연구에 따르면, 이러한 패턴은 2014년 이더리움 프리세일 생성기에도 적용되는데, 이 생성기는 프로세스의 일부에서 브라우저의 Math.random() 함수를 활용했습니다. 파이어폭스의 경우, 특정 엔트로피 붕괴 현상으로 인해 예측 불가능한 무작위성이 제한된 타임스탬프로 축소될 수 있으며, 이는 매우 가치가 높은 지갑 중 일부를 복구할 수 있는 잠재적인 경로가 될 수 있습니다. 프리세일 PRNG 관련 연구 자료를 참고하시기 바랍니다.

패턴: 건실한 암호화, 예측 가능한 시드

이 모든 사례에서 암호화 기술 자체에는 문제가 없었습니다. AES, ECDSA, 해싱 알고리즘은 결코 취약점이 아니었습니다. 취약점은 항상 입력값에 있었습니다. 즉, 시계, 결함이 있는 플랫폼 생성기, 브라우저의 특이점, 혹은 암호화 기능이 필요한 곳에 비암호화 기능이 사용된 결과, 예측 가능하게 된 난수 값이었습니다. 이러한 패턴을 인식해야만 우리는 “안전한” 지갑을 보고 올바른 질문을 던질 수 있습니다. “암호화가 강력한가?”가 아니라 “무작위성은 실제로 어디에서 비롯된 것인가?”라는 질문을 말입니다.

예측 가능성이 양날의 검인 이유

여기서 소유자에게 중요한 부분이 있습니다. 공격자가 키를 재생성하거나 서명에서 키를 도출할 수 있게 해주는 바로 그 예측 가능성 덕분에, 정당한 소유자를 위해 지갑을 복구할 수 있는 것입니다. 만약 지갑이 취약한 난수 생성 방식으로 생성되었고 접근 권한을 상실한 경우, 지갑을 위험에 빠뜨리는 바로 그 제한된 검색 공간 덕분에 지갑을 재구성할 수 있습니다. 즉, 열거 가능한 시드 공간을 모두 샅샅이 조사하거나, 본인의 공개 거래 내역에서 키를 도출함으로써 가능합니다. 우리는 이를 엄격히 ‘소유자 복구’ 목적으로만 수행하며, 사용자가 소유권을 입증할 수 있는 지갑에 한해, 그렇지 않았다면 잃어버렸을 자금을 반환하기 위해 이 과정을 진행합니다.

자신이 해당될 수 있는지 확인하는 방법

다음과 같은 경우 보안 위험에 노출되었을 수 있습니다: 2011~2015년경 브라우저에서 생성된 지갑(Randstorm); libbitcoin의 bx 시드 또는 이를 기반으로 한 도구로 생성된 지갑(MilkSad); 2013년경 초기 안드로이드 비트코인 지갑에서 생성된 지갑(SecureRandom); 영향을 받은 Trust Wallet 확장 프로그램 창에서 생성된 지갑; 또는 2014년 이더리움 프리세일 지갑. 이 모든 사례에서 우려스러운 점은 지갑이 겉보기에는 완전히 정상적으로 보인다는 것입니다. 즉, 누군가가 해당 공간을 일일이 조사하기 전까지는 이 취약점을 알아차릴 수 없습니다. 만약 귀하의 지갑 중 자금이 남아 있는 지갑이 위 사항 중 하나에 해당한다면, 해당 지갑을 위험에 노출된 것으로 간주하고 자금을 이동시키십시오. 만약 지갑에 접근할 수 없는 상태라면, 동일한 취약점을 통해 다시 접근할 수 있을 수도 있습니다.

좋은 무작위성은 어떤 모습일까

보안상의 교훈은 일관됩니다. 키와 시드는 적절한 암호화 난수 생성원에서 가져와야 하며, 서명 시에는 매번 고유하고 예측 불가능한 논스(nonce)를 사용해야 합니다(최신 지갑들은 RFC 6979에 따라 결정론적 논스를 사용하여 재사용 위험을 완전히 제거합니다). 신뢰할 수 있고 최신 버전의 소프트웨어나 평판이 좋은 하드웨어 지갑에서 시드를 생성하십시오. 오래된 브라우저 기반 생성기나 더 이상 지원되지 않는 도구는 주의해야 하며, 위 목록에 포함된 도구로 지갑을 생성한 경우 새로 생성된 지갑으로 이전하십시오. 양질의 난수성은 제대로 작동할 때는 눈에 띄지 않지만, 제대로 작동하지 않을 때는 치명적인 결과를 초래합니다. 바로 이 때문에 난수성에 이토록 많은 주의를 기울여야 하는 것입니다.

우리의 연구

‘약한 무작위성’ 복원은 KeychainX의 핵심 연구 분야입니다. 초기 암호화폐 중 ‘분실된’ 것으로 여겨지는 상당 부분이 실제로는 소유주를 위해 재구성되기를 기다리고 있는 ‘약한 무작위성’ 암호화폐이기 때문입니다. 위에서 언급한 각 사례에는 별도의 상세 페이지가 있으며, 이 개요는 이를 하나의 범주로 묶어 설명합니다. 우리는 새로운 사례가 등장할 때마다 이 조사 보고서의 작성 시기를 업데이트하고 내용을 관리합니다. 편리한 난수 생성 방식을 사용하려는 유혹은 지갑 소프트웨어가 세대를 거듭할 때마다 반복적으로 나타나기 때문에, 이러한 현상은 사라지지 않을 것입니다.

자주 묻는 질문

암호화폐 지갑에서 ‘약한 무작위성’이란 무엇인가요?

이는 키를 생성하거나 거래에 서명하는 데 사용되는 난수가 예측 가능한 출처(시계, 결함이 있는 난수 생성기, 또는 암호화 기능이 아닌 함수 등)에서 비롯되어, 방대한 키 공간을 검색 가능한 작은 공간으로 축소시키는 경우를 말합니다. 암호화 자체는 여전히 안전하지만, 입력값에 취약점이 존재합니다.

이 계열에는 어떤 취약점이 포함되어 있나요?

Randstorm(브라우저 지갑, 2011–2015), MilkSad(libbitcoin bx 시드, CVE-2023-39910), 2013년 안드로이드 SecureRandom 결함, 2023년 Trust Wallet 확장 프로그램 문제, 그리고 2014년 이더리움 프리세일 PRNG 취약점.

무작위성이 약하다는 것이 내 자금이 사라졌다는 뜻인가요?

이는 지갑이 위험에 처해 있다는 뜻입니다. 즉, 누구든지 해당 키를 재생성할 가능성이 있다는 것입니다. 하지만 정당한 소유자에게는 이는 종종 복구가 가능하다는 의미이기도 합니다. 지갑을 위험에 빠뜨리는 바로 그 축소된 탐색 공간 덕분에 지갑을 재구성할 수 있기 때문입니다.

내 지갑이 취약한 난수 생성 방식을 사용했는지 어떻게 알 수 있나요?

어떻게, 언제 생성되었는지 확인해 보세요: 2011~2015년 사이의 브라우저 지갑, bx 시드 생성 시드, 초기 안드로이드 지갑, 문제가 발생한 Trust Wallet 창, 또는 2014년 프리세일 지갑 등이 주요 위험 요인입니다. 지갑 자체는 정상적으로 보이지만, 생성 내역을 통해 위험 여부를 파악할 수 있습니다.

무작위성이 취약한 문제로 영향을 받은 지갑을 복구할 수 있나요?

대개 소유주를 대상으로 합니다. 지갑이 언제, 어떻게 생성되었는지에 대한 세부 정보(및 알려진 주소)가 있다면, 축소된 시드 공간을 샅샅이 조사하거나 공개된 거래 내역을 바탕으로 키를 도출해 드립니다. 성공 시에만 수수료를 받으며, 선불 비용은 없습니다.

무작위성이 취약한 지갑?

만약 귀하의 지갑이 이러한 유형 중 하나에 해당하고 접근 권한을 상실한 경우, 동일한 취약점을 통해 다시 접근할 수 있는 경우가 많습니다. 해당 취약점이 언제, 어떻게 발생했는지 알려주시면 24시간 이내에 정직하게 평가해 드리겠습니다.

KeychainX에 문의하기 →