echo is broken by design

  • tl;dr

    Probleme mit dem Befehl echo.

    Strings, die mit einem Bindestrich anfangen, können Optionsschalter sein. Um das zu umgehen, sollte man die Variable immer in Anführungszeichen setzen:

    Code
    echo -e # Leere Zeile
    echo "-e" # -e wird ausgeben

    Das funktioniert nicht mit Variablen. Wenn man aber ein Leerzeichen mit anhängt, wird der Optionsschalter nicht interpretiert.

    Code
    my_var="-e"
    echo "$my_var" # Leere Zeile
    echo "$my_var " # -e wird ausgegeben

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne deine Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklärst du dich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

  • Die bash (Ist ja nur eine von mehreren Shells, die es unter linux gibt) ist ja nun alt, sehr alt...
    Als die Leute noch wussten, wie man damit umgeht, war das alles kein Problem, die "Probleme" kannte man und hat sie umschifft.

    Zur Not eine andere Shell (csh z.B.) verwendet.

    Offensichtliche Fehler oder solche, die man dafür hält, können gar nicht so simpel korrigiert werden: Vermutlich hunderttausende Scripte funktionieren genau so, wie sie sollen. Würde jetzt die bash korrigiert, wäre das verheerend ...

    Außerdem:

    die 3. Zeile

    Code
    my_var="-e"
    echo "$my_var" # Leere Zeile
    echo "$my_var " # -e wird ausgegeben

    ist korrekt:
    Durch die Anführungszeichen wird das endende Leerzeichen mit in den Option-Parser gegeben und der findet somit keine "-e". Wenn das ohne LZ direkt in der Commandozeile passiert, werden endende Leerzeichen abgeschnitten, bevor die Option(en) zum Parser gehen.

    Lernst du schon gleich, wenn du mit der bash anfängst...

  • Damit verhinder Bash, dass *ungewollt* Optionen injiziert werden.

    Umgekehrt. Es werden Optionsschalter bei echo injiziert.

    Das wäre z.B. bei einem rm und der Variable -r fatal.

    Also halten wir fest: Alle Befehle sind betroffen.

    D.h. alles, was vom User vorgegeben wird, könnte potenziell gefährlich sein.

  • Wobei zumindest die GNU-Varianten von den meisten Programmen -- kennen, um anzuzeigen, dass keine Optionen mehr folgen. Also beispielsweise rm -- -r um eine Datei mit dem Namen -r zu löschen oder rm -- "$filename" um sich davor zu schützen, dass ein Benutzer etwas gefährliches in $filename schmuggeln kann.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Das ist fuer mich ein nettes Feature von echo aber kein Security issue. Es geht doch nur darum dass echo seine eigenen Argumente -e, -n und -E unterdrueckt. Das ist nicht ganz OK - aber wo ist das Securityproblem :conf:

    zeigt

    Code
    Expected -e - got 
    Expected -n - got 
    Expected -E - got 

    Ausserdem wird in dem Video erklaert dass jede echo Implementierung einer shell sich unterschiedlich verhaelt. Ist auch nicht OK und ein Problem fuer denjenigen der ueber verschiedene Platformen/shells identisches Verhalten braucht. Allerdings ist das fuer mich eher ein akademisches Problem ... it's a Bug - it's a Feature - und kaum jemand bemerkt es.

  • Wobei zumindest die GNU-Varianten von den meisten Programmen -- kennen, um anzuzeigen, dass keine Optionen mehr folgen.

    In Einzelfällen führt das dann wieder zu anderen Problemen. :) Ganz frisch:

    Code: Changelog
    sudo (1.9.5p2-3+deb11u1) bullseye-security; urgency=high
    
      * Non-maintainer upload by the Security Team.
      * sudoedit: do not permit editor arguments to include "--" (CVE-2023-22809)
    
     -- Salvatore Bonaccorso <carnil@debian.org>  Sat, 14 Jan 2023 14:29:53 +0100

    CVE dazu

    :rolleyes: sudo !!

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!