본문 바로가기
보안 및 개발/ETC...

Ethereum smart contracter

by CH@3M 2019. 10. 7.

solidity

payable : 이더리움 내장 modifier 중 하나, *이더 전송*과 관련된 함수라면 무조건 붙여야만 전송 가능
modifier : 함수 전에 붙어있음

Fallback : 함수명이 없는 no-name 함수
* contract 내 존재하지 않는 함수를 호출하려고 할 때 사용
* 아무 정보없이 이더를 보낼 때 fallback 으로 들어가게 됨
* ICO할때 많이 사용


[Ethereum의 Solidity 취약점]
1. Reentrace : 재귀호출 취약점, 외부 계약 호출(smart contracter)이 초기 실행이 완료되기 전에 호출 계약에 대한 새 호출을 허용할 때 발생
race to empty, call to the unkown 등의 용어로 사용됨

2. Access Control : 접근제어 취약점, 접근해서는 안되는 함수와 코드에 허용되지 않은 사용자가 접근할 수 있게 됨

3. Arithmetic Issues : 연산문제 overflow, Underflow
예) unit 부호없음 항상 양수인데 음수로 될경우 엄청 큰 수가 됨
delegatecall는 매우 위험함으로 사용하지 말아야함
safeMath : overflow, underflow 를 모두 막아주는 라이브러리

4. Unchecked Return Values for Low Level Calls
저수준의 호출로 예상치 못한 일 발생
OPcode : ex)어셈
send보다 transfer 함수를 사용

5. DoS : gas limit에 도달했거나 예상치 못한 throw를 실행시켰을 때 사용할 수 없는 계약이 되어버리는 취약점
msg.sender가 contract일때 발생할 수 있는 문제점을 잘 체크해야 함 -> 이걸 체크하는 게 잇어야함
contract일때는 ICO를 받지 않도록 해야함

6. Bad Randomness : 블록체인의 투명성으로 드러나거나, 예측 가능하는 등의 임의성을 보장받지 못하는 취약점
이더리움은 랜덤함수가 구현되있지 않고, 블록번호, timestamp, hash 등을 사용함
실제 사용하는 랜덤함수는 seed값기반으로 랜덤한 척 할 뿐, 그래서 하드웨어 적인 랜덤 값을 뽑아냄 (마우스 움직이는 횟수 등)
블록체인은 하드웨어 랜덤을 사용할 수 없음 contract 내 생성된 랜덤값은 다 같아야하는데 하드웨어적으로는 불가능하지! 그래서 블록번호, timestamp, hash 등을 사용함 하지만, 이런것은 contracter라 생각하면 위험함으로 안전하지 않음

7. Front-Running : 블록에 올리기 전, 답을 뺏길 수 있는 취약점, 불법적으로 거래 정보를 미리 알고 선수치는 것
블록에 들어가기 전에 트랜젝션은 모두가 알고 있음, 블록에 올라가는 순서는 miner 마음대로
소인수분해 문제 (소인수 분해는 컴퓨터에게 어려운 문제, 두 큰 소수의 곱은 쉬운 문제! 검증하기 쉬움! / 만약 블록체인 계약에 N의 두 큰 소수 p와 q를 구하는 문제가 적혀있고, 가장 먼저 푼 사람에게 ETH를 준다면? alice가 bob이 올려놓은 정보를 보고 큰돈과 답을 보내면 alice를 먼저 채택함....!)
Transaction Ordering Dependence가 없다는 것을 알아 둘것

8. Time-Manipulation : timestamp, transaction order를 조작할 수 있다!? / miner가 계약에 대한 지분을 보유하면 적절한 timestamp를 선택하여 조작
내가 miner라면 timestamp도 조작할 수 있음. 위에서 ordering을 조작하는 것과 같은 원리

9. Short Address Attack : 주소를 짧게 적어 발생하는 오류
off-chain
함수해쉬값 4bytes + 함수의 인자1 32bytes +  함수의 인자2 32bytes

위 내용은 smart contracter 와 관련된 Youtube 영상을 보고 정리한 내용입니다. (영상 : https://www.youtube.com/watch?v=A5mYsFsypms)

반응형