Selflinux - Shellprogrammierung #2

Open
opened 2024-10-16 20:02:56 +02:00 by rschaten · 0 comments
Owner

Von: "Ralf Doering" rdoering@netsys-it.de

Hallo,
erstmal ein Lob für den Beitrag zum selflinux-Projekt, auch wenn ich
gleich noch etwas inhaltlich meckern muss ;)

Da du als Autor des Teils über Shellskripting genannt bist, möchte ich
versuchen, einige Schnitzer, die mir bisher aufgefallen sind, zu
korrigieren.

1.2 Die Qual der Wahl =====================
Hier fehlt meiner Meinung nach ein Hinweis, auf POSIX/SUSv3 konforme
Shells. Eine original Bourne-Shell besitzt zumindest Linux nicht. Für
portable Shellskripte sollte man sich an SUSv3 halten, nicht an die
original Bourn Shell (auch wenn z.B. Solaris eine solche noch besitzt)

Die Bash ist übrigens nicht vollständig abwärtskompatibel zur Original
Bourne Shell. Features, die sh aufweist, aber von bash nicht unterstützt
werden, sind u.a. in der Bash-FAQ aufgeführt.

Die ksh unter "Einfach-Shells" einzuordnen halte ich für sehr gewagt,
die gehört (sowohl vom interaktiven Modus als auch von den Erweiterungen
für Shellskripte) in die Rubrik "Komfort-Shells".

Bei den Komfort-Shells fehlt IMO auch noch die zsh, die für interaktives
Arbeiten viele einzigartige Features aufweist.

3.9 Kommentare ==============
Ist es in diesem Zusammenhang sinnvoll, nochmal explizit darauf
hinzuweisen, das ein gequotetes # natürlich keinen Kommentar einleitet?

3.17 for ========
Diese Schleife ist etwas, was man normalerweise (ausser in ganz
besonderen, wohlüberlegten Fällen) vermeiden möchte:
----------------------------------------------------
for item in `cat program_list` # cat: Datei ausgeben
do
----------------------------------------------------

Erstens: uuoc (IMO)
Zweitens: wenn $item zeilenweise den Inhalt von program_list enthalten
soll, dann macht das Beispiel bei Vorkommen von IFS ind den Zeilen nicht
was es eigentlich soll

In der Regel is es hier eigentlich fast immer besser, ein
"while read item; do ... ; done < program_list"
zu nehmen.
5.2 Ein typisches init Skript =============================
----------------------------

    Source function library.
    /etc/rc.d/init.d/functions
    ----------------------------
    Das Beispiel sieht mir so aus, als würde es von einem RH/Fedora o.ä.
    System ausgehen? Obiges funktioniert so nicht auf allen Systemen, es
    fehlt ein entsprechender Hinweis.

5.4 Fallensteller =================
---------------------------
#!/bin/sh
stat=1
temp=/tmp/zeige$$
---------------------------

Ist ein häufiges Konstrukt, kann aber durch Dritte sehr schön über eine
Symlink-Attacke dazu benutzt werden, eine beliebige Datei des
aufrufenden Nutzers zu überschreiben. Soetwas sollte man nicht als
Beispiel hernehmen, die Praxis mit Security Reports ala 'Insecure
tempfile creation' gibt mir recht. Besser für so etwas mktemp(1)
benutzen, auch wenn das Beispiel dann komplexer wird. Solche
fehlerhaften Idiome bekommt man nur schwer aus den Köpfen der Nutzer
wieder heraus.

Analog gilt das auch für 3.17 (for-beispiele.sh), dort wäre der Angriff
sogar noch einfacher:
for file do
pr $file > $file.tmp # pr: Formatiert Textdateien
done

Ganz am Ende ist ein HTML-Typo:
---------------------------------------------------
*) echo "Anwendung: `basename $0` Dateiname" 1gt;&2
---------------------------------------------------

6. Anhang B ===========
Der Link auf das Bash Reference Manual führt ins Leere.

