Aplicación Citrix Workspace

Configurar la lista de permitidos para las aplicaciones que utilizan funcionalidades de LD_PRELOAD

Nota:

La configuración de la lista de permitidos mediante la funcionalidad LD_PRELOAD solo está disponible para la aplicación Citrix Workspace™ para Linux.

La protección de aplicaciones bloquea el inicio de una sesión protegida si otras aplicaciones en ejecución utilizan LD_PRELOAD. Si hay aplicaciones legítimas o si el administrador las aprueba, puede utilizar la función de lista de permitidos. Para permitir el uso de otras aplicaciones que utilizan LD_PRELOAD, debe configurar la lista de permitidos.

La protección de aplicaciones impide que se inicie una sesión protegida si se están ejecutando otras aplicaciones que utilizan LD_PRELOAD. Pero si hay aplicaciones legítimas o si el administrador las aprueba, puede utilizar la función de lista de permitidos. Para permitir que estas aplicaciones se ejecuten, debe configurar la lista de permitidos.

Puede añadir aplicaciones con funcionalidades de precarga a la lista de permitidos siguiendo estos pasos:

  1. Identifique el proceso que está bloqueando el inicio de la sesión de VDA/aplicación protegida.
  2. Cree un archivo de configuración para la lista de permitidos y añada el proceso identificado.

Identificar el proceso que impide el inicio de VDA protegido

Cuando la protección de aplicaciones impide el inicio de un VDA protegido debido al uso de LD_PRELOAD, verificar los procesos que utilizan LD_PRELOAD. Los procesos legítimos se pueden añadir a la lista de permitidos.

Para identificar los procesos que utilizan LD_PRELOAD, utilice el siguiente script. Guárdelo con una extensión .sh y ejecútelo como sudo en una ventana 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-->

Según la salida del script anterior, identifique los procesos que están provocando el fallo en el inicio del VDA protegido y añada esos procesos a la lista de permitidos.

Aquí tiene una imagen de ejemplo que muestra la salida con una lista de aplicaciones con una lista de precarga.

Visualización de la salida

Creación del archivo de configuración de la lista de permitidos

El archivo de configuración de la lista de permitidos del proceso no se instala de forma predeterminada por motivos de seguridad. Debe crear este archivo de configuración la primera vez que sea necesario.

  1. Cree un archivo vacío llamado AppProtection_Preload_Allowlist.json en la carpeta “$ICAROOT/config/”.
  2. Agregue los detalles del proceso en el siguiente formato. La segunda entrada describe cómo administrar varios procesos que utilizan la misma biblioteca en LD_PRELOAD.

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

    Aquí tiene una imagen de ejemplo que muestra la configuración recién agregada: Configure file

  3. Guarde el archivo y, a continuación, establezca los permisos para el archivo AppProtection_Preload_Allowlist.json mediante el siguiente comando.

sudo chmod 644 $ICAROOT/config/AppProtection_Preload_Allowlist.json

Nota:

Se permiten expresiones regex mínimas en las entradas de configuración para evitar la redundancia. Los caracteres especiales de regex deben comprobarse y escaparse con una doble barra invertida (\).

  • Por ejemplo, considere que la salida del script es la siguiente:

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

  • Para usar elementos variables como el número 126, se pueden usar expresiones regex para una entrada de lista de permitidos más genérica:

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

  • Puede ver que la salida incluye ‘.’ y ‘$’, que son caracteres especiales en los patrones regex, y se han escapado:

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

  • Si hay otros caracteres especiales como " (comillas) o ^ (acento circunflejo), escápelos de la misma manera.
Configurar la lista de permitidos para las aplicaciones que utilizan funcionalidades de LD_PRELOAD