Анализ смарт-контрактов
23.01.2024

Смарт-контракты с функцией BlackList

Продолжаем серию статей, посвященных описанию мошеннических схем в смарт-контрактах. Сегодня мы разберем смарт-контракты с функцией Черного списка (BlackList).

Опасности смарт-контрактов с функцией BlackList:

Смарт-контракты, включающие функцию Черного списка, несут в себе определенные риски и проблемы как для проекта, так и для его пользователей. Вот некоторые из опасностей, связанных с функциями "черного списка":

  1. Централизованный контроль: Функции Черного списка часто предоставляют централизованный контроль владельцу контракта или администраторам.

  2. Злоупотребление черным списком для недобросовестной практики: Злоумышленники (включая владельца контракта), могут использовать черный список для воздействия на конкретные адреса. Это может включать замораживание или ограничение функциональности учетных записей без веских на то оснований.

  3. Отсутствие прозрачности: Наличие функции черного списка, особенно если она не документирована, может привести к отсутствию прозрачности. Пользователи могут не знать о критериях составления черного списка или о процедуре исключения из него.

  4. Риски для безопасности: Если BlackList реализован ненадежно, существует риск возникновения уязвимостей, которые могут позволить неавторизованным лицам манипулировать черным списком, что может привести к несанкционированному замораживанию или переводу средств.

  5. Недоверие пользователей: Существование функции черного списка может подорвать доверие пользователей, поскольку их активы могут быть внесены в черный список без четких правил.

  6. Конфискация токенов: Злоумышленники могут использовать черный список для конфискации токенов или активов с определенных адресов без должных оснований. Это может привести к существенным финансовым потерям.

Как самостоятельно определить наличие подобных угроз в смарт-контрактах?

При проверке смарт-контракта можно предпринять определенные шаги, чтобы определить наличие угрозы, связанной с функциями черного списка:

  • Прежде чем приступить к работе со смарт-контрактом, внимательно прочитайте и изучите его код, включая все функции, связанные с составлением черного списка. Ищите функции, связанные с черным списком, замораживанием или ограничением функциональности учетных записей. Проверьте, есть ли функции, позволяющие добавлять или удалять адреса из черного списка.

  • Проанализируйте, кто имеет право собственности или административного контроля над контрактом. Оцените степень контроля и права, связанные с владельцем или администраторами.

  • Изучите документацию контракта, чтобы понять, как предполагается использовать функцию черного списка. Ищите информацию о механизмах управления, которые контролируют использование черного списка.

  • Оцените прозрачность: обеспечивает ли контракт прозрачность критериев составления черного списка. Проверьте, существуют ли четкие процедуры устранения ложных срабатываний или удаления адресов из черного списка.

  • Аудиты безопасности: проверьте, проходил ли смарт-контракт аудит безопасности, проводимый авторитетными сторонними компаниями.

  • Ознакомьтесь с отзывами сообщества или онлайн-форумов об использовании черных списков в проекте. Будьте внимательны к любым тревожным сигналам, поднятым членами сообщества, касающимся недобросовестной практики или недостаточной прозрачности.

  • Проведя тщательный анализ и приняв во внимание вышеуказанные факторы, вы сможете лучше оценить риски, связанные с функциями черного списка в смарт-контрактах. Будьте в курсе последних событий в нашем сообществе (Телеграм-канал) и лучших практик по выявлению мошенничества (наш Блог и YouTube-канал).

 

Хорошие новости: наш Сканер безопасности находит все распространенные (в том числе скрытые) функции Черных списков (BlackList) в 99,9% случаев. Используйте нашу премиум подписку и защитите свои средства от угроз.

 

Далее мы рассмотрим несколько наиболее распространенных примеров функции BlackList, которые успешно обнаруживает наша Платформа.

Обратите внимание, что это упрощенные примеры, и реальная реализация может отличаться. При анализе смарт-контрактов всегда следует проводить тщательную проверку кода и учитывать контекстно-зависимые факторы.

Пример 1: Базовый функционал Черного списка


