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:
- Identifizieren Sie den Prozess, der den Start der geschützten VDA-/App-Sitzung blockiert.
- 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.

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.
- Erstellen Sie eine leere Datei mit dem Namen AppProtection_Preload_Allowlist.json im Ordner „$ICAROOT/config/“.
-
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:

- 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.