저자: 재짓 싱, 코인텔레그래프, 편집: 파이브 바트, 골든 파이낸스
I. 스마트 컨트랙트의 잠재적 취약점
스마트 컨트랙트는 획기적인 특성에도 불구하고 악의적인 당사자가 악용할 수 있는 결함에서 자유로울 수 없습니다.
불충분한 입력 유효성 검사는 일반적인 취약점으로, 공격자가 예상치 못한 입력을 제공하여 계약 실행에 영향을 줄 수 있습니다. 또한 비즈니스 로직을 부적절하게 적용하면 컨트랙트에서 예기치 않은 동작이나 논리 공백이 발생하여 취약점이 발생할 수 있습니다. 또한 안전하지 않은 외부 호출(예: 외부 데이터 소스나 다른 컨트랙트에 대한 인터페이스와 관련된 호출)을 제대로 처리하지 않으면 취약점이 발생할 수 있습니다.
재진입 공격은 컨트랙트가 자체 상태 변경을 완료하기 전에 외부에서 다른 컨트랙트를 호출할 때 발생하는 취약점입니다. 이렇게 하면 호출된 컨트랙트가 호출한 컨트랙트에 다시 들어가서 일부 작업을 다시 수행할 수 있습니다. 이로 인해 예기치 않은 동작이 발생하고 공격자가 컨트랙트의 상태를 변경하여 자금이 소진되거나 다른 부정적인 영향을 미칠 수 있습니다.
개발자는 이러한 공격의 가능성을 고려하여 외부 컨트랙트나 데이터 소스를 사용할 때 주의를 기울여 외부 호출이 올바르게 처리되어 예기치 않은 동작과 취약성을 피할 수 있도록 해야 합니다. 스마트 컨트랙트 테스트와 같은 보안 절차에 세심한 주의를 기울여 진화하는 위협으로부터 스마트 컨트랙트를 보호할 수 있습니다.
II. 스마트 컨트랙트에서 재진입 공격이란 무엇인가요?
스마트 콘트랙트에서 재진입 공격은 콘트랙트가 자체 상태 변경을 완료하기 전에 외부에서 다른 콘트랙트나 함수를 호출할 때 발생합니다.
이를 통해 호출된 컨트랙트가 호출 컨트랙트에 다시 들어가 일부 작업을 다시 수행할 수 있으며, 이는 예기치 못한 빈번한 악의적인 행동으로 이어질 수 있습니다. 예를 들어 컨트랙트 A가 컨트랙트 B를 호출하여 자금을 송금한 다음 자신의 상태를 수정합니다.
컨트랙트 B의 코드에는 컨트랙트 A가 상태 변경을 완료하기 전에 다시 들어가 전송 함수를 재실행할 수 있는 콜백 함수가 포함될 수 있습니다. 이렇게 하면 공격자는 초기 트랜잭션을 완료하기 전에 컨트랙트의 자금에 여러 번 접근할 수 있습니다.
2016년에 발생한 악명 높은 이더리움 블록체인의 탈중앙화 자율 조직(DAO) 해킹은 또 다른 잘 알려진 사례입니다. 공격자들은 스마트 컨트랙트 코드의 재입력 결함을 악용하여 DAO에서 자금을 재귀적으로 제거했고, 결국 수백만 달러 상당의 이더(ETH)를 도난당했습니다.
이미지 src="https://img.jinse.cn/7226827_watermarknone.png" title="7226827" alt="EiymS447vnByLHL4qydUxD2f2KyelWzur5p7lcp0.jpeg">
또한 Uniswap, Lendf.Me, 버거스왑, 서지비앤비, 크림 파이낸스, 사이렌 프로토콜 등 여러 탈중앙화 금융(DeFi) 프로토콜이 재진입 취약점으로 인해 상당한 금전적 손실을 입었습니다. 이러한 침해로 인해 350만 달러에서 2,500만 달러에 이르는 손실이 발생했으며, 이는 디파이 분야에서 재진입 취약점의 지속적인 위협을 강조합니다.
셋째: 재진입 공격의 작동 방식
재진입 공격은 스마트 컨트랙트 함수 및 외부 호출의 순차적 실행을 활용하여 공격자가 특정 함수를 완료하기 전에 여러 번 실행할 수 있는 루프를 형성하여 악의적인 행동과 승인되지 않은 자금 인출을 초래할 수 있습니다.
공격자의 컨트랙트는 피해자의 컨트랙트를 효과적으로 '스푸핑'하여 피해자가 상태 수정을 완료하기 전에 공격자의 컨트랙트를 다시 호출합니다. 이로 인해 반복적인 인출이나 기타 부주의한 행동이 발생할 수 있습니다.
이미지 src="https://img.jinse.cn/7226833_watermarknone.png" title="7226833" alt="0ak1IuK14XEEWGu1ziVXMteeNxNoDdyzYIKmjkxw.jpeg">
위 그림은 스마트 컨트랙트에 대한 재진입 공격을 보여줍니다. 공격자의 컨트랙트는 피해자의 "withdraw()" 함수를 호출하여 잔액을 업데이트하기 전에 이더를 전송합니다. 그런 다음 공격자의 폴백 함수가 트리거되어 피해자의 컨트랙트에서 자금을 인출하기 위해 재귀적으로 withdraw()를 다시 호출합니다. 이 공격은 피해자가 자금을 송금하기 전에 잔액을 업데이트하지 않는 점을 이용합니다.
간단한 예를 통해 재진입 공격이 어떻게 작동하는지 자세히 살펴보겠습니다.
"출금" 기능이 있는 스마트 콘트랙트
사용자가 자금을 인출할 수 있는 디지털 지갑에 대한 스마트 콘트랙트가 있다고 가정해 보겠습니다. 이 컨트랙트에는 사용자의 잔액을 추적하는 것 외에도 자금 인출을 용이하게 하는 출금 기능이 있습니다. 출금 기능을 통해 사용자는 일반적으로 토큰이나 이더를 스마트 콘트랙트에서 개인 지갑으로 출금할 수 있습니다.
사용자 상호작용 및 기능 실행
사용자는 자신의 지갑에서 출금을 직접 요청합니다. 출금 기능을 사용하여 원하는 출금 금액을 입력합니다.
출금 기능은 출금 기능이 호출될 때 사용자에게 출금할 수 있는 충분한 자금이 있는지 확인합니다. 요청이 충족되면 필요한 금액을 사용자가 선택한 주소로 이체합니다.
외부 호출
여기가 바로 취약점이 드러나는 곳입니다. 컨트랙트는 인출이 사용자의 잔액에 반영되기 전에 다른 컨트랙트나 계정으로 외부 호출을 수행합니다.
재귀 호출
외부 컨트랙트의 코드에 원래 컨트랙트를 다시 호출할 수 있는 함수(예: 다른 출금 함수)가 포함된 경우, 재귀 루프가 생성됩니다. 이를 통해 출금 메서드가 완료되기 전에 다시 호출될 수 있습니다.
재진입자 악용 가능
그런 다음 공격자는 악성 컨트랙트를 사용하여 이 루프를 악용합니다. 공격자 컨트랙트는 지갑 컨트랙트가 외부 컨트랙트를 호출하는 동안 잔액이 업데이트되기 전에 지갑의 출금 함수를 다시 빠르게 호출합니다.
재진입 기능
어떤 경우에는 공격자가 스마트 컨트랙트의 재진입 기능(데이터나 이더 없이 컨트랙트가 호출을 수신할 때 작동하는 고유 기능)을 사용할 수 있습니다. 재진입 공격은 자금이 처리되는 동안 폴백 기능을 반복적으로 호출하여 수행할 수 있습니다.
조작 및 반복 인출
월렛 컨트랙트는 외부 호출이 수신될 때까지 잔액 업데이트를 지연시키기 때문에 공격자의 컨트랙트는 동일한 트랜잭션에서 인출 기능을 재사용할 수 있습니다. 따라서 승인 없이 자금을 쉽게 인출할 수 있어 공격자는 합법적으로 받을 수 있는 금액보다 더 많은 금액을 훔칠 수 있습니다. 결과적으로 지갑 계약 사용자에게 상당한 금전적 손실을 초래합니다.
IV. 재진입 공격의 결과
재진입 공격은 스마트 콘트랙트 사용자에게 심각한 재정적 손실을 초래할 수 있으므로 심각한 영향을 미칠 수 있습니다.
재진입 공격의 가장 즉각적인 결과 중 하나는 취약한 스마트 콘트랙트에 보관된 현금을 무단으로 인출하거나 조작하는 것입니다. 공격자는 이 취약점을 이용해 컨트랙트에서 반복적으로 자금을 인출하여 컨트랙트 잔액을 고갈시키고, 영향을 받는 컨트랙트에 자산을 투자하거나 보관한 사용자에게 잠재적으로 상당한 금전적 손실을 초래할 수 있습니다.
또한 재진입 공격은 스마트 컨트랙트와 블록체인 기술의 보안과 무결성에 대한 사용자의 신뢰를 약화시킬 수 있습니다. 재진입 취약점은 2016년 이더리움 블록체인을 해킹하여 막대한 금전적 손실을 초래하고 커뮤니티의 평판을 훼손한 사건에서 알 수 있듯이 치명적인 영향을 미칠 수 있습니다.
재진입 공격은 단기적인 금전적 결과 외에도 규제 및 법적 문제, 투자자 신뢰 저하, 블록체인 플랫폼과 프로젝트의 평판 손상과 같은 장기적인 영향을 미칠 수 있습니다. 공격에 취약하다는 인식은 사용자가 스마트 콘트랙트와 상호작용하거나 탈중앙화 애플리케이션(DApp)에 투자할 때 주의를 기울이게 하여 블록체인 기술의 채택과 확장을 저해할 수 있습니다.
V. 재진입 공격을 완화하는 방법
재진입 위협을 완화하려면 스마트 컨트랙트 생성 및 감사에 모범 사례를 구현하는 것이 필요합니다.
보안 실적이 있는 평판이 좋은 코드 라이브러리를 사용하는 것도 이 목표를 달성하는 한 가지 방법입니다. 이러한 라이브러리는 광범위한 테스트와 동료 검토를 거치므로 취약점이 발생할 가능성이 줄어듭니다.
개발자는 또한 '점검 효과 상호 작용' 설계와 같은 보안 점검을 사용하여 상태 변경이 원자적으로 발생하도록 함으로써 재진입 공격의 가능성을 최소화해야 합니다. 가능하다면 재진입 보안 스마트 컨트랙트 개발 프레임워크를 사용하여 이러한 취약점에 대한 추가적인 방어선을 추가할 수 있습니다.
일반적으로 이러한 프레임워크에는 재진입 공격을 방지하도록 특별히 설계된 방법과 보호 기능이 내장되어 있기 때문에 개발자가 수동으로 보안 보호 기능을 추가할 수는 없을 것입니다. 그러나 블록체인 보안은 여전히 진화하고 있기 때문에 개발자는 새로운 위협과 취약점을 계속 찾아야 합니다.