한 지갑 도난 사례를 통해 Web3의 보안 가이드를 탐구하다

알파토끼 연구 노트
2022-01-21 00:12:45
수집
복기 지갑 도난 사례, 8가지 안전 조언 정리, 웹 3.0에서 자산 안전을 실현하는 데 도움을 줍니다.

원문 제목: 《기술 | 하나의 지갑 도난 사례를 통해 Web3의 보안 가이드 탐구》

원문 출처: 아파투 연구 노트

원문 저자: Chris 아파투

사건

2022년 새해 첫날 아침, 작은 C는 코드를 작성하고 Web3js의 체인 상 계약 거래를 계속 테스트할 준비를 하고 있었습니다. 갑자기 자신의 테스트 계정(Bsc 체인)이 MetaMask에서 0으로 표시된 것을 발견했습니다. 분명히 전날 밤 계좌에는 100달러가 있었는데, 송금을 확인해보니:

돈이 다 사라졌습니다. 돈은 어디로 갔을까요?

배경

기술 출신의 작은 C는 최근 블록체인 개발을 배우고 있었습니다. 본래 전문 개발자였기에 매우 조심스럽고 신중했지만, 보통 테스트 네트워크에서만 작업하고, 끝난 후에 정식 네트워크에 배포하는 방식이었습니다. 그러나 현재 산업이 상대적으로 혼란스러운 단계에 있다는 것을 인식하지 못하고, 방심과 습관으로 인해 손실을 입게 되었습니다.

손실은 어떻게 발생했나요?

2021년 마지막 날, 작은 C는 우연히 흥미로운 계정을 발견했습니다(이 계정은 많은 활발한 거래가 있었습니다). 그래서 그 계정의 몇 가지 체인 상 거래를 추적했고, 매우 흥미로운 프로젝트(높은 연간 수익률이 있는)를 보게 되었습니다. 그래서 무심코 자신의 MetaMask에 연결한 후, 무심코 approve를 진행했습니다. 일반적으로 Web3 프로젝트는 이 과정이기 때문에, approve 후 송금이 끝나는 것이었습니다.

하지만 놀라운 장면이 펼쳐졌습니다: 클릭한 후, 전체 웹사이트가 갑자기 멈췄습니다(사실 이 멈춘 시간 동안, 도둑이 돈을 옮겼습니다). 아무런 반응이 없었고, 작은 C는 그때 별로 신경 쓰지 않고 사이트를 닫고 다른 일을 하러 갔습니다.

하루 정도 지나서, 작은 C가 다시 개발을 하러 돌아왔을 때, 계좌의 돈이 모두 사라진 것을 발견했습니다. 역사 기록을 확인해보니, 계좌의 잔액이 모두 전송된 것을 알게 되었습니다.

과정 회고

도둑은 어떻게 작은 C 계좌의 돈을 모두 옮겼나요?

현상: approve만 하면, 이론적으로 개인 키 없이도 해당 돈을 모두 옮길 수 있습니다.

작은 C는 추적을 진행했고, 대략 피싱 웹사이트의 approve에서 문제가 발생한 것으로 보였습니다. 그래서 해당 송금 기록을 추적했습니다.

그림에서 볼 수 있듯이, 먼저 하나의 계약을 approve(허가)했으며, 피싱 계약이 계좌 내 BUSD를 조작할 수 있도록 허가했습니다. 게다가 수량 제한이 없었습니다.

왜 BUSD였을까요? 작은 C는 피싱 사이트에 들어갔을 때 기본적으로 BUSD가 선택되었다는 것을 기억했습니다. 아마도 사이트를 탐색하고 지갑을 연결한 후, 도둑이 계좌 내에서 가장 많은 돈이 있는 토큰을 이미 필터링했을 것입니다.

그리고 작은 C는 이것이 새로운 swap 계약이라고 생각하고 높은 연간 수익이 있다고 믿으며, 먼저 시험해보려 했습니다. 그래서 일반적인 절차에 따라 approve를 진행했습니다. approve가 끝난 후, 웹사이트가 바로 멈췄습니다.

나중에 추적해보니, 허가 후 수십 초가 지나자 계약이 직접 송금 작업을 트리거하여 BUSD 토큰을 직접 옮겼습니다.

그 후 허가 정보를 확인해보았습니다.

기본적으로 MetaMask에서 기본 허가 시:

숫자로 변환하면, 우리가 아는 것은 1.157920892373162 곱하기 10의 59제곱입니다. 기본적으로 무한량 송금으로 이해할 수 있습니다. 즉, 이 허가 작업은 이 계약이 내 계좌의 토큰을 무한히 조작할 수 있게 합니다. 여기까지 보니 등골이 오싹해졌습니다. 예전에도 여러 번 approve를 클릭했지만, 그런 것을 보지 않았습니다.

