스마트 계약에서 버그를 찾는 방법은 무엇입니까? 꼭 알아야 할 7가지 팁

avatar
PANews
01-12
이 기사는 기계로 번역되었습니다
원문 표시

스마트 계약에서 버그를 찾는 방법은 무엇입니까? 꼭 알아야 할 7가지 팁

스마트 계약 버그를 찾는 것은 매우 보람 있는 노력이 될 수 있으며 해커로부터 생태계를 보호하기도 합니다. 나는 최근 70억 달러 규모의 버그를 발견하고 이를 보고한 대가로 220만 달러를 받은 개발자를 인터뷰하는 즐거움을 누렸습니다.

이 기사에서는 개발자가 버그를 발견한 과정과 이로 인해 어떻게 70억 달러의 가치가 손상될 수 있었는지 자세히 설명하고 버그를 찾는 데 도움이 되는 몇 가지 전략과 도구를 제공합니다.

시작하자.

다각형 스마트 계약 버그 사례

배경

2020년 5월 31일에 Matic 블록체인이 출시되었습니다(Matic은 나중에 Polygon으로 이름이 변경되었습니다). Polygon은 낮은 가스 요금과 짧은 블록 시간으로 유명한 EVM 호환 블록체인입니다. 체인은 최근 zk-rollup 기술을 탐색하기 시작했습니다.

블록체인의 첫 번째 블록인 폴리곤의 '제네시스' 블록을 보면 10개의 트랜잭션을 볼 수 있다. 거래 중 하나가 MRC20이라는 계약을 생성했습니다.

스마트 계약에서 버그를 찾는 방법은 무엇입니까? 꼭 알아야 할 7가지 팁

 다각형 생성 블록

이 스마트 계약은 무엇입니까?

네이티브 블록체인 토큰을 보낼 때 가스를 소비해야 합니다. 그래서 Polygon 팀은 누군가에게 ETH를 보내는 거래에 서명할 수 있는 계약을 배포했으며, 다른 사람은 해당 거래에 대한 가스 요금을 지불할 수 있습니다. 이 기능을 "메타 트랜잭션"이라고 하며 EIP-712의 도입으로 대중화되었습니다.

이러한 가스 없는 거래를 촉진하기 위해 계약이 거의 100억 개의 MATIC 토큰을 받았다는 것을 알 수 있습니다. 하지만 이 잘 설계된 계약에는 전체 잔액 훔치는 데 악용될 수 있는 버그가 포함되어 있습니다!

2021년 12월 3일, 이야기의 주인공인 가상 익명의 개발자 Leon Spacewalker는 Immunefi 버그 현상금 프로그램에 이 기능의 문제점을 자세히 설명하는 보고서를 제출했습니다. Whitehat2라고 부르는 두 번째 영웅도 하루 후에 버그를 보고했습니다.

2021년 12월 5일 체인이 최종적으로 포크, 롤백 및 수리되기 전에 약 800,000개의 MATIC이 도난당했습니다.

이 사건은 우리에게 많은 질문을 불러일으켰습니다. 버그가 무엇입니까? 어떻게 그토록 오랫동안 발견되지 않았나요? 어떻게 발견됐나요?

버그 악용

가스 없는 거래를 보내는 기능은 다음과 같습니다.

스마트 계약에서 버그를 찾는 방법은 무엇입니까? 꼭 알아야 할 7가지 팁

언뜻 보면 무해해 보입니다. 사용자의 서명, 토큰 수, 토큰을 보낼 사람, 추가 데이터 및 거래 만료 날짜가 필요합니다.

또한 몇 가지 제한 사항이 있으며, 메타 트랜잭션을 보내기 위해 데이터 해시를 가져오고, 데이터 해시가 사용되지 않는지 확인하고, 이 복구 기능을 실행합니다.

이 함수는 본질적으로 Solidity erecover 함수의 래퍼입니다.

