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:
- Identifique el proceso que está bloqueando el inicio de la sesión de VDA/aplicación protegida.
- 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.

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.
- Cree un archivo vacío llamado AppProtection_Preload_Allowlist.json en la carpeta “$ICAROOT/config/”.
-
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:

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