
안드로이드에서 비트코인을 저장하는 안드로이드 비트코인 지갑이 도난에 취약하게 만드는 심각한 보안 취약점이 발견되었으며, 현재 이 취약점을 이용해 사람들의 비트코인을 훔치는 공격이 발생하고 있습니다. 여러 사람이 자신의 안드로이드 지갑이 비워지고 자금이 1HKywxiL4JziqXrzLKhmB6a74ma6kxbSDj로 전송되었다고 보고했습니다. 이 주소에는 현재 55.8 BTC가 포함되어 있습니다. 이 버그는 안드로이드 자체의 결함이기 때문에 모든 안드로이드 비트코인 지갑이 취약합니다; 비트코인 지갑 for 안드로이드, 비트코인 스피너, blockchain.info의 모바일 버전 및 마이셀리움 지갑이 모두 목록에 포함되어 있습니다. 사용자들은 모든 자금을 데스크톱 또는 온라인 지갑으로 전송하고, 좋아하는 모바일 지갑이 문제를 해결하기 위한 업그레이드를 출시할 때까지 기다릴 것을 권장합니다. 비트코인 지갑 for 안드로이드는 이미 이를 해결했습니다; 비트코인 지갑 for 안드로이드 사용자는 플레이 스토어에서 최신 버전을 다운로드하기만 하면 지갑이 불안전한 자금을 자동으로 새로운 안전한 주소로 이동합니다.
버그의 원인은 안드로이드의 java.security.SecureRandom 메서드로, 개발자 안드레아스 실드바흐는 이를 “암호화 목적에 무용한 여러 심각한 버그가 있다”고 설명합니다. 문제는 다음과 같습니다: 비트코인 거래의 보안을 위해 의존하는 타원 곡선 디지털 서명 알고리즘은 세 가지 입력값을 가집니다: 거래, 서명자의 개인 키 및 임의의 숫자. 알고리즘은 두 개의 값, r과 s를 출력하며, s는 k-1(z+rd) 공식을 사용하여 계산됩니다. 여기서 z는 메시지의 해시, k는 임의의 숫자, d는 개인 키입니다. r은 오직 k에만 의존합니다.
따라서 주소의 소유자가 같은 임의의 숫자로 두 개의 거래에 서명하면 (물론 모든 주소는 하나의 개인 키에 연결되어 있으므로 같은 개인 키를 사용해야 합니다), 두 서명에서 두 개의 s 값을 추출하고 이를 빼서 rd 항이 상쇄되도록 만들 수 있으며, 거기서 개인 키를 추출하는 것은 간단한 나눗셈 문제가 됩니다 (더 자세한 설명은 여기에서 확인할 수 있습니다). 일반적으로 이는 문제가 되지 않습니다; 진정한 임의 숫자 생성기가 주어진다면 첫 번째 “충돌”은 우주의 열적 죽음과 거의 동시에 발생해야 합니다. 그러나 java.security.SecureRandom이 그렇게 무작위가 아니라는 것이 밝혀졌고, 많은 경우 동일한 “무작위” 숫자를 두 번 생성했습니다.
이러한 교묘한 공격의 가능성 때문에 비트코인 개발자들은 간단한 전략을 권장합니다: 같은 주소를 두 번 재사용하지 마십시오. 비트코인 주소에서 자금이 전송될 때마다 지갑은 해당 주소의 전체 내용을 비워야 하며, 필요한 만큼을 의도한 수신자에게 보내고 나머지 자금을 지갑이 제어하는 다른 이전에 사용되지 않은 주소로 보내야 합니다. 이를 수행하지 않는다고 해서 자금이 불안전하다는 의미는 아닙니다; 여기서의 공격은 자바의 임의 숫자 생성기의 약점에 의존하며, 적절한 임의 숫자 생성기(예: os.urandom)가 주어지면 타원 곡선 DSA는 여전히 강력합니다.
그러나 구현이 다소 결함이 있는 경우 취약해질 수 있으며, 일반적인 경우에도 주소 재사용은 비트코인의 프라이버시를 약화시킵니다. 만약 어떤 미친 과학자가 지하 동굴에서 완전한 기능을 갖춘 양자 컴퓨터를 가지고 갑자기 나타난다면, 한 번도 사용되지 않은 주소만이 안전할 것입니다. 그 이유는 비트코인이 있는 주소에서 거래를 한 적이 없다면 공격자가 개인 키를 파악하기 위해 알아야 할 정보가 거의 없기 때문입니다; 사실, 34자 문자열이 공격자가 의존할 수 있는 전부입니다. 그리고 그것조차도 그리 도움이 되지 않습니다; 주소를 유도하는 데 사용되는 해시 알고리즘은 매우 안전하며, 양자 컴퓨터에 대해서도 저항력을 유지합니다.
이번 사건은 비트코인 사용자들에게 지갑 보안의 다른 잠재적 결함을 살펴보라는 경각심을 일깨워야 합니다. 비트코인 사용자가 자신의 잘못 없이 해킹당한 사례가 많았으며, 공격자들이 안드로이드 루트 권한, 자바 키로거 등을 통해 비밀번호를 탈취했습니다; 많은 비트코인을 보유하고 있다면 가능한 한 적게 사용하는 지갑에 보관하는 것이 좋습니다.
별도의 지출 및 저축 지갑을 유지하는 것이 일반적이어야 하며; 이상적으로는 두 지갑 간에 자금을 보내기 위해 어떤 종류의 믹서를 사용하는 것이 프라이버시를 유지하는 데 도움이 됩니다. 오늘날 문제는 불안전한 임의 숫자 생성기입니다. 내일은 비트코인 채굴 ASIC을 재사용하여 브레인 월렛을 해킹하는 돌파구가 될 수 있습니다. 또는 또 다른 정수 오버플로우. 또는 Electrum 서버를 해킹하거나 blockchain.info의 SSL 인증서를 위조하여 가능해진 다중 확인 이중 지출 공격. 여기서의 교훈은 이렇습니다: 비트코인 구현에서 발생할 수 있는 모든 보안 결함을 해결하기까지는 아직 갈 길이 멉니다. 전통적인 금융 시스템은 40년을 보냈고, 그들조차도 완료되지 않았습니다.