Smart Contract/Security Tools

스마트 컨트랙트 보안 도구 - MythX

dev_swan 2023. 11. 7.

✏️ MythX

MythX는 이더리움 스마트 컨트랙트의 보안 검사를 위한 자동화된 플랫폼입니다. 스마트 컨트랙트는 블록체인에서 실행되는 프로그램으로, 보안 결함이나 취약점이 있을 경우 심각한 결과를 초래할 수 있습니다. MythX는 이러한 스마트 컨트랙트의 보안 취약성을 식별하고 개선하기 위해 개발되었습니다.

MythX - MythX

 

🤔 MythX 기능

 

1️⃣ 단언 및 속성 검사

  • Solidity assert 위반 : 심볼릭 분석, 퍼징 (바이트 코드)
  • MythX 단언 위반 (AssertionFailed 이벤트) : 심볼릭 분석, 퍼징 (바이트 코드)
    • MythX가 스마트 컨트랙트 코드 내에서 단언이 실패하는 경우를 탐지합니다.

 

2️⃣ 바이트 코드 안전성

  • 산술 연산 중 정수 오버플로우 : 심볼릭 분석, 퍼징 (바이트 코드)
  • 산술 연산 중 정수 언더플로우 : 심볼릭 분석, 퍼징 (바이트 코드)
  • 호출자가 실행을 임의의 위치로 리디렉션 가능 : 심볼릭 분석, 퍼징 (바이트 코드)
    • MythX가 공격자가 실행 흐름을 자신이 원하는 대로 조작이 가능한지 탐지합니다. 이는 공격자가 민감한 함수를 호출하거나 중요한 계산을 건너뛰게 만들 수 있어, 컨트랙트의 논리가 깨지거나, 자금이 도난당하는 경우를 방지합니다. 이 문제는 주로 call, deleagecall과 같은 저수준 함수의 부적절한 사용, 부적절한 권한 제어로 인해 발생합니다.
  • 호출자가 임의의 저장 위치에 쓸 수 있음 : 심볼릭 분석, 퍼징 (바이트 코드)
    • MythX가 공격자가 컨트랙트의 스토리지에 있는 변수의 값을 임의로 변경할 수 있는지 탐지합니다. 이 문제는 주로 call, deleagecall과 같은 저수준 함수의 부적절한 사용, 부적절한 권한 제어로 인해 발생합니다.
  • 초기화되지 않은 저장 변수의 위험한 사용 : Solidity 코드 분석
    • MythX가 스마트 컨트랙트의 특정 변수가 선언은 되었지만 초기화되지 않고 사용하는 경우를 탐지합니다. 이는 예를 들어, 토큰의 공급을 제어하는 변수가 초기화되지 않은 경우, 공격자가 이를 악용하여 추가 토큰을 생성하거나 소멸시킬 수도 있기 때문에 중요한 검사입니다.

 

3️⃣ 인증 컨트롤

  • 어떤 발신자도 계약 계정에서 ETH를 출금 가능 : 심볼릭 분석, 퍼징 (바이트 코드)
    • MythX가 ETH의 출금이 제한 없이 모든 사용자에 의해 수행될 수 있는지 탐지합니다.
  • 어떤 발신자도 SELFDESTRUCT를 트리거할 수 있음 : 심볼릭 분석, 퍼징 (바이트 코드)
    • MythX가 모든 사용자에 의해 SELFDESTRUCT 명령을 호출할 수 있는지 탐지합니다. SELFDESTRUCT 명령은 스마트 컨트랙트를 파괴하고 계약에 저장된 Ether를 지정된 주소로 전송하는 Ethereum 명령어입니다.
  • tx.origin을 인증 컨트롤의 일부로 사용 : Solidity 코드 분석

 

