Rapporto di audit del contratto intelligente per Dimo

Sommario di gestione

Dimo ha contattato Sayfer per eseguire un controllo di sicurezza sul loro contratto intelligente.

Questo rapporto documenta la ricerca condotta da Sayfer mirata alle risorse selezionate definite nell'ambito della ricerca. In particolare, questo rapporto mostra la revisione della posizione di sicurezza per il contratto intelligente di Dimo.

Durante il periodo di ricerca di 40 ore di ricerca, abbiamo scoperto 14 vulnerabilità nel contratto. Nessuno di loro è critico.

In conclusione, a seguito del rapporto dovrebbero essere implementate diverse soluzioni, ma il livello di sicurezza del sistema è adeguato.

Dopo una revisione da parte del team Sayfer, certifichiamo che tutti i problemi di sicurezza menzionati in questo rapporto sono stati risolti dal team Dimo.

Metodologia del rischio

Noi di Sayfer ci impegniamo a fornire ai nostri clienti audit di contratti intelligenti della massima qualità. Ecco perché abbiamo implementato un modello completo di valutazione del rischio per valutare la gravità dei nostri risultati e fornire ai nostri clienti le migliori raccomandazioni possibili per la mitigazione.

Il nostro modello di valutazione del rischio si basa su due fattori chiave: IMPATTO ed PROBABILITÀ. L'impatto si riferisce al danno potenziale che potrebbe derivare da un problema, come una perdita finanziaria, un danno alla reputazione o un sistema non operativo. La probabilità si riferisce alla probabilità che si verifichi un problema, tenendo conto di fattori quali la complessità del contratto e il numero di potenziali aggressori.

Combinando questi due fattori, possiamo creare una comprensione completa del rischio posto da un particolare problema e fornire ai nostri clienti una valutazione chiara e attuabile della gravità del problema. Questo approccio ci consente di dare priorità alle nostre raccomandazioni e garantire che i nostri clienti ricevano la migliore consulenza possibile su come proteggere i loro contratti intelligenti.

Il rischio è definito come segue:

Vulnerabilità per rischio

Alta – Minaccia diretta ai processi aziendali chiave.
Medio – Minaccia indiretta ai processi aziendali chiave o minaccia parziale ai processi aziendali.
Basso – Non esiste alcuna minaccia diretta. La vulnerabilità può essere sfruttata utilizzando altre vulnerabilità.
Informativo – Questo risultato non indica vulnerabilità, ma riporta un commento che segnala difetti di progettazione e implementazione impropria che potrebbero causare problemi a lungo termine.

Gravità
# di problemi
Alta
3
Medio
1
Basso
5
Informativo
5
critico
0

Approccio

Introduzione

Dimo ha contattato Sayfer per eseguire un controllo di sicurezza sul loro contratto intelligente.

Questo rapporto documenta la ricerca condotta da Sayfer mirata alle risorse selezionate definite nell'ambito della ricerca. In particolare, questo rapporto mostra la revisione del livello di sicurezza per i contratti sopra menzionati.

Panoramica dell'ambito

Insieme al team del cliente abbiamo definito il seguente contratto come ambito del progetto.
Commit hash: 14ce58aa499e3672fb0b61da13948a6ea51fb879

 

Contratto Sha-256
Premio.sol 86cffc0108ebe977ac55650da60cccc5f790013332186a2cb4dab47d7d38ac87

 

I nostri test sono stati eseguiti nel gennaio 2024.

Non lasciare che sia troppo tardi!

Inizia la tua verifica con Sayfer

Convalida dell'ambito

Abbiamo iniziato assicurandoci che l'ambito definitoci dal cliente fosse tecnicamente logico.
Decidere quale ambito è giusto per un dato sistema fa parte della discussione iniziale.

Modello di minaccia

Abbiamo definito che la più grande minaccia attuale al sistema è la capacità degli utenti malintenzionati di rubare fondi dal contratto.

Non lasciare che sia troppo tardi!

Inizia la tua verifica con Sayfer

Panoramica del protocollo

Introduzione al protocollo

DIMO è una società IoT web3 che consente agli utenti e agli sviluppatori di attingere al ricco flusso di dati generato dai veicoli moderni. La sua soluzione è un ecosistema di proprietà degli utenti che consente ai conducenti di trarre vantaggi economici dai propri dati e rendere possibili applicazioni come assicurazioni parametriche, car sharing peer-to-peer e mercati di veicoli. La piattaforma decentralizzata offre inoltre agli sviluppatori la massima tranquillità, sapendo che il loro accesso ai dati non è soggetto ai capricci di un gatekeeper centralizzato. Questa soluzione è basata su Polygon.

