작성자: 九九@慢雾安全团队
배경
슬로우 포그 보안팀 정보에 따르면 2024년 9월 4일, 탈중앙화 유동성 수익 프로젝트인 Penpie가 공격을 받아 공격자들은 약 3,000만 달러의 수익을 얻었습니다. 슬로우 포그 보안팀은 이 사건을 분석하고 그 결과를 다음과 같이 공유했습니다.
(https://img.jinse.cn/7291718_image3.png)
(https://img.jinse.cn/7291718_image3.png)
(https://x.com/Penpiexyz_io/status/1831058385330118831)
사전 지식
펜들 파이낸스는 총 45억 달러 이상의 고정 가치를 지닌 탈중앙화 금융 소득 거래 프로토콜입니다. 이 프로토콜은 매그파이와 성공적으로 통합되었으며 수익 기회를 최적화하고 비토큰노믹스 모델을 강화하도록 설계되었습니다. 이를 기반으로 펜파이 프로젝트는 펜들 파이낸스의 시장에서 패시브 수익을 가능하게 하는 유동성 채굴 기능을 도입합니다.
펜들 파이낸스에는 다음과 같은 주요 개념이 포함되어 있습니다:
PT(원금 토큰):는 미래의 어느 시점의 원금을 나타냅니다. PT를 보유한다는 것은 원금을 소유할 권리가 있으며 만기 시 상환할 수 있음을 의미합니다. 예를 들어, 1년 후 만기되는 1 PT-stETH에 대한 옵션을 보유하고 있다면 1년 후 1 ETH 상당의 stETH로 상환할 수 있습니다.
YT(수익률 토큰): 미래 수익을 나타냅니다. YT를 보유한다는 것은 기초자산에서 발생하는 모든 실시간 수익을 소유한다는 의미이며, 언제든지 누적된 수익을 펜들에서 수동으로 수령할 수 있습니다. 1 YT-stETH를 보유하고 있고 stETH의 평균 수익률이 5%인 경우, 1년이 끝날 때 0.05 stETH를 누적하게 됩니다.
SY(단순 수익률): 수익 자산을 랩하는 데 사용됩니다. strong>이자 지급 토큰을 랩핑하기 위한 컨트랙트입니다. 이자 수익 토큰의 수익률 생성 메커니즘과 상호작용할 수 있는 표준화된 인터페이스를 제공합니다.
LPT(유동성 공급자 토큰): 기초 자산에 유동성을 제공하기 위한 자격 증명 역할을 하는 유동성 마켓플레이스를 나타냅니다.
PRT(풀 보상 토큰): 사용자가 펜파이 풀에 예치한 LPT 토큰에 대한 예치 바우처를 나타냅니다.
근본 원인
이 사건의 핵심은 펜파이가 새로운 펜들 마켓플레이스에 등록할 때 다음을 수행한다는 것입니다. 새로운 펜들 마켓을 등록할 때, 펜들 파이낸스가 만든 모든 마켓이 합법적인 것으로 잘못 가정했습니다. 그러나 펜들 파이낸스의 마켓 생성 프로세스는 개방되어 있어 누구나 마켓을 생성할 수 있으며, SY 컨트랙트 주소와 같은 주요 매개변수는 사용자가 사용자 지정할 수 있습니다. 공격자는 이를 악용하여 악성 SY 컨트랙트가 포함된 마켓 플레이스 컨트랙트를 생성하고, 펜파이 풀이 보상을 받기 위해 외부 SY 컨트랙트를 호출해야 하는 메커니즘을 이용하여 플래시 크레딧을 통해 마켓 플레이스와 풀에 대량의 유동성을 추가하여 보상 금액을 인위적으로 부풀리고 수익을 얻었습니다.
공격의 단계별 분석
공격의 단계별 준비
트랜잭션 해시: 0x7e7f9548f301d3dd863eac94e6190cb742ab6aa9d7730549ff743bf84cbd21d1
1. 먼저, 공격자는 다음을 전달합니다. 먼저 공격자는 PendleYieldContractFactory 컨트랙트의 createYieldContract 함수를 통해 PT 및 YT 수익률 컨트랙트를 생성하고, SY를 공격 컨트랙트의 주소로 설정한 다음 이를 사용하여 PendleMarketFactoryV3 컨트랙트의 createNewMarket 함수를 호출하여 해당 마켓을 생성합니다. 해당 마켓 컨트랙트 0x5b6c_PENDLE-LPT.
3. 그런 다음 공격자는 대량의 YT 컨트랙트를 채굴하기 위해 채굴자를 호출합니다. 그런 다음 공격자는 YT 컨트랙트의 mintPY 함수를 호출하고 공격 컨트랙트(SY 컨트랙트)가 반환한 환율에 따라 대량의 YT와 PT를 채굴합니다.
4. 그 직후 공격자는 PT를 시장에 예치합니다. 0x5b6c_PENDLE-LPT에 예치하고 LP 토큰을 채굴합니다.
5. 마지막으로, 공격자는 LP 토큰을 예치금에 대한 대가로 펜파이 풀에 예금 바우처 PRT 토큰과 교환하여 입금합니다.
포멀 공격
트랜잭션 해시: 0x42b2ec27c732100dd9037c76da415e10329ea41598de453bb0c0c9ea7ce0d8e5
1. 공격자는 먼저 라이트닝 대출을 통해 대량의 agETH 및 rswETH 토큰을 빌려주었습니다.
2. Penpie 풀의 batchHarvestMarketRewards 함수를 호출하여 지정된 마켓에서 보상을 일괄 수집하면, 이 작업은 마켓 컨트랙트 0x5b6c_PENDLE-LPT의 redeemRewards 함수를 트리거합니다.
3. redeemRewards 함수에서 외부 호출인 SY 함수, SY 컨트랙트(공격 컨트랙트)의 claimRewards 함수가 외부에서 호출되며, 이 과정에서 공격자는 라이트닝 대출 자금을 사용하여 보상 토큰에 유동성을 추가하고(공격 컨트랙트의 보상 토큰은 의도적으로 0x6010_PENDLE-LPT와 0x038c_PENDLE-LPT의 두 마켓 토큰으로 설정되어 있습니다), 획득한 마켓 토큰을 펜파이 풀에 예치하여 해당 예치 바우처 토큰을 받습니다.
4. 다음으로, 새로 입금된 마켓 토큰을 펜파이에 예치합니다. 다음으로, 펜파이 풀에 새로 예치된 시장 토큰은 계산된 보상으로 취급되며, 해당 보상 계약의 queueNewRewards 함수를 통해 보상 계약으로 전송됩니다.
0x5b6c_PENDLE-. 공격자는 LPT 마켓에 입금하는 유일한 사람이므로 마스터펜파이 컨트랙트의 멀티클레임 기능을 즉시 호출하여 리워더 컨트랙트에서 이 부분의 LPT 토큰을 추출할 수 있습니다.
5. 마지막으로, 공격자는 마스터펜파이 컨트랙트에서 LPT 토큰을 인출할 수 있습니다. 마지막으로, 공격자는 펜들마켓예치 도우미 컨트랙트의 withdrawMarket 기능을 사용하여 3단계에서 얻은 예금 자격 증명의 PRT를 소각하고, 마켓 토큰을 상환하여 이전 단계에서 인출한 보상과 함께 유동성에서 제거하고, 궁극적으로 기초 자산 토큰(agETH 및 rswETH)에 액세스하여 수익을 실현합니다.
요약
이 보안 사고는 펜파이의 마켓플레이스 등록 과정에서 불충분한 점검과 펜들 파이낸스의 마켓플레이스 생성 로직에 대한 과도한 의존으로 인해 공격자가 악성 계약을 통해 보상 분배 메커니즘을 제어하여 과도한 보상을 획득할 수 있었던 것으로 드러났습니다. 슬로우 포그 보안팀은 프로젝트 소유자가 마켓을 등록할 때 엄격한 화이트리스트 검증 메커니즘을 추가하여 검증된 마켓만 허용되도록 할 것을 권장합니다. 또한 외부 컨트랙트 호출과 관련된 중요한 비즈니스 로직의 경우 감사 및 보안 테스트를 강화하여 유사한 사고가 재발하지 않도록 해야 합니다.