그리고 해커는 이 계약 방법을 제어할 수 있는 지갑 주소를 조작하여 계약 송금 방법을 시작하고 돈을 옮겼습니다. 그래서 친구들은 이후 metamask 허가를 클릭할 때 반드시 조심해야 합니다.

작은 C는 확인해보니, 도둑의 현재 계좌에는 약 3만 달러의 토큰이 있었고, 지금도 계속해서 피해자들이 돈을 송금하고 있었습니다. 그러나 블록체인에서는 이 해커가 누구인지 전혀 찾을 수 없었습니다.

문제가 발생한 단계

문제는 도대체 어디에 있었나요?

최근 블록체인을 배우고 있는 작은 C는 이 피싱의 논리를 정리해보았습니다. 해를 끼치려는 마음은 없어야 하고, 방어하려는 마음은 항상 가져야 합니다. 관심이 있는 분들은 알아보실 수 있습니다:

정상 송금

사례 1: 사용자 간 송금 A 사용자가 B 사용자에게 BUSD 송금

계약은 정상적으로 다음 논리를 검사합니다.

1) A 사용자 계좌 잔액이 충분한지 판단; 2) A 사용자가 송금을 시작했는지

프로세스는 아래 그림과 같습니다.

정상 계약 교환

우리가 평소에 pancakeswap, uniswap 등을 사용할 때의 교환 프로세스입니다.

사례 2: swap을 통해 토큰 교환 A 사용자가 토큰 교환(BUSD를 WBNB로 교환) 프로세스 계약이 판단합니다:

1) A 사용자 계좌 잔액이 충분한 BUSD가 있는지 (가정: 이미 swap 계약이 A 계좌의 BUSD 토큰을 조작할 수 있도록 허가됨)

2) swap 계약이 A 계좌의 500BUSD를 swap 계약 풀에 넣습니다(가정: 환율은 1:500)

3) 성공 후 계약이 A 계좌에 1BNB를 송금합니다.

주의: 2, 3점은 계약이 토큰을 조작하여 진행합니다. 즉, 계약은 우리가 직접 시작하는 계좌의 토큰 조작을 우회할 수 있습니다.

피싱 계약

먼저 이 추적 그림을 보세요.

정상 송금의 경우, 송금자와 계약을 실행하는 송금자는 동일한 사람이어야 합니다. 즉, 위 그림의 (1)과 (2)는 동일한 사람이 시작해야 합니다. 그러나 내가 송금된 이 거래는 두 주소가 동일하지 않습니다. 추측하기로는 피싱 계약을 실행할 수 있는 지갑 주소가 계약을 실행했으며, 내가 피싱 계약에 허가한 BUSD를 옮겼습니다.

피싱 계약을 확인해보니, 예상대로 피싱 계약은 암호화된 계약이었습니다. 하지만 생각해보면 어렵지 않습니다. Solidity를 조금 배운 사람은 계약 정의 시 여러 Admin이나 Owner를 설정하면 된다는 것을 알 것입니다.

그래서 앞으로는 프로젝트 측의 보증을 반드시 확인하고, 모르는 프로젝트에 허가를 주지 마세요!!!

안전 제안

이 사건 때문에 작은 C는 유용한 제안과 방법을 검색했고, 많은 피를 흘린 교훈을 보았습니다.

여기 몇 가지 방법을 나열하니, 여러분의 필요에 따라 선택하실 수 있습니다.

1) 키를 공유하지 마세요

이전에 한 게시물에서 하나의 니모닉으로 여러 계정을 생성하는 것을 보았는데, 이런 것은 추천하지 않습니다. 왜냐하면 한 번에 모두 도난당할 수 있기 때문입니다.

2) 키를 오프라인으로 저장하세요

현재 많은 클립보드 도구 입력법이 클립보드 기록을 클라우드에 업로드합니다. 만약 당신이 직접 복사했다면, 클라우드가 유출되면 당신의 키는 바로 사라집니다.

제안은 생성 후 즉시 종이에 적어두는 것입니다. 물론 종이에 적을 때, 키를 암호화하는 방법도 참고할 수 있습니다. 예를 들어 a는 1로, b는 2로, 1은 a로 대체하는 방식으로, 이렇게 하면 누군가 당신의 종이 키를 보더라도 당신의 디지털 자산을 건드릴 수 없게 됩니다.

3) 개발과 테스트를 분리하세요 (에어드랍과 주 계정 분리)

