Skip to content

exploit_proto#9

Open
pluto1011 wants to merge 1 commit into
Naddotfun:mainfrom
pluto1011:main
Open

exploit_proto#9
pluto1011 wants to merge 1 commit into
Naddotfun:mainfrom
pluto1011:main

Conversation

@pluto1011
Copy link
Copy Markdown

No description provided.

@pluto1011
Copy link
Copy Markdown
Author

PreventListingAttack.sol 테스트 코드에 대한 자세한 설명을 해드리겠습니다:

테스트 코드 상세 설명

이 테스트 코드는 본딩 커브 컨트랙트의 취약점을 이용해 정상적인 토큰 상장을 방해하는 공격을 시뮬레이션합니다. 두 가지 주요 테스트 함수를 구현했습니다:

1. testPreventListing() 함수

목적: 상장 조건을 방해하는 기본적인 공격을 시뮬레이션

단계별 동작:

  1. 초기 상태 분석:

    • 현재 토큰 리저브와 타겟 토큰 양의 차이를 계산
    • 상장에 필요한 정확한 토큰 구매량 파악
  2. 공격자의 선제 행동:

    • 공격자가 소량의 토큰(0.2 ETH 상당)을 구매
    • 상장에 필요한 토큰의 약 10%를 본딩 커브에 직접 전송
    • 이 전송은 리저브에 즉시 반영되지 않지만, 다음 거래에서 업데이트됨
  3. 작은 거래로 업데이트 트리거:

    • 0.01 ETH 상당의 작은 거래로 _update() 함수 호출을 유발
    • 이제 리저브에는 공격자가 전송한 토큰이 반영됨
  4. 정상 트레이더의 상장 시도:

    • 트레이더는 상장에 필요한 정확한 양의 토큰을 구매하려 함
    • 그러나 공격자가 이미 10%의 토큰을 전송했기 때문에, 정확히 타겟에 도달할 수 없음
    • 이로 인해 realTokenReserves == targetToken 조건이 충족되지 않고 락이 활성화되지 않음
  5. 결과 분석:

    • 실패 원인과 최종 리저브 상태 확인
    • 타겟과의 차이가 얼마나 남았는지 계산

2. testAdvancedPreventListing() 함수 <- 계산이 빡세서 통과를 못시키고 있어요

목적: 최소한의 토큰으로 최대한 효과적인 상장 방해 공격 시뮬레이션

단계별 동작:

  1. 정밀한 공격 파라미터 계산:

    • 정상 트레이더가 타겟에 도달하기 위해 필요한 정확한 ETH 양 계산
    • 단 1개의 토큰만 전송해도 공격이 가능함을 보여줌
  2. 공격 준비:

    • 공격자가 1 ETH 상당의 토큰을 구매
    • 정밀하게 계산된 최소량(1 토큰)만 본딩 커브에 직접 전송
    • 작은 거래로 리저브 업데이트 트리거
  3. 정상 트레이더의 상장 시도:

    • 트레이더가 원래 계산된 정확한 양의 토큰을 구매하려 함
    • 그러나 1 토큰의 차이로 정확히 타겟에 도달할 수 없음
    • 거래가 실패하거나 타겟에 정확히 도달하지 못함
  4. 트레이더의 조정 시도:

    • 트레이더가 공격을 인지하고 2 토큰을 추가로 구매하려 시도
    • 이 시도도 정확히 타겟에 도달하지 못하거나, 다른 문제로 실패함
  5. 종합적인 결과 분석:

    • 공격 성공 여부 판단
    • 트레이더의 대응 효과 분석
    • 로그를 통한 상세한 과정 추적

취약점의 핵심 요소

  1. 정확한 일치 요구 조건:

    function _checkTarget() private {
        if (realTokenReserves == getTargetToken()) {
            lock = true;
            emit Lock(token);
        }
    }
    • == 연산자는 정확히 같아야만 true를 반환
    • 공격자는 이 조건을 방해하기 위해 최소한의 토큰만 전송하면 됨
  2. 리저브 업데이트 메커니즘:

    function _update(uint256 amountIn, uint256 amountOut, bool isBuy) private {
        realNativeReserves = IERC20(wNative).balanceOf(address(this));
        realTokenReserves = IERC20(token).balanceOf(address(this));
        // ...
    }
    • 직접 전송된 토큰은 _update 함수가 호출될 때만 리저브에 반영됨
    • 이는 공격자가 잔액과 리저브 간의 불일치를 만들 수 있는 틈을 제공

공격의 효율성

특히 주목할 점은 testAdvancedPreventListing에서는 단 1개의 토큰만으로도 상장을 방해할 수 있다는 것입니다. 이는 _checkTarget()에서 정확한 일치만 확인하기 때문에 가능합니다. 정상 트레이더가 이를 인지하고 조정을 시도하더라도, 공격자는 계속해서 1-2개의 토큰을 추가로 전송하여 방해할 수 있습니다.

이러한 효율적인 공격은 최소한의 비용으로 프로젝트 전체의 상장을 지연시키거나 방해할 수 있어, 경제적 측면에서도 효과적인 공격 방식입니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant