기타 관련 콘텐츠는 개인 홈페이지 에서 확인할 수 있습니다.
본 글의 주요 참고자료는 METATRUST의 고래선 공유이며, 링크는 다음과 같습니다.
가격 조작의 출처:
블록체인 세계에서 모든 노드의 합의를 유지하기 위해 블록체인은 각 노드가 체인 외부에서 독립적으로 정보를 얻을 수 있는 능력을 거세합니다.
블록체인이 외부 세계와 유사한 가격 정보를 얻으려면 다음 두 가지 방법밖에 없습니다.
- Chainlink와 유사한 엔터티를 통해 적극적으로 가격을 제공하고 가격 데이터를 체인에 지속적으로 게시합니다.
- 유니스왑 등 스마트 계약에 저장된 매개변수를 통해 직접
예: 획득하려는 WETH 가격은 외부 데이터입니다.
getReserves()
ETH 가격을 요청하면 재무 모델 계산이 해당 값을 반환합니다.
여기서 플래시론을 사용하게 되면 금융모델을 잘못 계산하게 되면 계산된 WETH에 문제가 생길 가능성이 높습니다.
가격 조작 공격이란 무엇입니까?
가격 조작 공격은 부적절한 이익을 操控市场的买卖行为(操控流动性池或地址余额)
추구하는 것을 의미합니다.人为地影响产品或资产价格
가격 조작의 4가지 요소:
- 시장 지배력의 비대칭성: 플래시 대출을 통해 많은 자금을 보유
- 구매 및 판매 행위 조작: 대량의 토큰 교환, 시장 메커니즘 파괴(시장 유동성)
- 가격에 대한 악의적인 영향: 자산 가격 계산 오류(취약한 가격 조회 메커니즘)
- 부적절한 이익 추구: 비정상적인 금액의 보상이나 담보
실제 가격조작 공격 사례:
일반 프로세스:
- 사용자는 BNB와 USDT를 약속하고 LP 유동성 인증서를 얻습니다.
- 그런 다음 getReward() 함수를 호출하여 LP를 상환하고 혜택을 받으세요.
- 유동성 제거 과정에서 풀에 있는 BNB 토큰은 Bunny 토큰으로 교환됩니다.
공격 프로세스:
분석은 느린 안개 팬케이크 공격 분석을 볼 수 있습니다.
-
첫 번째 거래에 대해 특정 LP 유동성 인증서를 받으세요
-
사용자들은 플래시론을 통해 대량의 BNB와 USDT를 교환했습니다.
-
두 번째 트랜잭션인 플래시 대출은 풀에 많은 양의 유동성을 추가하는 동시에 getReward() 함수를 호출합니다.
-
먼저 LP를 WBNB-USDT 풀로 옮겨 유동성을 제거합니다. 풀에는 많은 양의 BNB와 USDT가 있습니다.
-
이후 대량의 BNB와 USDT가 WBNB-BUNNY 유동성으로 전환되었으며, WBNB 풀에 있는 WBNB의 수가 급격히 증가했습니다.
-
그런 다음 획득된 WBNB-BUNNY의 LP 번호에 따라,
valueOfAsset函数计算LP价值
-
问题就出在valueOfAsset进行LP价值计算的时候,通过WBNB-BUNNY池子中的WBNB实时数量计算
, 결과적으로 단일 LP의 가치가 크게 증가했습니다.
취약점 기능
getReserve() 함수는 풀 내 BNB 잔액을 계산한 후 이를 직접 사용하여 BNB 대비 LP 값을 계산합니다.
특정 재무 모델 계산:
가격 조작 공격을 피하는 방법:
취약한 문의 메커니즘을 사용하지 않는 세 가지 주요 방법이 있습니다.
- EOA(체인링크) 등을 통해 지속적으로 가격을 공급합니다.
- 여러 소스에서 가격을 수집하고 다양한 소스의 가격에 대한 가중 평균을 수행합니다.
- 과거 기간의 가격에 대해 가중 평균(유니스왑)을 수행합니다.
민감한 작업을 위한 변수 데이터는 사용자가 조작하기 쉬운 데이터에 의존해서는 안 됩니다. 그렇지 않으면 쉽게 위험을 초래할 수 있습니다.
Taint 분석을 이용한 취약점 탐지