스마트 컨트랙트(Smart Contracts)와 블록체인 애플리케이션(DApps)을 중심으로 한 블록체인 2.0 시대가 점차 주류가 되면서 스마트 컨트랙트와 블록체인 애플리케이션의 보안이 업계의 관심의 초점이 되고 있습니다.
특히 THE DAO, 바이낸스 도용 등의 사건을 겪은 후 스마트 계약과 블록체인 애플리케이션의 보안을 검증하고 보장하는 방법은 현재 블록체인 산업에서 시급한 페인 포인트가 되었습니다.
저자가 간단한 통계를 내보니 2017년 9월부터 2018년 9월까지 스마트 컨트랙트와 블록체인 애플리케이션 관련 취약점이 빈번하게 발생하는 패턴을 보였고 그 영향은 광범위했다. 직접적으로 막대한 금전적 손실을 입혔을 뿐만 아니라 장기적인 발전의 관점에서 볼 때 미래에 떠오르는 블록체인 기술의 지속 가능한 발전에도 영향을 미쳤습니다.
또한 현재 스마트 컨트랙트와 블록체인 적용의 잠재적인 취약점이 제대로 해결되지는 않았지만, 스마트 컨트랙트와 블록체인 적용 건수는 여전히 매일 평균 수만 건씩 빠른 속도로 증가하고 있는 상황입니다.
스마트 계약과 블록체인 응용 프로그램의 성장률과 보안이 건강하지 못한 관계에서 공존하고 있음을 보는 것은 어렵지 않습니다. 수요와 공급의 비유를 사용하면(성장률은 "공급", 보안은 "수요") 현재 스마트 계약 및 블록체인 애플리케이션의 일반적인 상태는 "공급이 수요를 초과"하는 상태입니다.
이를 바탕으로 대규모 스마트 계약과 블록체인 애플리케이션의 보안을 어떻게 보장할 것인가가 블록체인 산업의 미래지향적인 기업과 개인에게 핵심 이슈가 되었습니다. 사실, 현재 업계에는 기능 코드 일치, 기호 실행 및 기호 추상화에 기반한 자동 감사, 형식 검증에 기반한 자동 감사와 같은 이러한 문제점을 극복하기 위한 특별한 방법이 있습니다. 그 중 업계에서 광범위한 탐구와 실행을 거친 후 "정식 검증에 기반한 자동 감사"는 업계에서 비교적 성숙하고 주류 방법이 되었습니다.
따라서 저자는 특별히 "정식 검증"에 중점을 두고 현재 업계에서 두 가지 주요 공식 검증 도구(VaaS & Mythril)를 선택하고 간단한 테스트 비교를 수행합니다. 특히 테스트에 사용된 Mythril 도구의 버전은 "0.21.12"입니다.
보조 제목
VaaS 및 Mythril 도구 소개
01. VaaS 도구 소개
VaaS 도구는 Beosin Chengdu Lianan이 자체 지적 재산권을 사용하여 독자적으로 개발한 자동 형식 검증 도구입니다. 위험의 원인을 지적하고 스마트 계약의 기존 보안 허점, 보안 속성 및 기능적 정확성을 95% 이상의 정확도로 효과적으로 탐지합니다.
02. 미스릴 도구 소개
보조 제목
테스트 케이스 구성
계약 테스트 사례는 260개의 토큰 계약과 20개의 비즈니스 계약으로 구성됩니다.
- 토큰 계약에는 상위 200개의 토큰 계약과 감사를 위한 60개의 일반적인 토큰 계약이 포함되며 ICO, 락업, 발행 및 소각과 같은 기능을 포함합니다. 
- 보조 제목 
테스트 결과 개요
VaaS 도구는 토큰 및 비즈니스 클래스의 모든 계약 테스트 사례를 감지할 수 있지만 Mythril 도구는 비즈니스 계약이 아닌 토큰 계약만 감지할 수 있습니다. 따라서 이 테스트 결과 개요는 토큰 계약 목록의 비교 분석일 뿐이라는 점에 유의해야 합니다.
VaaS 도구에는 총 28개의 취약점 검사가 있지만 Mythril 도구는 VaaS 도구에 비해 9개의 취약점 검사만 있습니다. 따라서 VaaS 도구의 탐지 항목은 Mythril 도구보다 훨씬 많습니다. 특정 탐지 항목은 다음과 같이 비교됩니다.
VaaS & Mythril 탐지 항목 비교


