배경 소개

2025년 1월 4일에 우리는 이더리움 체인의 Sorra 프로젝트에 대한 여러 공격을 모니터링했습니다. 공격 해시는 다음과 같습니다.

https://etherscan.io/tx/0x6439d63cc57fb68a32ea8ffd8f02496e8abad67292be94904c0b47a4d14ce90d

https://etherscan.io/tx/0x03ddae63fc15519b09d716b038b2685f4c64078c5ea0aa71c16828a089e907fd

https://etherscan.io/tx/0xf1a494239af59cd4c1d649a1510f0beab8bb78c62f31e390ba161eb2c29fbf8b

https://etherscan.io/tx/0x09b26b87a91c7aea3db05cfcf3718c827eba58c0da1f2bf481505e0c8dc0766b

공격을 받은 프로젝트는 Sorra 였으며, 공격으로 인해 총 41,000 USD의 손실이 발생했습니다.

공격 및 사고 분석

2024년 12월 21일, 공격자는 스테이킹을 통해 공격 준비를 시작했다.

제로아워 기술 || SorraStake 공격 사고 분석

스테이킹 시 선택한 _tier가 0이므로 계약에 따라 락업 기간은 14일입니다.

제로아워 기술 || SorraStake 공격 사고 분석

14일 후인 2025년 1월 4일, 공격자는 공격을 시작했습니다. 공격자는 그것을 인출하여 _amount를 1과 동일하게 만듭니다. 철회 기능의 구체적인 구현을 살펴보겠습니다.

제로아워 기술 || SorraStake 공격 사고 분석

위 코드의 전체적인 로직은 다음과 같습니다. 첫 번째 단계는 사용자가 예치한 자산이 만료되었는지 여부를 확인한 후 보상을 계산하고 최종적으로 포지션을 차감하는 것입니다.

먼저 보상을 계산하는 방법을 살펴보겠습니다.

제로아워 기술 || SorraStake 공격 사고 분석

만료된 모든 예금에 대해 보상 계산이 계산되는 것을 코드에서 볼 수 있습니다. 여기에는 문제가 없는 것 같습니다.

위치를 업데이트하는 방법을 살펴보겠습니다.

제로아워 기술 || SorraStake 공격 사고 분석

제로아워 기술 || SorraStake 공격 사고 분석

updatePosition에서는 VaultExtension이 설정되지 않았기 때문에 _decreasePosition 함수로 바로 이동합니다. _decreasePosition 함수에서는 출금량과 포지션 감소 연산만 수행됩니다. 따라서 여기에 허점이 나타납니다. 사용자의 예치금이 만료되면 사용자는 원하는 예치금을 인출할 수 있으며 동시에 만료된 모든 예치금에 대한 보상을 인출하게 됩니다. 다만, 보상 추출 여부가 판단되지 않기 때문에 반복적으로 보상이 추출될 예정입니다.

요약

이 취약점의 원인은 Sorra 프로젝트 팀에서 사용자가 탈퇴할 때 이미 보상을 철회했는지 여부를 확인하지 못하여 사용자가 수많은 작업을 통해 반복적으로 보상을 철회할 수 있었기 때문입니다. 공격자는 위의 취약점을 악용하여 여러 트랜잭션을 시작하고 Sorra 프로젝트의 모든 SOR 토큰을 추출했습니다. 프로젝트 당사자는 코드 연산 로직을 설계할 때 다자간 검증을 수행하고 계약이 온라인화되기 전에 교차 감사를 위해 여러 감사 회사를 선택하는 것이 좋습니다.