스마트 계약의 "팬텀"

이 기사는 기계로 번역되었습니다
원문 표시

Solidity로 코딩된 스마트 계약은 결정된 기능과 논리를 포함하는 메서드를 캡슐화하는 클래스입니다. 스마트 계약 내에서 존재하지 않는 기능을 호출하면 일반적으로 트랜잭션이 되돌려집니다. 그러나 Solidity에는 " fallback "이라는 기능이 있습니다. 이는 일치하는 함수 이름과 일치하지 않는 계약에 대한 모든 함수 호출이 fallback 에 의해 포착된다는 것을 의미합니다. 이는 유용한 목적을 제공하지만 위험도 수반합니다. 다음 섹션에서는 fallback을 사용할 때 주의하는 것이 왜 중요한지 살펴보겠습니다.

"폴백"의 역사

버전 0.6.0 이 출시되기 전에 Solidity에는 다음과 같은 대체 구문이 있습니다.

 function() public payable{}

위의 방법은 기본 토큰(ETH, BNB 등)을 계약에 보내는 모든 수신 "호출"을 처리합니다. 또한 계약에 지정되지 않은 함수 호출에 대한 수신자 역할도 합니다. 아마도 Ethereum/Solidity 팀이 문제를 식별하여 버전 0.6.0 에 주요 변경 사항이 도입되었을 수도 있습니다. 이를 위해서는 구문 변경과 다음 기능을 갖춘 두 함수의 분리가 필요했습니다.

  • receive() external payable : 통화 데이터가 비어 있을 때 트리거됩니다. 그 목적은 스마트 계약으로 전송된 기본 토큰의 수신을 처리하는 것입니다.

  • fallback() external payable : 일치하는 함수가 없을 때마다 트리거됩니다. 이는 이전 폴백을 대체하는 역할을 하며 네이티브 토큰을 받을 의사가 없는 경우 지불하지 않도록 설정할 수 있습니다.

"대체" 위험 및 사례 연구

Fallback 기능은 Proxy Pattern에서 자주 활용되는 강력한 기능입니다. 그러나 계약 내에서 대체가 존재하면 특정 시나리오에서 상당한 위험이 발생할 수 있으며 잠재적으로 사용자에게 직접적인 금전적 손실을 초래할 수 있습니다.

설명을 위해 계약 A에 폴백이 포함되어 있고 다른 당사자의 관련 없는 계약 B가 계약 A와 상호 작용하는 상황을 생각해 보세요. 계약 B가 계약 A에 알려지지 않은 기능을 호출하면 폴백이 트리거되고 트랜잭션이 되돌리지 않습니다. . 이는 계약 B가 존재하지 않는 함수로 A를 호출하는 경우 호출자가 어떻게든 논리를 "우회"한 시나리오를 만듭니다.

이러한 공격이 발생하려면 여러 조건이 충족되어야 하는 것처럼 보일 수 있지만 이러한 공격의 실제 사례는 심각한 영향을 초래했습니다. 아래 두 가지 사례 연구의 구체적인 내용을 살펴보고 폴백이 위험한 이유와 보안에 어떤 의미가 있는지 알아보세요.

멀티스왑(anyswap) — 액세스 제어 취약점

Multiswap Router 계약(V6 이전)에는 위임된 권한을 활용하여 다른 사람을 대신하여 토큰을 브리지하거나 스왑하는 역할을 하는 " 허가 "라는 기능이 있습니다. 예를 들어:

 function anySwapOutUnderlyingWithPermit(address from,address token,address to,uint amount,uint deadline,uint8 v,bytes32 r,bytes32 s,uint toChainID) external {address _underlying = AnyswapV1ERC20(token).underlying();IERC20(_underlying).permit(from, address(this), amount, deadline, v, r, s);TransferHelper.safeTransferFrom(_underlying, from, token, amount);AnyswapV1ERC20(token).depositVault(amount, from);_anySwapOut(from, token, to, amount, toChainID);}

anySwapOutUnderlyingWithPermit 함수는 기본 토큰의 permit 함수를 호출하여 계약에 대한 전송 권한을 위임합니다. 그 후 계약은 transferFrom 호출하여 자금을 이동하고 브리징 절차는 자금을 다른 블록체인으로 전송합니다.

위 코드는 정상처럼 보이지만 기본 토큰의 계약에 폴백이 포함되어 있으면 비정상적인 성격을 띠게 됩니다. 항상 폴백을 갖는 토큰의 전형적인 예는 래핑된 기본 토큰(WETH, WBNB, WAVAX 등)입니다. 잠재적인 공격 시나리오는 다음과 같습니다.

  • 피해자 Alice는 라우터에 10 WETH를 승인했습니다.

  • 공격자 Bob은 10 WETH의 양과 임의의 v , r , s 값을 사용하여 anySwapOutUnderlyingWithPermit 함수를 실행합니다.

  • 계약은 권한 위임을 목적으로 permit 기능을 실행합니다. 그러나 이 시점에서 토큰은 대체 기능을 포함하는 WETH입니다. 어떤 인증이 이루어지고 있는지 확인하는 논리가 없으며 호출이 되돌려지지 않습니다. 결과적으로 계약은 Alice에서 Bob에게 10 WETH를 연결하는 것으로 진행됩니다 .