스마트 계약에서 버그를 찾는 방법은 무엇입니까? 꼭 알아야 할 7가지 팁

 Solidity ecrecover 함수 래퍼

실제 코드는 다음과 같습니다. 우리 함수는 서명된 트랜잭션의 출처를 확인합니다. Solidity 문서에서도 "오류 시 0을 반환합니다"라고 나와 있습니다. 문제가 있으면 0을 반환하는 ecrecovery 함수도 마찬가지입니다. 많은 개발자들이 알고 있듯이 이는 리스크 할 수 있습니다. 오류 시 0을 반환한다면 반환된 주소가 0이 아닌지 확인해야 한다는 의미입니다. 그렇죠?

실제 코드는 다음과 같습니다.

스마트 계약에서 버그를 찾는 방법은 무엇입니까? 꼭 알아야 할 7가지 팁

이상적인 코드는 다음과 같습니다.

스마트 계약에서 버그를 찾는 방법은 무엇입니까? 꼭 알아야 할 7가지 팁

실제로 오류가 발생하지 않는지 확인하기 위해 주소를 검사하지는 않습니다. transferWithSig 함수의 마지막 코드 줄은 실제 전송을 수행합니다. 여기서 일종의 확인을 수행해야 합니다. 그렇죠?

스마트 계약에서 버그를 찾는 방법은 무엇입니까? 꼭 알아야 할 7가지 팁

_transferFrom 함수는 위에 표시된 대로 _transfer 함수를 호출했습니다. 보낸 사람 주소에 잔액 충분한지 확인하지 않는다는 것을 알 수 있습니다.

이는 누군가가 유효하지 않은 서명을 보낼 수 있으며 이로 인해 ecrecovery에서 0 주소가 반환되지만 MRC20 계약은 여전히 ​​일정량의 토큰을 받는 사람 주소로 보낼 수 있음을 의미합니다. MRC20 계약이 자체적으로 토큰을 직접 보냈기 때문에 이것이 9,999,993,000 MATIC을 도난당한 방법입니다!

보낸 사람 주소에 서명된 거래에 대한 충분한 잔액 있는지 확인하기 위해 계약서에 검사가 있으면 이 문제를 피할 수 있습니다.

스마트 계약 버그가 오랫동안 발견되지 않은 이유

제가 이상한 점은 이 버그가 거의 1년 반 동안 잠복해 있다가 며칠 만에 또 다른 하얀 모자이자 해커인 Leon에 의해 발견되었다는 것입니다.

수상쩍은 것 같지만 Immunefi 팀에서는 이런 일이 항상 발생한다고 말합니다. 특정 버그 악용은 기사, 기사 또는 과제로 인해 인기를 끌 수 있으며 사람들이 버그를 찾기 시작하여 여러 사람이 동시에 발견하게 됩니다.

그러나 아마도 이 시기에 Polygon이 Polygonscan에 대한 계약을 확인한 것으로 밝혀졌고, 이때부터 사람들이 실제로 이에 관심을 갖기 시작했습니다.

어쩌면 이야기에 더 많은 내용이 있을 수도 있지만 그렇지 않을 수도 있습니다.

그럼에도 불구하고 Leon과 다른 버그 사냥꾼이 버그를 찾고 Web3 생태계를 보호하는 데 사용하는 일부 기술에 대한 교훈으로 이 버그를 활용해 보겠습니다.

계약 버그를 찾는 7가지 팁

이제 우리는 Leon과 다른 버그 사냥꾼들이 이러한 버그를 찾고 버그 현상금을 신청하는 데 사용하는 기술을 배우게 됩니다. 이 팁 목록은 귀하가 이미 스마트 계약의 기본 사항을 알고 있다고 가정하므로 Solidity를 배우는 것이 전제 조건입니다.

이러한 기술을 윤리적으로 사용하고 발견한 버그를 책임감 있게 공개하십시오.