4️⃣ 제어 흐름

  • 사용자 제공 주소로의 Delegatecall : 심볼릭 분석 (바이트 코드)
    • MythX가 사용자 제공 주소로 Delegatecall을 사용하는지 탐지합니다. 이는 공격자가 공격을 수행하고자 하는 악의적인 컨트랙트의 주소를 제공하면, Delegatecall을 통해 해당 악의적인 컨트랙트의 코드가 현재 컨트랙트의 컨텍스트에서 실행될 수 있습니다. 이로 인해 현재 컨트랙트의 상태가 예상치 못한 방식으로 변경될 수 있기 때문에 중요한 검사입니다.
  • 사용자 제공 주소로의 Call : 심볼릭 분석 (바이트 코드)
    • MythX가 사용자 제공 주소로 call을 사용하는지 탐지합니다. 이는 공격자가 공격을 수행하고자 하는 악의적인 컨트랙트의 주소를 제공하면, 해당 코드가 실행되면서 예상치 못한 행동이 발생할 수 있습니다.
  • 외부 호출로부터 반환 값이 확인되지 않음 : Solidity 코드 분석
    • MythX가 외부 컨트랙트 호출이 값을 반환하는지 탐지합니다. 이는 외부 컨트랙트 호출이 실패하거나 예상치 않은 결과를 반환할 경우 컨트랙트의 상태가 올바르지 않은 방식으로 변경될 수 있으며, 또는 이러한 오류 상황이 무시되고 컨트랙트가 정상적으로 실행된 것처럼 계속 진행될 수 있기 때문에 중요한 검사입니다.
  • 블록 타임스탬프가 제어 흐름 결정에 영향을 미침 : 태인트 분석 (바이트 코드)
    • MythX가 스마트 컨트랙트 코드에서 Ethereum 블록의 타임스탬프 값으로 중요한 결정을 내리는지 탐지합니다. 이는 마이너가 악의적으로 타임스탬프를 조작하여 되면 컨트랙트의 행동에 영향을 줄 수 있기 때문에 중요한 검사입니다.
  • 환경 변수가 제어 흐름 결정에 영향을 미침 : 태인트 분석 (바이트 코드)
    • MythX가 msg.sender, msg.value와 같은 Ethereum 환경 변수를 부적절하게 사용하는지 탐지합니다. 이는 외부 입력에 의해 조작될 수 있으므로, 중요한 결정 로직에서 사용될 때 신중히 사용해야 하기 때문에 중요한 검사입니다.
  • 무제한 데이터 구조를 순회하는 루프 : Solidity 코드 분석
    • MythX가 스마트 컨트랙트에서 크기 제한이 없는 배열이나 맵을 순회하는 루프를 탐지합니다. 이는 루프가 너무 많은 반복을 하게 될 경우 트랜잭션의 가스 비용이 급증할 수 있으며, 이는 트랜잭션을 실행하는데 필요한 가스가 블록 가스 제한을 초과하여 트랜잭션이 실패할 수 있기 때문에 중요한 검사입니다.
  • 무제한 데이터 구조를 순회하는 암시적 루프 : Solidity 코드 분석
    • MythX가 스마트 컨트랙트에서 반복문이 아닌, 다른 함수 호출, 재귀 호출 등을 통해 간접적으로 큰 데이터 구조를 순회하는 루프를 탐지합니다. 이는 마찬가지로 트랜잭션 가스 비용 급증과 스마트 컨트랙트의 성능을 저하시킬 수 있기 때문에 중요한 검사입니다.
  • do-while에서 continue의 사용 : Solidity 코드 분석
    • MythX가 스마트 컨트랙트의 do-while문에서 continue를 올바르게 사용하고 있는지 탐지합니다. 이는 continue는 일반적으로 현재 반복을 중단하고 루프의 다음 반복을 즉시 시작하는데 사용되나, do-while문의 경우 continue문이 루프의 마지막에 있지 않으면 continue이후의 코드는 실행되지 않고 건너뛰게 되기 때문에 중요한 검사입니다.
  • 동일한 트랜잭션에서 여러 호출이 실행됨 : 정적 분석 (바이트 코드)
    • MythX가 단일 트랜잭션에서 여러 호출이 실행되는 상황을 탐지합니다. 이는 재진입 공격, 트랜잭션 가스비용의 급증과 같은 취약점이 존재하기 때문에 중요한 검사입니다.
  • 외부 호출 후 지속 상태 읽기 : 정적 분석, 퍼징 (바이트 코드)
    • MythX가 외부 호출 이후에 계약의 상태 변수를 읽는 작업을 탐지합니다. 외부 호출은 재진입 공격을 허용할 수 있으므로, 호출 후 계약 상태를 읽을 때 예기치 않은 변경이 발생할 수 있기 때문에 중요한 검사입니다.
  • 외부 호출 후 지속 상태 쓰기 : 정적 분석, 퍼징 (바이트 코드)
    • MythX가 외부 호출 이후에 계약의 상태 변수를 쓰는 작업을 탐지합니다.
  • 사용자 정의 주소로의 호출 후 계정 상태 접근 : 심볼릭 분석 (바이트 코드)
    • MythX가 사용자가 정의한 주소의 외부 호출 이후 자신의 계정 상태 변수의 접근하는 경우를 탐지합니다. 이는 재진입 공격을 허용할 수 있기 때문에 중요한 검사입니다.
  • 랜덤성의 잠재적 약한 출처 : Solidity 코드 분석
    • MythX가 스마트 컨트랙트에서 랜덤 값을 생성할 때 사용되는 메커니즘이 충분히 안전한 지를 평가합니다.
    요구 사항 위반 : 퍼징 (바이트 코드)
    • MythX가 스마트 컨트랙트 코드 내에서 특정 조건이 충족되어야 할 때 그 조건이 항상 충족되는지 탐지합니다. 이는 require문과 같은 특정 조건을 검사할 때, 제약 조건이 항상 충족되는지를 검사합니다.
  • 하드코딩된 가스량으로 호출 : Solidity 코드 분석
    • MtyhX가 스마트 컨트랙트에서 특정 함수 호출이 고정된 가스양으로 실행되는지 탐지합니다. 이는 함수 호출 시 가스양을 하드코딩하면 가스양이 너무 낮으면 호출이 실패할 수 있으며, 너무 높으면 불필요한 가스 소비가 발생할 수 있기 때문에 중요한 검사입니다.

 

