Zumindest unter unixoiden Betriebssystemen wie MacOS und Linux begegnen sie einem heute andauernd, zum Beispiel bei Ollama:
curl -fsSL https://ollama.com/install.sh | sh
Harmlos aussehende Kommandozeilen wie diese, um eine neue Software zu installieren. Den Einzeiler einfach in die Shell kopieren und los geht es. Aber was genau geht da eigentlich los? Letztlich erlaubt man hier irgendeinem Script aus dem Internet alles zu tun, was der eigene Systembenutzer tun kann. Hat der aktuelle Benutzer sudo Rechte sogar alles, was root kann. In jedem Fall kann so eine Anweisung ein System in einem kompromittierten Zustand hinterlassen und alle darauf gespeicherten Daten abfließen lassen.
Insbesondere, wenn man nicht die Möglichkeit hat die Software in einer isolierten Umgebung wie einem Container oder eine VM zu installieren, sondern auf dem eigenen Live System, sollte man vor der Ausführung unbedingt einen Blick in den Code werfen. Über eine Variante des Befehls wie
curl -fsSL https://ollama.com/install.sh > ollama_install.sh
kann man den Code erhalten ohne ihn auszuführen. Oder man ruft direkt die Seite im Browser auf: https://ollama.com/install.sh.
Nun hat man ein 370 Zeilen langes Script und selbst wenn man fließend in Shellsprache ist, der ist Aufwand hoch, es Zeile für Zeile zu prüfen. Kann einem die KI hier helfen?
Setup
Für die Bewertung braucht es nur ein Prompt und dann dazu das zu prüfende Script. Für die im Folgenden gezeigten Ergebnisse war dies das Prompt:
Ich möchte wissen ob es sicher ist, das folgende, aus dem Internet geladene Script auszuführen. Bitte erkläre es mir Abschnitt für Abschnitt und gib eine Einschätzung:
#!/bin/sh.....
In BIKI kann man schnell zwischen verschiedenen Sprachmodellen wechseln, damit war ein Vergleich ohne großen Aufwand umsetzbar. Hier die Ergebnisse für zwei Modelle:
Qwen 2
Das Modell von Alibaba ist frei verfügbar und wurde hier in der 72B Version verwendet. Die Antwort ist sehr ausführlich und macht Inhalt und Aufbau des Scripts sehr gut verständlich:
Das Script, das Sie präsentiert haben, dient zur Installation der Software „Ollama“ auf einem Linux-System. Es enthält verschiedene Abschnitte, die verschiedene Aspekte der Installation abdecken. Ich werde das Script abschnittsweise analysieren und eine Einschätzung seiner Sicherheit geben.
Allgemeine Struktur und Sicherheitsaspekte
- Bash-Optionen und Fehlerbehandlung:
set -eu
set -e
: Beendet das Script, sobald ein Befehl fehlschlägt.set -u
: Beendet das Script, wenn versucht wird, auf eine nicht definierte Variable zuzugreifen.- Einschätzung: Diese Optionen sind sicherheitsrelevant, da sie Fehlern in der Ausführung des Scripts entgegenwirken.
- Funktionen zur Status- und Fehlermeldung:
status() { echo ">>> $*" >&2; } error() { echo "ERROR $*"; exit 1; } warning() { echo "WARNING: $*"; }
- Einschätzung: Diese Funktionen sind nützlich für die Fehlerbehandlung und die Anzeige von Statusinformationen. Sie sind sicherheitsneutral.
- Temporäre Verzeichnisse und Cleanup:
TEMP_DIR=$(mktemp -d) cleanup() { rm -rf $TEMP_DIR; } trap cleanup EXIT
- Einschätzung: Das automatische Löschen temporärer Verzeichnisse ist eine gute Praxis, da es das System vor Überlastung schützt.
- Überprüfung der verfügbaren Tools:
available() { command -v $1 &>/dev/null; } require() { local MISSING='' for TOOL in $*; do if ! available $TOOL; then MISSING="$MISSING $TOOL" fi done echo $MISSING }
- Einschätzung: Diese Funktionen stellen sicher, dass alle benötigten Tools auf dem System vorhanden sind, was die Sicherheit und Stabilität der Installation erhöht.
- Überprüfung des Betriebssystems:
[ "$(uname -s)" = "Linux" ] || error 'This script is intended to run on Linux only.'
- Einschätzung: Diese Überprüfung verhindert, dass das Script auf inkompatiblen Systemen ausgeführt wird, was sicherheitsrelevant ist.
- Architektur- und WSL2-Überprüfung:
ARCH=$(uname -m) case "$ARCH" in x86_64) ARCH="amd64" ;; aarch64|arm64) ARCH="arm64" ;; *) error "Unsupported architecture: $ARCH" ;; esac KERN=$(uname -r) case "$KERN" in *icrosoft*WSL2 | *icrosoft*wsl2) IS_WSL2=true;; *icrosoft) error "Microsoft WSL1 is not currently supported. Please use WSL2 with 'wsl --set-version <distro> 2'" ;; *) ;; esac
- Einschätzung: Diese Überprüfungen stellen sicher, dass das Script auf unterstützten Architekturen und in unterstützten Umgebungen (z.B. WSL2) ausgeführt wird.
- Sudo-Überprüfung:
SUDO= if [ "$(id -u)" -ne 0 ]; then if ! available sudo; then error "This script requires superuser permissions. Please re-run as root." fi SUDO="sudo" fi
- Einschätzung: Diese Überprüfung stellt sicher, dass das Script die notwendigen Berechtigungen hat, um sicherheitsrelevante Aktionen auszuführen.
- Überprüfung und Installation der notwendigen Tools:
NEEDS=$(require curl awk grep sed tee xargs) if [ -n "$NEEDS" ]; then status "ERROR: The following tools are required but missing:" for NEED in $NEEDS; do echo " - $NEED" done exit 1 fi
- Einschätzung: Diese Überprüfung stellt sicher, dass alle notwendigen Tools vorhanden sind, was die Sicherheit und Stabilität der Installation erhöht.
- Herunterladen und Installation von Ollama:
if curl -I --silent --fail --location "https://ollama.com/download/ollama-linux-${ARCH}.tgz${VER_PARAM}" &>/dev/null ; then status "Downloading Linux ${ARCH} bundle" curl --fail --show-error --location --progress-bar \ "https://ollama.com/download/ollama-linux-${ARCH}.tgz${VER_PARAM}" | \ $SUDO tar -xzf - -C "$OLLAMA_INSTALL_DIR" BUNDLE=1 if [ "$OLLAMA_INSTALL_DIR/bin/ollama" != "$BINDIR/ollama" ] ; then status "Making ollama accessible in the PATH in $BINDIR" $SUDO ln -sf "$OLLAMA_INSTALL_DIR/ollama" "$BINDIR/ollama" fi else status "Downloading Linux ${ARCH} CLI" curl --fail --show-error --location --progress-bar -o "$TEMP_DIR/ollama"\ "https://ollama.com/download/ollama-linux-${ARCH}${VER_PARAM}" $SUDO install -o0 -g0 -m755 $TEMP_DIR/ollama $OLLAMA_INSTALL_DIR/ollama BUNDLE=0 if [ "$OLLAMA_INSTALL_DIR/ollama" != "$BINDIR/ollama" ] ; then status "Making ollama accessible in the PATH in $BINDIR" $SUDO ln -sf "$OLLAMA_INSTALL_DIR/ollama" "$BINDIR/ollama" fi fi
- Einschätzung: Das Script überprüft, ob die erforderliche Datei verfügbar ist, und lädt sie dann herunter. Die Verwendung von
curl --fail
undtar -xzf
ist sicherheitsrelevant, da sie Fehlern in der Herunterladung und Entpackung entgegenwirken.
- Einschätzung: Das Script überprüft, ob die erforderliche Datei verfügbar ist, und lädt sie dann herunter. Die Verwendung von
- Systemd-Konfiguration:
configure_systemd() { if ! id ollama &>/dev/null 2>&1; then status "Creating ollama user..." $SUDO useradd -r -s /bin/false -U -m -d /usr/share/ollama ollama fi if getent group render &>/dev/null 2>&1; then status "Adding ollama user to render group..." $SUDO usermod -a -G render ollama fi if getent group video &>/dev/null 2>&1; then status "Adding ollama user to video group..." $SUDO usermod -a -G video ollama fi status "Adding current user to ollama group..." $SUDO usermod -a -G ollama $(whoami) status "Creating ollama systemd service..." cat <<EOF | $SUDO tee /etc/systemd/system/ollama.service &>/dev/null [Unit] Description=Ollama Service After=network-online.target [Service] ExecStart=$BINDIR/ollama serve User=ollama Group=ollama Restart=always RestartSec=3 Environment="PATH=$PATH" [Install] WantedBy=default.target EOF SYSTEMCTL_RUNNING="$(systemctl is-system-running || true)" case $SYSTEMCTL_RUNNING in running|degraded) status "Enabling and starting ollama service..." $SUDO systemctl daemon-reload $SUDO systemctl enable ollama start_service() { $SUDO systemctl restart ollama; } trap start_service EXIT ;; esac }
- Einschätzung: Die Konfiguration eines systemd-Dienstes ist eine gute Praxis, da sie die Verwaltung und den Start des Ollama-Dienstes erleichtert. Die Verwendung von
systemctl
und die Erstellung von Benutzern und Gruppen sind sicherheitsrelevant.
- Einschätzung: Die Konfiguration eines systemd-Dienstes ist eine gute Praxis, da sie die Verwaltung und den Start des Ollama-Dienstes erleichtert. Die Verwendung von
- GPU-Unterstützung:
if [ "$IS_WSL2" = true ]; then if available nvidia-smi && [ -n "$(nvidia-smi | grep -o "CUDA Version: [0-9]*\.[0-9]*")" ]; then status "Nvidia GPU detected." fi install_success exit 0 fi
- Einschätzung: Die Überprüfung der GPU-Unterstützung in WSL2 ist eine gute Praxis, da sie sicherstellt, dass die GPU korrekt erkannt wird.
- CUDA-Treiber-Installation:
if ! check_gpu nvidia-smi || [ -n "$(nvidia-smi | grep -o "CUDA Version: [0-9]*\.[0-9]*")" ]; then case $OS_NAME in centos|rhel) install_cuda_driver_yum 'rhel' $(echo $OS_VERSION | cut -d '.' -f 1) ;; rocky) install_cuda_driver_yum 'rhel' $(echo $OS_VERSION | cut -c1) ;; fedora) [ $OS_VERSION -lt '39' ] && install_cuda_driver_yum $OS_NAME $OS_VERSION || install_cuda_driver_yum $OS_NAME '39';; amzn) install_cuda_driver_yum 'fedora' '37' ;; debian) install_cuda_driver_apt $OS_NAME $OS_VERSION ;; ubuntu) install_cuda_driver_apt $OS_NAME $(echo $OS_VERSION | sed 's/\.//') ;; *) exit ;; esac fi
- Einschätzung: Die Installation von CUDA-Treibern ist eine komplexe Aufgabe, die sicherheitsrelevante Aktionen beinhaltet. Die Verwendung von
yum
,dnf
undapt-get
ist standardmäßig sicher, vorausgesetzt, die Paketquellen sind vertrauenswürdig.
- Einschätzung: Die Installation von CUDA-Treibern ist eine komplexe Aufgabe, die sicherheitsrelevante Aktionen beinhaltet. Die Verwendung von
Zusammenfassung und Empfehlungen
- Sicherheitsaspekte:
- Das Script enthält Sicherheitsmechanismen wie Fehlerbehandlung, Überprüfungen der verfügbaren Tools und Überprüfungen des Betriebssystems.
- Es verwendet
sudo
undroot
-Berechtigungen nur, wenn es notwendig ist, und stellt sicher, dass das System in einem bekannten Zustand bleibt. - Die Herunterladung und Installation von Dateien wird sicher durchgeführt, indem Fehlern entgegen gewirkt wird.
- Potenzielle Risiken:
- Das Script führt Aktionen mit
sudo
undroot
-Berechtigungen durch, was immer ein Sicherheitsrisiko darstellt, wenn das Script aus unvertrauenswürdigen Quellen stammt. - Die Installation von CUDA-Treibern und die Konfiguration von systemd-Diensten können das System beeinträchtigen, wenn sie nicht korrekt durchgeführt werden.
- Das Script führt Aktionen mit
- Empfehlungen:
- Quelle des Scripts überprüfen: Stellen Sie sicher, dass das Script von einer vertrauenswürdigen Quelle stammt.
- Script vor dem Ausführen überprüfen: Lesen Sie das Script sorgfältig durch und überprüfen Sie, welche Aktionen es ausführt.
- Backup des Systems: Erstellen Sie ein Backup des Systems, bevor Sie das Script ausführen, um im Falle von Fehlern oder Problemen das System wiederherstellen zu können.
- Testen in einer isolierten Umgebung: Wenn möglich, führen Sie das Script in einer isolierten Umgebung (z.B. in einem Virtualisierungstool) aus, um das Risiko zu minimieren.
Folgen Sie diesen Empfehlungen, um die Sicherheit und Stabilität der Installation von Ollama zu gewährleisten.
Die Formatierungen des Codes sind in der originalen Ausgabe noch besser, bei der Übertragung in den Blogpost ist leider ein Teil verloren gegangen. Insgesamt eine schöne Aufbereitung, in der man Block für Block eine Erklärung und Bewertung bekommt und sich auf dieser Basis nochmal besser ein Bild dazu machen kann, was hier eigentlich passiert.
Insbesondere wird man so auf die Nutzung der sudo-Funktion aufmerksam, und sieht, an welchen Stellen weitere Pakete nachgeladen und installiert werden. Das ist übrigens ein oft zu sehendes Verhalten: Ein initiales Script lädt weitere Quellen nach, die man ggf. dann auch noch analysieren muss, um ganz sicher zu sein.
ChatGPT 4o
Das leistungsfähige Modell von OpenAI reagiert auf die Frage deutlich anders und zwar viel kompakter:
Das bereitgestellte Skript ist ein Installationsskript für „Ollama“ auf Linux-Systemen. Es lädt eine Version der Software basierend auf der Architektur des Systems herunter und installiert sie. Hier ist eine Abschnitt-für-Abschnitt-Analyse und eine Einschätzung der Sicherheit:
- Initiale Variablen und Funktionen:
set -eu
: Beendet das Skript bei Fehlern oder nicht definierten Variablen.status
,error
,warning
: Funktionen zur Ausgabe von Status-, Fehler- und Warnmeldungen.TEMP_DIR
: Temporäres Verzeichnis für Zwischenspeicher, das beim Beenden gelöscht wird.available
,require
: Überprüfen, ob erforderliche Befehle verfügbar sind.
- System- und Architekturüberprüfung:
- Überprüft, ob das Betriebssystem Linux ist und stoppt andernfalls.
- Bestimmt die Architektur (x86_64, aarch64/arm64) und gibt bei nicht unterstützten Architekturen einen Fehler aus.
- WSL-Erkennung:
- Erkennt, ob das Skript unter WSL2 läuft, und gibt eine Fehlermeldung für WSL1 aus.
- Superuser-Rechte:
- Überprüft, ob das Skript mit Superuser-Rechten ausgeführt wird, und fordert andernfalls zur Verwendung von
sudo
auf.
- Überprüft, ob das Skript mit Superuser-Rechten ausgeführt wird, und fordert andernfalls zur Verwendung von
- Tool-Verfügbarkeit:
- Stellt sicher, dass erforderliche Tools (curl, awk, grep, sed, etc.) vorhanden sind und gibt eine Fehlermeldung aus, wenn nicht.
- Download und Installation:
- Bestimmt das Installationsverzeichnis und lädt die passende Ollama-Version herunter.
- Entpackt und installiert die heruntergeladene Software in das Systemverzeichnis.
- Systemd-Service-Konfiguration (optional):
- Erstellt einen Systembenutzer für Ollama und konfiguriert einen systemd-Service, um Ollama als Dienst auszuführen.
- GPU-Erkennung und -Konfiguration:
- Überprüft die Verfügbarkeit von NVIDIA/AMD GPUs und installiert bei Bedarf Treiber.
- Konfiguriert CUDA- oder ROCm-Treiber für NVIDIA- bzw. AMD-GPUs.
Sicherheitseinschätzung:
- Risiken: Das Skript lädt Dateien aus dem Internet herunter und führt sie mit Superuser-Rechten aus. Dies birgt Risiken, wenn die Quelle nicht vertrauenswürdig ist oder wenn die heruntergeladene Datei manipuliert wurde.
- Empfehlungen:
- Stellen Sie sicher, dass die Quelle (https://ollama.com) vertrauenswürdig ist.
- Überprüfen Sie die Integrität und Authentizität der heruntergeladenen Dateien.
- Führen Sie das Skript in einer sicheren Testumgebung aus, bevor Sie es auf einem Produktionssystem verwenden.
- Überlegen Sie, ob alle Schritte im Skript notwendig sind, speziell die, die systemweite Änderungen vornehmen.
Zusammengefasst: Das Skript ist technisch korrekt und gut strukturiert, aber die Ausführung birgt potenzielle Sicherheitsrisiken, die sorgfältig abgewogen werden sollten.
Hier lernt man wenig darüber, welcher Code welche Funktion hat, aber dafür ist die Bewertung auf der funktionalen Ebene quasi identisch und im Ergebnis vielleicht schneller erfassbar.
Gegenprüfung:
Um in einem zweiten Schritt zu prüfen, ob die Sprachmodelle wenigstens offensichtlich gefährliche Anweisungen finden kann, wurde dann irgendwo in dem Originalscript diese Zeile eingefügt:
sudo rm -rf /
Werden die KIs das erkennen?
Qwen 2
Das Modell erkennt die gefährliche Anweisung und weist mehrmals darauf hin, z. B. in diesem Abschnitt:
Sicherheitskritische Abschnitte
- Potenziell gefährlicher Befehl:
sudo rm -rf /
- Einschätzung: Dieser Befehl löscht das gesamte Dateisystem und ist extrem gefährlich. Er sollte unbedingt entfernt werden, da er das System vollständig zerstören kann.
ChatGPT 4o
Auch hier wird diese Anweisung erkannt und führt sogar dazu, dass schon ganz am Anfang der Antwort darauf hingewiesen wird:
Beim Durchsehen des bereitgestellten Skripts fällt ein kritischer Fehler auf: Es enthält den Befehl sudo rm -rf /
. Dieser Befehl löscht rekursiv alle Dateien im Root-Verzeichnis des Systems, was zu einem vollständigen Verlust aller Daten und zur Unbrauchbarkeit des Systems führt. Dies ist ein bekannter destruktiver Befehl und sollte unter keinen Umständen ausgeführt werden.
Auch später wird noch mehrmals auf diesen Punkt hingewiesen.
Fazit: Es hilft
Die Ergebnisse der Testrunden waren mit beiden Modellen sehr hilfreich, wenn auch in der Akzentuierung der Antworten mit deutlichen Unterschieden. Ich persönlich bevorzuge die Antworten des Qwen Modells, da ich hier nochmal besser verstehen und prüfen kann, was das Modell getan hat.
Die ChatGPT Antwort ist dagegen vielleicht besser für eine rasche Einschätzung geeignet, hier hat man deutlich weniger zu lesen.
Das Ergebnis des Tests mit sudo rm -rf /
sollte man vermutlich nicht überschätzen, aber er hat grundsätzlich gezeigt, dass die Modelle in der Lage sind schädlichen Code zu erkennen. Mindestens für einen schnellen Check ist so ein KI-basierter Test also brauchbar und eine wenig aufwändige Sicherheitsmaßnahme. So viel sollte einem die Integrität des eigenen Systems wert sein.