Análisis de smart contracts
23.01.2024

Contratos inteligentes con la función BlackList

Continuamos la serie de artículos dedicados a la descripción de esquemas fraudulentos en los contratos inteligentes. Hoy analizaremos los contratos inteligentes con la función Lista Negra (BlackList).

Los peligros de los contratos inteligentes con la función BlackList:

Los contratos inteligentes que incluyen una función de Lista Negra conllevan ciertos riesgos y problemas tanto para el proyecto como para sus usuarios. Éstos son algunos de los peligros asociados a las funciones de lista negra:

  1. Control centralizado: Las funciones de lista negra suelen proporcionar un control centralizado al propietario del contrato o a los administradores.

  2. Abuso de la lista negra para prácticas desleales: Los abusadores (incluido el titular del contrato), pueden utilizar la lista negra para dirigirse a direcciones específicas. Esto puede incluir la congelación o restricción de la funcionalidad de las cuentas sin motivo justificado.

  3. Falta de transparencia: La presencia de una función de lista negra, sobre todo si no está documentada, puede provocar falta de transparencia. Los usuarios pueden desconocer los criterios de la lista negra o el procedimiento de la misma.

  4. Riesgos de seguridad: Si BlackList no se implementa de forma segura, existe el riesgo de que se produzcan vulnerabilidades que permitan a personas no autorizadas manipular la lista negra, lo que podría dar lugar a la congelación o transferencia no autorizada de fondos.

  5. Desconfianza de los usuarios: La existencia de una función de lista negra puede minar la confianza de los usuarios, ya que sus activos pueden incluirse en una lista negra sin reglas claras.

  6. Confiscación de tokens: Los atacantes pueden utilizar una lista negra para confiscar tokens o activos de determinadas direcciones sin la debida justificación. Esto puede provocar importantes pérdidas económicas.

¿Cómo puedes determinar de forma independiente si tales amenazas están presentes en los contratos inteligentes?

Al validar un contrato inteligente, se pueden dar ciertos pasos para determinar si existe una amenaza asociada a las características de la lista negra:

  • Antes de empezar a trabajar con un contrato inteligente, lee y estudia detenidamente su código, incluidas las funciones relacionadas con las listas negras. Busca funciones relacionadas con la creación de listas negras, la congelación o la restricción de la funcionalidad de las cuentas. Comprueba si hay funciones que te permitan añadir o eliminar direcciones de la lista negra.

  • Analiza quién tiene la propiedad o el control administrativo del contrato. Evalúa el grado de control y los derechos asociados al propietario o a los administradores.

  • Examina la documentación del contrato para entender cómo se pretende utilizar la función de lista negra. Busca información sobre los mecanismos de gobernanza que controlan el uso de la lista negra.

  • Evalúa la transparencia: ¿garantiza el contrato que los criterios de la lista negra son transparentes? Comprueba si existen procedimientos claros para eliminar falsos positivos o eliminar direcciones de la lista negra.

  • Auditorías de seguridad: comprueba si el contrato inteligente ha sido sometido a auditorías de seguridad por parte de empresas externas de confianza.

  • Familiarízate con los comentarios de la comunidad o de los foros online sobre el uso de listas negras en el proyecto. Mantente alerta ante cualquier señal de alarma que planteen los miembros de la comunidad sobre prácticas desleales o falta de transparencia.

  • Si realizas un análisis exhaustivo y tienes en cuenta los factores anteriores, podrás evaluar mejor los riesgos asociados a las funciones de lista negra en los contratos inteligentes. Mantente al día de las últimas novedades en nuestra comunidad (canal de Telegram) y de las mejores prácticas para la detección del fraude (nuestro Blog y canal de YouTube).

 

Buenas noticias: nuestro Escáner de Seguridad encuentra todos los elementos comunes (incluidos los ocultos) de la Lista Negra (BlackList) el 99,9% de las veces. Utiliza nuestra suscripción Premium y protege tus fondos de las amenazas.

 

A continuación, veremos algunos de los ejemplos más comunes de la función BlackList que nuestra Plataforma detecta con éxito.

Ten en cuenta que se trata de ejemplos simplificados y que la implementación real puede diferir. Al analizar los contratos inteligentes, siempre debes realizar una revisión exhaustiva del código y tener en cuenta los factores dependientes del contexto.

Ejemplo 1: Funcionalidad básica de la Lista Negra


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;
    }
}

Consejos para la detección:Busca funciones (por ejemplo, addToBlackList y removeFromBlackList) que tengan modificadores de acceso (onlyOwner). La presencia de dichos modificadores significa que sólo el Propietario puede modificar la lista negra.