2개의 브라우저를 설치하세요. 하나는 chrome, 다른 하나는 brave입니다. 하나는 당신의 주 지갑을 관리하고, 다른 하나는 에어드랍 수령 및 다양한 체인 상 작업에 참여할 수 있습니다.

4) 출처가 불분명한 소프트웨어를 다운로드하지 마세요

baidu와 같은 곳에서 출처가 불분명한 소프트웨어를 다운로드하지 마세요. 제가 본 사례 중에는 도난당한 메타마스크를 다운로드하여 바로 파산한 경우도 있습니다. 반드시 정식 주소에서 다운로드하세요. 조건이 된다면 google play, chrome web store 등을 참고하세요.

5) 즉시 당신의 허가를 확인하세요

확인할 수 있는 웹사이트는 아래 몇 가지입니다. debank는 오픈 소스가 아니지만 UI 상호작용이 좋습니다. 이후의 것은 오픈 소스이니, 여러분이 선택하세요.

https://debank.com/

https://approved.zone/

https://tac.dappstar.io/

https://ethallowance.com/

그림에서 보시다시피, 기본적으로 무한입니다.

매번 MetaMask를 호출할 때 반드시 허가를 잘 살펴보세요. 저처럼 무작정 허가를 클릭하지 마세요.

6) 허가 전에 계약의 안전성을 확인하세요

https://www.slowmist.com/service-smart-contract-security-audit.html

느린 안개(SlowMist)의 계약 감사 기능을 사용할 수 있습니다.

또한 해당 계약이 오픈 소스인지 확인해보세요. 오픈 소스라면 해당 계약이 업그레이드 가능한 계약인지 등을 확인해야 합니다.

7) 에어드랍과 혜택을 받을 때 안전에 주의하세요

작은 계정을 사용하여 수령하세요. 큰 계정을 사용하지 마세요. 허가할 때 한도를 설정할 수 있습니다!!!

8) 사회공학적 침입에 경계하고, Discord에서 낯선 사람과의 개인 대화에 조심하세요

예를 들어 Discord나 Telegram에서, 누군가 며칠 동안 당신과 아는 척하며, 돈을 벌게 해주겠다고 하면서 그가 보내준 소프트웨어를 설치하고 로그인하라고 한다면, 99.99% 당신은 모든 것을 잃게 될 것입니다. 계정이 도난당합니다.

특히 Discord에서는 NFT의 공식 Discord에 들어가면 누군가 개인 메시지를 보내와서 화이트리스트를 얻었다고 하며, mint 링크를 첨부합니다. 사기꾼은 자신의 프로필 사진과 이름을 공식처럼 바꿉니다. 사실 그들은 당신과 함께 그룹을 만들어서 그렇게 합니다.

사실 욕심만 부리지 않으면 이런 사기를 쉽게 간파할 수 있습니다. 일반적으로 몇 시간 내에 mint하라고 하며, 수량은 1-10개입니다. 많은 인기 프로젝트에서 화이트리스트 mint는 한두 개면 괜찮습니다. 이렇게 10개를 한 번에 mint하라고 하며 시간 제한이 있는 경우는 드물죠.

또한 사기꾼이 프로젝트 공식 웹사이트를 모방하여 가짜 웹사이트를 만들고, 프로젝트 서버의 사람들에게 개인 메시지를 보내 mint하도록 유도합니다.

또한 어떤 친구는 opensea에서 가짜 NFT를 구매한 후, 그것이 공식이 아니란 것을 발견하고 며칠 후 그 NFT가 계좌에서 사라졌습니다. 그러나 이미 비용이 차감되었습니다… (어떻게 발견했나요? 체인을 보고 공식 Discord에서 공식 Opensea 웹사이트를 확인했습니다.)

또한 가짜 collab.land가 지갑 비밀번호를 훔쳐 대 V에게 에어드랍을 주고, 대 V가 그 NFT/token을 구매했다고 주장합니다.

새해가 밝았습니다. 모두 안전에 유의하시길 바랍니다. 이 글을 읽는 모든 분들이 평안하고 순조롭게 지내시길 바랍니다!

이 글은 저자 Chris에게 감사드립니다.

관련 태그
체인캐처(ChainCatcher)는 독자들에게 블록체인을 이성적으로 바라보고, 리스크 인식을 실제로 향상시키며, 다양한 가상 토큰 발행 및 조작에 경계해야 함을 상기시킵니다. 사이트 내 모든 콘텐츠는 시장 정보나 관련 당사자의 의견일 뿐이며 어떠한 형태의 투자 조언도 제공하지 않습니다. 만약 사이트 내에서 민감한 정보를 발견하면 “신고하기”를 클릭하여 신속하게 처리할 것입니다.
banner
체인캐처 혁신가들과 함께하는 Web3 세상 구축