Valutazione della sicurezza

I seguenti casi di test sono stati la linea guida durante l'audit del sistema. Questa lista di controllo è una versione modificata del SCSVS v1.2, con grammatica, chiarezza, concisione e criteri aggiuntivi migliorati. Dove c'è una lacuna nella numerazione è stato eliminato un criterio originario. I criteri contrassegnati da un asterisco sono stati aggiunti da noi.

Architettura, design e modellazione delle minacce

Architettura, design e modellazione delle minacce Nome del test
G1.2 Ogni modifica di progettazione introdotta è preceduta dalla modellazione delle minacce.
G1.3 La documentazione definisce in modo chiaro e preciso tutti i limiti di fiducia nel contratto (relazioni di fiducia con altri contratti e flussi di dati significativi).
G1.4 Il SCSVS, i requisiti di sicurezza o la politica è disponibile per tutti gli sviluppatori e i tester.
G1.5 Gli eventi per le operazioni (cambiamento di stato/cruciali per il business) sono definiti.
G1.6 Il progetto include un meccanismo in grado di interrompere temporaneamente le funzionalità sensibili in caso di attacco. Questo meccanismo non dovrebbe bloccare l'accesso degli utenti alle loro risorse (ad esempio token).
G1.7 La quantità di criptovalute inutilizzate conservate sul contratto è controllata e al livello minimo accettabile in modo da non diventare un potenziale bersaglio di un attacco.
G1.8 Se la funzione di fallback può essere richiamata da chiunque, è inclusa nel modello di minaccia.
G1.9 La logica aziendale è coerente. Importanti cambiamenti nella logica dovrebbero essere applicati a tutti i contratti.
G1.10 Per rilevare le vulnerabilità vengono utilizzati strumenti di analisi automatica del codice.
G1.11 Viene utilizzata l'ultima major release di Solidity.
G1.12 Quando si utilizza un'implementazione esterna di un contratto, viene utilizzata la versione più recente.
G1.13 Quando le funzioni vengono sovrascritte per estendere la funzionalità, la parola chiave super viene utilizzata per mantenere la funzionalità precedente.
G1.14 L'ordine di eredità è accuratamente specificato.
G1.15 È presente un componente che monitora l'attività del contratto utilizzando gli eventi.
G1.16 Il modello di minaccia include transazioni di balene.
G1.17 La perdita di una chiave privata non compromette la sicurezza dell'intero progetto.

Politiche e procedure

Politiche e procedure Nome del test
G2.2 La sicurezza del sistema è costantemente monitorata (es. il livello previsto di fondi).
G2.3 Esiste una politica per tenere traccia delle nuove vulnerabilità di sicurezza e per aggiornare le librerie all'ultima versione sicura.
G2.4 Il dipartimento di sicurezza può essere contattato pubblicamente e che la procedura per la gestione dei bug segnalati (ad es. bug bounty completa) sia ben definita.
G2.5 Il processo di aggiunta di nuovi componenti al sistema è ben definito.
G2.6 Il processo delle principali modifiche al sistema prevede la modellazione delle minacce da parte di un'azienda esterna.
G2.7 Il processo di aggiunta e aggiornamento dei componenti al sistema include un controllo di sicurezza da parte di un'azienda esterna.
G2.8 In caso di hack, è in atto una procedura di mitigazione chiara e ben nota.
G2.9 La procedura in caso di hack definisce chiaramente quali persone devono eseguire le azioni richieste.
G2.10 La procedura include allarmare altri progetti sull'hacking attraverso canali attendibili.
G2.11 Viene definita una procedura di mitigazione della perdita di chiave privata.

Aggiornabilità

Aggiornabilità Nome del test
G3.2 Prima dell'aggiornamento, viene effettuata un'emulazione in un fork della rete principale e tutto funziona come previsto sulla copia locale.
G3.3 Il processo di aggiornamento viene eseguito da un contratto multisig in cui più di una persona deve approvare l'operazione.
G3.4 I timelock vengono utilizzati per operazioni importanti in modo che gli utenti abbiano il tempo di osservare i cambiamenti imminenti (si prega di notare che la rimozione di potenziali vulnerabilità in questo caso potrebbe essere più difficile).
G3.5 inizializzare() può essere chiamato una sola volta.
G3.6 inizializzare() può essere chiamato solo da un ruolo autorizzato tramite opportuni modificatori (es inizializzatore, onlyOwner).
G3.7 Il processo di aggiornamento viene eseguito in un'unica transazione in modo che nessuno possa eseguirlo in anticipo.
G3.8 I contratti aggiornabili hanno spazi riservati sugli slot per impedire la sovrascrittura.
G3.9 Il numero di slot riservati (come intervallo) è stato ridotto in modo appropriato se sono state aggiunte nuove variabili.
G3.10 Non ci sono cambiamenti nell'ordine in cui vengono dichiarate le variabili di stato del contratto, né i loro tipi.
G3.11 I nuovi valori restituiti dalle funzioni sono gli stessi delle versioni precedenti del contratto (es proprietario(), saldoDi(indirizzo)).
G3.12 L'implementazione viene inizializzata.
G3.13 L'implementazione non può essere distrutta.

 