01. 동일한 시험 항목에 대한 시험 결과
선택된 260개의 토큰 테스트 사례에 대해 Mythril 도구는 15분 이내에 184개의 계약 결과를 실행할 수 있고 76개는 탐지 결과가 없으며 VaaS 도구는 모든 결과를 실행할 수 있습니다. Mythril 도구와 VaaS 도구 모두 비교를 위해 실행할 수 있는 184개의 결과를 가져오면 결과는 다음과 같습니다.
- 적중률 및 오탐률 
탐지 결과 비교를 통해 동일한 탐지 항목과 비교하여 VaaS 도구의 탐지 능력이 Mythril 도구보다 훨씬 높습니다. 계산에 따르면 VaaS 도구의 탐지 정확도는 96.9%, Mythril 도구의 탐지 정확도는 36.6%, VaaS 도구의 오탐율은 15.3%, Mythril 도구의 오탐율은 48.5%입니다. 자세한 내용은 아래 그림을 참조하십시오.

적중률과 오경보율의 계산 공식은 다음과 같습니다.
- 적중률 = 적중 수/총 문항 수 
- 가양성률 = 가양성 수/(가양성 수 + 히트 수) 
저자의 통계에 따르면 VaaS 도구와 Mythril 도구 모두에서 수행한 탐지 항목은 총 655개 질문입니다.
- VaaS 도구는 적중률 96.9%로 총 635개의 문제를 감지했으며, 총 115개의 오탐지, 오탐률 15.3%를 기록했습니다. 
- Mythril 도구는 적중률 36.6%로 총 240개의 문제를 감지했으며, 총 226개의 오탐지, 오탐율 48.5%를 기록했습니다. 이 중 미스릴 툴 재진입 공격과 서비스 거부 오경보 비율이 상대적으로 높아 전체의 93.3%를 차지한다. 
총 탐지 값은 다음 표에서 비교됩니다.

- 시험 시간 제한 
Mythril 도구의 평균 테스트 시간은 226.2초인 반면 VaaS 도구의 평균 테스트 시간은 164.4초입니다. VaaS 도구의 운영 효율성이 Mythril 도구보다 우수함을 보여줍니다.
02. VaaS 도구에 대한 특정 탐지 항목의 탐지 결과
자세한 내용은 아래 표를 참조하십시오.
보조 제목

사례발표
01. 동일한 탐지 항목의 경우
- 재입학 
사례:

interface TEST {
function test123() external view returns (uint256);
function getBlocknumber() external view returns (uint256);
}
contract test2 {
function testCalling(address _testAdddress) public {
TEST t = TEST(_testAdddress);
t.test123();//미스릴 위양성
}
function testFormal(address _testAdddress) public view returns(uint256 time){
TEST t = TEST(_testAdddress);
t.getBlocknumber();//mythril 오탐지
return time;
}
}
contract Reentrancy {
mapping(address => uint256) public balances;
event WithdrawFunds(address _to,uint256 _value);
function depositFunds() public payable {
balances[msg.sender] += msg.value;
}
function showbalance() public view returns (uint256 ){
return address(this).balance;
}
function withdrawFunds (uint256 _weiToWithdraw) public {
require(balances[msg.sender] >= _weiToWithdraw);
require(msg.sender.call.value(_weiToWithdraw)());
balances[msg.sender] -= _weiToWithdraw;//mythril 명백한 오탐지
emit WithdrawFunds(msg.sender,_weiToWithdraw);
}
}

- VaaS 도구 테스트 결과: 

- Mythril 도구 테스트 결과: 


▷ 저자 분석에 따르면 VaaS 도구는 재진입 공격의 위치를 보고했고, Mythril 도구는 외부 호출에 대한 경보를 발령했으며 총 4개의 경보가 발생했으며 그 중 2개는 정상적인 외부 호출이고 다른 하나는 외부 호출이었습니다. 오탐율이 높은 명백한 오경보.
- TXOriginAuthentication(tx.origin 사용 오류) 
사례:

contract TxUserWallet {
address owner;
constructor() public {
owner = msg.sender;
}
function transferTo(address dest, uint amount) public {
require(tx.origin == owner);
dest.transfer(amount);
}
}

- VaaS 도구 테스트 결과: 

- Mythril 도구 테스트 결과: 

▷ 작성자의 분석에 따르면 VaaS 도구와 Mythril 도구 모두 tx.origin 키워드를 감지하고 경고할 수 있습니다.
- 낮은 수준의 호출 호출(호출 호출, 위임 호출 호출, 자살 함수 호출) 
사례:

contract Delegatecall{
uint public q;
bool public b;
address addr = 0xde6a66562c299052b1cfd24abc1dc639d429e1d6;
function Delegatecall() public payable {
}
function call1() public returns(bool) {
b = addr.delegatecall
(bytes4(keccak256("fun(uint256,uint256)")),2,3);
return b;
}
function call2(address add) public returns(bool){
b=add.delegatecall
(bytes4(keccak256("fun(uint256,uint256)")),2,3);
return b;
}
}

- VaaS 도구 테스트 결과: 

- Mythril 도구 테스트 결과: 

▷ 저자의 분석에 따르면 해당 사건의 대리인 콜 콜은 2건인 반면, Mythril 툴은 1회만 보고되어 과소신고의 위험이 있습니다.
- BlockMembers 조작(블록 매개변수 종속성) 
사례:

function createTokens() payable external {
if (isFinalized) throw;
if (block.number < fundingStartBlock) throw;
if (block.number > fundingEndBlock) throw;
if (msg.value == 0) throw;
uint256 tokens = safeMult(msg.value, tokenExchangeRate);
uint256 checkedSupply = safeAdd(totalSupply, tokens);
if (tokenCreationCap < checkedSupply) throw;
totalSupply = checkedSupply;
balances[msg.sender] += tokens;
CreateBAT(msg.sender, tokens);
}
function finalize() external {
if (isFinalized) throw;
if (msg.sender != ethFundDeposit) throw;
if(totalSupply < tokenCreationMin) throw;
if(block.number <= fundingEndBlock && totalSupply != tokenCreationCap) throw;
// move to operational
isFinalized = true;
if(!ethFundDeposit.send(this.balance)) throw;
}
function refund() external {
if(isFinalized) throw;
if (block.number <= fundingEndBlock) throw;
if(totalSupply >= tokenCreationMin) throw;
if(msg.sender == batFundDeposit) throw;
uint256 batVal = balances[msg.sender];
if (batVal == 0) throw;
balances[msg.sender] = 0;
totalSupply = safeSubtract(totalSupply, batVal);
uint256 ethVal = batVal / tokenExchangeRate;
LogRefund(msg.sender, ethVal);
if (!msg.sender.send(ethVal)) throw;
}
}

- VaaS 도구 테스트 결과: 

- Mythril 도구 테스트 결과: 

▷ 저자 분석에 따르면 VaaS 도구와 Mythril 도구 모두 블록 매개변수 종속성을 감지할 수 있지만 Mythril 도구는 오탐의 위험이 있습니다.
- 서비스 거부 
사례:

contract Auction {
address public highestBidder = 0x0;
uint256 public highestBid;
function Auction(uint256 _highestBid) {
require(_highestBid > 0);
highestBid = _highestBid;
highestBidder = msg.sender;
}
function bid() payable {
require(msg.value > highestBid);
highestBidder.transfer(highestBid);
highestBidder = msg.sender;
highestBid = msg.value;
}
function auction_end() {
}
}

- VaaS 도구 테스트 결과: 

- Mythril 도구 테스트 결과: 

▷ 저자의 분석에 따르면 VaaS 도구와 Mythril 도구 모두 서비스 거부에 대한 위험 탐지를 수행할 수 있습니다. 그러나 이 경우 최고 입찰자가 악의적으로 계약을 공격하여 전송이 지속적으로 실패하여 계약이 서비스 수락을 거부할 수 있습니다.이 경우 VaaS 도구는 서비스 거부 위험을 감지할 수 있습니다. 그러나 Mythril 도구는 그것을 감지하지 못했습니다.
- Unchecked Call Or Send Return Values (호출 및 반환 값 전송 탐지) 
사례:

if (lastTimeOfNewCredit + TWELVE_HOURS < block.timestamp) {
msg.sender.send(amount);
creditorAddresses[creditorAddresses.length - 1].send(profitFromCrash);
corruptElite.send(this.balance);
...
return true;
}
else {
msg.sender.send(amount);
return false;
}

- VaaS 도구 테스트 결과: 

- Mythril 도구 테스트 결과: 

▷ 작성자 분석에 따르면 VaaS 도구와 Mythril 도구 모두 확인되지 않은 통화 호출의 반환 값을 감지할 수 있지만 Mythril 도구는 오탐의 위험이 있습니다.
- 정수 오버플로 
사례 1:

function distributeBTR(address[] addresses) onlyOwner {
for (uint i = 0; i < addresses.length; i++) {
balances[owner] -= 2000 * 10**8;
alances[addresses[i]] += 2000 * 10**8;
Transfer(owner, addresses[i], 2000 * 10**8);
}
}

▷ 저자의 분석에 따르면 위의 경우 balances[owner]의 값을 확인하지 않아 underflow가 발생할 수 있지만 Mythrill 도구는 오류를 보고하지 않으므로 Mythrill 도구는 상시 작동을 확인하지 않습니다.
사례 2:

contract A {
uint c;
function add(uint8 a,uint8 b){
uint8 sum = a+b;
c=sum;
}
}

- VaaS 도구 테스트 결과: 

- Mythril 도구 테스트 결과: 

▷ 작성자의 분석에 따르면 uint256이 아닌 데이터 유형에 대한 Mythrill 도구의 오버플로 감지가 정확하지 않습니다.
사례 3:
- Mythril 도구의 일부 감지 결과: 


▷ 작성자 분석에 따르면 Mythrill 도구는 일부 특정 변수를 처리하지 않아 오탐이 발생했습니다. 배열, msg.value, now 등과 같은
02. VaaS 도구에 대한 특정 탐지 항목 사례
사례 1:

...
contract ERC20 is ERC20Basic {
function allowance(address owner, address spender) constant returns (uint);
function transferFrom(address from, address to, uint value);
function approve(address spender, uint value);
event Approval(address indexed owner, address indexed spender, uint value);
}
...
function transfer(address _to, uint _value) onlyPayloadSize(2 * 32) {
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
Transfer(msg.sender, _to, _value);
}

- 시험 결과: 


사례 2:

contract A {
B b;
uint c;
function test(uint a){
b = new B(a);
c = b.get(200);
}
}
contract B {
uint b;
function B(uint e){
b=100;
}
function get(uint a)returns(uint){
require(a<100);
return a;
}
}

- 시험 결과: 

▷ 저자의 분석에 따르면 Case 2의 경우 컨트랙트 간 호출은 소스코드가 있으면 VaaS 툴은 성공적으로 호출 및 테스트가 가능하지만 Mythril 툴은 불가능하다. 이것이 Mythril 도구가 비즈니스 계약 검증을 수행할 수 없는 이유 중 하나입니다.

VaaS 도구와 Mythril 도구의 논리, 차원, 데이터에 대한 위의 간단한 비교 분석을 통해 저자는 독자가 읽은 후에 자신의 사업 방향과 초점을 기반으로 그에 상응하는 판단과 평가를 할 수 있을 것이라고 믿는다.
스마트 컨트랙트와 블록체인 애플리케이션, 심지어 전체 블록체인 산업의 보안과 상관없이 앞으로 공급(성장률)과 수요(보안) 간의 관계를 균형 있게 유지하는 모델로 개발해야 하며 더 많은 것이 필요합니다. 현재 현상 유지의 문제점이 어디에 있는지, 그리고 문제점에 대응하여 개선하고 혁신하는 방법을 명확하게 파악하십시오.
최첨단 기술의 지지자이든 블록체인 기술의 괴짜이든, 분권화된 사고를 가지고 스마트 계약과 블록체인 응용 프로그램이 미래에 광범위한 영향을 미칠 것이라는 통찰력을 가진 사람이라면 누구나 "form" Chemical에 대한 저자의 목표를 이해할 수 있습니다. 확인"이 이 테스트 보고서의 목적입니다.
현재 스마트 컨트랙트와 블록체인 애플리케이션의 구현 및 블록체인 생태계의 전반적인 구축을 촉진하는 방법에 더 많은 관심을 기울이고 있지만 여전히 해결되지 않은 근본적인 기술 아키텍처에 다양한 허점과 위험이 있는 경우 사실입니다. , 그것은 너무 야심적일 것입니다.
따라서 저자는 대규모 스마트 계약 및 블록체인 애플리케이션의 보안을 보장하고 블록체인 생태계의 양호한 운영 및 유지를 유지하기 위해 "정식 검증"이 자동화된 감사의 중요한 방법이 되었다고 제안합니다.
오탐율, 오탐율, 적중률, 테스트 시간 제한 등의 평가 차원을 통해 특정 검증 및 감사 도구의 타당성을 판단하는 것은 현재의 스마트 계약 및 블록체인 응용 프로그램 개발에 필요한 단계입니다. 본격적으로 미션을 수행합니다.