contract TokenWithBlackListAndFee {
    address public owner;
    mapping(address => bool) public BlackList;
    uint256 public BlackListFee;

    constructor(uint256 _fee) {
        owner = msg.sender;
        BlackListFee = _fee;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Only the owner can modify the BlackList");
        _;
    }

    function addToBlackListWithFee(address _account) public payable onlyOwner {
        require(msg.value >= BlackListFee, "Insufficient fee");
        BlackList[_account] = true;
    }

    function removeFromBlackList(address _account) public onlyOwner {
        BlackList[_account] = false;
    }
}

Советы по обнаружению:Ищите функции (например, addToBlacklist и removeFromBlacklist), имеющие модификаторы доступа (onlyOwner). Наличие подобных модификаторов означает, что только владелец (Owner) может изменять черный список.

common tips

Пример 2: Черный список с механизмом взимания платы (Blacklist with Fee)


contract TokenWithBlackListAndFee {
    address public owner;
    mapping(address => bool) public BlackList;
    uint256 public BlackListFee;

    constructor(uint256 _fee) {
        owner = msg.sender;
        BlackListFee = _fee;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Only the owner can modify the BlackList");
        _;
    }

    function addToBlackListWithFee(address _account) public payable onlyOwner {
        require(msg.value >= BlackListFee, "Insufficient fee");
        BlackList[_account] = true;
    }

    function removeFromBlackList(address _account) public onlyOwner {
        BlackList[_account] = false;
    }
}

Советы по обнаружению:Определите функции (например, addToBlacklistWithFee), которые требуют взимания платы (msg.value) для внесения в черный список. Это является очень опасным сигналом.

Пример 3: Черный список с условиями, зависящими от времени


contract TokenWithTimeLock {
    address public owner;
    mapping(address => bool) public BlackList;
    uint256 public BlackListTimeLock;

    constructor(uint256 _timeLock) {
        owner = msg.sender;
        BlackListTimeLock = _timeLock;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Only the owner can modify the BlackList");
        _;
    }

    function addToBlackListTimed(address _account) public onlyOwner {
        require(block.timestamp >= BlackListTimeLock, "Time lock not yet expired");
        BlackList[_account] = true;
    }

    function removeFromBlackList(address _account) public onlyOwner {
        BlackList[_account] = false;
    }
}

Советы по обнаружению:Определите функции (например, addToBlacklistTimed), которые накладывают на черный список условия, зависящие от времени блока. Обычно это используется для составления черных списков с задержкой или по расписанию.

Пример 4: Черный список с регистрацией событий (Events)


contract TokenWithBlackListAndEvents {
    address public owner;
    mapping(address => bool) public BlackList;

    event AddressAddedToBlackList(address indexed account);
    event AddressRemovedFromBlackList(address indexed account);

    constructor() {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Only the owner can modify the BlackList");
        _;
    }

    function addToBlackList(address _account) public onlyOwner {
        BlackList[_account] = true;
        emit AddressAddedToBlackList(_account);
    }

    function removeFromBlackList(address _account) public onlyOwner {
        BlackList[_account] = false;
        emit AddressRemovedFromBlackList(_account);
    }
}

Советы по обнаружению:Ведение журнала событий: Ищите события, которые регистрируют действия по внесению в черный список. События обеспечивают прозрачность и очень важны для мониторинга действий по контракту. Можно сказать, что это самый безопасный вид BlackList поскольку разработчики не прячут эту функцию, а открыто регистрируют все ее вызовы в журналах событий.

Пример 5: Черный список с функцией белого списка (Whitelist)


contract TokenWithBlackListAndWhitelist {
    address public owner;
    mapping(address => bool) public BlackList;
    mapping(address => bool) public whitelist;

    constructor() {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Only the owner can modify the lists");
        _;
    }

    function addToBlackList(address _account) public onlyOwner {
        BlackList[_account] = true;
    }

    function removeFromBlackList(address _account) public onlyOwner {
        BlackList[_account] = false;
    }

    function addToWhitelist(address _account) public onlyOwner {
        whitelist[_account] = true;
    }

    function removeFromWhitelist(address _account) public onlyOwner {
        whitelist[_account] = false;
    }
}

