부활^cc
revive^CC Hyperledger Fabric Smart Contracts (Chaincode)를위한 정적 분석 도구입니다. 블록 체인 관련 보안 취약점을 감지하여 개발자가 깨끗하고 안전한 스마트 계약을 작성할 수 있도록 도와줍니다. revive^CC Hyperledger Fabric Chaincode를위한 두 개의 기존 정적 분석 도구 중 하나이며, 다른 도구는 특정 요구 사항을 충족하는 체인 코드 파일을 분석 할 수있는 Chainsecurity의 체인 코드 스캐너입니다. revive^CC Special을 만드는 것은이 도구가 모든 체인 코드 파일 에 보안 분석의 접근성을 가져 왔다는 것입니다. 이것은 지금까지 사용할 수 없었던 것입니다.
이 도구는 오픈 소스 go 정적 분석 도구 리브의 확장이며 Revive의 프레임 워크를 사용하여 구축되었습니다. 따라서 개발자가 Clean Go 코드를 작성하도록 돕기 위해 Revive의 모든 혜택과 점검이 포함되어 있습니다. revive^CC 셰필드 대학교에서 '스마트 계약 분석'에 관한 논문 프로젝트의 일환으로 지어졌습니다.
설치
1. Place folder in the your $GOPATH/src/github.com/youraccount
2. Go into directory sivachokkapu/revive-cc
3. $ make install
4. $ make build
5. Move the revive file into $GOPATH/bin
6. You should now be able to use revive commands
용법
$ revive {chaincodefilename.go} - will analyse the file
$ revive -formatter stylish {chaincodefilename.go} - better output format
$ revive - on a directory will analyse all files if from the same package

디렉토리에서 $ Revive 사용
성능

Revive^CC의 성능을 평가하기 위해 각각의 취약점이 포함 된 다양한 실제 사례 체인 코드 파일이 발견되었습니다. GitHub 리포지토리의 평가를 위해 총 20 개의 공개 체인 코드 파일이 얻어졌습니다. 이 모든 파일이 확인되었고 다음과 같은 취약점 이보고되었습니다. 그런 다음 성능은 20 파일 중 13 개만 확인할 수있는 Chainsecurity의 체인 코드 스캐너와 비교되었습니다. 전반적으로, Revive^cc는 더 많은 취약점을 감지 할 수있었습니다 (Revive^CC가 더 많은 진정한 긍정적 인 것을 감지 할 수 있으므로 약간 더 많은 오 탐지를 감지합니다).
감지 가능한 취약점
블랙리스트 체인 코드 가져 오기

체인 코드에서 블랙리스트 체인 코드 가져 오기 취약점의 예
특정 라이브러리를 가져 오면 동료간에 합의가 부족할 수 있습니다. 이는 특정 라이브러리가 외부 세계와의 커뮤니케이션을 허용하고 파일 액세스 권한을 부여하며 비 결정적 행동을 체인 코드에 도입 할 수도 있기 때문입니다. 이것들은 모두 동료들 사이의 일관되지 않은 계산으로 이어질 수 있습니다. 블랙리스트 라이브러리 중 하나는 '시간'라이브러리입니다. 이 라이브러리를 사용하면 동료를 사용하면 주어진 시간에 현재 타임 스탬프를 얻을 수 있지만, 각 피어는 트랜잭션 중에 동일한 타임 스탬프를 생성 할 것 같지 않습니다. 이로 인해 동료들 사이에 비 결정적 행동이 발생하여 일관성이없는 계산이 발생할 수 있습니다.
글로벌 상태 변수

체인 코드의 글로벌 상태 변수 취약성의 예
글로벌 변수는 원장에서 글로벌 변수가 추적되지 않기 때문에 글로벌 변수는 단일 피어에만 전 세계적입니다. 피어는 반드시 모든 거래를 실행하지 않으며 글로벌 변수의 범위가 단일 피어로 제한됨에 따라 해당 주가 분기 될 수 있습니다. 읽거나 쓰는 데이터는 이러한 글로벌 상태 변수에 의존해서는 안됩니다. 이는 다른 읽기 및 쓰기 세트로 계산할 수 있으므로. 이 비 일관된 계산으로 인해 동료 간의 합의가 부족하여 모든 거래는 유효하지 않습니다.
goroutines

체인 코드의 고 루틴 취약성의 예
Goroutines는 동시성을 Chaincode에 소개합니다. 그런 다음 비 결정적 행동을 가져올 수 있습니다. 이로 인해 동일한 읽기 및 쓰기 세트를 계산하지 않기 때문에 동료 간의 일관되지 않은 계산이 발생할 수 있습니다. 이로 인해 네트워크의 동료들 사이에 합의가 부족하여 모든 거래가 유효하지 않은 것으로 표시됩니다. 그러므로 고어 라틴을 사용하는 것은 낙담합니다.
팬텀 원장을 읽었습니다

체인 코드에서 원장 취약성에 대한 팬텀 읽기의 예
gethistoryofkey 또는 getQueryResult를 사용하여 원장에서 데이터를 얻는 것은 시스템의 버전 관리 제어를 전달하지 않습니다. 이는 이러한 방법을 사용하여 검색 한 데이터를 사용하여 새로운 데이터를 작성하거나 원장에 대한 데이터를 업데이트해서는 안된다는 것을 의미합니다. 이로 인해 예상치 못한 행동으로 이어질 수 있으며, 이는 거래 실행에 영향을 미치고 의도하지 않은 결과를 초래할 수 있습니다.
지도 위의 범위

체인 코드의 맵 취약성 범위의 예
범위 키워드를 사용하면 GO의 다양한 데이터 구조의 모든 요소를 반복 할 수 있습니다. 그러나 범위가 맵에 적용되면 반복 순서는 이동 중에 무작위로 표시됩니다. 이는 맵의 요소를 통해 반복을 반복하기 위해 범위를 사용하는 것이 반복 순서가 모든 실행 사이에 변경 될 수 있으므로 결정적이지 않다는 것을 의미합니다. 따라서 동료 간의 계산은 일관되지 않으며 네트워크의 동료가 합의에 도달하는 것은 불가능합니다.
쓰기 후 읽으십시오

체인 코드에서 쓰기 취약성 후 읽기의 예
원장 명세서에 발효 되려면 먼저 트랜잭션을 원장에 커밋하고 작성해야합니다. 그때까지 작성된 값은 이전 가치를 유지할 것입니다. 이는 원장 에서이 값을 읽으면 체인 코드가 의도하지 않은 이전 값을 반환한다는 것을 의미합니다. 이로 인해 예상치 못한 행동이 발생하여 거래 실행에 영향을 미치고 의도하지 않은 결과를 초래할 수 있습니다.
특허
MIT