신흥 고성능 블록체인 플랫폼인 Sui는 다양한 혁신적인 기술과 독창성을 보유하고 있으며 다양한 애플리케이션 시나리오에 대해 빠르고 안전한 거래 경험을 제공하는 데 중점을 두고 있습니다. Sui에 대한 기본 지식은 Exploring Sui: Technology and Contract Security Behind High Performance 에서 찾을 수 있습니다. 블록체인에서 일반적으로 사용되는 다른 프로그래밍 언어(예: Solidity)와 달리 Sui는 Move 언어를 사용하므로 재진입 공격, 정수 오버플로 등 Solidity에서 흔히 발생하는 취약점 문제를 어느 정도 해결할 수 있습니다. , 이중 지출, DoS 공격 및 컴파일러 문제가 있지만 개발자가 코드에 오류를 발생시키는 것을 막을 수는 없습니다. 따라서 개발자는 스마트 계약의 보안을 보장하기 위해 일부 고유한 기능이나 특징을 이해하고 주의를 기울여야 합니다.
SlowMist 보안 팀은 Sui 커뮤니티가 공유하는 보안 개발 관행과 수년간 축적된 자체 보안 감사 경험을 통합하고 흡수하여 개발자가 보안 위험을 더 잘 이해할 수 있도록 돕는 Sui-Move 계약 감사 입문서를 출시했습니다. Sui 스마트 계약 및 잠재적인 보안 위협을 완화하기 위한 실용적인 솔루션을 제공합니다.
공간 제한으로 인해 이 문서에서는 Sui-Move 계약 감사 소개의 일부만 나열합니다. GitHub(https://github.com/slowmist/Sui-MOVE-Smart-Contract-)에서 Watch, Fork 및 Star를 사용할 수 있습니다. 감사 입문서/blob/main/README_CN.md.
1. 모듈 선언 및 가시성
1.1 "public(friend)" 기능 (최신 Sui 버전에서는 "public(friend)"가 "public(package)"로 대체됨)
정의: 지정된 친구 모듈에서만 액세스할 수 있도록 함수를 선언하는 데 사용됩니다. 이는 "공개"와 "비공개" 사이에서 더욱 세분화된 액세스 제어를 제공합니다.
예:
1.2 "입력" 기능
정의: "입력" 기능은 모듈의 진입점이며 트랜잭션 블록 내에서 직접 호출을 허용합니다. 매개변수는 트랜잭션 블록에 대한 입력에서 나와야 하며 블록의 이전 트랜잭션이나 수정된 데이터의 결과일 수 없습니다. 또한 "entry" 함수는 "drop" 기능이 있는 유형만 반환할 수 있습니다.
예:
정의: "입력" 기능은 모듈의 진입점이며 트랜잭션 블록 내에서 직접 호출을 허용합니다. 매개변수는 트랜잭션 블록에 대한 입력에서 나와야 하며 블록의 이전 트랜잭션이나 수정된 데이터의 결과일 수 없습니다. 게다가 "entry" 함수는 "drop" 기능이 있는 유형만 반환할 수 있습니다.
예:
1.3 "공개" 기능
정의: "공개" 함수는 트랜잭션 블록 및 기타 모듈에서 호출될 수 있으며 외부 상호 작용에 적합합니다. 매개변수와 반환 값에 대해 "입력" 함수와 동일한 제한이 없으며 일반적으로 기능을 외부 세계에 노출하는 데 사용됩니다.
예:
2. 객체 관리
2.1 객체의 고유성
정의: 각 Sui 개체에는 체인에 있는 개체의 고유성을 보장하는 고유한 "objID"가 있습니다.
2.2 포장 및 포장 풀기
정의:
- 직접 래핑: Sui 객체를 다른 객체의 필드로 사용하고, 언래핑 시 래핑 객체를 소멸해야 합니다.
- 객체 패키징: 패키지된 객체는 다른 객체의 일부가 되며 더 이상 독립적으로 존재하지 않습니다. 압축을 푼 후에도 개체의 ID는 변경되지 않습니다.
2.3 맞춤형 전송 전략
정의: "sui::transfer::transfer"를 사용하여 사용자 정의 전송 전략을 정의합니다. "store" 기능이 있는 객체의 경우 "sui::transfer::public_transfer"를 통해 생성할 수 있습니다.
2.4 객체의 속성
정의: Sui 개체의 속성에는 개체의 동작 방식을 결정하는 "복사", "삭제", "저장" 및 "키"가 포함됩니다.
2.5 객체 권한 확인
- 주소 소유 객체
정의: 특정 주소(계정 주소 또는 개체 ID)가 소유한 개체입니다. 해당 개체의 소유자만 이러한 개체에 액세스하고 작동할 수 있습니다.
- 불변 객체
정의: 불변 객체는 수정하거나 전송할 수 없으며 누구나 접근할 수 있습니다. 전역 액세스가 필요하지만 수정할 필요가 없는 데이터에 적합합니다.
- 공유 객체
정의: 공유 객체는 여러 사용자가 액세스하고 운영할 수 있으며 분산 애플리케이션과 같은 시나리오에 적합합니다. 그러나 합의가 필요하기 때문에 운영 비용이 높습니다.
- 래핑된 객체
정의: 개체 래핑은 하나의 개체를 다른 개체에 포함하는 것입니다. 래핑된 개체는 더 이상 독립적으로 존재하지 않으며 래핑 개체를 통해 액세스해야 합니다.
3. 보안검색
3.1 숫자 오버플로 검사
정의: 개체 래핑은 하나의 개체를 다른 개체에 포함하는 것입니다. 래핑된 개체는 더 이상 독립적으로 존재하지 않으며 래핑 개체를 통해 액세스해야 합니다.
3. 보안검색
3.1 숫자 오버플로 검사
Sui의 스마트 계약은 기본적으로 숫자 오버플로 검사를 수행합니다.
3.2 재진입 확인
일명 재진입 공격은 정상적인 계약 호출 거래에 예상치 못한(외부) 호출을 삽입해 전반적인 비즈니스 호출 프로세스를 변경하고 불법적인 이익을 얻는 행위입니다. 외부 계약 호출이 관련된 경우 잠재적인 재진입 위험이 있을 수 있습니다. 현재 재진입 문제는 단일 기능 재진입, 교차 기능 재진입, 교차 계약 재진입의 세 가지 범주로 나눌 수 있습니다. Move 언어의 일부 기능은 재진입 공격에 대한 자연스러운 보호 기능을 제공합니다.
- Move에는 동적 통화가 없으며 모든 외부 통화는 먼저 사용을 통해 가져와야 합니다. 즉, 외부 통화가 예상되고 결정됩니다.
- 기본 토큰 전송은 대체 기능을 트리거하지 않습니다.
- 이동에서 자원 모델은 한 번에 하나의 실행 컨텍스트에서만 자원에 액세스할 수 있도록 보장합니다. 즉, 함수 실행이 완료되지 않으면 실행이 완료될 때까지 다른 함수가 동일한 리소스에 액세스할 수 없습니다.
1. 초과 감사
참고: Move는 수학 연산을 수행할 때 오버플로 검사를 수행합니다. 작업이 오버플로되면 트랜잭션이 실패합니다. 그러나 Move는 비트 연산에 대한 오버플로 검사를 수행하지 않는다는 점에 유의해야 합니다.
위치 찾기: 코드에서 비트 연산이 수행되는 위치를 찾아 오버플로 위험이 있는지 확인합니다.
2. 산술 정밀도 오류 감사
참고: Move에는 부동 소수점 유형이 없습니다. 따라서 산술 연산을 수행할 때 연산 결과를 부동 소수점 수로 표현해야 하는 경우 정밀도 오류가 발생할 수 있습니다. 경우에 따라 정확도 오류를 완전히 방지하기는 어렵지만 최적화와 합리적인 설계를 통해 그 영향을 완화할 수 있습니다.
포지셔닝: 산술 연산, 특히 정밀 오류를 생성할 수 있는 계산과 관련된 코드의 모든 부분을 검토하고 이러한 작업이 계약 논리 또는 수치 정확도에 부정적인 영향을 미치지 않는지 확인하고 정밀 오류를 완화하기 위한 최적화 권장 사항을 제시합니다.
3. 조건부 경쟁 감사
참고: Sui의 유효성 검사기는 사용자가 제출한 트랜잭션을 정렬할 수도 있으므로 감사에서 동일한 블록의 트랜잭션을 정렬하여 이익을 얻는 문제에 여전히 주의를 기울여야 합니다.
위치:
- 함수가 호출되기 전에 계약의 데이터 상태에 대해 예상되는 관리가 있습니까?
- 기능 실행 중 계약 데이터 상태에 대한 예상 관리가 있는지 여부.
- 함수 호출 후 계약 데이터 상태에 대한 관리가 예상됩니까?
4. 접근통제 감사
참고: 계약의 특정 주요 기능은 사용자의 입금액을 직접 업데이트할 수 있는 기능과 같은 내부 호출로 제한되어야 합니다. 이러한 기능이 실수로 외부에 공개되면 권한 제어가 우회되어 보안이 취약해지고 심지어 자산 손실이 발생할 수 있습니다. 따라서 승인된 역할이나 모듈만 이러한 기능을 호출할 수 있도록 하거나 내부에서만 사용할 수 있도록 액세스 권한을 엄격하게 설정해야 합니다.
포지셔닝: 모든 기능, 특히 외부에 노출되어서는 안 되는 기능의 액세스 제어 설정을 확인하여 내부에서만 호출할 수 있는지 확인해야 합니다. 노출되어서는 안 되는 기능 인터페이스가 노출된 것으로 확인된 경우에는 위험도가 높은 것으로 표시하고 수정 제안을 해야 합니다.
5. 객체 관리 감사
참고: Sui에서는 객체를 공유 객체(Shared Object)로 변환할 수 있습니다. 이는 객체의 액세스 권한이 비공개에서 공개로 변경될 수 있음을 의미합니다. 따라서 사용된 모든 개체를 면밀히 조사하여 각 개체가 정적인지 공유인지 확인해야 합니다. 개체가 실수로 개인 개체에서 공유 개체로 변환되었는지 특별히 주의하십시오. 이로 인해 승인되지 않은 사용자가 이러한 개체에 액세스하여 잠재적인 보안 위험이 발생할 수 있습니다.
포지셔닝: 모듈에 포함된 모든 개체를 구성 및 분석하고, 개체 유형 및 권한 설정을 확인하고, 개체의 권한이 비즈니스 요구 사항과 일치하는지 확인합니다. 개인 개체가 실수로 공유 개체로 변환된 것이 발견된 경우 잠재적 위험으로 플래그를 지정하고 수정을 권장해야 합니다.
6. 토큰 소비 감사
포지셔닝: 모듈에 포함된 모든 개체를 구성 및 분석하고, 개체 유형 및 권한 설정을 확인하고, 개체의 권한이 비즈니스 요구 사항과 일치하는지 확인합니다. 개인 개체가 실수로 공유 개체로 변환된 것이 발견된 경우 잠재적 위험으로 플래그를 지정하고 수정을 권장해야 합니다.
6. 토큰 소비 감사
참고: Sui의 토큰 모델은 다른 체인의 토큰 모델과 다릅니다. Sui는 객체가 토큰을 보유할 수 있도록 하며, 토큰 객체는 다른 객체 내에 중첩되어 분할될 수 있습니다. 따라서 토큰 소비와 관련된 시나리오에서는 보안 문제나 예상치 못한 손실을 방지하기 위해 토큰 관리 및 유통에 특별한 주의를 기울여야 합니다.
위치:
- 소비된 양이 정확한지 확인하세요.
- 토큰 객체가 올바르게 전송되었는지 확인하세요.
- 토큰의 분할과 병합이 정당한지 확인하세요.
- 토큰과 객체의 바인딩을 확인하세요.
7. 플래시 대출 공격 감사
참고: Sui's Move에는 플래시 대출(뜨거운 감자)도 사용됩니다. 사용자는 한 번의 거래로 많은 양의 자금을 빌려 원하는 대로 사용할 수 있으며, 거래 내에서 자금을 반환하기만 하면 됩니다. 악의적인 사용자는 가격 조작 등 대규모 금융 공격을 수행하기 위해 플래시 대출을 통해 자신의 자금을 늘리는 경우가 많습니다.
포지셔닝: 프로토콜 자체의 알고리즘(보상, 이자율 등)과 오라클 머신에 대한 의존도가 합리적인지 분석합니다.
8. 권한 취약점 감사
참고: Sui의 Move 계약에서 권한 허점은 비즈니스 요구 사항 및 기능 설계와 밀접하게 관련되어 있으므로 더 복잡한 모듈이 발생하면 프로젝트 당사자에게 각 메서드의 호출 권한을 확인해야 합니다(여기서 권한은 일반적으로 기능을 나타냅니다). 가시성 및 함수 호출 권한).
위치:
- 모든 함수 메서드의 가시성 및 호출 권한을 확인하고 프로젝트 평가 단계에서 프로젝트 당사자는 설계 문서를 제공해야 하며, 감사 중에는 설계 문서의 설명을 기반으로 권한이 확인됩니다.
- 프로젝트팀 역할의 권한 범위를 정리합니다. 프로젝트팀 역할의 권한이 사용자의 자산에 영향을 미칠 경우 과도한 권한이 발생할 위험이 있습니다.
- 외부 함수에 전달된 개체의 유형을 분석합니다. 일부 권한 있는 함수인 경우 일부 권한 있는 개체가 참여해야 합니다.
9. 계약 업그레이드에 대한 보안 감사
참고: Move에서는 use 키워드를 통해 외부 모듈을 가져옵니다. Sui의 계약은 업그레이드가 가능하지만 게시된 계약 패키지는 변경 불가능한 개체이므로 게시된 후에는 철회하거나 수정할 수 없습니다. 계약 업그레이드의 핵심은 업데이트된 계약을 새 주소에 다시 게시하고 이전 버전 계약의 데이터를 새 계약으로 마이그레이션하는 것입니다. 따라서 계약 업그레이드 과정에서는 특별한 주의를 기울여야 합니다.
- "init" 기능: "init" 기능은 계약이 처음으로 릴리스될 때만 실행되며 후속 계약 업그레이드가 발생할 때 다시 트리거되지 않습니다.
- 계약을 업그레이드해도 종속성이 자동으로 업데이트되지 않습니다. 계약 패키지가 외부 패키지에 의존하는 경우 외부 패키지가 업그레이드되면 계약 패키지가 자동으로 업그레이드된 계약 주소를 가리키지 않습니다. 따라서 새 종속성을 지정하려면 계약 패키지를 수동으로 업그레이드해야 합니다.
포지셔닝: 마이그레이션 작업이 안전하고 정확한지 확인하고 중요한 데이터가 누락되거나 업데이트에 의존하는 문제를 방지하기 위해 계약 업그레이드 프로세스 중에 데이터 마이그레이션 로직을 자세히 검사하는 것이 필요합니다.
10. 외부 통화 보안 감사
참고: 외부 모듈 사용 감사 항목과 동일합니다. Move의 외부 호출은 외부 모듈을 먼저 가져와야 하기 때문에 이론적으로 외부 호출의 결과는 개발자가 기대하는 것이며 가장 필요한 것은 외부 모듈의 안정성입니다.
위치 지정: 외부에서 가져온 라이브러리를 확인해야 합니다.
11. 반환 값 확인
참고: 다른 스마트 계약 언어와 마찬가지로 Move 계약에서도 특정 기능의 반환 값을 확인해야 합니다. 이러한 반환 값의 처리를 무시하면 키 로직이 제대로 실행되지 않아 보안 문제가 발생할 수 있습니다.
위치 지정: 코드의 모든 함수 호출, 특히 외부 호출이나 중요한 상태 업데이트와 관련된 함수 호출의 반환 값을 확인해야 합니다. 반환 값이 처리되지 않거나 확인되지 않으면 예측할 수 없는 동작이 발생할 수 있으므로 잠재적 위험 지점으로 표시해야 합니다.
12. 서비스 거부 감사
참고: 서비스 거부(DoS) 공격은 코드 논리 오류, 호환성 문제 또는 기타 보안 취약점으로 인해 발생할 수 있으며 이로 인해 스마트 계약이 제대로 작동하지 않을 수 있습니다. 이러한 문제는 계약 가용성에 영향을 미치거나 계약을 완전히 마비시킬 수도 있습니다.
12. 서비스 거부 감사
참고: 서비스 거부(DoS) 공격은 코드 논리 오류, 호환성 문제 또는 기타 보안 취약점으로 인해 발생할 수 있으며 이로 인해 스마트 계약이 제대로 작동하지 않을 수 있습니다. 이러한 문제는 계약 가용성에 영향을 미치거나 계약을 완전히 마비시킬 수도 있습니다.
위치:
- 다양한 상황에서도 정상적으로 실행될 수 있는지, 오류나 허점으로 인해 계약이 중단되지 않는지 비즈니스 로직의 견고성 점검에 집중하세요.
- 외부 의존성 문제로 인한 서비스 중단을 방지하기 위해 외부 모듈과 상호 작용하는 부분에 주의하고 호환성을 보장합니다.
13. 가스 최적화 감사
참고: Ethereum과 마찬가지로 Sui에도 가스 메커니즘이 있으며 모든 모듈 스크립트 호출은 가스를 소비합니다. 따라서 일부 길고 복잡도가 높은 코드를 최적화하는 것이 필요합니다.
위치:
- 분리할 수 있는지 확인하기 위한 복잡한 호출이 필요합니다.
- 여기에는 함수 내부 실행의 효율성을 최적화할 수 있는지 확인하기 위한 고주파 호출이 포함됩니다.
14. 설계 논리 감사
참고: 디자인 로직 감사의 초점은 코드의 비즈니스 프로세스와 구현을 확인하여 디자인 결함이나 기대치에서 벗어난 부분이 있는지 확인하는 것입니다. 예상되는 논리와 일치하지 않는 코드 구현은 예상치 못한 동작이나 보안 위험을 초래할 수 있습니다.
위치:
- 다양한 역할의 권한과 범위를 기반으로 비즈니스 프로세스에서 가능한 호출 경로를 분류합니다.
- 각 비즈니스 프로세스에 포함된 데이터의 범위를 결정하고 데이터 운영이 비즈니스 설계와 일치하는지 확인합니다.
- 실제 통화 경로와 예상 비즈니스 프로세스를 비교하고 예상치 못한 결과를 초래할 수 있는 통화 상황을 식별하고 분석합니다.
15. 기타
위 표현에는 반영되지 않은 내용입니다.
개발자의 경우 이러한 모범 사례를 따르면 스마트 계약의 보안을 효과적으로 향상하고 잠재적인 보안 위험을 줄일 수 있습니다. 이 모범 사례가 더 많은 개발자가 안전하고 신뢰할 수 있는 스마트 계약을 생성하고 블록체인 기술의 건전한 발전을 촉진하는 데 도움이 되기를 바랍니다.
참조:
[1] https://intro.sui-book.com/
[2] https://docs.sui.io/
[3] https://move-dao.github.io/move-book-zh/introduction.html
작성자 | 승리!
편집자 리사, 리즈
모든 댓글