common tips

Ejemplo 2: Mecanismo de Lista Negra con Cuota (BlackList con Cuota)


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;
    }
}

Consejos para la detección:Define funciones (como addToBlackListWithFee) que requieran un cargo (msg.value) para estar en la lista negra. Esta es una señal muy peligrosa.

Ejemplo 3: Lista negra con condiciones dependientes del tiempo


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;
    }
}

Consejos para la detección:Define funciones (por ejemplo, addToBlackListTimed) que impongan a la lista negra condiciones dependientes del tiempo de bloqueo. Esto se utiliza normalmente para listas negras retrasadas o programadas.

Ejemplo 4: Lista negra con registro de eventos


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);
    }
}

Consejos para la detección:Registro de eventos: Busca eventos que registren acciones de listas negras. Los eventos proporcionan transparencia y son muy importantes para controlar las acciones de los contratos. Se podría decir que éste es el tipo más seguro de BlackList porque los desarrolladores no ocultan esta función, sino que registran abiertamente todas sus llamadas en los registros de eventos.

Ejemplo 5: Lista negra con función de lista blanca (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;
    }
}

Consejos para la detección:Funcionalidad de lista blanca: Presta atención a los contratos que tienen funcionalidad de lista negra y lista blanca al mismo tiempo. Esta doble funcionalidad puede tener implicaciones para las transferencias de tokens sin el conocimiento del propietario u otras actividades fraudulentas.

common tips

Ejemplo 6: Lista negra con Control de Gobernanza (Control de Gobernanza)


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;
    }
}

Consejos para la detección:Identifica los contratos en los que las actividades de listas negras están sujetas al control de gestores de contratos externos. Cuando consideres un contrato inteligente, analiza cuidadosamente el código, prestando atención a los controles de acceso, los mecanismos de pago, los términos y condiciones dependientes del tiempo, el registro de eventos, las protecciones antielusión y otros factores importantes. Además, ten en cuenta las particularidades del proyecto y sus objetivos cuando evalúes las implicaciones de utilizar la función de lista negra.

Ejemplo 7: Lista negra con parada de emergencia


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;
    }
}

Consejos para la detección:El mecanismo de pausa por colisión puede pausar algunas funciones, incluidos los cambios en la lista negra.

Ejemplo 8: Lista negra con condiciones dinámicas


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;
    }
}

Consejos para la detección:A menudo, las listas negras pueden basarse en determinadas condiciones o acontecimientos. Estudia detenidamente las funciones que se comprueban antes de activar la Lista Negra. Estas funciones contienen la lógica para añadir al propietario a la Lista Negra, en este ejemplo la condición para añadir es que el saldo de la cuenta esté por encima del umbral especificado.

Ejemplo 9: Lista Negra con Eliminación por Tiempo (Eliminación por Tiempo)


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;
    }
}

Consejos para la detección:Identificar los contratos en los que la eliminación de la lista negra está limitada en el tiempo. A menudo, en estos casos, se utilizan cálculos de tiempo basados en block.timestamp.

Ejemplo 10: Lista Negra con Protección de Límite de Gas (Protección de Límite de Gas)


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;
    }
}

Consejos para la detección:Identifica los contratos en los que determinadas funciones, como las listas negras, están sujetas a límites de gas.

common tips

Ejemplo 11: Lista negra con integración externa con Oracle (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");
    }
}

Consejos para la detección:Ten cuidado con los contratos que dependen de Oráculos externos para tomar decisiones sobre listas negras. Comprueba siempre la fiabilidad y transparencia de los Oráculos que utiliza un contrato inteligente.

Ejemplo 12: Lista negra con interacción con un contrato externo


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);
    }
}            

Consejos para la detección:Al tomar decisiones sobre listas negras, ten cuidado con los contratos que interactúan con contratos externos, sobre todo si no se verifica el código fuente del contrato externo.

Ejemplo 13: Lista negra con umbral dinámico (Umbral dinámico)


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;
    }
}

Consejos para la detección:Identificar los contratos en los que el umbral de la lista negra es dinámico y puede ser fijado por el propietario a lo largo del tiempo (llamando a determinados métodos del contrato).

