LD_PRELOAD機能を使用するアプリの許可リストを構成する

最終公開日 : Nov 03, 2026
注記:
LD_PRELOAD機能を使用した許可リストの構成は、Linux版Citrix Workspace™アプリでのみ利用可能です。
App Protectionは、他の実行中のアプリがLD_PRELOADを使用している場合、保護されたセッションの起動をブロックします。正規のアプリである場合、または管理者が承認している場合は、許可リスト機能を使用できます。LD_PRELOADを使用する他のアプリの使用を許可するには、許可リストを構成する必要があります。
App Protectionは、LD_PRELOADを使用している他のアプリが実行されている場合、保護されたセッションの開始を停止します。ただし、正当なアプリである場合、または管理者が承認している場合は、許可リスト機能を使用できます。これらのアプリの実行を許可するには、許可リストを設定する必要があります。
次の手順で、プリロード機能を持つアプリを許可リストに追加できます。
  1. 保護されたVDA/アプリセッションの開始をブロックしているプロセスを特定します。
  2. 許可リストの構成ファイルを作成し、特定されたプロセスを追加します。

保護されたVDAの起動を妨げているプロセスを特定する

App ProtectionがLD_PRELOADの使用により保護されたVDAの起動を妨げる場合、LD_PRELOADを使用しているプロセスを確認します。正規のプロセスは許可リストに追加できます。
LD_PRELOADを使用しているプロセスを特定するには、次のスクリプトを使用します。.sh拡張子で保存し、ターミナルウィンドウでsudoとして実行します。
#!/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"
上記のスクリプトの出力に基づいて、保護されたVDAの起動失敗の原因となっているプロセスを特定し、それらのプロセスを許可リストに追加します。
以下に、プリロードリストを持つアプリのリストを含む出力を表示するサンプル画像を示します。
出力表示

許可リスト構成ファイルの作成

プロセス許可リスト構成ファイルは、セキュリティ上の理由からデフォルトではインストールされません。この構成ファイルは、必要になったときに初めて作成する必要があります。
  1. 「$ICAROOT/config/」フォルダーにAppProtection_Preload_Allowlist.jsonという名前の空のファイルを作成します。
  2. 次の形式でプロセス詳細を追加します。2番目のエントリは、LD_PRELOADで同じライブラリを使用する複数のプロセスを管理する方法について説明しています。
    {
        "LD_PRELOAD_PATH1" : "PROCESS_PATH1",
        "LD_PRELOAD_PATH2" : "PROCESS_PATH2|PROCESS_PATH3"
    }
    新しく追加された構成を表示するサンプル画像を次に示します。 構成ファイル
  3. ファイルを保存し、次のコマンドを使用してAppProtection_Preload_Allowlist.jsonファイルのアクセス許可を設定します。
sudo chmod 644 $ICAROOT/config/AppProtection_Preload_Allowlist.json
注:
冗長性を防ぐため、構成エントリでは最小限の正規表現が許可されています。特殊な正規表現文字は確認し、二重のバックスラッシュ (\\) でエスケープする必要があります。
  • たとえば、スクリプトの出力が次のようになっているとします。
LD_PRELOAD=:/snap/firmware-updater/226/gnome-platform/\\$LIB/bindtextdomain\\.so": "/snap/firmware-updater/226/bin/firmware-notifier
  • 126のような可変要素を使用するには、より汎用的な許可リストエントリに正規表現を使用できます。
LD_PRELOAD=:/snap/firmware-updater/\\d+/gnome-platform/\\$LIB/bindtextdomain\\.so": "/snap/firmware-updater/226/bin/firmware-notifier
  • 出力には、正規表現パターン内の特殊文字である「.」と「$」が含まれており、これらはエスケープされていることがわかります。
LD_PRELOAD=:/snap/firmware-updater/226/gnome-platform/\\$LIB/bindtextdomain\\.so": "/snap/firmware-updater/226/bin/firmware-notifier
  • " (引用符) や \^ (キャレット) のような他の特殊文字がある場合は、同様にエスケープします。