Citrix Workspaceアプリ

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

注記:

LD_PRELOAD機能を使用した許可リストの構成は、Linux版Citrix Workspace™アプリでのみ利用可能です。

LD_PRELOADを使用する他のアプリが実行されている場合、App Protectionは保護されたセッションの起動をブロックします。正規のアプリである場合、または管理者が承認した場合は、許可リスト機能を使用できます。LD_PRELOADを使用する他のアプリの使用を許可するには、許可リストを構成する必要があります。

LD_PRELOADを使用する他のアプリが実行されている場合、App Protectionは保護されたセッションの開始を停止します。ただし、正当なアプリである場合、または管理者が承認した場合は、許可リスト機能を使用できます。これらのアプリの実行を許可するには、許可リストを設定する必要があります。

プリロード機能を持つアプリは、以下の手順で許可リストに追加できます。

  1. 保護されたVDA/アプリセッションの開始をブロックしているプロセスを特定します。
  2. 許可リストの構成ファイルを作成し、特定されたプロセスを追加します。

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

LD_PRELOADの使用によりAppProtectionが保護された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"
<!--NeedCopy-->

上記のスクリプトの出力に基づいて、保護されたVDAの起動失敗の原因となっているプロセスを特定し、それらのプロセスを許可リストに追加します。

以下に、プリロードリストを持つアプリのリストを含む出力を表示するサンプル画像を示します。

出力表示

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

プロセス許可リスト構成ファイルは、セキュリティ上の理由からデフォルトではインストールされていません。この構成ファイルは、最初に必要になったときに作成する必要があります。

  1. 「$ICAROOT/config/」という指定されたフォルダー内に、AppProtection_Preload_Allowlist.json という名前が付けられた空のファイルを作成します。
  2. 次の形式でプロセス詳細を追加します。2番目のエントリは、LD_PRELOADで同じライブラリを使用する複数のプロセスを管理する方法について説明しています。

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

    新しく追加された構成を表示するサンプル画像です: 構成ファイル

  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

  • " (引用符) や ^ (キャレット) のような他の特殊文字がある場合は、同様にエスケープしてください。
LD_PRELOAD機能を使用するアプリの許可リストを構成する