📝 원문 정보
- Title: Slither: A Static Analysis Framework For Smart Contracts
- ArXiv ID: 1908.09878
- 발행일: 2019-08-28
- 저자: Josselin Feist, Gustavo Grieco and Alex Groce
📝 초록 (Abstract)
이 논문은 Ethereum 스마트 계약에 대한 풍부한 정보를 제공하기 위해 설계된 정적 분석 프레임워크인 Slither에 대해 설명합니다. 이는 Solidity 스마트 계약을 SlithIR이라는 중간 표현으로 변환하여 작동합니다. SlithIR은 정적 단일 할당(SSA) 형식과 축소된 명령 집합을 사용해 분석의 구현을 용이하게 하면서도, Solidity를 바이트코드로 변환하는 과정에서 손실될 수 있는 의미 정보를 유지합니다. Slither는 데이터 흐름 및 오염 추적과 같은 일반적으로 사용되는 프로그램 분석 기법의 적용을 가능케 합니다. 이 프레임워크에는 다음과 같은 네 가지 주요 용도가 있습니다: (1) 취약점 자동 탐지, (2) 코드 최적화 기회 자동 탐지, (3) 사용자의 계약 이해 개선, (4) 코드 검토 지원. 이 논문에서는 Slither의 개요를 소개하고 중간 표현의 설계를 상세히 설명하며 실제 계약에서 능력을 평가합니다. 우리는 Slither의 버그 탐지가 빠르고 정확하며 다른 정적 분석 도구보다 Ethereum 스마트 계약에 있는 문제를 찾는 데 속도, 견고성 및 진단과 거짓 긍정 사이의 균형 면에서 우수함을 보여줍니다. 우리는 대규모 스마트 계약 데이터 세트를 사용하여 도구를 비교했으며 1000개의 가장 많이 사용되는 계약에 대한 수작업 검토 결과를 제시합니다.
💡 논문 핵심 해설 (Deep Analysis)
This paper introduces Slither, a static analysis framework that enables effective detection and resolution of vulnerabilities in Ethereum smart contracts. By transforming Solidity code into an intermediate representation called SlithIR, which uses Static Single Assignment (SSA) form and a reduced instruction set, the tool simplifies implementing various analyses while preserving the semantic information from Solidity source code.
Core Summary: The paper presents Slither, a static analysis framework for Ethereum smart contracts that transforms Solidity into an intermediate representation called SlithIR. This transformation uses SSA form to enable efficient implementation of program analyses such as data flow and taint tracking.
Problem Statement: Smart contracts are pivotal in blockchain technology for performing trustless computations across various industries. However, they often contain vulnerabilities that can be exploited by malicious actors leading to significant losses. Therefore, there is a need for robust static analysis tools.
Solution (Core Technology): Slither addresses this issue by converting Solidity smart contracts into an intermediate representation called SlithIR. This conversion facilitates the implementation of various analyses using SSA form and a reduced instruction set while preserving key semantic information from the original Solidity code.
Key Results: The paper evaluates Slither’s performance on real-world contracts, showing that it is fast, accurate, and superior in terms of speed, robustness, and balance between detection accuracy and false positives compared to other static analysis tools.
Significance & Application: Slither provides a powerful tool for analyzing smart contracts, detecting vulnerabilities, identifying optimization opportunities, enhancing understanding of the code, and supporting thorough code reviews. This can lead to more secure and efficient smart contract development.
📄 논문 본문 발췌 (Translation)
# 서론
다양한 산업 분야에서 블록체인 플랫폼을 사용하여 신뢰 없는 컴퓨팅을 수행하고 있습니다. 금융 서비스부터 공급망, 물류, 의료 등 다양한 애플리케이션은 블록체인 기술에 기반한 솔루션으로 개발되고 있습니다. 그 중 가장 인기 있는 기술 중 하나는 Ethereum 스마트 계약입니다. 이러한 계약은 일반적으로 고급 프로그래밍 언어인 Solidity로 작성되어 Ethereum 가상 머신(EVM) 어셈블리 명령으로 컴파일되어 블록체인에 배포됩니다. 종종 배포된 스마트 계약 코드는 보안성이 낮습니다: 소프트웨어 취약점이 자주 발견되며, 악의적인 행위자가 이를 악용하여 수백만 달러의 손실과 블록체인 시스템의 명성을 해치고 있습니다.
최근 몇 년 동안 다양한 도구와 프레임워크가 개발되어 Ethereum 스마트 계약을 분석하고 취약점을 찾아내기 위해 정적 및 동적 분석 기법을 사용합니다. 이러한 도구들은 퍼징, 심볼릭 실행, 오염 추적, 정적 분석과 같은 인기 있는 프로그램 테스트 기법을 기반으로 합니다.
정적 분석은 계약 내에서 잠재적인 문제를 탐지하는 가장 효과적인 방법 중 하나입니다. 일반적으로 정적 분석 도구는 Solidity 소스 코드나 컴파일된 계약의 디스어셈블리 버전을 분석합니다. 그런 다음, 공통 보안 문제가 검색하기에 적합한 내부 표현으로 계약 코드를 변환합니다.
현대 커mplier인 clang은 제3자 분석기를 구축할 수 있는 다양한 API를 제공하지만 Solidity 컴파일러는 같은 기능을 제공하지 못합니다. 이상적으로 Ethereum 스마트 계약용 정적 분석 프레임워크는 다음과 같은 특성을 가져야 합니다:
-
정확한 추상화 수준: 프레임워크가 너무 추상적이면 일반적인 사용 패턴을 포착하는 정확한 의미를 도입하기 어렵습니다. 반대로 특정 문제만 탐지하도록 너무 좁게 초점을 맞추면 새로운 검출기 또는 분석을 추가하기 어려울 수 있습니다.
-
견고성: 실제 코드를 파싱하고 분석할 때 오류 없이 작동해야 합니다.
-
성능: 분석은 큰 계약에 대해서도 빠르게 수행되어야 하며, IDE와 같은 개발 도구 또는 모든 커밋 시 실행되는 연속 통합 체크에 쉽게 통합될 수 있어야 합니다.
-
정확성: 대부분의 잠재적인 문제를 찾으면서 낮은 거짓 긍정률을 유지할 수 있는 검출기를 개발해야 합니다. 만약 거짓 긍정률이 매우 높다면 전체 계약에 대한 수작업 감사를 요구하게 되어 그 효용성이 저하됩니다.
-
배터리 포함: 대부분의 계약에 유용한 일반적인 분석 및 문제 검출기 세트를 제공해야 합니다. 이는 프레임워크를 확장하려는 보안 엔지니어와 문제를 보고하려는 코드 감사자 모두에게 매력적입니다.
이 논문은 Slither라는 오픈 소스 정적 분석 프레임워크를 소개합니다. 이 도구는 Ethereum 스마트 계약에 대한 풍부한 정보를 제공하고 앞서 열거된 중요한 속성을 갖추고 있습니다. Slither는 자체 중간 표현인 SlithIR을 사용하여 Solidity 코드의 정적 분석을 간단하게 만듭니다. 데이터 흐름 및 오염 추적과 같은 일반적으로 사용되는 프로그램 분석 기법을 적용하여 정보를 추출하고 정제합니다. Slither는 보안에 초점을 맞춘 정적 분석 프레임워크로 구축되었지만 스마트 계약의 이해도 향상, 코드 검토 지원 및 누락된 최적화 탐지에도 사용됩니다.
우리의 기여를 다음과 같이 요약할 수 있습니다:
- Solidity 계약에 대한 정적 분석 프레임워크인 Slither를 소개합니다.
- Slither의 중간 표현 및 분석기 설계를 상세히 설명합니다.
- 대규모의 활발하게 사용되는 스마트 계약에서 Slither의 성능, 견고성 및 정확성을 평가하고 비교합니다.
Slither와 우리의 데이터 세트는 오픈 소스이므로 다른 사람들은 우리의 결과를 검증하고 개선할 수 있습니다. 이 논문의 나머지 부분은 다음과 같이 구성됩니다.
[[IMG_PROTECT_1]]
SlithIR
SlithIR은 Slither에서 사용하는 중간 표현으로, Solidity 코드를 나타냅니다. 제어 흐름 그래프의 각 노드는 최대 한 개의 Solidity 표현식을 포함하며 이는 SlithIR 명령 집합으로 변환됩니다. 이러한 표현은 분석 구현을 용이하게 하면서도, Solidity 소스 코드에 포함된 중요한 의미 정보를 잃지 않습니다.
명령 집합
SlithIR은 40개 미만의 명령어를 사용합니다. 내부 제어 흐름 표현이 없으며 Slither의 제어 흐름 그래프 구조(SlithIR 코드는 그래프의 각 노드에 연결됨)에 의존합니다. 다음은 주요 명령어의 고수준 설명입니다; 전체 설명은 여기서 확인할 수 있습니다.
표기법
$`LV`$와 $`RV`$는 각각 할당받는 변수(Left-Value)와 읽히는 변수(Right-Value)를 나타냅니다. 변수는 Solidity 변수 또는 중간 표현에 의해 생성된 임시 변수일 수 있습니다.
산술 연산
두 가지 형태로 표현됩니다: 이진 혹은 일원 연산자입니다:
-
LV $`=`$ RV BINARY RV
-
LV $`=`$ UNARY RV
매핑과 배열:
Solidity는 참조를 통해 액세스되는 매핑 및 배열을 조작할 수 있습니다. SlithIR은 $`REF`$(ReferenceVariable)이라는 특정 변수 유형을 사용하여 참조의 결과를 저장합니다. 인덱스 연산자는 변수에 대한 참조를 가능하게 합니다:
REF $`\leftarrow`$ Variable [Index]
구조체:
구조체 액세스는 멤버 연산자를 통해 수행됩니다:
REF $`\leftarrow`$Variable$`\cdot`$ Member
호출:
Slither는 호출에 대한 상세 정보를 제공하며 9개의 호출 명령어가 있습니다:
-
LV $`=`$ L_CALL Destination Function [ARG..] (저수준 Solidity 호출)
-
LV $`=`$ H_CALL Destination Function [ARG..] (고수준 Solidity 호출)
-
LV $`=`$ LIB_CALL Destination Function [ARG..] (라이브러리 호출)
-
LV $`=`$ S_CALL Function [ARG..] (내장 Solidity 함수 호출)
-
LV $`=`$ I_CALL Function [ARG..] (내부 함수 호출)
-
LV $`=`$ DYN_CALL Variable [ARG..] (내부 동적 함수 호출)
-
LV $`=`$ E_CALL Event [ARG..] (이벤트 호출)
-
LV $`=`$ Send Destination (Solidity $`send`$)
-
Transfer Destination (Solidity $`transfer`$)
일부 호출은 시간 제한을 설정할 수 있으며, 이를 통해 특정 시간 내에 완료되지 않으면 분석이 중단됩니다.
정적 단일 할당(SSA) 형식
Slither는 SSA 형식을 사용하여 코드의 복잡성을 줄이고 분석을 용이하게 합니다. SSA 형식은 각 변수가 할당될 때마다 새롭게 생성되며, 이를 통해 중복된 참조를 제거하고 분석 과정에서 발생할 수 있는 오류를 최소화합니다.
[[IMG_PROTECT_2]]
실험
우리는 Slither의 성능을 평가하기 위해 대규모 스마트 계약 데이터 세트를 사용했습니다. 특히, 1000개의 가장 많이 사용되는 스마트 계약에 대한 수작업 검토 결과를 제시합니다.
실험 1
이러한 실제 계약에서 Slither는 빠르고 정확하며 다른 도구보다 속도, 견고성 및 진단과 거짓 긍정 사이의 균형 면에서 우수함을 입증했습니다.
실험 2
우리는 두 데이터 세트(1000개 계약 및 35,000개 계약)에 대해 Slither의 최적화 검출 능력을 테스트했습니다. 결과적으로 많은 수의 계약이 상수로 선언될 수 있는 변수를 포함하고 있음을 발견했으며, 이를 통해 배포 비용과 사용 비용을 줄일 수 있습니다.
Reference
이 글은 ArXiv의 공개 자료를 바탕으로 AI가 자동 번역 및 요약한 내용입니다.
저작권은 원저자에게 있으며, 인류 지식 발전에 기여한 연구자분들께 감사드립니다.