smart contract 취약점
정수형 캐스팅 오류 (Integer Type Casting Vulnerability)
smart contract에서 서로 달느 크기의 정수형 변수 간에 casting을 수행할 때 의도치 않은 값 손실이나 오버플로우가 발생할 수 있다. 특히 uint256을 uint8이나 uint16같은 작은 타입으로 casting할때 문제가 된다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract CastingExample {
mapping(address => uint256) public balances;
function deposit() external payable {
balances[msg.sender] += msg.value;
}
function withdraw() external {
uint8 amount = uint8(balances[msg.sender]);
require(amount > 0, "Nothing to withdraw");
payable(msg.sender).transfer(amount); // amount는 uint8로 캐스팅됨
balances[msg.sender] = 0;
}
receive() external payable {}
}
위의 smart contract에서 balances[msg.sender]가 uint256인데, 이를 uint8로 다운캐스팅함으로써 값이 0~255 사이로 잘려나간다.
공격 시나리오
1. 공격자가 1ether를 예치
2. uint8 amount로 변환 -> 1 ether의 하위 8비트만 추출
3. 원래 의도한 금액과 다르게 작은 금액만 인출
4. 잔액은 0으로 초기화됨 -> 나머지 금액은 소실됨
예방 방법
- 다운캐스팅을 피하고 항상 충분한 비트 수의 타입을 사용
- 형 변환이 필요한 경우 명시적으로 범위 검사를 수행
- 고정된 비트수의 작은 타입 (uint8, uint16) 대신 충분히 큰 타입 (uint256) 사용을 권장함.
'2025 하계 모각코' 카테고리의 다른 글
| 2025 하계 모각코 6회차 (1) | 2025.08.18 |
|---|---|
| 2025 하계 모각코 4회차 (2) | 2025.08.14 |
| 2025 하계 모각코 3회차 (0) | 2025.08.13 |
| 2025 하계 모각코 2회차 (1) | 2025.07.25 |
| 2025 하계 모각코 1회차 - 목표 및 결과 (1) | 2025.07.15 |