GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Kann das Aussortieren einer Datei ein potenzielles Sicherheitsrisiko darstellen?

Ja , es handelt sich um ein potenzielles Risiko, siehe CVE-2003-0063 oder CVE-2008-2383 oder CVE-2010-2713 oder CVE-2012-3515 oder OSVDB 3881 oder CVE-2003-0020 oder eine der hier aufgeführten ähnlichen ... Einige mehr in den Kommentaren unten auch.

Aktualisieren es ist nicht nur ein Potenzial Risiko, es ist ein echtes Risiko .rxvt-unicode (Versionen 2.7–9.19, gepatcht in 9.20) ermöglicht Lese-/Schreibzugriff auf X-Window-Eigenschaften, dies kann die benutzerunterstützte Ausführung beliebiger Befehle ermöglichen, diesem Problem wurde CVE-2014-3121 zugewiesen, weitere Details hier https ://bugzilla.redhat.com/show_bug.cgi?id=1093287 .

In jüngerer Zeit (Oktober 2019) iTerm2 Bei Versionen bis v3.3.5 wurde festgestellt, dass sie dieselbe Problemklasse aufweisen:Die Anzeige schädlicher Inhalte kann den integrierten tmux aktivieren und die Ausführung von Befehlen zulassen, siehe CVE-2019-9535.

Dieses Thema wird auch hier gut behandelt:https://unix.stackexchange.com/questions/73713/how-safe-is-it-to-cat-an-arbitrary-file und eine gründliche Analyse des zugrunde liegenden Problems von Gilles hier:https://unix.stackexchange.com/questions/15101/how-to-avoid-escape-sequence-attacks-in-terminals .

Erklärung

Was Sie beobachten, ist ein Nebeneffekt des Verhaltens bestimmter Escape-Sequenzen:Einige von ihnen stopfen Zeichen (die normalerweise auch Escape-Sequenzen enthalten) direkt in den Terminal-Eingabepuffer . Alles natürlich im Namen der Abwärtskompatibilität. Der Standard xterm Escapes, die mit dem Begriff "Report " beschrieben werden, tun dies. Dieses Verhalten ermöglicht es Programmen, Terminal- (oder andere) Eigenschaften "in Band" abzufragen/einzustellen, statt über ioctls oder eine andere API.

Als ob das nicht schon schlimm genug wäre, können einige solcher Sequenzen einen Zeilenumbruch enthalten , was bedeutet, dass alles, was vom Terminal (Ihre Shell) liest, einen scheinbar vollständigen Benutzerbefehl sieht.

Hier ist eine nette Möglichkeit, dies mit read von bash zu verwenden um ein Escapezeichen (als Eingabeaufforderung) auszugeben, lesen Sie die Antwort sofort und teilen Sie sie in Variablen auf:

IFS=';' read -sdt -p $'\e[18t' csi8 rows cols
echo rows=$rows cols=$cols

