Configurer la liste d’autorisation pour les applications qui utilisent les fonctionnalités LD_PRELOAD
Remarque :
La configuration de la liste d’autorisation à l’aide de la fonctionnalité LD_PRELOAD est uniquement disponible pour l’application Citrix Workspace™ pour Linux.
La protection des applications bloque le lancement d’une session protégée si d’autres applications en cours d’exécution utilisent LD_PRELOAD. S’il existe des applications légitimes ou si elles sont approuvées par l’administrateur, vous pouvez utiliser la fonctionnalité de liste d’autorisation. Pour autoriser l’utilisation d’autres applications qui utilisent LD_PRELOAD, vous devez configurer la liste d’autorisation.
La protection des applications empêche le démarrage d’une session protégée si d’autres applications utilisant LD_PRELOAD sont en cours d’exécution. Mais s’il existe des applications légitimes ou si l’administrateur les approuve, vous pouvez utiliser la fonctionnalité de liste d’autorisation. Pour permettre à ces applications de s’exécuter, vous devez configurer la liste d’autorisation.
Vous pouvez ajouter des applications avec des fonctionnalités de préchargement à la liste d’autorisation en suivant les étapes suivantes :
- Identifiez le processus qui bloque le démarrage de la session VDA/application protégée.
- Créez un fichier de configuration pour la liste d’autorisation et ajoutez le processus identifié.
Identifier le processus empêchant le lancement du VDA protégé
Lorsque AppProtection empêche le lancement d’un VDA protégé en raison de l’utilisation de LD_PRELOAD, vérifiez les processus utilisant LD_PRELOAD. Les processus légitimes peuvent être ajoutés à la liste d’autorisation.
Pour identifier les processus utilisant LD_PRELOAD, utilisez le script suivant. Enregistrez-le avec une extension .sh et exécutez-le en tant que sudo dans une fenêtre de terminal :
#!/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-->
En fonction de la sortie du script précédent, identifiez les processus qui empêchent le lancement du VDA protégé et ajoutez ces processus à la liste d’autorisation.
Voici un exemple d’image affichant la sortie avec une liste d’applications ayant une liste de préchargement.

Création du fichier de configuration de la liste d’autorisation
Le fichier de configuration de la liste d’autorisation de processus n’est pas installé par défaut pour des raisons de sécurité. Vous devez créer ce fichier de configuration la première fois qu’il est nécessaire.
- Créez un fichier vide nommé AppProtection_Preload_Allowlist.json dans le dossier « $ICAROOT/config/ ».
-
Ajoutez les détails du processus au format suivant. La deuxième entrée décrit comment gérer plusieurs processus qui utilisent la même bibliothèque dans LD_PRELOAD.
{ "LD_PRELOAD_PATH1" : "PROCESS_PATH1", "LD_PRELOAD_PATH2" : "PROCESS_PATH2|PROCESS_PATH3" } <!--NeedCopy-->Voici un exemple d’image affichant la configuration nouvellement ajoutée :

- Enregistrez le fichier, puis définissez les autorisations du fichier AppProtection_Preload_Allowlist.json à l’aide de la commande suivante.
sudo chmod 644 $ICAROOT/config/AppProtection_Preload_Allowlist.json
Remarque :
Des expressions regex minimales sont autorisées dans les entrées de configuration pour éviter la redondance. Les caractères spéciaux des expressions regex doivent être vérifiés et échappés avec une double barre oblique inverse (\).
- Par exemple, considérez que la sortie du script est la suivante :
LD_PRELOAD=:/snap/firmware-updater/226/gnome-platform/\\$LIB/bindtextdomain\\.so": "/snap/firmware-updater/226/bin/firmware-notifier
- Pour utiliser des éléments variables comme le nombre 126, des expressions regex peuvent être utilisées pour une entrée de liste d’autorisation plus générique :
LD_PRELOAD=:/snap/firmware-updater/\\d+/gnome-platform/\\$LIB/bindtextdomain\\.so": "/snap/firmware-updater/226/bin/firmware-notifier
- Vous pouvez voir que la sortie inclut « . », « $ » qui sont des caractères spéciaux dans les modèles regex, et qui ont été échappés :
LD_PRELOAD=:/snap/firmware-updater/226/gnome-platform/\\$LIB/bindtextdomain\\.so": "/snap/firmware-updater/226/bin/firmware-notifier
- S’il existe d’autres caractères spéciaux comme
"(guillemet) ou^(accent circonflexe), échappez-les de la même manière.