Советы по обнаружению:Функциональность "белого списка": Обращайте внимание на контракты, в которых одновременно присутствуют функции "черного" и "белого" списков. Такая двойная функциональность может иметь последствия для передачи токенов без ведома их владельца или других мошеннических действий.

common tips

Пример 6: Черный список с контролем управления (Governance Control)


interface Governance {
    function canBlackList(address _caller) external view returns (bool);
}

contract TokenWithGovernanceControl {
    address public owner;
    address public governanceContract;
    mapping(address => bool) public BlackList;

    constructor(address _governanceContract) {
        owner = msg.sender;
        governanceContract = _governanceContract;
    }

    modifier onlyOwnerOrGovernance() {
        require(msg.sender == owner || Governance(governanceContract).canBlackList(msg.sender), "Not authorized");
        _;
    }

    function addToBlackListGoverned(address _account) public onlyOwnerOrGovernance {
        BlackList[_account] = true;
    }

    function removeFromBlackList(address _account) public onlyOwnerOrGovernance {
        BlackList[_account] = false;
    }
}

Советы по обнаружению:Определите контракты, в которых действия по составлению черных списков подлежат контролю со стороны внешних управляющих контрактов. При рассмотрении смарт-контракта внимательно проанализируйте код, обращая внимание на контроль доступа, механизмы оплаты, условия, зависящие от времени, регистрацию событий, защиту от обхода и другие важные факторы. Кроме того, при оценке последствий использования функции черного списка учитывайте специфику проекта и его цели.

Пример 7: Черный список с аварийной паузой (Emergency Stop)


contract TokenWithEmergencyStop {
    address public owner;
    bool public emergencyStop;
    mapping(address => bool) public BlackList;

    constructor() {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Only the owner can modify the BlackList");
        _;
    }

    modifier whenNotPaused() {
        require(!emergencyStop, "Contract is paused");
        _;
    }

    function addToBlackList(address _account) public onlyOwner whenNotPaused {
        BlackList[_account] = true;
    }

    function removeFromBlackList(address _account) public onlyOwner whenNotPaused {
        BlackList[_account] = false;
    }

    function toggleEmergencyStop() public onlyOwner {
        emergencyStop = !emergencyStop;
    }
}

Советы по обнаружению:Механизм аварийной паузы может приостановить работу некоторых функций, включая изменения в черном списке.

Пример 8: Черный список с динамическими условиями


contract TokenWithDynamicBlackList {
    address public owner;
    mapping(address => bool) public BlackList;

    constructor() {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Only the owner can modify the BlackList");
        _;
    }

    function conditionallyBlackList(address _account, uint256 _threshold) public onlyOwner {
        require(getBalance(_account) < _threshold, "Account balance exceeds threshold");
        BlackList[_account] = true;
    }

    function removeFromBlackList(address _account) public onlyOwner {
        BlackList[_account] = false;
    }
}

Советы по обнаружению:Часто черный список может быть составлен на основе определенных условий или событий. Внимательно изучайте функции, которые проверяются перед активацией Черного списка. В этих функциях содержится логика добавления владельца в Черный список, в данном примере условие добавления - баланс аккаунта выше заданного порогового значения.

Пример 9: Черный список с удалением по времени (Time-Locked Removal)


contract TokenWithTimeLockedRemoval {
    address public owner;
    mapping(address => bool) public BlackList;
    mapping(address => uint256) public removalTimeLock;

    constructor() {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Only the owner can modify the BlackList");
        _;
    }

    function addToBlackList(address _account) public onlyOwner {
        BlackList[_account] = true;
        removalTimeLock[_account] = block.timestamp + 7 days;
    }

    function removeFromBlackList(address _account) public onlyOwner {
        require(block.timestamp >= removalTimeLock[_account], "Time lock not expired");
        BlackList[_account] = false;
        removalTimeLock[_account] = 0;
    }
}

Советы по обнаружению:Выявляйте контракты, в которых удаление из черного списка ограничено по времени. Часто в таких случаях используются расчеты времени, основанных на block.timestamp.

