sherlock-2025-07-mellow-m06

[M-06] Targeted-lockup bypass: freshly minted shares can be transferred immediately in the same transfer() or transferFrom() call

보고서

Summary

새로운 토큰에는 잠금이 적용되어 전송 및 소각이 되면 안된다. 토큰 전송을 처리하는 도중에 새로운 토큰을 발행하는데, 이렇게 발행된 토큰의 락은 확인하지 않았다. 새로 발행된 토큰을 포함하는 금액으로 토큰 전송 요청이 가능했기에 락을 우회하여 토큰을 전송할 수 있다.

Keyword

logic flaw, lock bypass

Vulnerability

이 프로토콜은 토큰을 새로 발행 받으면 각 계정별로 잠금 기간을 가지도록 디자인되었다. 잠금 기간에는 토큰을 소각하거나 전송할 수 없다. 토큰 발행 요청을 받으면 발행 가능 시점까지 대기하고, 시간이 지나 조건이 맞으면 발행된다. 발행된 토큰을 전송할 때 updateChecks를 호출하여 잠금 기간이 지났는지 확인한다. 이후 claimShares를 호출하여 발행 대기중인 토큰을 먼저 발행한다. 발행 과정에서 잠금 기간이 갱신된다. 그리고 super._update를 호출하여 토큰을 전송한다. 따라서 claimShares를 통해 방금 발행된 토큰은 잠금 기간을 무시하고 즉시 이동할 수 있다.

function _update(address from, address to, uint256 value) internal override {
@>  updateChecks(from, to);
    if (from != address(0)) {
@>      claimShares(from);
    }
    if (to != address(0)) {
        claimShares(to);
    }
@>  super._update(from, to, value);
}

예를 들어 다음 상황을 생각해보자.

  • 기존 balance 10
  • 발행 대기중인 금액이 100
  • 110 만큼 전송 요청하면 방금 발행된 100만큼의 토큰도 이동할 수 있다.

Impact

발행된 토큰에 잠금이 적용되지 않음

Mitigation

새로 발행된 토큰 금액만큼은 전송될 수 없도록 막는다.

Memo

동일한 이슈는 짚어냈지만, 락이 새로 발행된 토큰에 적용되어야 한다는 관점으로 생각하지 않았던 것 같다.


tags: bughunting, mellow, smart contract, solidity, severity medium, solo issue, logic flaw, lock bypass