В данной статье будут рассмотрены вопросы контроля доступа в смарт-контрактах на Rust с двух точек зрения:
Видимость доступа/вызова методов (функций) контракта
Контроль доступа к функциям привилегий/Распределение полномочий и ответственности
1. Видимость функций (методов) контракта
При написании смарт-контрактов можно контролировать права доступа к функциям контракта, задавая их видимость. Это очень важно для защиты ключевых частей контракта от случайного доступа или манипуляций.
В качестве примера биржи Bancor Network, 18 июня 2020 года произошел инцидент с безопасностью, вызванный неправильной настройкой прав доступа к ключевым функциям смарт-контракта. Этот контракт был написан на языке Solidity, видимость функций делится на public/external и private/internal.
При исправлении уязвимости безопасности Bancor ошибочно установил некоторые ключевые функции перевода как общедоступные, что позволило любому вызывать эти функции из внешнего контракта для выполнения операций перевода, что поставило под серьезный риск активы пользователей на сумму 590000 долларов.
!
В смарт-контрактах Rust контроль видимости функций также важен. Контрактные функции, помеченные макросом #[near_bindgen], определенным NEAR SDK, имеют следующие видимые атрибуты:
pub fn: публичная функция, часть интерфейса смарт-контрактов, доступная для вызова из вне контракта.
fn: Функция без указанного pub может быть вызвана только внутри контракта.
pub(crate) fn: ограничить вызов в пределах внутреннего пространства crate.
Другой способ установить метод как internal - это определить его в блоке кода impl Contract, который не помечен #[near_bindgen].
Для функции обратного вызова необходимо установить ей свойство public, чтобы ее можно было вызывать через function call. Также необходимо убедиться, что функцию обратного вызова может вызывать только сам контракт, это можно реализовать с помощью макроса #[private].
!
2. Контроль доступа к привилегированным функциям(Механизм белого списка)
Кроме видимости функций, необходимо также на семантическом уровне установить полную механизм белого списка для контроля доступа. Некоторые привилегированные функции (такие как инициализация контракта, включение/приостановка, унифицированный перевод и т.д.) могут вызываться только владельцем контракта (owner).
Можно реализовать пользовательский Trait для управления доступом к привилегированным функциям, проверяя, является ли вызывающий транзакцию адрес владельцем контракта:
Основываясь на этом принципе, можно настроить более сложные атрибуты для установки нескольких пользователей или нескольких белых списков в белом списке, чтобы реализовать детальный контроль доступа к группам.
!
3. Другие методы управления доступом
Другие методы контроля доступа в Rust смарт-контрактах также включают:
Контроль времени вызова смарт-контрактов
Механизм многофакторного вызова функций смарт-контрактов
Управление(DAO) реализации
Эти материалы будут подробно описаны в последующих выпусках серии дневников по смарт-контрактам.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
9 Лайков
Награда
9
4
Поделиться
комментарий
0/400
not_your_keys
· 2ч назад
Не могу понять, как обойти уязвимость Bancor с того раза.
Посмотреть ОригиналОтветить0
SigmaBrain
· 21ч назад
Действительно, уроки Bancor остались в памяти.
Посмотреть ОригиналОтветить0
NewPumpamentals
· 21ч назад
Снова говорят о контроле доступа, почему не учатся на уроках Bancor?
Контроль доступа к смарт-контрактам Rust: видимость функций и управление привилегированным доступом
Rust смарт-контракты养成日记(7)合约安全之权限控制
В данной статье будут рассмотрены вопросы контроля доступа в смарт-контрактах на Rust с двух точек зрения:
1. Видимость функций (методов) контракта
При написании смарт-контрактов можно контролировать права доступа к функциям контракта, задавая их видимость. Это очень важно для защиты ключевых частей контракта от случайного доступа или манипуляций.
В качестве примера биржи Bancor Network, 18 июня 2020 года произошел инцидент с безопасностью, вызванный неправильной настройкой прав доступа к ключевым функциям смарт-контракта. Этот контракт был написан на языке Solidity, видимость функций делится на public/external и private/internal.
При исправлении уязвимости безопасности Bancor ошибочно установил некоторые ключевые функции перевода как общедоступные, что позволило любому вызывать эти функции из внешнего контракта для выполнения операций перевода, что поставило под серьезный риск активы пользователей на сумму 590000 долларов.
!
В смарт-контрактах Rust контроль видимости функций также важен. Контрактные функции, помеченные макросом #[near_bindgen], определенным NEAR SDK, имеют следующие видимые атрибуты:
Другой способ установить метод как internal - это определить его в блоке кода impl Contract, который не помечен #[near_bindgen].
Для функции обратного вызова необходимо установить ей свойство public, чтобы ее можно было вызывать через function call. Также необходимо убедиться, что функцию обратного вызова может вызывать только сам контракт, это можно реализовать с помощью макроса #[private].
!
2. Контроль доступа к привилегированным функциям(Механизм белого списка)
Кроме видимости функций, необходимо также на семантическом уровне установить полную механизм белого списка для контроля доступа. Некоторые привилегированные функции (такие как инициализация контракта, включение/приостановка, унифицированный перевод и т.д.) могут вызываться только владельцем контракта (owner).
Можно реализовать пользовательский Trait для управления доступом к привилегированным функциям, проверяя, является ли вызывающий транзакцию адрес владельцем контракта:
ржавчина pub trait Ownable { fn assert_owner(&self) { assert_eq!(env::p redecessor_account_id(), self.get_ owner()); } fn get_owner(&self) -> AccountId; fn set_owner(&mut Self, владелец: AccountId); }
Основываясь на этом принципе, можно настроить более сложные атрибуты для установки нескольких пользователей или нескольких белых списков в белом списке, чтобы реализовать детальный контроль доступа к группам.
!
3. Другие методы управления доступом
Другие методы контроля доступа в Rust смарт-контрактах также включают:
Эти материалы будут подробно описаны в последующих выпусках серии дневников по смарт-контрактам.
!
!
!
!
!
!
!