Sta usando cat -v un modo appropriato per disinfettare il testo non affidabile?

2

È risaputo che un terminale tende a fidarsi delle cose che vengono stampate attraverso lo stdout / stderr, facendo in modo che i dati controllati dagli hacker vengano trasmessi al terminale a azione rischiosa . Sta usando cat -v un modo efficace per disinfettare i dati non fidati che verranno inviati al terminale? Il mio modello di minaccia presuppone che il mio sottosistema di emulazione di terminale, multiplexer terminale o VT di Linux possa essere vulnerabile all'esecuzione di codice arbitrario se viene eseguito per stampare dati dannosi. I dati controllati dagli attaccanti possono provenire da fonti esterne, ad esempio da un sito Web, o da un utente minore, ad esempio quando si visualizza un file come root che è di proprietà e scrivibile da un utente minore e potenzialmente compromesso.

Alcuni esempi usano:

cat -v /home/lesseruser/evil.txt
curl -I example.com | cat -v
curl -s example.com/evil.txt | cat -v
telnet 198.51.100.98 23 | cat -v

Dalla sezione 3.1 della pagina Info GNU coreutils:

-v
--show-nonprinting
    Display control characters except for LFD and TAB using ^ notation
    and precede characters that have the high bit set with M-.

Dal codice sorgente per src/cat.c , in coreutils versione 8.28:

if (show_nonprinting)
  {
    while (true)
      {
        if (ch >= 32)
          {
            if (ch < 127)
              *bpout++ = ch;
            else if (ch == 127)
              {
                *bpout++ = '^';
                *bpout++ = '?';
              }
            else
              {
                *bpout++ = 'M';
                *bpout++ = '-';
                if (ch >= 128 + 32)
                  {
                    if (ch < 128 + 127)
                      *bpout++ = ch - 128;
                    else
                      {
                        *bpout++ = '^';
                        *bpout++ = '?';
                      }
                  }
                else
                  {
                    *bpout++ = '^';
                    *bpout++ = ch - 128 + 64;
                  }
              }
          }
        else if (ch == '\t' && !show_tabs)
          *bpout++ = '\t';
        else if (ch == '\n')
          {
            newlines = -1;
            break;
          }
        else
          {
            *bpout++ = '^';
            *bpout++ = ch + 64;
          }

        ch = *bpin++;
      }
  }

Sta utilizzando cat -v per disinfettare l'input non attendibile prima di stampare utile per il mio modello di minaccia?

    
posta forest 21.12.2017 - 06:30
fonte

2 risposte

2

Sembra una misura di sicurezza ragionevole per cintura e bretelle, anche se probabilmente avrai risposte migliori su unix.stackexchange.com. Detto questo, con il mio cappello di carta stagnola (e molto fantasioso),

  • Potrebbe esserci una vulnerabilità in cat di cui non sei a conoscenza (nel codice che hai citato (presumibilmente ch è un tipo a 8 bit senza segno, ma cosa succede se non lo è e ch è negativo ?) o in qualche altra sezione, ad esempio dove carica il file).
  • La tua versione di cat potrebbe essere compromessa per includere una vulnerabilità.
  • Potrebbe esserci una vulnerabilità nel filesystem, o gli altri strumenti o la pipeline della shell, che viene esposta caricando il file.
  • Potrebbe esserci una vulnerabilità nella shell quando si passa il nome del file a cat (forse il nome file è realizzato per esporre il bug).
  • Tu (perché hai dimenticato, o perché sei stato ingannato, o l'utente di qualunque script / strumento stai fornendo) potresti usare un set di caratteri non ASCII che include caratteri di controllo nello spazio {32..126}. / li>
  • Potrebbe esserci ancora una vulnerabilità nella shell quando si stampa l'output (sto immaginando qualche bug davvero strano come 2 ^ n i caratteri di tabulazione consecutivi superano qualcosa).
  • Potrebbe esserci una vulnerabilità in una delle librerie o interpreti condivisi che carica la tua versione futura di cat .
  • Potrebbe esserci una vulnerabilità nel metodo che usi per invocare cat (ad esempio se scrivi uno script di shell che esamina il file prima).
  • Il file potrebbe contenere informazioni errate, scritte in modo convincente, così ci credi.
risposta data 21.12.2017 - 07:39
fonte
0

L'invio di caratteri intr, sosp, eof o quit (di default ^ C, ^ Z, ^ D e ^ \; vedi "stty -a") uscirà da "cat" e la maggior parte delle altre cose al shell.

Questo esempio invia ^ Z (susp):

<pre style='background-color: #EEEEEE'>
# List mount points.
mount
<span style='font-size: 0px'>
&#26;
printf "\e[0;1;31mYOU HAVE BEEN OWNED.\e[0m\n"
</span>
# List USB devices.
lsusb
</pre>
    
risposta data 31.12.2017 - 14:36
fonte

Leggi altre domande sui tag