2026.01.20 12:40 - Exploit

How?
DUSD/USDC pool에 100M치 USDC add liquidity
당시 DUSD의 getSharedPrice로 산정된 값은 1.01

이후, 10M치 USDC ↔ 9.215M DUSD 스왑 진행

동시에, Curve: 3pool에 170M치 USDC 단일 유동성 공급
이를 바탕으로 15M치 MIM withdraw // 120M 3Crv ↔ 37,742 MIM 스왑 진행, MIM-3Crv Pool 가격 조작

앞선 공격으로 인한 pool imbalance로 LP 토큰의 가치를 비정상적인 inflated value로 계산해 반환
Frax Finance: MIM-3LP3CRV-f Token.calc_withdraw_one_coin()이 manipulated된 값을 반환
calc_withdraw_one_coin 함수
(금번 사례에서는 18,622,517,448,370,302,132,064,568 return = 18.6[18 decimals])
= 18.6 달러로 폭등한 가치 적용 (정상값은 LP 토큰 1개당 1.0으로 페깅되어야 함)
최종적으로 스왑을 진행하기전, updateTotalAum을 호출해 앞선 비정상값을 프로토콜이 AUM으로 반영하게 함

앞서 스왑한 9.215M DUSD를 USDC로 스왑해, 9.215M DUSD ↔ 12.785M USDC로 한번의 스왑으로 2.78M USDC 가량을 차익거래로 실현

MachineUtils.getSharePrice로 DUSD 가격을 반환할때, 앞서 updateTotalAum 를 호출해서 최종적으로 참조하는 lastTotalAum 이 manipulated된 값이 되었고, 해당 AUM값을 바탕으로 getSharePrice값을 계산하게 됨
1번 과정에 DUSD/USDC pool에 추가한 100M치 USDC add liquidity 다시 제거
1~7번을 한번 더 반복

Flashloan으로 빌린 자금 상환
최종적으로 Attacker 4.1M 가량 수익 실현

Why?
updateTotalAum 함수가 permissionless하게 호출 가능했고, 트랜잭션 중간에도 실시간 spot price 기반으로 갱신이 가능했기에, 가격 평가의 기준이 되는 lastTotalAum 이 외부 공격에 의해 쉽게 변동될 수 있었음.getSharePrice 를 호출할때 마다 AUM을 계산하려면 외부 프로토콜들을 다 돌면서 calc_withdraw_one_coin 과 같은 함수를 호출해 AUM을 계산해야하는데, 수시로 push를 통해 값을 가져오면 이 과정에서 부담되는 가스비가 감당하기 어려움
lastTotalAum 로 캐싱된 값을 사용하게 하고, 탈중앙화로 해당 값을 자유롭게 updateTotalAum 를 pull 해 값을 갱신할 수 있게 해두어 문제가 발생.