Application Citrix Workspace

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 :

  1. Identifiez le processus qui bloque le démarrage de la session VDA/application protégée.
  2. 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.

Affichage de la sortie

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.

  1. Créez un fichier vide nommé AppProtection_Preload_Allowlist.json dans le dossier « $ICAROOT/config/ ».
  2. 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 : Fichier de configuration

  3. 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.
Configurer la liste d’autorisation pour les applications qui utilisent les fonctionnalités LD_PRELOAD