Logica di business

Logica di business Nome del test
G4.2 La logica del contratto e l'implementazione dei parametri del protocollo corrispondono alla documentazione.
G4.3 La business logic procede in un ordine sequenziale e non è possibile saltare i passaggi o eseguirli in un ordine diverso da quello progettato.
G4.4 Il contratto ha correttamente rispettato i limiti di business.
G4.5 La logica di business non si basa sui valori recuperati da contratti non attendibili (soprattutto quando sono presenti più chiamate allo stesso contratto in un singolo flusso).
G4.6 La logica aziendale non si basa sull'equilibrio del contratto (ad esempio, saldo == 0).
G4.7 Le operazioni sensibili non dipendono dai dati del blocco (ad es. blocco hash, timestamp).
G4.8 Il contratto utilizza meccanismi che mitigano gli attacchi di ordine delle transazioni (front-running) (ad esempio schemi di pre-commit).
G4.9 Il contratto non invia fondi automaticamente, ma consente agli utenti di prelevare fondi in transazioni separate.

Access Control

Access Control Nome del test
G5.2 Il principio del minimo privilegio è rispettato. Altri contratti dovrebbero poter accedere solo a funzioni e dati per i quali sono in possesso di specifica autorizzazione.
G5.3 I nuovi contratti con accesso al contratto verificato aderiscono automaticamente al principio dei diritti minimi. I contratti devono disporre di autorizzazioni minime o nulle fino a quando l'accesso alle nuove funzionalità non viene concesso in modo esplicito.
G5.4 Il creatore del contratto rispetta il principio del minimo privilegio ei suoi diritti seguono rigorosamente quelli delineati nella documentazione.
G5.5 Il contratto applica le regole di controllo degli accessi specificate in un contratto attendibile, in particolare se il controllo degli accessi lato client dApp è presente e potrebbe essere aggirato.
G5.6 Le chiamate a contratti esterni sono consentite solo se necessario.
G5.7 Il codice modificatore è chiaro e semplice. La logica non deve contenere chiamate esterne a contratti non attendibili.
G5.8 Tutti gli attributi degli utenti e dei dati utilizzati dai controlli di accesso sono conservati in contratti attendibili e non possono essere manipolati da altri contratti se non specificamente autorizzati.
G5.9 I controlli di accesso falliscono in modo sicuro, anche quando si verifica un ripristino.
G5.10 Se l'input (parametri della funzione) viene convalidato, ove possibile viene utilizzato l'approccio di convalida positiva (whitelisting).

Comunicazione

Comunicazione Nome del test
G6.2 Vengono identificate le librerie che non fanno parte dell'applicazione (ma su cui si basa il contratto intelligente per funzionare).
G6.3 La chiamata delegata non viene utilizzata con contratti non attendibili.
G6.4 I contratti di terze parti non nascondono funzioni speciali (ad es. Revert).
G6.5 Il contratto non controlla se l'indirizzo è un contratto che utilizza il codice operativo extcodesize.
G6.6 Gli attacchi di rientro vengono mitigati bloccando le chiamate ricorsive da altri contratti e seguendo il modello Check-Effects-Interactions. Non utilizzare la funzione di invio a meno che non sia indispensabile.
G6.7 Il risultato di chiamate di funzioni di basso livello (ad es invia, delegachiama, chiama) da altri contratti è controllato.
G6.8 Il contratto si basa sui dati forniti dal mittente corretto e non si basa sul valore tx.origin.

Aritmetica

