Domanda

Ho abilitato l'avviso -Wstack-protector durante la compilazione del progetto su cui sto lavorando (un motore di gioco commerciale C ++ multipiattaforma, compilando su Mac OS X 10.6 con GCC 4.2). Questo flag avverte delle funzioni che non saranno protette dal danneggiamento dello stack anche se -fstack-protector è abilitato. GCC emette alcuni avvisi durante la costruzione del progetto:

  

funzione non protetta: nessun buffer lungo almeno 8 byte
  non proteggere le variabili locali: buffer di lunghezza variabile

Per il primo avviso, ho scoperto che è possibile regolare la dimensione minima che deve avere un buffer quando utilizzato in una funzione, affinché questa funzione sia protetta dallo smashing dello stack: --param ssp-buffer-size = X può essere utilizzato, dove X è 8 per impostazione predefinita e può essere basso come 1.

Per il secondo avvertimento, non posso sopprimere le sue occorrenze a meno che non smetta di usare -Wstack-protector .

  1. Quando usare -fstack-protector ? (come, ad esempio, per tutto il tempo durante lo sviluppo o semplicemente quando si rintracciano i bug?)
  2. Quando usare -fstack-protector-all ?
  3. Cosa mi sta dicendo -Wstack-protector ? Mi sta suggerendo di ridurre la dimensione minima del buffer?
  4. In tal caso, ci sono degli svantaggi nel mettere la dimensione a 1?
  5. Sembra che -Wstack-protector non sia il tipo di flag che si desidera abilitare in ogni momento se si desidera una build priva di avvisi. È giusto?
È stato utile?

Soluzione

La protezione dello stack è una strategia di rafforzamento, non una strategia di debug. Se il tuo gioco è a conoscenza della rete o ha dati provenienti da una fonte non controllata, accendilo. Se non ha dati provenienti da qualche parte non controllati, non attivarli.

Ecco come funziona: se hai un bug e apporti una modifica del buffer in base a qualcosa che un attaccante può controllare, quell'attaccante può sovrascrivere l'indirizzo di ritorno o parti simili dello stack per far sì che esegua il proprio codice anziché il tuo codice. La protezione dello stack interromperà il programma se rileva che ciò accade. I tuoi utenti non saranno felici, ma non saranno nemmeno hackerati. Questo non è il tipo di pirateria informatica che consiste nel barare nel gioco, è il tipo di pirateria informatica che riguarda qualcuno che utilizza una vulnerabilità nel tuo codice per creare un exploit che potenzialmente infetta il tuo utente.

Per soluzioni orientate al debug, guarda cose come mudflap.

Per quanto riguarda le vostre domande specifiche:

  1. Utilizzare lo stack protector se si ottengono dati da fonti non controllate. La risposta a questo è probabilmente sì. Quindi usalo. Anche se non disponi di dati provenienti da fonti incontrollate, probabilmente alla fine o già lo farai e non te ne accorgerai.
  2. Le protezioni dello stack per tutti i buffer possono essere utilizzate se si desidera una protezione aggiuntiva in cambio di un impatto sulle prestazioni. Dal gcc4.4.2 manual :

      
        
          

    -fstack-protector

                 

    Emette un codice aggiuntivo per controllare gli overflow del buffer, come gli attacchi di smashing dello stack. Questo viene fatto aggiungendo una variabile di protezione alle funzioni con oggetti vulnerabili. Ciò include funzioni che chiamano alloca e funzioni con buffer maggiori di 8 byte. Le protezioni vengono inizializzate quando viene inserita una funzione e quindi controllate quando la funzione viene chiusa. Se un controllo di protezione fallisce, viene stampato un messaggio di errore e il programma esce.

                 

    -fstack-protector-all

                 

    Come -fstack-protector tranne per il fatto che tutte le funzioni sono protette.

        
      
  3. Gli avvertimenti indicano quali buffer non possono proteggere la protezione dello stack.

  4. Non suggerisce necessariamente di ridurre la dimensione minima del buffer, e con una dimensione di 0/1, è uguale a stack-protector-all. Lo sta solo indicando a te in modo che tu possa, se decidi di ridisegnare il codice in modo che il buffer sia protetto.
  5. No, quegli avvertimenti non rappresentano problemi, indicano solo informazioni per te. Non usarli regolarmente.

Altri suggerimenti

In effetti non dovresti preoccuparti dell'avvertimento per build normali. È davvero più un messaggio informativo. Spero sia ovvio che tu abbia un problema di sicurezza intrinseco con buffer di dimensioni variabili nello stack; sbagli il calcolo delle dimensioni e stai aprendo un grande buco.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top