스마트 컨트랙트 취약점과 보안 감사
스마트 컨트랙트 취약점과 보안 감사
스마트 컨트랙트는 코드의 오류가 곧바로 물리적 자산의 영구 탈취로 직결되는 환경이므로, 배포 전 정적 분석과 보안 감사(Audit)가 필수적입니다.
내용
1. 재진입 공격 (Reentrancy Attack) 심층 분석
재진입 공격은 외부 호출 시 제어권이 악의적 컨트랙트로 넘어갔을 때, 상태 업데이트가 완료되기 전에 원본 함수를 다시 호출하여 자금을 반복 인출하는 수법입니다.
1.1 Checks-Effects-Interactions 패턴
모든 스마트 컨트랙트 함수는 다음 순서를 엄격히 준수해야 합니다:
1. Checks (검증): 입력값과 조건을 require로 검증
2. Effects (상태 변경): 내부 상태 변수(잔고 등)를 먼저 차감
3. Interactions (외부 상호작용): 외부 계정으로의 이더/토큰 전송을 가장 마지막에 실행
function safeWithdraw(uint256 amount) external {
// 1. Checks
require(balances[msg.sender] >= amount, "Insufficient balance");
// 2. Effects (먼저 차감!)
balances[msg.sender] -= amount;
// 3. Interactions (가장 마지막에 송금)
(bool success, ) = msg.sender.call{value: amount}("");
require(success, "Transfer failed");
}
2. 오라클 조작(Oracle Manipulation)과 프론트러닝 방어
- 취약점: 단일 DEX 풀의 스팟 가격(Spot Price)을 가격 기준으로 삼으면, 공격자가 플래시론으로 해당 풀의 가격을 일시적으로 왜곡시켜 부당 대출을 받습니다.
- 해결책: 체인링크(Chainlink) 등 탈중앙 오라클 네트워크를 사용하거나, 시간가중평균가격(TWAP, Time-Weighted Average Price)을 사용해야 합니다.