Diese Sequenzen können je nach Terminal variieren, außer für rxvt und abgeleitet, die Grafikabfrage escape enthält einen Zeilenumbruch (Beispiel mit bash und $'' Zeichenfolgen, siehe doc/rxvtRef.txt in der Quelle)` :

$ echo $'\eGQ'
$ 0
bash: 0: command not found

Dieses Escape sendet \033G0\n in den Eingabepuffer des Terminals (oder Ziffer 1 statt 0 wenn Sie ein grafikfähiges rxvt haben ).

Kombinieren Sie dieses Escape also mit anderen Sequenzen, die sich ähnlich verhalten:

echo $'\x05' $'\e[>c' $'\e[6n' $'\e[x' $'\eGQ'

Bei mir führt dies zu 11 Versuchen, verschiedene Befehle auszuführen:1 , 2c82 , 20710 (meine rxvt Versionszeichenfolge), 0c5 , 3R (5 und 3 waren die Cursorkoordinaten), 112 und 0x0 .

Ausnutzbar?

Mit rxvt und den neuesten Terminal-Emulatoren sollten Sie "nur" in der Lage sein, eine begrenzte Menge von meist numerischen Sequenzen zu erstellen. In alten Terminalemulatoren war es möglich (einige der oben aufgeführten CVEs), auf die Zwischenablage, das Fenstersymbol und den Titelleistentext zuzugreifen, um böswilligere Zeichenfolgen für den Aufruf zu erstellen (eine aktuelle geringfügige Ausnahme ist, wenn Sie den answerbackString X-Ressourcenzeichenfolge, die mit dieser Methode jedoch nicht direkt festgelegt werden kann). Der Fehler besteht dann darin, willkürliches Lesen von und zuzulassen Schreibzugriff auf etwas, das als Status oder Speicher innerhalb von Escape-Sequenzen übergeben wird, die Daten in den Eingabepuffer stopfen.

rxvt erfordert zur Aktivierung Änderungen bei der Kompilierzeit, aber urxvt hat hilfreicherweise einen -insecure Befehlszeilenoption, die einige der aufregenderen Funktionen aktiviert:

$ echo $'\e]2;;uptime;\x07' $'\e[21;;t' $'\eGQ' 
bash: l: command not found
17:59:41 up 1448 days,  4:13, 16 users,  load average: 0.49, 0.52, 0.48
bash: 0: command not found

Die drei Sequenzen sind:

  1. \e]2;...\x07 Fenstertitel setzen;
  2. \e[21;;t Fenstertitel abfragen, im Eingabepuffer platzieren;
  3. \eGQ Abfragegrafikfähigkeit, die \n hinzufügt in den Eingabepuffer.

Auch hier können je nach Terminal andere Funktionen wie Schriftgröße, Farben, Terminalgröße, Zeichensatz, alternative Bildschirmpuffer und mehr über Escapes zugänglich sein. Unbeabsichtigte Änderungen daran sind zumindest eine Unannehmlichkeit, wenn nicht gar ein regelrechtes Sicherheitsproblem. Aktuelle Versionen von xterm Beschränken Sie potenziell problematische Funktionen über „Allow*“-Ressourcen.

CVE-2014-3121

Vor v9.20, urxvt schützte nicht auch den Lese- und Schreibzugriff auf X-Eigenschaften (meistens von Fenstermanagern verwendet). Schreiben Lesezugriff (oder genauer gesagt, Zugriff auf Sequenzen, die potenziell beliebige Zeichenfolgen widerspiegeln) erfordert jetzt den -insecure Option.

$ echo $'\e]3;xyzzy=uptime;date +%s;\x07'
$ xprop -id $WINDOWID xyzzy
xyzzy(UTF8_STRING) = 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x3b, 0x64, 0x61, 0x74, \
0x65, 0x20, 0x2b, 0x25, 0x73, 0x3b

Dies kann trivialerweise verwendet werden, um beliebige Zeichenfolgen in den Eingabepuffer des Terminals zu stopfen. Wenn die Escape-Sequenz zum Abfragen einer Eigenschaft aufgerufen wird (zusammen mit dem hilfreichen \eGQ was einen Zeilenumbruch hinzufügt):

 $ echo $'\e]3;?xyzzy\x07' $'\eGQ'
 $ 3;uptime;date +%s;0
 bash: 3: command not found
 17:23:56 up 1474 days,  6:47, 14 users,  load average: 1.02, 1.20, 1.17
 1400603036
 bash: 0: command not found

Mehrere Befehle, die Leerzeichen und Shell-Metazeichen beibehalten. Dies kann auf verschiedene Weise ausgenutzt werden, angefangen natürlich mit dem Cat-ing einer nicht vertrauenswürdigen Binärdatei, weitere Ideen in H.D. Moore's Short Paper (2003).

Nachverfolgung

Für die Escape-Sequenz fragen Sie nach:1;112;112;1;0x1;2 Dies ist:Terminalparameter anfordern (DECREQTPARM) und Geräteattribute senden :

$ echo $'\e[x' $'\e[0c'
;1;1;112;112;1;0x1;2c

Die zweite (\e[0c ) ist dasselbe wie ^E (mit rxvt ). Es gibt auch einige Escape-Sequenzen. die vollständige Sequenz, die für jeden geschrieben wurde, ist jeweils:

\e[1;1;1;112;112;1;0x
\e[?1;2c

Definitiv ja.

Neu hinzugefügt 2020-01-25:

Von Zeit zu Zeit bin ich von LATIN-1 gewechselt Codierung nach UTF-8 als Standardkodierung In den meisten meiner Systeme habe ich einige interessante Features gefunden darum herum (es gibt jetzt zwei Längen für eine Saite)...

Zum Beispiel, da ich gerne mit Bash spiele , habe ich gefragt, warum die Bash-Lokalisierung nicht mit mehrzeiligen Zeichenfolgen funktioniert. Diese Bash-Funktion stellt einen Fehler dar, bei dem die Umgehung darin besteht, eval zu verwenden . Wenn dies keine Sicherheitslücke ist , das könnte eins werden oder produzieren...

In jeder Entwicklung von fast allem (Sprachen, Bibliotheken, Tools, Protokolle, Anwendungen, Hardware, Installer, Konsolen usw.) kommen neue Funktionen mit potenziell neuen Fehlern...

Glücklicherweise sind es so wenige, wie sie schnell korrigiert werden (nahezu einem Tag von offenbaren), aber sie sind!

Also definitiv ja, pass auf dich auf!

Korrekte Verwendung von cat Befehl.

Da Sie anscheinend einen modernen Terminal-Emulator verwenden , einige Escape-Sequenzen könnte verwendet werden, um den Tastaturpuffer zu modifizieren .

Es könnten richtige Shell-Befehle eingefügt werden.

Sie könnten das Argument -e verwenden von cat zum sicheren Betrieb siehe man cat .

  -e     equivalent to -vE

  -E, --show-ends
         display $ at end of each line

  -v, --show-nonprinting
         use ^ and M- notation, except for LFD and TAB

Dann

$ cat -e suspectfile.raw
$ cat -e suspectfile.raw | less

oder unter bash:

$ less < <(cat -e suspectfile.raw)

oder sogar

$ which less cat
/usr/bin/less
/bin/cat
$ rawless() { /usr/bin/less < <(/bin/cat -e "[email protected]");}

Bemerkungen

Wenn Sie command not found lesen , bedeutet dies, dass tatsächlich etwas injiziert wurde.

Die Haupt-Injektion Funktion, die nicht war entfernt ist die Sequenz indentify yourself , verwendet in vielen VT-100 Kapselungen.

Diese Sequenz ist Escape Z die injizieren die Zeichenfolge 1;2c in Ihren Tastaturpuffer, was VT-100 bedeutet (nach AVO-Konvention).

Apropos cat , könnten Sie Folgendes versuchen:

$ cat <<< $'\033Z'

Oder eine andere ANSI-Sequenz:CSI c (Geräteattribute ):

$ cat <<< $'\033[c'

druckt eine leere Zeile, aber in der nächsten aufgeforderten Zeile sehen Sie 1;2c (oder vielleicht mit anderen Nummern, je nach verwendetem Endgerät) als ob Sie traf sie:

$ 65;1;9c█

... aber mit -e Schalter:

$ cat -e <<< $'\033Z'
^[Z$
$ cat -e <<< $'\033[c'
^[[c$

Wobei -e => -vE , -v transformiere \033 in ^[ und -E Geben Sie $ ein Zeichen am Ende der Zeile (und nichts wird in die nächste Zeile geschrieben, Sie Tastaturpuffer ist nicht betroffen).

Im VT100-Benutzerhandbuch finden Sie möglicherweise viele lustige Dinge (wie:cat <<< $'\033#8';)

(Sie waren modernes Terminal ! Früher... )

Versuch mit bash

Es gibt einen kleinen Bash-Befehl, um den Tastaturpuffer zu leeren und seinen Inhalt abzurufen:

$ cat <<<$'\033[c';buf='';while read -t .1 -n 1 chr;do
        buf+="$chr"
  done;printf "\n>|%q|<\n" $buf

^[[?65;1;9c
>|$'\E[?65;1;9c'|<

Und eine kleine Funktion, um jede Kette zu testen:

$ trySeq() {
    printf -v out "$1"
    echo -n "$out"
    buf=""
    while read -t.1 -n1 char
      do buf+="$char"
    done
    [ "$buf" ] && printf "\r|%q|->|%q|<\e[K\n" "$out" "$buf"
}

Also könnte ich versuchen:

$ for seq in $'\e['{c,{1..26}{n,t,x}};do
      trySeq "$seq";done
|$'\E[c'|->|$'\E[?65;1;9c'|<
|$'\E[1x'|->|$'\E[3;1;1;120;120;1;0x'|<
|$'\E[5n'|->|$'\E[0n'|<
...

(Vielleicht mit etwas harmlosem Effekte auf deiner Konsole;)

Kleines Praxisbeispiel

Stellen Sie sich vor, manche könnten so etwas in Ihre Umgebung stellen:

$ source <(printf '%dc() {
     printf "You\\047ve been hitted\\041\\n"
   };\n' {0..100};printf 'alias %s=1c\n' {0..100};)

Wenn Sie dann

$ cat <<<$'\e[c'

$ 65;1;9c█

Der Cursor bleibt am Ende der Eingabeaufforderungszeile.

Von dort aus, wenn Sie automatisch Return drücken statt Strg + c , lesen Sie etwas wie:

$ 65;1;9c
You've been hitted!
You've been hitted!
You've been hitted!
$ █

Und jetzt?

Ab da gibt es leider keinen Standard .

Jedes virtuelle Terminal Implementierung könnte vollen ANSI- und/oder vollen DEC-Standard unterstützen...

Aber da es einige Sicherheitsprobleme gibt, tun viele dies nicht...

Sie könnten ein Verhalten mit einem Terminal beobachten, das Sie mit einem anderen nicht beobachten würden ...

xterm, Linux-Konsole, Gnome-Terminal, Konsole, fbterm, Terminal (Mac OS)... die Liste der Terminal-Emulatoren ist gar nicht so kurz!

Und jeder von ihnen hat seine eigenen Fehler und Einschränkungen im Vergleich zu den DEC- und ANSI-Standards.

In der Praxis finden Sie vielleicht eine virtuelle Konsole, die mehr featured sein könnte als andere und wo Tastaturinjektion könnte Ihre Sicherheit brechen.

Das ist einer der Gründe, weil ich es vorziehe, immer denselben (alten) xterm zu verwenden eher als andere Tools mit mehr Features.


"Echte" Glasterminals hatten eine Escape-Sequenz, um den Bildschirm auf einem Drucker zu drucken. Sie taten dies, indem sie einen Befehl ausführten und den aktuellen Bildschirminhalt an die Standardeingabe des Druckbefehls weiterleiteten.

Der Befehl könnte durch eine andere Escape-Sequenz konfiguriert werden.

Der klassische Weg, dies auszunutzen, bestand darin, Dateien mit Namen zu erstellen, in denen die Escape-Sequenz eingebettet war, um den Druckerbefehl festzulegen und ihn in ein Skript Ihrer Wahl zu ändern und dann eine zweite Datei mit der Escape-Sequenz für den Druck darin zu haben.

Als dann jemand ls ausführte In diesem Verzeichnis würden sie Ihren Code ausführen. Was schön wäre, wenn es der root wäre Benutzer!

Theoretisch sollten moderne Terminalemulatoren so etwas nicht mehr tun.

Terminal.app scheint auf dem NextStep nsterm zu basieren, also kann es alle möglichen Verrücktheiten enthalten.

Versuchen Sie vielleicht einzugrenzen, welche genauen Bytes den command not found erzeugen Nachrichten?

Sieht so aus, als gäbe es Escape-Sequenzen zum Anheben und Absenken des Terminals:

http://the.taoofmac.com/space/apps/Terminal

einige weitere Informationen hier:

http://invisible-island.net/ncurses/terminfo.src.html#toc-_Apple__Terminal_app

Wenn Sie Inhalte an die stdin eines Programms senden möchten,

program -para meters < /path/file.ext

Linux
  1. Warum kann Rm schreibgeschützte Dateien entfernen?

  2. 4 Möglichkeiten zum Erstellen einer Textdatei im Linux-Terminal

  3. Wie kann ich eine Datei unter Linux symbolisch verknüpfen?

  4. Löschen Sie den Terminalverlauf in Linux

  5. Wie kann ich eine bestimmte Datei von einem Linux-Terminal aus finden?

So drucken Sie eine JSON-Datei im Linux-Terminal

Terminal-Pager

Kann ein Bash-Skript mit einer Datei verknüpft werden?

Können überschriebene Dateien wiederhergestellt werden?

Wie mache ich eine Datei im Linux-Terminal ausführbar?

Warum kann ich im Terminal nicht scrollen?