Citrix Workspace-App

Zulassungsliste für Apps konfigurieren, die LD_PRELOAD-Funktionalitäten verwenden

Hinweis:

Das Konfigurieren der Zulassungsliste mithilfe der LD_PRELOAD-Funktionalität ist nur für die Citrix Workspace™-App für Linux verfügbar.

Der App-Schutz blockiert den Start einer geschützten Sitzung, wenn andere ausgeführte Apps LD_PRELOAD verwenden. Wenn es sich um echte Apps handelt oder wenn sie vom Administrator genehmigt wurden, können Sie die Zulassungslistenfunktion verwenden. Um die Verwendung anderer Apps, die LD_PRELOAD verwenden, zuzulassen, müssen Sie die Zulassungsliste konfigurieren.

Der App-Schutz verhindert den Start einer geschützten Sitzung, wenn andere Apps, die LD_PRELOAD verwenden, ausgeführt werden. Wenn es sich jedoch um legitime Apps handelt oder der Administrator dies genehmigt, können Sie die Zulassungslistenfunktion verwenden. Um diesen Apps die Ausführung zu ermöglichen, müssen Sie die Zulassungsliste einrichten.

Sie können Apps mit Preload-Funktionalitäten mithilfe der folgenden Schritte zur Zulassungsliste hinzufügen:

  1. Identifizieren Sie den Prozess, der den Start der geschützten VDA-/App-Sitzung blockiert.
  2. Erstellen Sie eine Konfigurationsdatei für die Zulassungsliste und fügen Sie den identifizierten Prozess hinzu.

Prozess identifizieren, der den Start des geschützten VDA verhindert

Wenn AppProtection den Start eines geschützten VDA aufgrund der LD_PRELOAD-Nutzung verhindert, überprüfen Sie die Prozesse, die LD_PRELOAD verwenden. Echte Prozesse können der Zulassungsliste hinzugefügt werden.

Um Prozesse zu identifizieren, die LD_PRELOAD verwenden, verwenden Sie das folgende Skript. Speichern Sie es mit der Erweiterung .sh und führen Sie es als sudo in einem Terminalfenster aus:

#!/bin/bash

declare -A map

append_kv() {
  local key="$1"
  local val="$2"
  local sep="$3"

  if [[ -v "map[$key]" && -n "${map[$key]}" ]]; then
    map["$key"]+="$sep$val"
  else
    map["$key"]="$val"
  fi
}

escape_json_string() {
    local str="$1"
    # Escape backslashes first, then quotes, then other control characters
    str="${str//\\/\\\\}"     # \ → \\
    str="${str//\"/\\\"}"     # " → \"
    str="${str//$'\t'/\\t}"   # tab → \t
    str="${str//$'\n'/\\n}"   # newline → \n
    str="${str//$'\r'/\\r}"   # carriage return → \r
    printf '%s' "$str"
}

print_procs_JSON() {
    printf "{\n"
    first=true
    for key in "${!map[@]}"; do
        if [ "$first" = true ]; then
            first=false
        else
            printf ",\n"
        fi
        printf "  \"%s\": \"%s\"" "$(escape_json_string "$key")" "$(escape_json_string "${map[$key]}")"
    done
    printf "\n}\n"
}

validate_json() {
    local json="$1"

    if command -v jq >/dev/null 2>&1; then
        printf '%s' "$json" | jq -e . >/dev/null 2>&1
        return $?
    fi

    if command -v python3 >/dev/null 2>&1; then
        printf '%s' "$json" | python3 -c 'import json, sys; json.load(sys.stdin)' >/dev/null 2>&1
        return $?
    fi

    # No validator available on PATH.
    return 2
}

