한국어
자유게시판
Qtum Institute : 비극이 왜 반복 되는가? 4차원의 스마트계약 취약성에 대한 포괄적인 분석

Qtum 퀀텀 체인 ...

 

2 시간 전

*이 기사는 저자의 개인 의견만을 나타냅니다.

 

컴파일 된 단어로 : 지능형 계약 보안 사고가 자주 발생 또한 현재 블록 체인 기술의 보급과 발전에 영향을 좋은 질문을했다 계약 기술 보안 인텔리전스의 상태에 있습니다. 이 백서는 4 차원에서 스마트 계약 기술의 현재 취약점을 분석하고 취약점의 원인과 코딩 제안을 논의합니다.

 

: 설계 Qtum 개발 팀은 UTXO 모델 EVM 가상 머신 Qtum 특정 AAL (검토를 통해 연결 심층 분석 Qtum 양자 체인 계정 추상화 계층은 (AAL Qtum)는 지능형 계약 Qtum에 직접 적용 할 수있는 견고하게). 따라서 Qtum Quantum Chain Smart Contract는 블록 체인에 더 나은 확장 성을 제공하므로 블록 체인에서 점점 더 복잡한 코드 논리를 실행하고 체인 에서 올바른 결과를 유지할 수 있습니다. 스마트 계약의 기본 운영 객체는 체인의 원래 토큰 및 주소뿐만 아니라 경제적 가치가 높은 Qrc20 및 Qrc721과 같은 다양한 토큰입니다.

 

작은 파티를 교환하는 계약 프로젝트의 잘 알려진 많은 수의, 중단없이 자사의 발명 이후 정보 기술을 도난, 가장 주목할 만하게 DAO 이벤트, 해커는 20에서 만 3.6 위에 동전 이더넷, 이더넷 리드 타임 통화 가격을 얻기 위해 관리 달러는 13 달러 밑으로 직접 떨어졌습니다. The DAO 이후, 계약 허점으로 인한 자산 도용이 때때로 발생했기 때문에 앞으로 더 유사한 공격이 발생할 것으로 예상되므로 스마트 계약의 보안 문제가 많은 주목을 받았습니다.

 이 문서는 일반적인 견고 자신의 문제의 일부를 나열합니다, 이러한 문제는 쉽게 간과 공격에 쉽게, 그리고 해당 권고는 이러한 문제를 해결하는 데있다.

 

NO.1 난수

공용 체인 세계의 데이터는 공유되며, 블록을 업데이트하는 데 사용되는 마이닝 방법 (PoW 또는 PoS 등)에 관계없이 최종 상태를 계산할 수 있습니다. 즉, 블록 체인 에코 시스템이 존재하지 않습니다. 난수 시드에는 난수를 생성하는 견고성 설계에서 rand () 함수가 없습니다.

 

최근 핫 Dapps의 대부분은 시금치 유형입니다. 즉, 도박을 달성하기 위해 많은 임의성이 필요하지만 견고성은 난수를 지원하지 않습니다. 일부 디자이너는 그런 중대한 보안 취약점 인 임의의 소스, 같은 블록 해시 값, 타임 스탬프, 블록 높이 제한 또는 가스 등의 다음 블록 변수를 계약을 사용하여 생각, 자신의 가장 큰 문제는 이러한 양은 광부가 관리하는 것이므로 실제로 무작위가 아닙니다 .

 

예를 들어 다음 블록의 해시를 임의의 개체로 사용하면 도박 참가자가 패리티를 눌러 내기를 수행 한 다음 큰 풀에서 짝수를 배팅 할 수 있습니다. 그런 다음 해시가 홀수 블록이고 브로드 캐스트하지 않는다고 계산합니다. 그리고 비용과 성공률이 측정되는 한, 큰 광부와 광산은 도박 게임을 통제 할 기회가 있습니다. 또한 블록 변수 만 사용하면 블록의 모든 트랜잭션에서 의사 난수가 동일하므로 공격자는 한 블록 내에서 여러 트랜잭션을 수행하여 수익을 배가시킬 수 있습니다.

그것을 해결하는 방법?

블록 체인 난수의 경우 좋은 특수 솔루션이 없기 때문에 무작위성을 보장하기 위해 블록 체인에서 임의성을 얻을 수 있습니다. 예를 들어 난수 공급 업체로 활동하고 자산을 담보로 제공하며 블록 체인을 통해 보상을 발행하는 신뢰할 수있는 중앙 집중화 된 시스템의 확률 시스템에 액세스 할 수 있습니다.

 