결국 Bob은 다른 계약에서 함수를 호출할 때 라우터 계약에 강력한 제한이 없었기 때문에 Alice로부터 10 WETH를 훔치는 데 성공했습니다.

이번 공격으로 인해 총 144만 달러의 피해를 입는 등 막대한 금전적 손실이 발생했습니다. 이는 많은 프로젝트 개발자, 프로그래머, 보안 감사자에게 중요한 교훈이 되는 중요한 금액입니다.

flashloan을 통해 임의로 다른 계약의 토큰 손실을 발생시킵니다.

이 취약점은 Code4rena 의 감사자에 의해 발견되었습니다. 취약한 계약을 다른 계약에서 금전적 손실로 이어질 수 있는 방법을 보여주는 스크립트와 함께 단순화된 방식으로 재현하겠습니다.

 interface IFlashBorrower {function onFlashLoan(uint256, bytes) external;}contract VulnerableContract {IERC20 tokenX = 0x001234;function flashloan(IFlashBorrower receiver, uint256 amount, bytes calldata data) public payable {uint256 fee = amnount * 50 / 1_000;tokenX.mint(address(receiver), amount);receiver.onFlashLoan(shareAmount, data);tokenX.burn(address(receiver), amount + fee);emit Flashloaned(receiver, eusdAmount, burnShare);}}

flashloan 기능의 호출자는 receiver 누구인지에 대한 완전한 제어권을 갖습니다. 함수 내에 검증 로직이 없으며, 수신자의 수수료를 고려하여 tokenX mint 하고 burn 작업을 진행합니다. 수신자가 되돌리지 않는 fallback 기능을 가진 컨트랙트인 경우 컨트랙트 내 tokenX 소각되어 수수료만큼의 손실이 발생합니다. 공격 시나리오:

  • 피해자는 존재하지 않는 함수를 호출할 때 되돌리지 않는 대체 함수를 포함하는 GnosisSafeProxy 통해 배포된 계약 A 입니다. 사용자는 계약에 100 tokenX 저장합니다.

  • 공격자는 계약 A 로 설정된 수신자를 사용하여 flashloan 함수를 호출합니다.

  • 이 단계에서는 논리를 되돌릴 수 있는 제약 조건을 충족하지 않고 논리가 실행됩니다. 성공적인 거래 후 계약 A는 공격자의 플래시 대출 중 수수료인 5개의 토큰에 의해 소각됩니다 . 이는 제품 사용 시 사용자 보호에 대한 중대한 위반입니다.

결론

위의 두 가지 사례 연구에서 계약 내에 폴백 기능을 갖는 것은 계약 사용자에게 영향을 미칠 수 있는 숨겨진 팬텀과 유사합니다. 사용자 손실의 직접적인 원인은 계약 자체가 아니라 이를 사용하는 제3자 계약입니다. 그러나 개발자로서 귀하는 모든 상황에서 항상 사용자 안전에 대한 책임을 져야 합니다.

대체 기능이 포함된 계약의 경우 항상 논리를 확인하고 데이터에 잘못된 동작이 있으면 즉시 되돌리는 것이 중요합니다.

제3자 계약을 사용하는 경우 내부 논리 전체를 예측할 수 없습니다. 항상 반환 값의 유효성을 검사하고 사용자가 전달된 중요한 데이터를 제어하도록 허용하지 마십시오.

Verichains 팀은 감사한 프로젝트와 현재 감사 중인 프로젝트에서 확인된 최신 취약점과 블록체인 보안 커뮤니티의 정보를 지속적으로 업데이트합니다.

Verichains를 읽어주셔서 감사합니다! 새로운 게시물을 받고 내 작업을 지원하려면 무료로 구독하세요.

베리체인스 소개

Verichains 는 코드 감사, 암호 분석, 경계 보안 및 사고 조사를 전문으로 하는 선도적인 블록체인 보안 회사입니다. 2017년 세계적 수준의 보안 연구자들이 설립한 이 회사는 보안, 암호화 및 핵심 블록체인 기술에 대한 광범위한 전문 지식을 활용하여 BNB Bridge 및 Ronin Bridge를 포함한 대규모 암호화 해킹의 보안 문제를 조사하고 해결하는 데 도움을 주었습니다. 문의사항이나 질문이 있으시면 info@verichains.io 로 연락주세요.

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