Il CVE-2016-2324 ha consentito l'esecuzione di codice in modalità remota?

5

Diciamo che ho questo tipo di codice :

// In revision.c
char *path_name(const struct name_path *path, const char *name) // by design, name_path->len is a 32 bits int, but this doesn’t concern name
{
      const struct name_path *p;
      char *n, *m;
      int nlen = strlen(name); // the size is converted to a positive number (the correct size was allocated previously with an unsigned long). I got 705804100
      int len = nlen + 1;

      for (p = path; p; p = p->up) { //loop is skipped (except in another case fixed since 2.7.1)
          if (p->elem_len)
              len += p->elem_len + 1;
      }
      n = xmalloc(len); // if len is negative, it will also be converted to a negative 64 bits integer *(which explains it is normally trying to allocate serveral Pb of ram most of the time)* which will be read as positive after that. // but this isn’t the run case that is interesting here.
      m = n + len - (nlen + 1); // the size of m is lower than name
      strcpy(m, name); // strcpy rely on the null terminating character. The result is written in an unallocated memory from heap. This is the definition of heap overflow enabling server side remote code execution if name[] contains assembly, and have the correct size. This open the way to defeat canaries aslr, and nx combined see http://security.stackexchange.com/q/20497/36301#comment182004_20550
      for (p = path; p; p = p->up) {
          if (p->elem_len) {
              m -= p->elem_len + 1;
              memcpy(m, p->elem, p->elem_len);
              m[p->elem_len] = '/';
          }
      }
      return n;
}

Potrebbe esserci un caso in cui il sistema lascia che l'overflow si verifichi mantenendo completamente chiuso il percorso di esecuzione del codice remoto?

Un percorso creato in un database git (un albero del git) dovrebbe contenere codice binario per eseguire l'esecuzione del codice remoto. Tuttavia, un percorso non può contenere il nul byte (poiché è usato come delimitatore in un albero git) .

Se è necessario un caso specifico , è Ubuntu con linux versione < 3.16 e tutte le protezioni di sicurezza abilitate (intendo nx aslr e dep combinati tranne i canarini) . L'architettura è x86_64 . libc è una vecchia versione (ma con patch di sicurezza) di glibc .

Aggiornamento:

Ora, la creazione di una bozza dovrebbe essere più semplice .

    
posta user2284570 25.02.2016 - 21:09
fonte

3 risposte

7

Un buffer overflow (del tipo "write") offre un vantaggio a un utente malintenzionato solo se l'utente malintenzionato può organizzare che l'overflow si estenda su altri byte che sono utilizzati per qualcos'altro. In qualsiasi momento, il processo viene eseguito in uno spazio indirizzo , la maggior parte dei quali non allocati. Se il buffer che è overflown si trova alla fine dello spazio indirizzo, oppure è seguito solo da byte non utilizzati, allora una pagina non mappata, l'overflow non aiuterà l'autore dell'attacco.

Ricordo un caso con lo strumento da riga di comando rlogin su SunOS 4.1.4 (sistemi sparc). Era root suid e si poteva ottenere in segfault se la variabile di ambiente TERM conteneva una stringa più lunga di 64 caratteri. Tuttavia, il buffer overflown si trovava proprio alla fine della sezione dei dati e non c'era altro oltre a sovrascrivere.

Attenzione, però, che malloc() può usare byte extra prima e dopo ogni blocco assegnato per tenere traccia di quali blocchi sono allocati. A seconda dell'implementazione di malloc() , la modifica di questi byte può o non può aiutare l'aggressore. La linea di fondo è che mentre alcuni buffer overflow non possono essere sfruttati, di solito è molto difficile accertarsi che un buffer overflow non possa essere sfruttato. È più sicuro presumere che qualsiasi overflow del buffer possa portare a conseguenze drastiche e non consentire che si verifichino del tutto.

    
risposta data 25.02.2016 - 21:19
fonte
1

Non tutti gli overflow del buffer portano all'esecuzione di codice in modalità remota. Dipende da come viene allocato il buffer e se il puntatore dell'istruzione può essere controllato dall'attaccante. Ci sono molti fattori che determinano se l'esecuzione di codice in modalità remota è una possibilità.

    
risposta data 25.02.2016 - 21:15
fonte
0

Ubuntu utilizza dati protezione dell'esecuzione . Ciò interrompe il codice che viene eseguito dalla memoria nella parte di dati del processo. Ciò renderà efficace il codice iniettato tramite un buffer overflow impossibile da eseguire. Quindi l'overflow può verificarsi anche se l'esecuzione non può. Tecniche come ROP vengono utilizzate per aggirare la DEP.

    
risposta data 25.02.2016 - 21:17
fonte

Leggi altre domande sui tag