버그를 찾는 작업의 대부분은 코드를 살펴보고 Slither와 같은 도구를 실행하는 데서 비롯됩니다. 220만 달러 규모의 이 작업에서 Leon은 스마트 계약 코드를 한 줄씩 살펴봄으로써 버그를 찾을 수 있었다고 말했습니다. 따라서 버그를 찾는 데는 종종 대량 수동 작업이 필요하다는 점을 명심하세요!

아래의 실용적인 팁 외에도 Leon의 가장 큰 시사점은 스마트 계약 버그 사냥꾼이 "귀하의 이점을 찾도록" 한다는 것입니다. 종종 이것은 다른 사람들과 차별화되는 무언가를 찾는 것을 의미합니다. 커뮤니티로서 우리는 스마트 계약 공간의 모든 구석구석을 다루어야 하므로 특히 잘하고 탁월한 부분을 찾으십시오.

다음은 귀하의 우위를 찾고 성공적인 스마트 계약 버그 사냥꾼이 되는 데 도움이 되는 7가지 전략과 팁입니다.

1. 프로젝트 찾기 및 버그 검색

오류를 찾는 첫 번째 방법은 프로토콜이 어떻게 작동하는지 자세히 이해하는 것입니다. 이는 모든 스마트 계약 버그 사냥꾼이 배워야 할 첫 번째 기술 중 하나입니다. 즉, 프로토콜을 처음부터 끝까지 이해하는 능력입니다.

문서를 찾아보고, 프로토콜을 직접 다시 구현해 보고, 블록체인 익스플로러 에서 프로토콜을 통해 트랜잭션을 확인하세요.

Leon은 이 전략이 다른 버그 사냥꾼에게는 효과가 있었지만 자신에게는 그렇지 않았다고 말했습니다. 그는 다음 세 가지에 중점을 두지만 모든 버그 사냥꾼이 이를 수행할 수 있는 것이 중요합니다.

2. 버그 찾기 및 프로젝트 검색

버그를 찾는 더 쉬운 방법은 잘 알려지지 않은 버그를 찾아 어떤 프로토콜 구현에 해당 버그가 포함되어 있는지 확인하는 것입니다. 버그를 대중에게 노출시키기 위해 노력하는 사람들이 많기 때문에 이 전략에는 대량 연구가 필요합니다: https://swcregistry.io/

먼저 모든 기본 스마트 계약 버그를 알아야 하고 그 다음에는 고급 버전을 알아야 합니다. 모범 사례를 이해하고 따르지 않는 프로토콜이 있는지 확인해야 합니다.

스마트 계약 버그가 발견되고 많은 프로젝트에서 이를 방지할 수 없다고 생각되면 버그 검색을 시작하세요. 이 새로운 버그와 이를 찾는 방법에 완전히 익숙해질 때까지는 말이죠. 이 버그를 겪는 다른 스마트 계약 개발자를 돕기 위해 블로그나 게시물을 작성하세요.

3.빨리 움직여라

버그 사냥꾼이 스마트 계약을 검토하기를 원하는 프로젝트는 Immunefi와 같은 버그 포상금 프로그램에 등록해야 합니다. 당신은 새로운 현상금을 발견하는 최초의 개발자 중 한 명이 되고 싶을 것입니다. 다른 헌터보다 먼저 계약서를 살펴보기 시작하면 취약점을 찾는 데 더 많은 시간을 할애할 수 있습니다.

작업 속도를 높이는 몇 가지 방법이 있습니다. Leon이 Immunifi Discord 채널의 알림을 통해 다른 사람보다 먼저 스마트 계약 취약점을 찾을 수 있었던 방법 중 하나입니다. 새 프로젝트가 들어오거나 프로젝트가 업데이트될 때마다 알림을 받게 됩니다. 이와 같은 도구는 다른 사람보다 먼저 코드를 파헤치는 데 도움이 될 수 있습니다.

4. 창의력을 발휘하세요