2 번 재진입 취약점

견고성 계약의 특징 중 하나는 블록 체인 네트워크에 이미 배포 된 계약 코드를 호출 할 수 있다는 것입니다. 이러한 종류의 공격은 계약에서 체인의 토큰을 처리 할 수 ​​있기 때문에 발생합니다.

 

계약에는 fallback () 함수가 있으며 계약의 특수 함수이며 이름이없고 매개 변수도없고 반환 값이 없습니다 계약 주소를 직접 전송할 때 계약에 함수 호출을 보내지 않습니다. fallback () 함수가 트리거되므로 공격은 fallback ()의 ​​일부 악성 연산을 설정하여 추가 코드 논리 구현을 수행 할 수 있습니다. DAO는 주로 재진입 공격으로 인해 많은 수의 토큰이 손실되는 것을 담당합니다.

 

그것을 해결하는 방법?

계약을 알 수없는 주소로 직접 전송하면 재진입 공격이 발생할 수 있으며 공격자는 fallback () 함수의 외부 주소에 악성 코드가 포함 된 계약을 작성할 수 있습니다. 따라서 계약서가이 주소로 돈을 이체하면 악의적 인 코드가 호출됩니다. 흔히 악성 코드는 개발자가 원치 않는 작업을 실행하는 취약한 계약에 대해 함수를 실행합니다.

