대회 시작 전에 $107K Jupiter Lend를 분석한 방법

발행: (2026년 2월 9일 오전 12:56 GMT+9)
4 분 소요
원문: Dev.to

Source: Dev.to

설정: 10만 7천 달러 규모 현상금, 공개된 코드 없음

Jupiter가 10만 7천 달러 규모의 보상이 걸린 대출 프로토콜 감사 콘테스트를 발표했을 때, 준비가 전부라는 것을 알았다. 문제는? 코드는 아직 공개되지 않았다는 점이다.
하지만 코드를 몰라도 분석을 시작할 수 있다.

공격 표면 매핑

코드를 건드리기 전에, 모든 Solana 대출 프로토콜이 공유하는 공격 표면을 매핑했다:

// Common lending protocol state structure
#[account]
pub struct LendingMarket {
    pub authority: Pubkey,
    pub token_mint: PubKey,
    pub total_deposits: u64,
    pub total_borrows: u64,
    pub interest_rate: u64,
    pub last_update_slot: u64,
    // Oracle price feed – critical attack vector
    pub oracle: Pubkey,
}

이전 Solana 대출 공격 사례(Mango, Solend 사건)를 연구하면서 다음과 같은 취약점 유형을 정리했다:

  • 오라클 조작 – 가격 피드를 샌드위치할 수 있는가?
  • 이자율 계산 – 고정소수점 연산에서 정밀도 손실?
  • 청산 로직 – 건강 지수 검사에서 레이스 컨디션?
  • 크로스‑프로그램 호출 – CPI 콜백을 통한 재진입?

Jupiter의 기존 제품들은 그들의 대출 설계에 대한 힌트를 제공했다:

// Predicted account validation pattern based on Jupiter Perps
pub fn validate_position(ctx: Context) -> Result {
    let position = &ctx.accounts.position;
    let market = &ctx.accounts.market;

    // Health factor check – where bugs often hide
    let health = calculate_health_factor(
        position.collateral_value,
        position.borrow_value,
        market.liquidation_threshold,
    )?;

    require!(health >= MINIMUM_HEALTH, ErrorCode::Unhealthy);
    Ok(())
}

일반적인 취약점 클래스에 대한 익스플로잇 템플릿

// Solana uses u64, precision loss is common
fn calculate_interest(principal: u64, rate: u64, time: u64) -> u64 {
    // BUG: If rate * time overflows u64
    // Upcast to u128 before multiplication
    let result = principal
        .checked_mul(rate).unwrap()
        .checked_mul(time).unwrap()
        .checked_div(PRECISION_FACTOR).unwrap();
    result as u64
}
pub fn check_oracle_freshness(
    oracle_price: &PriceAccount,
    current_slot: u64,
    max_staleness: u64,
) -> Result {
    // CRITICAL: Many protocols forget this check
    let price_slot = oracle_price.last_update_slot;

    require!(
        current_slot.saturating_sub(price_slot) <= max_staleness,
        // (truncated in original)
    );
    Ok(())
}
  • 공격 패턴은 보편적 – 오라클 문제, 정밀도 손실, 레이스 컨디션은 모든 대출 프로토콜에서 나타난다.
  • 재사용 가능한 템플릿은 시간 절약 – 내 템플릿 라이브러리는 Jupiter Lend에서 6시간 이상을 절감했다.
  • 팀의 코딩 스타일이 반복 – 같은 팀의 다른 프로젝트를 공부하면 설계 선택을 예측하는 데 도움이 된다.
0 조회
Back to Blog

관련 글

더 보기 »

sunpeak은 MCP 앱에 전념한다

개요: MCP Apps는 이제 ChatGPT, Claude, Goose 및 VS Code에서 실행됩니다. Claude는 1월 26일에 MCP App 지원을 발표했으며, ChatGPT는 2월 4일에 이를 따랐습니다. 2월 현재…