Aritmetica Nome del test
G7.2 I valori e le operazioni matematiche sono resistenti agli overflow di numeri interi. Utilizza la libreria SafeMath per le operazioni aritmetiche prima della solidità 0.8.*.
G7.3 I frammenti di codice non controllati da Solidity ≥ 0.8.* non introducono under/overflow di numeri interi.
G7.4 I valori estremi (es. valori massimi e minimi del tipo di variabile) sono considerati e non modificano il flusso logico del contratto
G7.5 La disuguaglianza non rigorosa viene utilizzata per l'uguaglianza di equilibrio.
G7.6 Nei calcoli vengono utilizzati gli ordini di grandezza corretti.
G7.7 Nei calcoli, la moltiplicazione viene eseguita prima della divisione per la precisione.
G7.8 Il contratto non presuppone la precisione a virgola fissa e utilizza un moltiplicatore o memorizza sia il numeratore che il denominatore.

Denial of Service

Denial of Service Nome del test
G8.2 Il contratto non esegue iterazioni su cicli non associati.
G8.3 La funzionalità di autodistruzione viene utilizzata solo se necessario. Se è incluso nel contratto, dovrebbe essere chiaramente descritto nella documentazione.
G8.4 La business logic non è bloccata se un attore (es. contratto, account, oracolo) è assente.
G8.5 La logica aziendale non disincentiva gli utenti a utilizzare i contratti (ad esempio, il costo della transazione è superiore al profitto).
G8.6 Le espressioni di funzioni assert o require hanno una variante passante.
G8.7 Se la funzione di fallback non è richiamabile da nessuno, non sta bloccando le funzionalità del contratto.
G8.8 Non ci sono operazioni costose in un ciclo.
G8.9 Non ci sono chiamate a contratti non attendibili in un ciclo.
G8.10 Se esiste la possibilità di sospendere l'esecuzione del contratto, è anche possibile riprenderlo.
G8.11 Se vengono utilizzate whitelist e blacklist, non interferiscono con il normale funzionamento del sistema.
G8.12 Non ci sono DoS causati da overflow e underflow.

Dati Blockchain

Dati Blockchain Nome del test
G9.2 Qualsiasi dato salvato nei contratti non è considerato sicuro o privato (anche variabili private).
G9.3 Nessun dato riservato viene memorizzato nella blockchain (password, dati personali, token ecc.).
G9.4 I contratti non utilizzano valori letterali stringa come chiavi per i mapping. Le costanti globali vengono utilizzate invece per prevenire l'attacco Homoglyph.
G9.5 Il contratto non genera banalmente numeri pseudocasuali basati sulle informazioni dalla blockchain (ad esempio seeding con il numero del blocco).

Utilizzo e limitazioni del gas

Utilizzo e limitazioni del gas Nome del test
G10.1 L'utilizzo del gas è previsto, definito e ha limiti chiari che non possono essere superati. Sia la struttura del codice che l'input dannoso non dovrebbero causare l'esaurimento del gas.
G10.2 L'esecuzione e la funzionalità della funzione non dipendono dalle tariffe del gas codificate (sono destinate a variare).

Chiarezza e leggibilità

Chiarezza e leggibilità Nome del test
G11.2 La logica è chiara e modularizzata in molteplici semplici contratti e funzioni.
G11.3 Ogni contratto ha un breve commento di 1-2 frasi che ne spiega lo scopo e la funzionalità.
G11.4 Vengono utilizzate implementazioni standard, questo è chiarito nel commento. Se queste implementazioni sono state modificate, le modifiche sono annotate in tutto il contratto.
G11.5 L'ordine di ereditarietà viene preso in considerazione nei contratti che utilizzano più funzioni di ereditarietà e shadow.
G11.6 Ove possibile, i contratti utilizzano codice testato esistente (ad esempio contratti token o meccanismi come possedibile) invece di implementarne uno proprio.
G11.7 Modelli di denominazione coerenti vengono seguiti durante tutto il progetto.
G11.8 Le variabili hanno nomi distintivi.
G11.9 Tutte le variabili di archiviazione vengono inizializzate.
G11.10 Le funzioni con il tipo restituito specificato restituiscono un valore di quel tipo.
G11.11 Vengono utilizzate tutte le funzioni e le variabili.
G11.12 richiedere è usato al posto di ritornare in if dichiarazioni.
G11.13 I affermare La funzione viene utilizzata per verificare la presenza di errori interni e il file richiedere La funzione viene utilizzata per garantire una condizione valida in ingresso da utenti e contratti esterni.
G11.14 Il codice assembly viene utilizzato solo se necessario.

Copertura del test

Copertura del test Nome del test
G12.2 Le narrazioni sugli abusi dettagliate nel modello di minaccia sono coperte da unit test
G12.3 Le funzioni sensibili nei contratti verificati sono coperte con test in fase di sviluppo.
G12.4 L'implementazione dei contratti verificati è stata verificata per le vulnerabilità della sicurezza utilizzando sia l'analisi statica che quella dinamica.
G12.5 Le specifiche del contratto sono state formalmente verificate
G12.6 La specifica ei risultati della verifica formale sono inclusi nella documentazione.