Пример 10: Черный список с лимитами по газу (Gas Limit Protection)


contract TokenWithGasLimitProtection {
    address public owner;
    mapping(address => bool) public BlackList;

    constructor() {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Only the owner can modify the BlackList");
        _;
    }

    modifier limitGas() {
        require(gasleft() >= 100000, "Insufficient gas");
        _;
    }

    function addToBlackListGasLimited(address _account) public onlyOwner limitGas {
        BlackList[_account] = true;
    }

    function removeFromBlackList(address _account) public onlyOwner {
        BlackList[_account] = false;
    }
}

Советы по обнаружению:Определите контракты, в которых определенные функции, например, составление черного списка, зависят от лимитов газа.

common tips

Пример 11: Черный список с внешней интеграцией с Оракулом (Oracle)


interface Oracle {
    function isBlackListed(address _account) external view returns (bool);
}

contract TokenWithOracleIntegration {
    address public owner;
    Oracle public oracle;

    constructor(address _oracleAddress) {
        owner = msg.sender;
        oracle = Oracle(_oracleAddress);
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Only the owner can modify the BlackList");
        _;
    }

    function addToBlackListByOracle(address _account) public onlyOwner {
        require(oracle.isBlackListed(_account), "Oracle did not confirm BlackListing");
    }
}

Советы по обнаружению:Будьте внимательны к контрактам, которые при принятии решений о внесении в черный список полагаются на внешние Оракулы. Всегда проверяйте надежность и прозрачность Оракулов, которые использует смарт-контракт.

Пример 12: Черный список с взаимодействием с внешним контрактом


interface ExternalContract {
    function addToBlackList(address _account) external;
    function removeFromBlackList(address _account) external;
}

contract TokenWithExternalInteraction {
    address public owner;
    ExternalContract public externalContract;

    constructor(address _externalContract) {
        owner = msg.sender;
        externalContract = ExternalContract(_externalContract);
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Only the owner can modify the BlackList");
        _;
    }

    function addToBlackListExternal(address _account) public onlyOwner {
        externalContract.addToBlackList(_account);
    }

    function removeFromBlackListExternal(address _account) public onlyOwner {
        externalContract.removeFromBlackList(_account);
    }
}            

Советы по обнаружению:При принятии решений о внесении в черный список будьте внимательны к контрактам, которые взаимодействуют с внешними контрактами, особенно если исходный код внешнего контракта не верифицирован.

Пример 13: Черный список с динамическим порогом (Dynamic Threshold)


contract TokenWithDynamicThreshold {
    address public owner;
    mapping(address => bool) public BlackList;
    uint256 public dynamicThreshold;

    constructor(uint256 _initialThreshold) {
        owner = msg.sender;
        dynamicThreshold = _initialThreshold;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Only the owner can modify the BlackList");
        _;
    }

    function addToBlackListDynamicThreshold(address _account) public onlyOwner {
        require(getBalance(_account) > dynamicThreshold, "Account balance is below threshold");
        BlackList[_account] = true;
    }

    function removeFromBlackList(address _account) public onlyOwner {
        BlackList[_account] = false;
    }

    function updateDynamicThreshold(uint256 _newThreshold) public onlyOwner {
        dynamicThreshold = _newThreshold;
    }
}

Советы по обнаружению:Выявляйте контракты, в которых порог включения в черный список является динамическим и может быть установлен владельцем с течением времени (с помощью вызова определенных методов контракта).