5️⃣ ERC 표준

  • 잘못된 ERC20 구현 : Solidity 코드 분석

 

6️⃣ Solidity 코딩

  • 오래된 컴파일러 버전 : Solidity 코드 분석
  • 설정되지 않은 또는 부동 컴파일러 버전 사용 : Solidity 코드 분석
    • MythX가 Solidity 코드의 컴파일러 버전이 지정되지 않았는지 탐지합니다.
  • 우에서 좌로 오버라이드 제어 문자 사용 : Solidity 코드 분석
    • MtyhX가 Solidity 코드 내에서 특수한 유니코드 문자인 Right-to-Left Override제어 문자의 사용을 감지합니다.
더보기

💡 Right-to-Left Override (RLO)

Right-to-Left Override (RLO)는 유니코드 문자 중 하나로, 텍스트의 표시 방향을 오른쪽에서 왼쪽으로 바꾸는 데 사용됩니다. 이 특수 문자는 주로 히브리어나 아랍어와 같이 오른쪽에서 왼쪽으로 쓰는 언어를 지원하기 위해 만들어졌습니다.

  • 내장 심볼 은폐 : Solidity 코드 분석
    • MythX가 Solidity 코드에서 내장된 심볼이나 키워드가 사용자 정의 변수나 함수 등으로 은폐되는지 탐지합니다.
  • 잘못된 생성자 이름 : Solidity 코드 분석
  • 상태 변수가 다른 상태 변수를 은폐 : Solidity 코드 분석
  • 지역 변수가 상태 변수를 은폐 : Solidity 코드 분석
  • 함수 매개변수가 상태 변수를 은폐 : Solidity 코드 분석
  • 반환 값이 상태 변수를 은폐 : Solidity 코드 분석
  • 효과 없는 단항 연산 : Solidity 코드 분석
    • MythX가 Solidity 코드에서 단항 연산이 수행되지만 그 결과가 어디에도 저장되지 않거나 사용되지 않는 경우를 탐지합니다.
  • 할당 후 바로 단항 연산 : Solidity 코드 분석
    • MythX가 Solidity 코드에서 변수에 값을 할당한 직후에 단항 연산이 수행되는 경우를 탐지합니다.
    uint x = 5;
    x = 10;
    x++;
    
    위의 예시 코드에서 x에 5를 할당한 후 10을 할당하고 1을 증가시키는데, 첫 번째 할당은 완전히 무시되므로 의미가 없습니다.
  • 사용되지 않은 상태 변수 : Solidity 코드 분석
  • 사용되지 않은 지역 변수 : Solidity 코드 분석
  • 사용되지 않은 함수 매개변수 : Solidity 코드 분석
  • 사용되지 않은 반환 값 : Solidity 코드 분석

❗️ MythX 사용 가이드 (Visual Studio Code)

 

1️⃣ 익스텐션 마켓플레이스에 MythX를 입력하고 익스텐션을 설치합니다.

MythX 사용가이드(1)

 

2️⃣ MythX 회원가입 및 API Key 발급

  • MythX 공식 사이트에 접속하여 회원가입을 진행합니다.

MythX: Smart contract security service for Ethereum

 

MythX: Smart contract security service for Ethereum

Stay protected as the smart contract security landscape evolves With MythX, you get increased scalability and performance, continual improvements to our security analysis engines, and higher vulnerability detection than locally-run security tools.

mythx.io

  • 로그인 후 Dashboard로 이동하여 API Key를 발급받습니다.

MythX 사용가이드 (2)

 

3️⃣ MythX 로그인을 위해 액세스 토큰을 입력합니다.

MythX 사용가이드 (3)

 

4️⃣ 테스트할 스마트 컨트랙트의 우클릭하고 Run Quick Mode Analysis를 실행합니다.

MythX 사용가이드 (4)

 

5️⃣ MythX Dashboard의 View Analyses에서 보안 검사를 확인합니다.

MythX 사용가이드 (5)

 

6️⃣ Visual studio code의 명령 팔레트를 사용하여 탐지 모드를 설정할 수 있습니다.

  • Quick Mode : 잘못된 코딩 패턴과 낮은 복잡성 버그를 찾는데 효과적입니다. / 2분
  • Standard Mode : 실행 시간이 더 오래 걸리지만 복잡한 보안 문제를 찾을 수 있습니다. / 15분
  • Deep Mode : 실행 시간이 더 오래 걸리지만 깊고 숨겨진 취약점을 찾을 수 있습니다. / 45분

댓글