Rust 스마트 컨트랙트 개발일지 (10-2)
BlockSec
2022-04-03 04:13
本文约4501字,阅读全文需要约18分钟
이 문서는 Sputnik_DAOv2::Factory Contract의 계약 해석을 제공합니다.

전문1. Sputnik-DAO 공장 계약

Sputnik-DAO는 플랫폼의 분산형 자율 조직(DAO)의 통일된 생성 및 관리를 실현하기 위해 생성형 공장 설계 패턴(Factory Pattern)을 채택합니다.

이 기사에서는 Sputnik-DAO 플랫폼 팩토리 패턴(sputnikdao-factory)의 설계 및 구현을 자세히 소개합니다.

해당 계약의 소스 코드 웨어하우스는 다음 위치에 있습니다.

첫 번째 레벨 제목

2. DAPP 모듈 기능 소개

Sputnik DAO 플랫폼의 DAPP 페이지를 열면 많은 분산형 자율 조직이 플랫폼에서 자체 DAO 인스턴스 개체(Sputnikdaov2 계약)를 생성하고 사용자 정의한 것을 볼 수 있습니다.

2022년 3월 현재 이 플랫폼에서 생성된 가장 활발한 DAO는 news.sputnik-dao.near이며, 3051개의 제안(제안)이 공개 투표 중이거나 마감 상태입니다.

📄독자의 편의를 위해 계약의 구조도를 참조용으로 위에 제공합니다.

즉, Sputnik DAO 플랫폼을 기반으로 생성된 모든 DAO 인스턴스 계약은 NEAR 계정의 하위 계정에 배포됩니다. 예를 들면 다음과 같습니다.

NEAR 프로토콜의 하위 계정 정의는 https://docs.near.org/docs/concepts/account#subaccounts 🔗에서 참조할 수 있습니다.

아래 그림과 같이 분산형 조직은 NEAR 메인 네트워크에서 공개적으로 거래를 개시할 수 있으며, sputnikdao-factory 컨트랙트에서 제공하는 create() 메서드를 호출하여 새로운 DAO 인스턴스를 생성할 수 있습니다.

3. sputnikdao-factory 계약 코드의 해석

Rust 팩토리 모드 컨트랙트의 작성 방법에 대한 이해를 돕기 위해 이 글에서는 sputnikdao-factory의 컨트랙트 코드를 깊이 있게 해석합니다.

3.1 DAO 생성

스푸트니크다오 공장 계약 상태는 주로 다음 두 부분으로 구성됩니다.

Base64 디코딩 후 args 매개변수의 구체적인 내용은 다음과 같습니다.

이 내용은 바로 multicall.sputnik-dao.near 컨트랙트 배포 시 컨트랙트 초기화 메소드 new() 실행 시 필요한 컨트랙트 구성 정보입니다.

다음 기사에서는 factory_manager.create_contract의 특정 구현을 자세히 분석합니다.

이 함수의 매개변수는 다음과 같이 지정됩니다.

분산형 자율 조직에서 제공하는 DAO 기본 정보: Config

5. callback_method: create_contract() 메소드 실행 후 콜백 함수를 지정하며, 이 팩토리 컨트랙트에서 새로운 DAO 인스턴스 컨트랙트 정보를 유지 및 처리하는데 사용됩니다.

6. callback_args: 콜백 함수의 함수 매개변수.

이 기능의 실행은 주로 다음 단계로 나뉩니다.

최종 DAO 인스턴스 컨트랙트가 배포된 후 on_create() 함수는 factory_manager.create_contract() 실행 코드 32-53 라인의 끝에서 다시 호출됩니다.

다음은 콜백 함수 on_create의 내부 코드 구현입니다.

이 함수의 특정 처리 논리는 다음과 같습니다.

텍스트

텍스트

텍스트

코드 위치: sputnikdao-factory2/src/lib.rs # Line136-149

factory_manager.update_contract()의 처리 세부 사항은 다음과 같습니다. 이 인터페이스는 해당 DAO 인스턴스 계약에서 update() 함수의 호출을 실현할 수 있습니다.

다음 사항을 언급할 가치가 있습니다.

Sputnik-DAO 코드를 분석하는 동안 BlockSec은 Factory 계약에서 Sputnik-DAO를 사용하는 모든 계약에 영향을 미칠 심각한 보안 문제를 발견했습니다. 프로젝트 당사자에게 연락한 후 문제가 최종적으로 확인되고 제 시간에 수정되었습니다.

💡보안 취약성은 구체적으로 다음과 같이 설명됩니다.

코드의 이전 버전에서 sputinikdao 팩토리 계약에서 제공하는 public update() 메서드에는 다음과 같은 키 어설션 검사가 없었습니다. 이로 인해 메서드는 누구나 호출할 수 있습니다.

공교롭게도 DAO 인스턴스 계약(Sputnikdaov2 계약)은 기본적으로 교차 계약 호출을 통해 Sputnik-DAO Factory에서 이 계약을 업그레이드할 수 있도록 합니다.

DAO 인스턴스 계약에 구현된 update() 메서드는 다음과 같으며 코드는 sputnikdao2/src/upgrade.rs에 있습니다. # Line 62

위 코드의 9행에서 factory_info.auto_update 값은 DAO 인스턴스 계약이 배포되고 초기화를 위해 new() 메서드를 호출할 때 기본적으로 True로 설정됩니다.

DAO 인스턴스 계약의 new() 메서드는 다음과 같이 구현됩니다. 코드는 sputnikdao2/src/lib.rs에 있습니다. # Line 83-104

요약하면 일반 사용자(Factory 계약 및 DAO 계약 자체가 아님)는 Factory 계약에서 제공하는 pub fn update() 메서드를 통해 모든 DAO 계약의 코드를 업그레이드(변조)할 수 있으며, 이는 Sputnik-DAO 플랫폼 및 Sputnik-DAO 플랫폼에 의존하는 모든 계약 프로젝트는 큰 보안 위험을 초래합니다.

🪴 다행히 이 문제가 발견되었을 때 이 버전의 코드는 NEAR 메인넷에 아직 런칭되지 않았기 때문에 손실은 없었습니다.

프로젝트 당사자의 빠른 대응으로 인해 합리적인 화이트리스트 검증 메커니즘을 추가하여 취약점을 올바르게 수정했습니다😊

첫 번째 레벨 제목

텍스트

위에서 발견 및 수정된 취약점 외에도 Sputnik-DAO Factory 계약의 보안은 주로 다음 측면에서 보장됩니다.

다음 함수는 상태 변수를 수정하지 않습니다.

프로젝트 당사자의 빠른 대응으로 인해 합리적인 화이트리스트 검증 메커니즘을 추가하여 취약점을 올바르게 수정했습니다😊

커밋 수정 참조: 518ad1d97614fff4b945aba75b6c8bd2483187a2🔗

BlockSec
作者文库