BlockChain 17

Solidity 취약점 #1

Re-enterency (= in mastering Ethereum) ✔️ 이더리움 스마트 컨트랙트의 특징 중 하나는 다른 외부 컨트랙트의 코드를 호출하고 활용할 수 있다는 점이다. ✔️ 컨트랙트는 일반적으로 이더를 처리하기 때문에 종종 다양한 외부 사용자 주소로 이더를 전송하는데, 이 경우 컨트랙트는 외부 호출을 요청해야 함 ✔️ 이 경우, 공격자가 컨트랙트에 콜백을 포함하여 대체 코드를 실행하도록 강제할 수 있다. 간단하게는 개발자가 두 가지 사실을 놓쳤을 때 발생할 수 있다. 1. 이더를 보내는 것은 수신자의 Fallback Function을 호출하는 것과 동일하다. 또한, 이러한 코드 실행은 동기적으로 진행되므로 재진입이 발생할 수 있다. 2. 주소로 돈을 보내는 것은 주소의 코드에 제어를 이전할..

BlockChain 2022.01.11

Solidity 취약점 카테고리화

취약점을 체계화하기 위해 주제 조사 진행하여 아래 Keyword별 연구 간행물 조사 진행함 Survey Smart Contract Vulnerability Common pattern Known attack Solidity 추가적으로 Solidity 공식 문서, Smart Contract Weakness Classfication(SWC) 등의 웹사이트 활용하였음 : 최소 2번 언급된 것을 고려(= 논문일 시 최소 한 번 또는 두 번) & 악용될 수 있는 약점 추출 결과 취약점 약자 CWE Systemazation tx.origin으로 인한 인증 Atx CWE-284 Blockhash 사용 BU CWE-668 Call to the unknown CU CWE-669 Untursted Callee의 Delega..

BlockChain 2022.01.11

Solidity #5

이더리움 상태 EVM의 작업은 이더리움 프로토콜에 정의된 대로 스마트 컨트랙트 코드의 실행 결과로 유효한 상태 변화를 계산하여 이더리움 상태를 업데이트하는것이다. 이러한 측면에서 이더리움을 트랜잭션 기반 상태 머신으로 설명할수 있고, 이것은 외부의 주체가 트랜잭션 생성, 수락 및 주문을 통해 상태 변화를 시작한다는 사실을 반영한다. 가장 상위 레벨에서보면 이더리움 월드상태(world state)가 있다. 월드 상태는 이더리움 주소를 계정(account)에 매핑한것이다. 이더리움 주소는 이더 잔액(balance), 논스, 계정의 스토리지, 계정의 프로그램 코드를 의미한다. - 이더 잔액은 계좌가 소유한 웨이로 저장된다. - 논스는 계정이 EOA일 경우 해당 계정에서 성공적으로 전송한 트랜잭션의 수를 나타낸..

BlockChain 2022.01.10

Solidity #4

SELFDESTRUCT 컨트랙트 생명 주기의 끝 : 컨트랙트 소멸 selfdestruct(address recipient);// 컨트랙트를 삭제할 수 있는 유일한 방법 삭제 가능한 컨트랙트 생성을 원한다면 컨트랙트에 명시적으로 위의 코드를 추가하면 된다. 어떤 컨트랙트가 영원히 지속되는 것을 보장하기 위해서는 해당 코드를 포함하지 않으면 된다. 다른 컨트랙트 호출 다른 컨트랙트를 호출하기 위한 가장 안전한 방법은 직접 다른 컨트랙트를 만드는 것 1) 새로운 인스턴스 만들기 : 다른 컨트랙트를 호출하기 가장 안전한 방법은 직접 다른 컨트랙트를 만드는 것 // SPDX-License-Identifier:GPL-30 pragma solidity >=0.5.0 address(this).balance 내장 함수 ..

BlockChain 2022.01.07

Solidity #3

# Fallback Function 이름 그대로 대비책 함수이다. 특징 무기명 함수, 이름이 없는 함수이다. External 필수 Payable 왜 쓰는가? 스마트 컨트랙이 이더를 받을 수 있게 한다. 이더를 받고 난 후 어떠한 행동을 취할수 있다. Call함수로 없는 함수가 불려질 때, 어떠한 행동을 취하게 할수 있다. ! 이전의 call은 이더를 보내기 위한 용도로 사용했지만 외부 스마트 컨트랙의 함수를 부를때 사용할 수도 있다. // ~0.6 version function() external payable{ } // 0.6~ version Fallback은 receive와 fallback 두가지 형태로 나뉘게 되었다. Receive 순수하게 이더만 받을때 작동한다. receive() external..

BlockChain 2022.01.06

Solidity #2

- Try/Catch Try/catch는 프로그램을 종료시키지 않고 어떠한 대처를 할 수 있다. 정상 실행되므로 Try/catch내의 에러를 잡기가 힘들다 3가지 Catch가 존재한다 Catch Error(string memory reason){ … } : revert나 require를 통해 생성된 에러 용도 Catch panic(uint errorcode) { … } : assert를 통해 생성된 에러 0.8버전에는 없고 0.8.1버전 부터 존재 Catch(bytesmemoryLowlevelData) { … } : low level error를 잡는다 3. 언제 사용되는지 ? 1) 외부 스마트 컨트랙트 함수를 부를 때 : 다른 스마트 컨트랙을 인스턴스화 해서, try/catch문이 있는 스마트 컨트랙의..

BlockChain 2022.01.05

Solidity #1

# 정의 1) 계약 지향 프로그래밍 언어로 다양한 블록체인 플랫폼의 스마트계약 작성 및 구현에 사용된다. 2) 정적타입의 프로그래밍 언어로 EVM상에서 작동하는 스마트계약을 개발하기 위해 설계되었다. # Intro * Solidity License // SPDX-License-Identifier: GPL-3.0 * pragma 1) 버전 특정 컴파일러 기능이나 검사를 가능하게 할 수 있다. Pragma지시문은 항상 소스 파일에 대해 로컬이므로 모든 프로젝트에서 활성화하려면 모든 파일에 pragma를 추가해야 함 호환되지 않는 변경 사항을 거부하기 위한 의미로서 pragma를 추가할 수도 있다. Ex> pragma solidity ^0.4.0; Pragma solidity >=0.7.0 gihub -> l..

BlockChain 2022.01.04