Общие советы по выявлению функций Черного списка (BlackList)

  1. Ищите функции, изменяющие список адресов (mapping):
    Изучите код смарт-контракта, чтобы выявить те функции, которые изменяют список адресов, например, добавляют или удаляют адреса.

  2. Проверьте наличие доступа только для владельца (Owner):
    Функции черного списка часто имеют ограничения доступа, позволяющие выполнять их только владельцу контракта или администраторам. Ищите использование модификатора onlyOwner или аналогичных механизмов контроля доступа.

  3. Проверьте функцию-конструктор constructor():
    Функция-конструктор задает начальное состояние контракта. Проверьте, не инициализируются ли в конструкторе какие-либо адресные связки или списки, что указывает на наличие черного списка.

  4. Изучите логику модификаторов:
    Проанализируйте логику модификаторов типа onlyOwner, чтобы понять, при каких условиях могут выполняться функции, связанные с черным списком.

  5. Поиск ключевых терминов:
    Найдите в коде смарт-контракта такие ключевые слова, как "blacklist", "addBlacklist", "removeBlacklist" или аналогичные термины (в самых простых случаях эти функции имеют подобные названия, в более сложных вариантах названия могут не отображать суть функции, чтобы замаскировать ее).

  6. Проверьте документацию и комментарии:
    Просмотрите документацию и комментарии к контракту на предмет упоминания функций, связанных с черными списками. Разработчики часто предоставляют информацию о том, как следует использовать те или иные функции, включая черный список.

  7. Проверьте внешние вызовы (call) или события (event):
    Ищите внешние вызовы или события, которые могут быть инициированы при добавлении адреса в черный список или его удалении. Это может дать представление о том, как контракт взаимодействует с внешними компонентами на основе действий, связанных с черным списком.

  8. Оцените возможности обновления и управления кодом контракта:
    Оцените смарт-контракт на предмет наличия механизмов обновления или структур управления, позволяющих вносить изменения в логику его работы с черным списком. Понимание того, как осуществляется управление обновлениями, очень важно для прогнозирования потенциальных изменений в функциональности черных списков.

  9. Проверяйте логику черного списка в других функциях:
    Изучите другие функции контракта на предмет наличия проверок, позволяющих определить, находится ли адрес в черном списке, перед выполнением определенных действий.

  10. Рассмотрите сценарии использования и токеномику:
    Разберитесь в сценариях использования и токеномике проекта. Если проект связан с управлением адресами пользователей или имеет функции, связанные с правами пользователей, то, возможно, есть причина для включения черного списка.

  11. Регистрация событий:
    Обратите внимание на наличие журнала событий, связанных с действиями по созданию черного списка. События часто используются для регистрации значительных изменений состояния, обеспечивая прозрачность поведения контракта.

  12. Защита от ограничения газа:
    С осторожностью относитесь к функциям, имеющим защиту от превышения лимита газа. Хотя это может быть реализация функции безопасности, она также может использоваться для контроля или ограничения выполнения некоторых критически важных функций контракта.

  13. Зависимые от времени условия:
    Проверьте наличие зависящих от времени условий, связанных с внесением в черный список. Например, в контрактах могут быть реализованы временные блокировки на удаление или другие механизмы, чувствительные к времени.

  14. Независимые аудиты:
    Ищите смарт-контракты, прошедшие независимый аудит со стороны авторитетных аудиторских фирм. Аудиторские отчеты дают представление о безопасности и функциональности контракта.

  15. Изучите отзывы сообщества:
    Проверьте форумы сообщества, социальные сети или официальные каналы связи на предмет обсуждения наличия и использования функции черного списка. Пользователи могут высказать ценные соображения и опасения.

common tips

При анализе смарт-контракта крайне важно иметь полное представление о его особенностях и функциональных возможностях. Приведенные советы помогут выявить и оценить наличие функции черного списка, что позволит принимать взвешенные решения о взаимодействии с контрактом.

По возможности выбирайте контракты, соответствующие устоявшимся стандартам (например, ERC-20). Эти стандарты часто подвергаются тщательной проверке и имеют репутацию надежных.

 

Надеемся, что эти примеры помогли Вам лучше разобраться со схемами Черных списков (BlackList) в смарт-контрактах.

 

Поскольку вся информация в блокчейне открыта (конечно, при условии верифицированного исходного кода контракта), то вооружившись этими знаниями Вы можете самостоятельно изучать смарт-контракты и выявлять различные схемы скама.

Однако, мы все уже сделали за Вас! Подключайте премиум подписку и откройте для себя доступ к эксклюзивным фильтрам по функциям смарт-контрактов и свежую аналитику. Повысьте шансы на успешные инвестиции в прибыльные токены.

С уважением, команда Lotus Market.

All posts

Connect to a wallet

Metamask