smart contract 취약점
4. 프런트러닝 (Front-Running)
프런트러닝은 블록체인의 투명성을 악용하는 공격이다. Attacker는 아직 처리되지 않은 트랜잭션이 모여있는 mempool을 감시하다가, 이득이 될 만한 트랜잭션 발견하면 더 높은 gas fee를 지불해 Attacker의 트랜잭션을 먼저 처리하도록 끼어드는 방식이다.
취약점 예시
contract InsecureFindTheWord {
bytes32 public solutionHash; // 정답 단어의 해시값
uint public prizeAmount = 1 ether;
address public winner;
constructor(bytes32 _solutionHash) {
solutionHash = _solutionHash;
}
function solve(string memory _solution) public {
// 아직 아무도 정답을 맞추지 않았어야 함
require(winner == address(0), "Already solved!");
// 제출된 단어의 해시값과 정답 해시값을 비교
if (keccak256(abi.encodePacked(_solution)) == solutionHash) {
winner = msg.sender;
payable(msg.sender).transfer(prizeAmount);
}
}
receive() external payable {}
}
여기에서 사용자 Alice가 정답을 찾아 solve("mysecretword")를 호출했다고 가정하자. 이 트랜잭션은 호출 뒤에 mempool에 들어가 block에 포함되기를 기다린다.
이때, Attacker가 mempool을 모니터링하다가 Alice의 트랜잭션을 발견 후, 입력값을 그대로 복사한다. 그리고 Alice보다 더 높은 gas fee를 설정해 똑같은 트랜잭션을 생성한다. 마이너들은 더 높은 fee를 주는 Attacker의 트랜잭션을 먼저 처리하게 되고, 결국 Attacker에게 상금이 돌아간다.
예방
1. Commit-Reveal 패턴 사용
contract SecureFindTheWord {
mapping(address => bytes32) public commitments;
uint public prizeAmount = 1 ether;
address public winner;
// 커밋 단계: (주소, 정답, 임의값)의 해시를 저장
function commit(bytes32 _commitment) public {
// 동일한 주소에서 중복 커밋 방지
require(commitments[msg.sender] == bytes32(0), "Already committed!");
commitments[msg.sender] = _commitment;
}
// 리빌 단계: 정답과 임의값을 공개하여 검증
function reveal(string memory _solution, string memory _nonce) public {
require(winner == address(0), "Already solved!");
// 사용자가 이전에 커밋한 해시를 가져옴
bytes32 committedHash = commitments[msg.sender];
require(committedHash != bytes32(0), "You have not committed yet!");
// 제출된 정보로 해시를 다시 만들어 커밋된 해시와 비교
bytes32 revealHash = keccak256(abi.encodePacked(msg.sender, _solution, _nonce));
if (revealHash == committedHash) {
winner = msg.sender;
payable(msg.sender).transfer(prizeAmount);
}
}
receive() external payable {}
}'2025 하계 모각코' 카테고리의 다른 글
| 2025 하계 모각코 6회차 (1) | 2025.08.18 |
|---|---|
| 2025 하계 모각코 5회차 (1) | 2025.08.17 |
| 2025 하계 모각코 3회차 (0) | 2025.08.13 |
| 2025 하계 모각코 2회차 (1) | 2025.07.25 |
| 2025 하계 모각코 1회차 - 목표 및 결과 (1) | 2025.07.15 |