Consejos generales para identificar las características de la Lista Negra (BlackList)

  1. Busca funciones que modifiquen la lista de direcciones (mapeo):
    Examina el código del contrato inteligente para identificar las funciones que modifican la lista de direcciones, como añadir o eliminar direcciones.

  2. Comprueba el acceso sólo para propietarios:
    Las funciones de la lista negra suelen tener restricciones de acceso que permiten que sólo las ejecute el propietario del contrato o los administradores. Busca el uso del modificador onlyOwner o mecanismos similares de control de acceso.

  3. Comprueba la función constructora constructor():
    La función constructora especifica el estado inicial del contrato. Comprueba si algún enlace o lista de direcciones no se inicializa en el constructor, lo que indica la presencia de una lista negra.

  4. Examina la lógica de los modificadores:
    Analiza la lógica de los modificadores de tipo onlyOwner para saber en qué condiciones se pueden realizar funciones relacionadas con las listas negras.

  5. Busca términos clave:
    Busca palabras clave como "BlackList", "addBlackList", "removeBlackList" o términos similares en el código del contrato inteligente (en los casos más sencillos estas funciones tienen nombres similares, en variantes más complejas los nombres pueden no reflejar la esencia de la función para disfrazarla).

  6. Consulta la documentación y los comentarios:
    Revisa la documentación y los comentarios del contrato en busca de referencias a las funciones de la lista negra. Los desarrolladores suelen proporcionar información sobre cómo utilizar determinadas funciones, incluida la lista negra.

  7. Comprueba las llamadas externas (llamada) o los eventos (evento):
    Busca llamadas o eventos externos que puedan desencadenarse cuando una dirección se añade a la lista negra o se elimina de ella. Esto puede proporcionar información sobre cómo interactúa el contrato con componentes externos en función de las acciones de la lista negra.

  8. Evaluar las capacidades de actualización y gestión de los códigos contractuales:
    Evalúa el contrato inteligente para ver si existen mecanismos de actualización o estructuras de gobierno que permitan cambios en su lógica de listas negras. Comprender cómo se gestionan las actualizaciones es importante para anticipar posibles cambios en la funcionalidad de la lista negra.

  9. Comprueba la lógica de la lista negra en otras funciones:
    Examina otras características del contrato para ver si existen comprobaciones para determinar si una dirección está en la lista negra antes de realizar determinadas acciones.

  10. Considera los escenarios de uso y la tokenómica:
    Comprende los escenarios de uso y la tokenómica del proyecto. Si el proyecto está relacionado con la gestión de direcciones de usuarios o tiene funciones relacionadas con los derechos de los usuarios, puede haber una razón para activar la lista negra.

  11. Inscripción al acto:
    Observa la existencia de un registro de eventos asociado a las acciones de la lista negra. Los eventos se utilizan a menudo para registrar cambios de estado significativos, proporcionando transparencia al comportamiento del contrato.

  12. Protección contra la limitación de gas:
    Ten cuidado con las funciones que tienen protección contra el límite de gas. Aunque puede ser la implementación de una función de seguridad, también puede utilizarse para controlar o limitar el rendimiento de algunas funciones contractuales críticas.

  13. Condiciones dependientes del tiempo:
    Comprueba si hay condiciones sensibles al tiempo asociadas a las listas negras. Por ejemplo, los contratos pueden implementar bloqueos temporales en la eliminación u otros mecanismos sensibles al tiempo.

  14. Auditorías independientes:
    Busca contratos inteligentes que hayan sido auditados de forma independiente por empresas de auditoría acreditadas. Los informes de auditoría proporcionan información sobre la seguridad y funcionalidad del contrato.

  15. Explora las opiniones de la comunidad:
    Consulta los foros de la comunidad, las redes sociales o los canales de comunicación oficiales en busca de debates sobre la presencia y el uso de la función de inclusión en listas negras. Los usuarios pueden aportar ideas y preocupaciones valiosas.

common tips

Al analizar un contrato inteligente, es crucial conocer a fondo sus características y funcionalidad. Estos consejos te ayudarán a identificar y evaluar la presencia de una función de lista negra, permitiéndote tomar decisiones informadas sobre la interacción con el contrato.

Siempre que sea posible, elige contratos que cumplan las normas establecidas (por ejemplo, ERC-20). Estas normas suelen ser objeto de escrutinio y tienen fama de fiables.

 

Esperamos que estos ejemplos te hayan ayudado a comprender mejor los esquemas de Lista Negra (BlackList) en los contratos inteligentes.

 

Dado que toda la información de la cadena de bloques es abierta (siempre que, por supuesto, se verifique el código fuente del contrato), armado con este conocimiento puedes estudiar de forma independiente los contratos inteligentes e identificar diversas estafas.

Sin embargo, ¡ya lo hemos hecho todo por ti! Regístrate para obtener una suscripción Premium y accede a filtros exclusivos sobre las características de los contratos inteligentes y a nuevos análisis. Aumenta tus posibilidades de invertir con éxito en tokens rentables.

Saludos, equipo de Lotus Market.

All posts

Connect to a wallet

Metamask