Finanza decentralizzata

Finanza decentralizzata Nome del test
G13.1 Il contratto del prestatore non presuppone che il suo saldo (utilizzato per confermare il rimborso del prestito) venga modificato solo con le proprie funzioni.
G13.2 Le funzioni che modificano il saldo dei prestatori e/o prestano criptovaluta non sono rientranti se lo smart contract consente di prendere in prestito la criptovaluta della piattaforma principale (ad es. Ethereum). Blocca gli attacchi che aggiornano il saldo del mutuatario durante l'esecuzione del prestito flash.
G13.3 Le funzioni di prestito flash possono chiamare solo funzioni predefinite sul contratto ricevente. Se possibile, definire un sottoinsieme attendibile di contratti da richiamare. Di solito, il contratto di invio (prestito) è quello da richiamare.
G13.4 Se include operazioni potenzialmente pericolose (ad es. restituzione di più ETH/token di quelli presi in prestito), la funzione del destinatario che gestisce ETH o token presi in prestito può essere richiamata solo dal pool e all'interno di un processo avviato dal proprietario del contratto ricevente o da un'altra fonte attendibile (ad es. multiseg).
G13.5 I calcoli della quota del pool di liquidità vengono eseguiti con la massima precisione possibile (ad esempio, se il contributo è calcolato per ETH dovrebbe essere fatto con una precisione di 18 cifre – per Wei, non Ether). Il dividendo va moltiplicato per 10 alla potenza del numero di cifre decimali (es. dividendo * 10^18 / divisore).
G13.6 I premi non possono essere calcolati e distribuiti all'interno della stessa chiamata di funzione che deposita i token (dovrebbe essere definita anche come non rientrante). Questo protegge dalle fluttuazioni momentanee delle azioni.
G13.7 I contratti di governance sono protetti dagli attacchi di prestiti flash. Una possibile tecnica di mitigazione è richiedere il processo di deposito dei token di governance e proporre una modifica da eseguire in transazioni diverse incluse in blocchi diversi.
G13.8 Quando si utilizzano oracoli su catena, i contratti sono in grado di sospendere le operazioni in base al risultato degli oracoli (in caso di oracolo compromesso).
G13.9 I contratti esterni (anche fidati) che sono autorizzati a modificare gli attributi di un contratto di progetto (es. prezzo del token) hanno le seguenti limitazioni implementate: soglie per la modifica (es. non più/meno del 5%) e un limite di aggiornamenti (es. un aggiornamento al giorno).
G13.10 Gli attributi del contratto che possono essere aggiornati dai contratti esterni (anche fidati) vengono monitorati (ad es. utilizzando gli eventi) e viene implementata una procedura di risposta agli incidenti (ad es. durante un attacco in corso).
G13.11 Operazioni matematiche complesse che consistono in operazioni sia di moltiplicazione che di divisione eseguono prima le moltiplicazioni e poi le divisioni.
G13.12 Quando si calcolano i prezzi di scambio (ad es. da ETH a token o viceversa), il numeratore e il denominatore vengono moltiplicati per le riserve (vedere il getInputPrice funzione nel ScambioUniswap contrarre).

 