Als weitere Referenzen fehlen hier IMO mindesten noch folgende:
- Advanced Bash Skripting Guide: http://www.tldp.org/LDP/abs/html/
- POSIX/SUSv3 Spezifikation
Von: "Ralf Doering" <rdoering@netsys-it.de> ``` Hallo, erstmal ein Lob für den Beitrag zum selflinux-Projekt, auch wenn ich gleich noch etwas inhaltlich meckern muss ;) Da du als Autor des Teils über Shellskripting genannt bist, möchte ich versuchen, einige Schnitzer, die mir bisher aufgefallen sind, zu korrigieren. 1.2 Die Qual der Wahl ===================== Hier fehlt meiner Meinung nach ein Hinweis, auf POSIX/SUSv3 konforme Shells. Eine original Bourne-Shell besitzt zumindest Linux nicht. Für portable Shellskripte sollte man sich an SUSv3 halten, nicht an die original Bourn Shell (auch wenn z.B. Solaris eine solche noch besitzt) Die Bash ist übrigens nicht vollständig abwärtskompatibel zur Original Bourne Shell. Features, die sh aufweist, aber von bash nicht unterstützt werden, sind u.a. in der Bash-FAQ aufgeführt. Die ksh unter "Einfach-Shells" einzuordnen halte ich für sehr gewagt, die gehört (sowohl vom interaktiven Modus als auch von den Erweiterungen für Shellskripte) in die Rubrik "Komfort-Shells". Bei den Komfort-Shells fehlt IMO auch noch die zsh, die für interaktives Arbeiten viele einzigartige Features aufweist. 3.9 Kommentare ============== Ist es in diesem Zusammenhang sinnvoll, nochmal explizit darauf hinzuweisen, das ein gequotetes # natürlich keinen Kommentar einleitet? 3.17 for ======== Diese Schleife ist etwas, was man normalerweise (ausser in ganz besonderen, wohlüberlegten Fällen) vermeiden möchte: ---------------------------------------------------- for item in `cat program_list` # cat: Datei ausgeben do ---------------------------------------------------- Erstens: uuoc (IMO) Zweitens: wenn $item zeilenweise den Inhalt von program_list enthalten soll, dann macht das Beispiel bei Vorkommen von IFS ind den Zeilen nicht was es eigentlich soll In der Regel is es hier eigentlich fast immer besser, ein "while read item; do ... ; done < program_list" zu nehmen. 5.2 Ein typisches init Skript ============================= ---------------------------- Source function library. /etc/rc.d/init.d/functions ---------------------------- Das Beispiel sieht mir so aus, als würde es von einem RH/Fedora o.ä. System ausgehen? Obiges funktioniert so nicht auf allen Systemen, es fehlt ein entsprechender Hinweis. 5.4 Fallensteller ================= --------------------------- #!/bin/sh stat=1 temp=/tmp/zeige$$ --------------------------- Ist ein häufiges Konstrukt, kann aber durch Dritte sehr schön über eine Symlink-Attacke dazu benutzt werden, eine beliebige Datei des aufrufenden Nutzers zu überschreiben. Soetwas sollte man nicht als Beispiel hernehmen, die Praxis mit Security Reports ala 'Insecure tempfile creation' gibt mir recht. Besser für so etwas mktemp(1) benutzen, auch wenn das Beispiel dann komplexer wird. Solche fehlerhaften Idiome bekommt man nur schwer aus den Köpfen der Nutzer wieder heraus. Analog gilt das auch für 3.17 (for-beispiele.sh), dort wäre der Angriff sogar noch einfacher: for file do pr $file > $file.tmp # pr: Formatiert Textdateien done Ganz am Ende ist ein HTML-Typo: --------------------------------------------------- *) echo "Anwendung: `basename $0` Dateiname" 1gt;&2 --------------------------------------------------- 6. Anhang B =========== Der Link auf das Bash Reference Manual führt ins Leere. Als weitere Referenzen fehlen hier IMO mindesten noch folgende: - Advanced Bash Skripting Guide: http://www.tldp.org/LDP/abs/html/ - POSIX/SUSv3 Spezifikation ```
rschaten self-assigned this 2024-10-16 20:02:57 +02:00
Sign in to join this conversation.
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: rschaten/Shell-Programmierung#2
No description provided.