for pid in /proc/*/; do
    pid=${pid%*/}
    pid=${pid##*/}

    # Only numeric /proc entries are process IDs.
    [[ "$pid" =~ ^[0-9]+$ ]] || continue

    environ_file="/proc/$pid/environ"
    cmdline_file="/proc/$pid/cmdline"

    if [[ ! -r "$environ_file" || ! -r "$cmdline_file" ]]; then
        continue
    fi

    # Check if the process has the LD_PRELOAD environment variable set
    ld_preload=$(cat "$environ_file" 2>/dev/null | tr '\0' '\n' | grep '^LD_PRELOAD=' | cut -d '=' -f 2-)
    if [ -n "$ld_preload" ]; then
        # Keep only argv[0] (the executable path/name) from cmdline.
        cmdline=$(cat "$cmdline_file" 2>/dev/null | tr '\0' '\n' | head -n 1)
        [ -n "$cmdline" ] || continue
        # Output the LD_PRELOAD value and the process cmdline in JSON format
        append_kv "LD_PRELOAD=$ld_preload" "$cmdline" "|"
    fi
done

# Generate and validate JSON output before printing.

json_output="$(print_procs_JSON)"

if ! validate_json "$json_output"; then
    status=$?
    if [ "$status" -eq 2 ]; then
        echo "Warning: could not validate JSON (no jq/python3 found)." >&2
        printf '%s\n' "$json_output"
        exit 0
    fi

    echo "Error: generated invalid JSON output." >&2
    exit 1
fi

printf '%s\n' "$json_output"
<!--NeedCopy-->

Basierend auf der Ausgabe des vorhergehenden Skripts identifizieren Sie die Prozesse, die den Start des geschützten VDA fehlschlagen lassen, und fügen Sie diese Prozesse der Zulassungsliste hinzu.

Hier ist ein Beispielbild, das die Ausgabe mit einer Liste von Apps mit einer Preload-Liste anzeigt.

Ausgabeanzeige

Erstellen der Konfigurationsdatei für die Zulassungsliste

Die Konfigurationsdatei für die Prozess-Zulassungsliste wird aus Sicherheitsgründen nicht standardmäßig installiert. Sie müssen diese Konfigurationsdatei beim ersten Bedarf erstellen.

  1. Erstellen Sie eine leere Datei mit dem Namen AppProtection_Preload_Allowlist.json im Ordner „$ICAROOT/config/“.
  2. Fügen Sie die Prozessdetails im folgenden Format hinzu. Der zweite Eintrag beschreibt, wie mehrere Prozesse verwaltet werden, die dieselbe Bibliothek in LD_PRELOAD verwenden.

        {
            "LD_PRELOAD_PATH1" : "PROCESS_PATH1",
            "LD_PRELOAD_PATH2" : "PROCESS_PATH2|PROCESS_PATH3"
        }
    <!--NeedCopy-->
    

    Hier ist ein Beispielbild, das die neu hinzugefügte Konfiguration zeigt: Konfigurationsdatei

  3. Speichern Sie die Datei und legen Sie dann die Berechtigungen für die Datei AppProtection_Preload_Allowlist.json mit dem folgenden Befehl fest.

sudo chmod 644 $ICAROOT/config/AppProtection_Preload_Allowlist.json

Hinweis:

Minimale Regex-Ausdrücke sind in Konfigurationseinträgen erlaubt, um Redundanz zu vermeiden. Spezielle Regex-Zeichen müssen überprüft und mit einem doppelten Backslash (\) maskiert werden.

  • Betrachten Sie zum Beispiel, dass die Skriptausgabe wie folgt aussieht:

LD_PRELOAD=:/snap/firmware-updater/226/gnome-platform/\\$LIB/bindtextdomain\\.so": "/snap/firmware-updater/226/bin/firmware-notifier

  • Um variable Elemente wie die Zahl 126 zu verwenden, können Regex-Ausdrücke für einen generischeren Eintrag in der Zulassungsliste verwendet werden:

LD_PRELOAD=:/snap/firmware-updater/\\d+/gnome-platform/\\$LIB/bindtextdomain\\.so": "/snap/firmware-updater/226/bin/firmware-notifier

  • Sie können sehen, dass die Ausgabe „.“ und „$“ enthält, die Sonderzeichen in Regex-Mustern sind und maskiert wurden:

LD_PRELOAD=:/snap/firmware-updater/226/gnome-platform/\\$LIB/bindtextdomain\\.so": "/snap/firmware-updater/226/bin/firmware-notifier

  • Wenn es andere Sonderzeichen wie " (Anführungszeichen) oder ^ (Caret) gibt, maskieren Sie diese auf die gleiche Weise.
Zulassungsliste für Apps konfigurieren, die LD_PRELOAD-Funktionalitäten verwenden