Controllo dell'ordine da Sayfer





    Questo sito è protetto da reCAPTCHA e Google Informativa sulla Privacy ed Termini di Servizio applicare.

    Risultati dell'audit

    [H] La modifica dell'orario di Genesi può potenzialmente interrompere la distribuzione delle ricompense

    ID DIRE-01
    Stato dei servizi Fissa
    Rischio Alta
    Affari Impact rewardsGenesisTime è una variabile critica che traccia il momento in cui sono state avviate le ricompense e quindi governa la distribuzione delle ricompense.

    Il tasso di ricompensa continua a diminuire nel tempo, riducendosi lentamente all'85% del ciclo precedente in un momento futuro. Pertanto, reimpostare il tempo di genesi dopo l'inizio della distribuzione della ricompensa potrebbe interrompere l'intero schema.

    Dove – Premio.sol; resetRewardsGenesisTime()
    – Premio.sol; manualmenteImpostaRicompenseGenesisTime(uint256)

    Descrizione

    Cambiare rewardsGenesisTime più avanti nel ciclo avrà un impatto sulle variabili cruciali currentWeek e weekLimit e potrebbe potenzialmente rovinare l'intero schema di distribuzione delle ricompense e il suo programma previsto.

    Mitigazione

    Una possibile mitigazione è quella di rivedere queste funzioni in modo tale che il ripristino del tempo di genesi sia possibile solo prima dell'inizio della distribuzione della ricompensa:

     function resetRewardsGenesisTime() external onlyRole(ADMIN_ROLE) {
            require(dimoTotalSentOutByContract==0,"Reward Distribution already started");
            rewardsGenesisTime = block.timestamp;
      }

    Se è necessario reimpostare o modificare la variabile dopo il fatto, forse può essere gestito in modo controllato e prevedibile sulla catena, anziché consentire agli amministratori un controllo arbitrario.

     

    [H] Ritiro dell'amministratore non controllato

    ID DIRE-02
    Stato dei servizi Fissa
    Rischio Alta
    Impatto sul business Sebbene agli account amministratore per definizione venga data una certa fiducia, se vengono compromessi, possono essere utilizzati per prosciugare il contratto dei suoi fondi utilizzando questa funzione.
    Dove – Premio.sol; adminPrelievo(indirizzo, uint256)

    Descrizione

    La funzione adminWithdraw(address, uint256) consente agli amministratori di inviare fondi contrattuali agli utenti senza limitazioni. Secondo la documentazione, questo viene utilizzato se gli utenti inviano DIMO al contratto senza staking. Tuttavia, riteniamo che questa funzione possa essere soggetta ad abusi, come spiegato nella sezione sull'impatto aziendale.

    Mitigazione

    Un modo possibile per aumentare la sicurezza è inviare una richiesta per conto di un utente, magari utilizzando un account con il ruolo Oracle. Un amministratore deve quindi approvare la transazione. Ciò richiede almeno due account per approvare tali transazioni, fornendo un ulteriore livello di sicurezza.

     

    [H] Gli amministratori possono reimpostare il registro a piacimento

    ID DIRE-03
    Stato dei servizi Riconosciuto
    Rischio Alta
    Impatto sul business Il registro è il luogo in cui vengono archiviati i dati dell'utente e vengono eseguite le convalide. Se il registro viene reimpostato, gli utenti esistenti non riceveranno più i premi a meno che i dati non vengano migrati nel nuovo registro.
    Dove – Premio.sol; setRegistryContractAddress(indirizzo)

    Descrizione

    setRegistryContractAddress(address) consente agli amministratori di reimpostare l'indirizzo del registro a piacimento.

    Mitigazione

    Una soluzione è assicurarsi che questa funzione venga ripristinata a meno che il registro non sia impostato in primo luogo.

      function setRegistryContractAddress(
        address registryContractAddress
      ) external onlyRole(ADMIN_ROLE) {
        require(
            registryContractAddress != address(0),
            "registryContractAddress is an invalid zero address"
        );
        require(address(registry)==address(0)),"already set, cannot be set again")
        registry = IRegistry(registryContractAddress);
      }

    Un'altra soluzione è impostare una procedura di migrazione dei dati. Se tale procedura è già in atto, allora questo risultato può essere tranquillamente ignorato.

     

    [I] Il Deployer ha sia il ruolo di amministratore che quello di Oracle

    ID DIRE-04
    Stato dei servizi Riconosciuto
    Rischio Informativo
    Impatto sul business Abbiamo deciso di considerare questo risultato come informativo perché è principalmente un corollario delle principali preoccupazioni di centralizzazione sopra descritte. Con il modo attuale in cui è costruito il sistema, è necessario che qualcuno assegni e gestisca i ruoli Oracle e Admin. Tuttavia, non è necessario che l'account ricopra questi ruoli.
    Dove – Ricompensa.sol:108-111; inizializza(indirizzo, indirizzo, indirizzo)

    Descrizione

    Durante l'inizializzazione, il distributore riceve i ruoli di amministratore, amministratore predefinito e Oracle:

    _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
    
    _setupRole(ORACLE_ROLE, msg.sender);
    _setupRole(ADMIN_ROLE, msg.sender);

    Mitigazione

    Considera l'idea di assegnare solo il ruolo di amministratore predefinito, ereditato dagli OA AccessControlUpgradeable, al distributore, consentendogli di gestire i ruoli per altri utenti.

     

    [M] Utilizza AccessControlDefaultAdminRulesUpgradeable

    ID DIRE-05
    Stato dei servizi Riconosciuto
    Rischio Medio
    Impatto sul business Considerata la centralizzazione intrinseca del contratto e l’importanza dei ruoli amministrativi (e quindi della loro gestione), abbiamo deciso di valutare questo risultato come a rischio medio.
    Dove -

    Descrizione

    Reward.sol attualmente utilizza AccessControlUpgradable per concedere e gestire l'accesso alle funzioni critiche. Nello schema di controllo degli accessi di OZ, l'account che possiede DEFAULT_ADMIN_ROLE è in grado di concedere e revocare tutti gli altri ruoli. Allo stato attuale del contratto viene consegnato al distributore al momento dell'inizializzazione.

    AccessControlDefaultAdminRulesUpgradeable si estende AccessControlUpgradable con due caratteristiche di sicurezza cruciali:

    • Può contenere un solo account DEFAULT_ADMIN_ROLE.
    • DEFAULT_ADMIN_ROLE possono essere trasferiti solo utilizzando un processo in due fasi. Un ritardo configurabile tra i due passaggi, changeDefaultAdminDelay, viene applicato.

    Mitigazione

    Passa da AccessControlUpgradable a AccessControlDefaultAdminRulesUpgradeable.

     

    [L] Convalida input insufficiente in manualmenteSetRewardsGenesisTime(uint256)

    ID DIRE-06
    Stato dei servizi Fissa
    Rischio Basso
    Impatto sul business Riteniamo che questo problema sia basso, poiché un valore errato potrebbe essere corretto dall'amministratore con la stessa facilità con cui è stato fornito.
    Dove – Premio.sol; manualmenteImpostaRicompenseGenesisTime(uint256)

    Descrizione

    Oltre a comportare un rischio di centralizzazione, come spiegato sopra, manuallySetRewardsGenesisTime(uint256) inoltre non riesce a convalidare il timestamp fornito dall'amministratore. Accetterebbe felicemente un tempo futuro, che porta a _getNumberOfWeeksSinceGenesis() per ripristinare:

      function _getNumberOfWeeksSinceGenesis()
        private
        view
        returns (uint256 unixTimeDiff)
      {
        unixTimeDiff = (block.timestamp - rewardsGenesisTime) / 7 days;
      }

    Mitigazione

    Assicurati che l'input sia uguale o inferiore al timestamp corrente.

     

    [L] Convalida input insufficiente in setMinimumTimeForRewards(uint256)

    ID DIRE-07
    Stato dei servizi Fissa
    Rischio Basso
    Impatto sul business Proprio come il risultato precedente, abbiamo deciso di classificare questo risultato come a basso rischio perché può essere facilmente corretto richiamando nuovamente la funzione.
    Dove – Premio.sol; setMinimumTimeForRewards(uint256)

    Descrizione

    Questo risultato è molto simile nella sostanza a quello direttamente sopra. Un valore troppo alto impedirà agli utenti di richiedere i propri premi. Ciò, insieme al fatto che i premi vengono ridotti su base settimanale _limitForWeek(uint256), neutralizzerà il vantaggio conferito dall'adozione anticipata.

    Mitigazione

    Definire un intervallo accettabile di valori per minimumTimeForRewards e applicarlo tramite la funzione. A causa dell'influenza diretta che questo valore ha sull'intera struttura dei premi della piattaforma, gestirlo attentamente è fondamentale.

     

    [L] Errore non utilizzato

    ID DIRE-08
    Stato dei servizi Fissa
    Rischio Basso
    Impatto sul business Abbiamo deciso di considerare questo problema come basso piuttosto che informativo, questa omissione apparentemente accidentale ha un certo impatto sulla logica del contratto.
    Dove – Ricompensa.sol:12

    Descrizione

    L'errore InvalidArrayLegnth() è dichiarato alla riga 12, ma mai utilizzato.

    Mitigazione

    Ipotizziamo che questo errore dovesse essere inserito batchTransfer(TransferInfo[]) se l'array fornito non ha otto membri:

    if(transferInfos.length != 8) revert InvalidArrayLength();

     

    [L] Valore restituito non selezionato

    ID DIRE-09
    Stato dei servizi Fissa
    Rischio Basso
    Impatto sul business La funzione di trasferimento dei token ERC20 restituisce il successo o il fallimento del trasferimento come valore booleano. È considerata buona pratica verificare questo valore e procedere solo se l'operazione ha esito positivo. Tuttavia, poiché la documentazione lo implica batchTransfer(TransferInfo[]) viene utilizzato solo per trasferire token Dimo, consideriamo questo risultato basso.
    Dove – Ricompensa.sol:232; batchTrasferimento(InformazioniTrasferimento[])

    Descrizione

    Sulla riga indicata viene effettuato un trasferimento dimoToken, ma il valore restituito viene lasciato deselezionato.

    Mitigazione

    Ripristina con un errore se il trasferimento fallisce:

    if (!dimoToken.transfer(user, amount)) revert TokenTransferFailed();

     

    [L] Chiamata API deprecata

    ID DIRE-10
    Stato dei servizi Riconosciuto
    Rischio Basso
    Impatto sul business a differenza di grantRole(bytes32, address), _setupRole(bytes32, address) non effettua alcun controllo sul conto chiamante. È stato quindi deprecato.
    Dove – Ricompensa.sol:108-111; inizializza(indirizzo, indirizzo, indirizzo)

    Descrizione

    La funzione _setupRole(bytes32, address), utilizzato nella posizione specificata, è stato deprecato in OpenZepplin 5.0. Chiamando grantRole(bytes32, address) invece ora è consigliato.

    Mitigazione

    Sostituisci le chiamate a _setupRole(bytes32, address) con grantRole(bytes32, address).

     

    [I] Emissione di eventi insufficiente

    ID DIRE-11
    Stato dei servizi Fissa
    Rischio Informativo
    Impatto sul business Molti strumenti di monitoraggio, frontend, strumenti fuori catena e servizi di reporting si affidano agli eventi per acquisire le attività dei contratti in tempo reale. Inoltre, i protocolli possono reagire rapidamente alle emissioni di eventi sospetti.
    Dove – Premio.sol; setRegistryContractAddress(indirizzo)
    – Premio.sol; setMinimumTimeForRewards(uint256)
    – Premio.sol; setSyntheticProxyAddress(indirizzo)
    – Premio.sol; resetRewardsGenesisTime()
    – Premio.sol; manualmenteSetRewardsGenesisTime()
    – Ricompensa.sol:267-268; batchTrasferimento(InformazioniTrasferimento[])

    Descrizione

    Le funzioni sopra menzionate non emettono eventi per importanti aggiornamenti di stato.

    Mitigazione

    Aggiungi emissioni di eventi.

     

    [I] Versionamento della solidità

    ID DIRE-12
    Stato dei servizi Riconosciuto
    Rischio Informativo
    Impatto sul business Il contratto può essere compilato e testato con diverse versioni del compilatore durante lo sviluppo e la revisione e un'altra versione diversa del compilatore durante la distribuzione sulla mainnet. Ciò può portare a risultati inaspettati.
    Dove Ricompensa.sol:2

    Descrizione

    Il contratto specifica il suo pragma come pragma solidity ^0.8.13;. Ciò consente l'utilizzo di qualsiasi versione di Solidity a partire dalla 0.8.13. Inoltre, la 0.8.13 non è la versione più recente.

    Mitigazione

    Decidere un'unica versione di solidità da utilizzare. L'ultima versione stabile (e quindi consigliata) è la 0.8.19.

     

    [I] Indicizzare il parametro della settimana in TokensTransferredForConnectionStreak()

    ID DIRE-13
    Stato dei servizi Fissa
    Rischio Informativo
    Impatto sul business L'indicizzazione è utile per filtrare gli eventi nei log di Ethereum. Ogni parametro indicizzato in un evento aggiunge un argomento al registro eventi, semplificando la ricerca di eventi specifici utilizzando tali parametri.
    Dove – Ricompensa.sol:81

    Descrizione

    Il parametro week rappresenta la settimana corrente in cui è stato distribuito l'airdrop. Poiché l'indicizzazione semplifica il filtraggio di eventi specifici da parte delle applicazioni frontend, l'indicizzazione di questo parametro consentirà di filtrare facilmente gli utenti che hanno ricevuto airdrop in una determinata settimana.

    Mitigazione

    Considerare l'indicizzazione del parametro specificato.

     

    [I] Adesione alla Solidity Style Guide

    ID DIRE-14
    Stato dei servizi Fissa
    Rischio Informativo
    Impatto sul business Questo problema è puramente informativo. Non vi è alcun impatto sulla posizione di sicurezza del contratto o altro.
    Dove – Ricompensa.sol:36

    Descrizione

    TransferInfo[], una struttura, è definita alla riga 36, ​​direttamente dopo le variabili di stato. La guida allo stile Solidity consiglia di posizionare prima le dichiarazioni struct.

    Mitigazione

    Sposta la dichiarazione della struttura direttamente all'inizio del contratto, prima delle variabili di stato.

    Contattaci

    Rimaniamo in contatto

    Dove
    Tel Aviv, Israele
    messaggeri:
    Non esitate a contattarci, saremo lieti di rispondere!





      Questo sito è protetto da reCAPTCHA e Google Informativa sulla Privacy ed Termini di Servizio applicare.
      Salta al contenuto