Nemo 계약 보안 취약점으로 259만 달러 도난, Sui 체인 자산 안전 다시 경고
사건 개요:
2025년 9월 7일 베이징 시간, Sui 체인에서 Nemo가 공격당했으며, 해커는 py_index를 조작하여 약 259만 달러를 탈취했습니다.


공격자 주소:
0x01229b3cc8469779d42d59cfc18141e4b13566b581787bf16eb5d61058c1c724
공격 거래:
https://suivision.xyz/txblock/HMMicxQWn43rnNswi4gNHanUaeiWW5ijqM5bHLca67D9?tab=Overview
Nemo 패키지:
0x0f286ad004ea93ea6ad3a953b5d4f3c7306378b0dcc354c3f4ebb1d506d3b47f
근본 원인:
이번 Nemo 도난의 근본 원인은 PyState가 잘못 설정되어 가변 참조로 되어 있어 공격자가 악의적으로 pyindex를 수정할 수 있게 되었고, mintpy 함수를 호출할 때 py_index와 분리된 SY 매개변수를 곱하여 대량의 PT와 YT를 얻을 수 있었습니다.
심층 분석 결과, py.getsyamountinforexactpyout 함수가 py.currentpyindex를 호출할 때 제약 없이 수를 전달하여 pyState의 pyindex 필드를 수정할 수 있도록 허용했습니다.
· py.getsyamountinforexactpy_out는 PY 출력을 위해 필요한 SY의 입력량을 계산하지만, 여기서 index에는 아무런 제한이 없습니다.

· py.currentpyindex는 전달된 pyindex와 저장된 index를 비교하여 최대값을 pystate.pyindexstored의 최신 값으로 반환합니다.

공격 과정 분석
- 공격자는 initpyposition 함수를 호출하여 py_position을 초기화합니다(사용자의 포지션 기록을 초기화하며, 이번 공격과는 무관합니다).

- 이어서 플래시 론 py.borrowptamount를 이용해 대량의 PT 토큰을 빌립니다(후속적으로 swap을 통해 SY 잔액으로 교환합니다).

- 100회 market.swapexactptforsy를 호출하여 PT를 SY 토큰으로 교환합니다.

- py.getsyamountinforexactpyout를 통해 PY 출력을 위해 필요한 SY의 입력량을 계산하는데, 여기서 공격자는 pyindex에 구성된 극단적으로 큰 수 553402322211286548480000을 전달하여 원래 구조를 파괴했습니다.

- 이어서 공격자는 비정상적으로 확대된 지수를 이용하여 yieldfactory.mintpy를 호출할 때 비정상적으로 높은 할인율로 PT와 YT를 발행하여 대량의 PT를 탈취합니다.

MintEvent는 다음과 같습니다:

- 마지막으로 공격자는 발행된 PT를 사용하여 py.repayptamount로 부채를 상환한 후, redeem을 통해 수익형 자산을 회수하고 Scallop에서 토큰을 인출합니다.
이로써 공격자는 py_index를 조작하여 약 259만 달러를 탈취하였고, 이후 자산을 USDC로 변환한 뒤 Bridge를 통해 크로스 체인 전송하여 최종적으로 ETH와 DAI로 변환하여 0x41b1906c4BCded607c6b02861cE15C2E49FF7576에 저장했습니다.
공격 발생 후 Nemo 팀은 긴급하게 스마트 계약 기능을 중단하고 공격 사건을 조사하기 시작했습니다. 조사 결과, 259만 달러의 자산 손실은 충분한 감사 없이 새로운 기능이上线된 데서 비롯된 것으로 나타났습니다.
사건 요약:
이번 공격의 핵심은 민감한 데이터가 잘못 설정되어 쓰기 가능한 상태가 되어 공격자가 자유롭게 매개변수를 전달하고 수정할 수 있게 된 것입니다. 민감한 데이터의 상태에 대해서는 엄격한 제한과 검사를 해야 합니다.