Leon이 이점을 얻을 수 있는 또 다른 방법은 대량 커뮤니티 포럼을 살펴보고 그들이 버그 제출을 고려하고 있는지 확인하는 것입니다. 그런 다음 그는 포상금이 승인되기도 전에 스마트 계약을 살펴보기 시작했습니다. 이는 다른 개발자가 프로젝트 측의 버그 포상금 제출이 성공할 때까지 기다리기 때문에 다른 개발자보다 계약을 검토하는 데 더 많은 시간을 제공합니다.

5. 도구를 알아라

버그 사냥꾼은 VSCode Solidity 확장, Hardhat, Foundry, Brownie, Dune, Etherscan 및 기타 여러 도구를 사용합니다.

버그 찾기 전략 중 하나는 VSCode를 로드하고, Solidity 확장을 사용하여 VSCode에 코드를 추가한 다음, 일반적인 오류나 취약한 코드 구현을 한 줄씩 살펴보는 것입니다.

잠재적인 취약점을 찾은 후 계약에 대한 테스트를 실행할 테스트 환경을 설정하세요. 프로토콜 개발자가 원래 사용했던 대량 테스트를 재사용할 수 있는 경우가 많습니다.

6. 감사 프로젝트를 포기하지 마세요

여기서는 별로 할 말이 없습니다. 감사 회사는 실수를 합니다. Leon이 취약점을 발견한 많은 프로젝트는 최고의 기업에서 감사 받았습니다.

이 블로그에서 논의한 팁을 사용하여 이러한 문제를 찾는 데 도움을 받으세요!

7. 산업별 지식

귀하의 가장 큰 강점 중 하나는 특정 틈새 시장에 집중하는 것일 수 있습니다. 도메인을 잘 알고 있으면 모든 기능이 서로 어떻게 호출되는지 이해할 수 있는 지식을 갖게 됩니다. 반대로 강력한 스마트 계약 취약점 전문가이지만 DeFi에 대해 전혀 모르는 경우 DeFi 계약에서 취약점을 찾기가 어려울 것입니다. 예를 들어, 많은 개발자는 코드를 이해하지만 금융 전문 용어는 이해하지 못합니다.

당신은 탈중앙화 거래소, 대출 프로토콜 또는 NFT를 이해하는 데 능숙할 수도 있습니다!

보안 전문가가 되고 Web3 내 특정 분야의 전문가가 될 수 있다면 취약점을 찾는 다른 사람들보다 우위를 점할 수 있는 좋은 위치에 있게 될 것입니다.

요약하다

이 기사가 귀하의 스마트 계약 버그 검색 여정에 도움이 되기를 바랍니다. 스마트 계약 작성 시 보안에 대해 자세히 알아보려면 상위 10가지 DeFi 보안 모범 사례를 확인하세요.

그리고 언제나 그랬듯이 생태계를 더욱 안전하게 구축하고 유지하는 여러분의 모습을 보고 싶습니다.

관련된 링크들:

👉MRC20 계약:

https://polygonscan.com/address/0x0000000000000000000000000000000000001010#code

👉Immunefi 글:

https://medium.com/immunefi/polygon-lack-of-balance-check-bugfix-postmortem-2-2m-bounty-64ec66c24c7d

👉폴리곤 계약으로 변경:

https://github.com/maticnetwork/contracts/commit/55e8118ad406c9cb0e9b457ca4f275c5977809e4#diff-cc4ed03464edad9d87d48cff647eb6940dfe9a4c419f63e3994bdc91b01bfecb

👉이전 다각형 계약:

https://github.com/maticnetwork/contracts/blob/56ec7eb257ce10a9f70621f56f6e3f37eb8e0c57/contracts/child/MRC20.sol

👉Ecrecovery 챌린지:

https://github.com/code-423n4/2021-09-swivel-findings/issues/61

출처
면책조항: 상기 내용은 작자의 개인적인 의견입니다. 따라서 이는 Followin의 입장과 무관하며 Followin과 관련된 어떠한 투자 제안도 구성하지 않습니다.
라이크
즐겨찾기에 추가
코멘트