{EtherStore 계약 

uint256 공개 withdrawalLimit 1 = 에테르. 
매핑 (어드레스 => uint256) 공개 lastWithdrawTime; 
매핑 (어드레스 => uint256) 공개 잔액, 

함수 depositFunds () {공중 채무 
잔액 [msg.sender] + = msg.value; 


(_weiToWithdraw uint256) withdrawFunds 함수 {공개 
(가) 요구 (잔액이 [msg.sender]> = _weiToWithdraw); 
// 철수 제한 
상기 필요한 (_weiToWithdraw <= withdrawalLimit) 
//받는 허용 시간 제한 철회 
합니다 (필요한 지금> = lastWithdrawTime [MSG를 . .sender] + 1 주), 
(가) 필요 (msg.sender.call.value (_weiToWithdraw) ()); 
잔액 [msg.sender] - = _weiToWithdraw; 
lastWithdrawTime [msg.sender = 현재; 

}

이것은 공격받은 계약입니다. 두 가지 기능은 다음과 같습니다.

  • depositFunds () 함수는 사용자 잔액 만 추가합니다.

  • withdrawFunds () 함수를 사용하면 철회 할 토큰 수를 지정할 수 있습니다.

공격 계약을 살펴 보겠습니다.

오기 "EtherStore.sol"; 

계약 초당 { 
EtherStore 공개 etherStore, 

가변 어드레스와 계약 intialise // etherStore 
생성자 (어드레스 _etherStoreAddress) { 
etherStore = EtherStore (_etherStoreAddress) 


함수 pwnEtherStore () {채무 대중 
에게 공격 // 가까운 에테르 
요구] (msg.value> 에테르 = 1이다.); 
// depositFunds를 보내기 ETH () 함수 
etherStore.depositFunds.value (에테르 1). (); 
매직 시작 // 
etherStore.withdrawFunds을 (에테르 1.); 


함수 collectEther () public { 
msg.sender.transfer (this.balance); 


// fallback 함수 - 마술이 발생하는 곳 
function () payable {
if (etherStore.balance> 1 ether) { 
etherStore.withdrawFunds (1 ether); 


}

 

공격자는 EtherStore 계약 주소를 생성자의 입력 매개 변수로 사용하여 Attack.sol을 생성합니다. 계약에서 공개 변수 etherStore는 공격 대상 계약을 가리키고 공격자는 계약에 1보다 많은 값을 저장하는 pwnEtherStore () 함수를 호출합니다. 토큰은 10이라고 가정합니다.

 

공격 계약과 공격받은 계약의 동작을 시뮬레이션 할 수 있습니다.

  • - 1 : pwnEtherStore ()를 호출 한 후, msg.value 1 토큰 (그리고 많은 양의 가스)으로 EtherStore의 despoitFunds () 함수가 호출됩니다. 공격 계약의 주소는 (0x0 ... 123) , 나머지 [0x0 ... 123] = 1이 EtherStore에 기록됩니다.

  • - 2 : Attack 계약은 EtherStore에서 withdrawFunds () 기능을 호출합니다. 이때 계약의 균형이 이루어지며 철수가 이루어지지 않습니다.

  • - 3 : 계약은 Attack 계약에 1 토큰을 보냅니다.이 시점에서 Attack.sol의 fallback () 기능이 불이익을 받게됩니다.

  • - 4 : 계약 어드레스 EtherStore 밸런스를 결정하는 대체 () 함수는, 이번에 재진입 계약 EtherStore을 달성하는 것이 () 함수를 호출 withdrawFunds 1보다 큰

  • - 5 : 토큰을 보내기 위해 address.call.value ()를 사용 했으므로 현재 예외가 발생하지 않았고 변수는 아직 변경되지 않았고 [0x0 ... 123] = 1, 동전 철수 시간이 업데이 트되지 않은, 성공을 다시 입력, 공격 계약에 토큰을 계속 보낼 것입니다

  • - 6 : EtherStore.sol 토큰이 1보다 작은 경우, 공격 계약을 대체 ()는 내부 장애 조건이 결정되고, 잔류 비트 EtherStore 수행, 균형 및 통화 시간을 언급 업데이트하지만이 시간 재진입 공격은 종료 잔액이 1보다 작습니다.

 

 

이제 코딩의 순간에 이러한 문제를 피할 수 있습니다.

  • - 1 : 토큰을 보낼 때 기본 제공되는 transfer () 함수가 사용됩니다.이 경우 적은 양의 가스 만 첨부되므로 공격 계약 일지라도 계약을 여러 번 호출 할만큼 가스가 충분하지 않아 재진입 공격을 피할 수 있습니다.

  • - 2 : 상태 변수를 변경하는 모든 로직이 토큰이 계약 (또는 외부 호출)에서 전송되기 전에 발생하는지, 지역화 기능에서 알 수없는 주소에 대한 외부 호출을 수행하는 코드 또는 코드 실행을 마지막 작업으로 배치하는지 확인하십시오 예를 들어, 위 계약에서 내부 변수 (잔액 및 동전 시간)의 변경이 전송 전에 배치되면 재진입 공격을 피할 수 있습니다.

  • - 3 : 뮤텍스를 도입하여 코드 실행 중에 계약을 잠그는 상태 변수를 추가하여 재진입 호출을 방지합니다.

 

NO.3 짧은 주소 공격 이 공격은 매개 변수를 계약 기능에 전달할 때 ABI 인코딩 스펙을 포함합니다. 예를 들어 address 매개 변수를 사용하면 address 매개 변수를 함수에 전달할 때 16 진수로 변환해야하지만 표준은 40 자의 16 진수이지만 36 개의 16 진수 주소 만 보낼 수 있습니다. 인코딩 매개 변수의 끝에 0을 넣어 예상 길이를 구성하면 타사 호출 기능에 공격 가능한 취약성이 있습니다.

그것을 해결하는 방법?

자물쇠 지갑을 예로 들어 보겠습니다. 사용자가 Qrc20 토큰을 신청하면 입력 주소가 합법적인지 여부를 확인하지 않으며 짧은 주소 공격이 발생합니다. Qrc20 토큰의 전송 인터페이스를 살펴 보겠습니다.

함수 전달 (주소, uint 토큰) 공개 반환 (bool 성공);

 

사용자가 주소로 100 코인 요청을 제출하면 지갑은 transfer () 함수 매개 변수 요구 사항에 따라 매개 변수를 인코딩합니다.

a9059cbb000000000000000000000000deaddeaddeaddeaddeaddeaddeaddeaddeaddead0000000000000000000000000000000000000000000000056bc75e2d63100000

 

처음 4 바이트 (a9059cbb)는 transfer () 함수 시그니처 / 선택기이고 두 번째 32 바이트는 주소이며 마지막 32 바이트는 토큰 수를 나타내는 uint256입니다.

 

이제 1 바이트 (2 자리 16 진수)가 손실되는 주소를 보내면

0xdeaddeaddeaddeaddedeaddededededededededededededededededededededededededededede

주소 (마지막 두 자릿수 부족)로 보내고 동일한 100 개의 토큰을 검색합니다. 지갑이이 입력을 검증하지 않으면 다음 형식으로 인코딩됩니다.

예 :

 

이 시점에서 코드 끝 부분에 00이 채워지면 체인 스마트 계약에 전송 된 코드가 잘못 해석됩니다. 주소 매개 변수는 다음과 같이 읽혀집니다.

0xdeaddeaddeaddeaddedededededeaddeaddede00

그 숫자는 56bc75e2d6310000000 (두 개 이상)으로 읽혀 25,600 개의 토큰을 나타냅니다. 지갑에 25,600 개가 넘는 토큰이 있으면 완료된 주소로 25,600 개의 토큰이 추출되어 토큰 도용이 발생합니다. 참고 : 공격자는 끝에 0이 포함 된 주소를 쉽게 생성 할 수 있습니다.

 

블록 체인으로 보내기 전에 모든 입력을 검증하면 이러한 유형의 공격을 막을 수 있습니다. 동시에, 매개 변수 순서가 중요한 역할을합니다 .ABI 코드의 채우기는 문자열 끝에 만 발생하므로 스마트 계약에서 매개 변수를 합리적으로 정렬하면 이러한 공격을 막을 수 있습니다.

 

NO.4 높은 가스 경쟁

이 허점에 대한 이유는 천연 토큰이 가스로서의 결함이기 때문입니다. 광부들은 더 높은 수익과 수익을 얻기 위해 항상 더 높은 거래를 꾸리려고합니다.

그것을 해결하는 방법?

광부는 일반적으로 트랜잭션의 gasPrice에 따라 정렬 된 광업시 블록에 포함 할 트레이딩 풀의 트랜잭션을 선택합니다. 첫 번째 유형의 공격 (재진입 공격)은 공격받은 계약이 시작될 때 호출됩니다. 거래의 모든 단계가 광부에 의해 블록으로 포장 될 수 있도록 높은 가스가 필요합니다. 마찬가지로, 계약에 대한 요구가 고도로 계산 된 결과를 얻고 그 결과에 대해 높은 보상을 제공하는 것이라면, 공격자는 올바른 결과를 얻기 위해 많은 계산을 할 필요가 없지만 트레이딩 풀을 모니터 할 필요가 있습니다. 문제에 대한 해결책을 살펴보면 공격자는 답을 얻고 통과하면 매우 높은 gasPrice 트랜잭션을 생성하여 트랜잭션이 원래의 트랜잭션보다 먼저 블록으로 패키징되는지 확인합니다. 다른 사람의 계산 결과를 도용하여 이익을 얻는 공격 계획.

유명한 ERC20 토큰 표준 approve () 함수의 위험이 존재합니다 :

함수 승인 (_spender, uint256 _value)은 (bool 성공)을 반환합니다.

 

이 기능을 사용하면 다른 사용자가 자신을 대신하여 토큰을 전송하도록 권한을 부여 할 수 있습니다. A B는 100token, 그러나 후회 양도 권한을 부여하고 어떤 점에서 권한을 수정하려면, 당신은 B에 등이 50token를 전송할 수, 트랜잭션 (transaction)를 작성해야하고 B는 트랜잭션을 검색 할 수 있습니다, 거래 후 거래는 B를 구축 나타납니다 (가) 지출, 높은 gasprice가 자신의 거래 트랜잭션이보다 더 할 수 있도록 설정 100token, 빠르게 최종 포장되고, B는 150token의 총을 사용할 수있는 권리가 있습니다.

 

사용할 수있는 한 가지 방법은 계약서에 논리를 작성하고 gasPrice의 상한을 설정하는 것입니다. 이것은 사용자가 gasPrice를 증가시키지 않고 상한선을 초과하여 거래의 순서를 정하는 것을 방지합니다. 이러한 거래에 잠겨 광부, 공격, 그들은 패키지 거래를 자유롭게 선택할 수있는 경우 그러나이주의 사항은, 일반 사용자의 공격의 가능성을 줄일 수 있습니다, 그 자체가 계약 수준에 악을 할 수있는 광부을 종식하기가 어렵습니다.

 

요약

이 같은 견고 언어 문제 자체가 많이있다, 공격에 바로 구멍의 일부가 요약 유형 비교는 눈에 보이지 취약 정밀도의 부족, 변수 저장 공간이 비싸고 비라는 이름의 위험성하는 경향이 초기 초기화 함수를 설계되었습니다 다양한 크기의은 ( 초기 견고성 생성자는 계약과 동일한 이름을 가진 함수이며 계약 이름의 수정으로 인해 많은 수의 사용 권한 문제를 쉽게 만들 수 있습니다.

 

이제 시장은 피하기 위해 기능 중 하나에 교훈 또는 직접 후계자를 취할 수있는 서면 계약에 OpenZeppelin 많은 표준 수학 계산과 과학적인 정밀 가공 변수가 아주 잘하고있는 도서관, 모두 많은 표준화 된 계약이 있었다 취약점의 출현.

 

참고 문헌

[1] ERC20 취약성 분석 링크 

[2] 견고 안전 링크

[3] 견고 공식 문서 링크

 

https://bitkan.com/zh/ksite/articles/51079 

번호 제목 글쓴이 날짜 조회 수
공지 큐바오(큐백x)Qrc20 코인 출금방법 [133] title: 퀀텀아이콘슈퍼스테이커 2021.02.24 6922
공지 [Q-helper] 퀀텀 코어의 수량이 맞지 않게 표시되는 오류 해결 방법 [1] title: 퀀텀아이콘슈퍼스테이커 2021.01.24 14056
공지 연이자 약5% 슈퍼스테이커 운영중입니다 수수료3%(0.5개당0.015개) [11] title: 퀀텀아이콘슈퍼스테이커 2020.12.15 6627
공지 글쓰기 레벨 안내입니다. [59] QTUM 2019.07.09 8409
11070 비트 1000만원 넘었네요 [9] 퀀텀버스터 2019.05.27 668
11069 저스틴선 중대발표예고 [8] title: 퀀텀아이콘디지털자산 2019.05.26 917
11068 채굴 관련 질문입니다 [10] 가자퀀텀 2019.05.26 377
11067 네오도 퀀텀과 비슷합니다 [4] 리채텀 2019.05.26 726
11066 퀀텀 차트 입니다 [6] 큐텀투더문문 2019.05.26 650
11065 상대적 박탈감좀 그만 느끼게 해줄순 없는건가 [14] title: 우리다같이 스마일오빠 2019.05.26 728
11064 퀀텀이 개차반이된 이유 [13] title: 퀀텀아이콘디지털자산 2019.05.25 818
11063 아 다르고 어 다르지 않나요? [2] 나띵 2019.05.25 793
11062 과연 퀀텀이 이만원을 넘기는날이올까요? [32] 퀀텀포레버 2019.05.25 1266
11061 쎄타퓨엘 [2] 퀀텀날동이 2019.05.24 682
11060 아가리파이터 등장 [4] title: 퀀텀아이콘디지털자산 2019.05.23 723
11059 [질문이요] 큐바오에 지갑불러오기 핀번호 기억안나면?? [2] louis85 2019.05.23 264
» Qtum 연구소: 스마트계약 취약성에 대한 포괄적인 분석 [1] title: 퀀텀아이콘껀텀 2019.05.22 536
11057 바이낸스 트러스트 월렛, 블록체인 4개 추가 지원 [1] title: 퀀텀아이콘껀텀 2019.05.21 495
11056 네오 네트워크 멈춤ㅋㅋㅋㅋㅋㅋ [8] title: 우리다같이 스마일촉촉하 2019.05.21 1041
11055 미국 SEC "반에크·솔리드X BTC ETF 승인 연기" [4] 불꽃 2019.05.21 630
11054 제작년 코린이로 손실을 겪었던 [9] 정정해갸노 2019.05.20 901
11053 개인적인 생각입니다 [2] 정정해갸노 2019.05.20 602
11052 전문유튜버 [6] ok가쟈! 2019.05.20 630
11051 2019 Global Summit Forum 席杭州 항저우시 [2] title: 퀀텀아이콘껀텀 2019.05.19 542

포인트랭킹

순위 닉네임 포인트
1위 title: 스텔라쿵 캐리커쳐 #1타이어 7460995점
2위 슈퍼비트 6494300점
3위 title: 퀀텀아이콘빵먹는곰돌이 6453844점
4위 title: 스텔라쿵 캐리커쳐 #1미스릴 6207546점
5위 불꽃 6102050점
6위 지금감사 5822300점
7위 title: 퀀텀아이콘봄이 5488150점
8위 밀키웨이 3047900점
9위 빵상 2975450점
10위 대바기 2728250점