Cleanup capabilities
This commit is contained in:
366
sloptrap
366
sloptrap
@@ -351,6 +351,7 @@ write_embedded_helper() {
|
||||
cat <<'EOF'
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
|
||||
helper_pid=""
|
||||
helperd_bin=${SLOPTRAP_HELPERD_BIN:-/usr/local/bin/sloptrap-helperd}
|
||||
@@ -394,6 +395,7 @@ EOF
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
umask 077
|
||||
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
|
||||
helper_dir=${SLOPTRAP_HELPER_DIR:-/tmp/sloptrap-helper}
|
||||
queue_dir="$helper_dir/queue"
|
||||
@@ -482,15 +484,15 @@ release_request_dir() {
|
||||
local owner_gid=$3
|
||||
local path
|
||||
[[ $owner_uid =~ ^[0-9]+$ && $owner_gid =~ ^[0-9]+$ ]] || return 0
|
||||
for path in "$request_dir" "$request_dir/status" "$request_dir/stdout" "$request_dir/stderr"; do
|
||||
[[ -e $path && ! -L $path ]] || continue
|
||||
chown "$owner_uid:$owner_gid" "$path" 2>/dev/null || true
|
||||
done
|
||||
chmod 700 "$request_dir" 2>/dev/null || true
|
||||
for path in "$request_dir/status" "$request_dir/stdout" "$request_dir/stderr"; do
|
||||
[[ -e $path && ! -L $path ]] || continue
|
||||
chmod 600 "$path" 2>/dev/null || true
|
||||
done
|
||||
for path in "$request_dir" "$request_dir/status" "$request_dir/stdout" "$request_dir/stderr"; do
|
||||
[[ -e $path && ! -L $path ]] || continue
|
||||
chown "$owner_uid:$owner_gid" "$path" 2>/dev/null || true
|
||||
done
|
||||
}
|
||||
|
||||
init_request_outputs() {
|
||||
@@ -537,6 +539,7 @@ write_status() {
|
||||
|
||||
run_apt_install() {
|
||||
local request_dir=$1
|
||||
local apt_get_bin
|
||||
has_capability "apt-install" || {
|
||||
printf 'capability apt-install is not active\n' >"$request_dir/stderr"
|
||||
write_status "$request_dir" 126
|
||||
@@ -566,8 +569,18 @@ run_apt_install() {
|
||||
return
|
||||
fi
|
||||
done
|
||||
if apt-get update >"$request_dir/stdout" 2>"$request_dir/stderr" \
|
||||
&& apt-get install -y --no-install-recommends "${packages[@]}" >>"$request_dir/stdout" 2>>"$request_dir/stderr"; then
|
||||
apt_get_bin=${SLOPTRAP_APT_GET_BIN:-}
|
||||
if [[ -z $apt_get_bin ]]; then
|
||||
apt_get_bin=$(command -v apt-get 2>/dev/null || true)
|
||||
fi
|
||||
if [[ -z $apt_get_bin || ! -x $apt_get_bin ]]; then
|
||||
printf 'apt-get is not available in this image\n' >"$request_dir/stderr"
|
||||
write_status "$request_dir" 127
|
||||
log_action "apt-install" "packages=missing-tool" 127
|
||||
return
|
||||
fi
|
||||
if "$apt_get_bin" update >"$request_dir/stdout" 2>"$request_dir/stderr" \
|
||||
&& "$apt_get_bin" install -y --no-install-recommends "${packages[@]}" >>"$request_dir/stdout" 2>>"$request_dir/stderr"; then
|
||||
write_status "$request_dir" 0
|
||||
log_action "apt-install" "packages=${packages[*]}" 0
|
||||
return
|
||||
@@ -578,6 +591,7 @@ run_apt_install() {
|
||||
|
||||
run_packet_capture() {
|
||||
local request_dir=$1
|
||||
local tcpdump_bin
|
||||
has_capability "packet-capture" || {
|
||||
printf 'capability packet-capture is not active\n' >"$request_dir/stderr"
|
||||
write_status "$request_dir" 126
|
||||
@@ -609,7 +623,17 @@ run_packet_capture() {
|
||||
log_action "packet-capture" "interface=$iface stdout=invalid" 2
|
||||
return
|
||||
fi
|
||||
local -a cmd=(tcpdump -i "$iface")
|
||||
tcpdump_bin=${SLOPTRAP_TCPDUMP_BIN:-}
|
||||
if [[ -z $tcpdump_bin ]]; then
|
||||
tcpdump_bin=$(command -v tcpdump 2>/dev/null || true)
|
||||
fi
|
||||
if [[ -z $tcpdump_bin || ! -x $tcpdump_bin ]]; then
|
||||
printf 'tcpdump is not available in this image\n' >"$request_dir/stderr"
|
||||
write_status "$request_dir" 127
|
||||
log_action "packet-capture" "interface=$iface tool=missing" 127
|
||||
return
|
||||
fi
|
||||
local -a cmd=("$tcpdump_bin" -p -i "$iface")
|
||||
if [[ -s $output_file ]]; then
|
||||
local capture_path
|
||||
capture_path=$(read_request_value "$output_file" || true)
|
||||
@@ -704,6 +728,7 @@ EOF
|
||||
cat <<'EOF'
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
|
||||
helper_dir=${SLOPTRAP_HELPER_DIR:-/tmp/sloptrap-helper}
|
||||
queue_dir="$helper_dir/queue"
|
||||
@@ -721,50 +746,8 @@ ensure_helper_ready() {
|
||||
if [[ -w $queue_dir ]] && helper_running; then
|
||||
return 0
|
||||
fi
|
||||
if [[ -z ${SLOPTRAP_ACTIVE_CAPABILITIES:-} ]]; then
|
||||
printf 'slop-apt: capability helper is not available in this session\n' >&2
|
||||
exit 1
|
||||
fi
|
||||
if ! command -v setpriv >/dev/null 2>&1; then
|
||||
printf 'slop-apt: setpriv is required to bootstrap the capability helper\n' >&2
|
||||
exit 1
|
||||
fi
|
||||
setpriv --reuid 0 --regid 0 --clear-groups -- env \
|
||||
SLOPTRAP_HELPER_DIR="$helper_dir" \
|
||||
SLOPTRAP_ACTIVE_CAPABILITIES="${SLOPTRAP_ACTIVE_CAPABILITIES:-}" \
|
||||
SLOPTRAP_AUDIT_LOG="${SLOPTRAP_AUDIT_LOG:-/codex/state/capabilities.log}" \
|
||||
SLOPTRAP_CAPTURE_DIR="${SLOPTRAP_CAPTURE_DIR:-/codex/state/captures}" \
|
||||
SLOPTRAP_WORKDIR="${SLOPTRAP_WORKDIR:-/workspace}" \
|
||||
SLOPTRAP_HOST_UID="${SLOPTRAP_HOST_UID:-$(id -u)}" \
|
||||
SLOPTRAP_HOST_GID="${SLOPTRAP_HOST_GID:-$(id -g)}" \
|
||||
bash -c '
|
||||
set -euo pipefail
|
||||
helper_dir=${SLOPTRAP_HELPER_DIR:-/tmp/sloptrap-helper}
|
||||
queue_dir="$helper_dir/queue"
|
||||
pidfile="$helper_dir/helperd.pid"
|
||||
helper_bin=$(command -v sloptrap-helperd)
|
||||
[[ -n $helper_bin ]] || exit 1
|
||||
mkdir -p "$queue_dir"
|
||||
chmod 711 "$helper_dir"
|
||||
chmod 1733 "$queue_dir"
|
||||
if [[ -r $pidfile ]]; then
|
||||
pid=$(<"$pidfile")
|
||||
if [[ -n $pid ]] && kill -0 "$pid" 2>/dev/null; then
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
"$helper_bin" >/dev/null 2>&1 &
|
||||
for ((i=0; i<30; i+=1)); do
|
||||
if [[ -r $pidfile ]]; then
|
||||
pid=$(<"$pidfile")
|
||||
if [[ -n $pid ]] && kill -0 "$pid" 2>/dev/null; then
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
sleep 0.1
|
||||
done
|
||||
exit 1
|
||||
'
|
||||
printf 'slop-apt: capability helper is unavailable; start a fresh sloptrap session with apt-install enabled\n' >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
if [[ ${1-} != "install" ]]; then
|
||||
@@ -811,12 +794,14 @@ EOF
|
||||
cat <<'EOF'
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
|
||||
helper_dir=${SLOPTRAP_HELPER_DIR:-/tmp/sloptrap-helper}
|
||||
helper_dir=${SLOPTRAP_CAPTURE_HELPER_DIR:-/codex/state/capture-helper}
|
||||
queue_dir="$helper_dir/queue"
|
||||
default_output=${SLOPTRAP_CAPTURE_DIR:-/codex/state/captures}
|
||||
workspace_root=${SLOPTRAP_WORKDIR:-/workspace}
|
||||
pidfile="$helper_dir/helperd.pid"
|
||||
packet_capture_enabled=${SLOPTRAP_PACKET_CAPTURE_ENABLED:-0}
|
||||
mkdir -p "$default_output"
|
||||
|
||||
helper_running() {
|
||||
@@ -828,53 +813,15 @@ helper_running() {
|
||||
}
|
||||
|
||||
ensure_helper_ready() {
|
||||
if [[ $packet_capture_enabled != "1" ]]; then
|
||||
printf 'slopcap: packet capture is not enabled in this session\n' >&2
|
||||
exit 1
|
||||
fi
|
||||
if [[ -w $queue_dir ]] && helper_running; then
|
||||
return 0
|
||||
fi
|
||||
if [[ -z ${SLOPTRAP_ACTIVE_CAPABILITIES:-} ]]; then
|
||||
printf 'slopcap: capability helper is not available in this session\n' >&2
|
||||
exit 1
|
||||
fi
|
||||
if ! command -v setpriv >/dev/null 2>&1; then
|
||||
printf 'slopcap: setpriv is required to bootstrap the capability helper\n' >&2
|
||||
exit 1
|
||||
fi
|
||||
setpriv --reuid 0 --regid 0 --clear-groups -- env \
|
||||
SLOPTRAP_HELPER_DIR="$helper_dir" \
|
||||
SLOPTRAP_ACTIVE_CAPABILITIES="${SLOPTRAP_ACTIVE_CAPABILITIES:-}" \
|
||||
SLOPTRAP_AUDIT_LOG="${SLOPTRAP_AUDIT_LOG:-/codex/state/capabilities.log}" \
|
||||
SLOPTRAP_CAPTURE_DIR="${SLOPTRAP_CAPTURE_DIR:-/codex/state/captures}" \
|
||||
SLOPTRAP_WORKDIR="${SLOPTRAP_WORKDIR:-/workspace}" \
|
||||
SLOPTRAP_HOST_UID="${SLOPTRAP_HOST_UID:-$(id -u)}" \
|
||||
SLOPTRAP_HOST_GID="${SLOPTRAP_HOST_GID:-$(id -g)}" \
|
||||
bash -c '
|
||||
set -euo pipefail
|
||||
helper_dir=${SLOPTRAP_HELPER_DIR:-/tmp/sloptrap-helper}
|
||||
queue_dir="$helper_dir/queue"
|
||||
pidfile="$helper_dir/helperd.pid"
|
||||
helper_bin=$(command -v sloptrap-helperd)
|
||||
[[ -n $helper_bin ]] || exit 1
|
||||
mkdir -p "$queue_dir"
|
||||
chmod 711 "$helper_dir"
|
||||
chmod 1733 "$queue_dir"
|
||||
if [[ -r $pidfile ]]; then
|
||||
pid=$(<"$pidfile")
|
||||
if [[ -n $pid ]] && kill -0 "$pid" 2>/dev/null; then
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
"$helper_bin" >/dev/null 2>&1 &
|
||||
for ((i=0; i<30; i+=1)); do
|
||||
if [[ -r $pidfile ]]; then
|
||||
pid=$(<"$pidfile")
|
||||
if [[ -n $pid ]] && kill -0 "$pid" 2>/dev/null; then
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
sleep 0.1
|
||||
done
|
||||
exit 1
|
||||
'
|
||||
printf 'slopcap: capture helper is unavailable; start a fresh sloptrap session with packet-capture enabled\n' >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
resolve_requested_path() {
|
||||
@@ -1174,6 +1121,45 @@ ensure_capability_trust() {
|
||||
prompt_capability_trust
|
||||
}
|
||||
|
||||
host_network_packet_capture_active() {
|
||||
$ALLOW_HOST_NETWORK && capability_list_contains "$ENABLED_CAPABILITIES" "packet-capture"
|
||||
}
|
||||
|
||||
prompt_runtime_packet_capture_ack() {
|
||||
local tty_path="/dev/tty"
|
||||
printf '%s' "$PREFIX_TEXT" >"$tty_path"
|
||||
printf '%b' "$COLOR_TEXT" >"$tty_path"
|
||||
printf 'Warning: host networking + packet-capture is a high-trust mode.\n' >"$tty_path"
|
||||
printf 'If you continue, code inside this session can capture host-network traffic, including plaintext protocols and requests to local services.\n' >"$tty_path"
|
||||
printf 'It can also transmit spoofed packets into the host network namespace for the duration of this run.\n' >"$tty_path"
|
||||
printf 'This is not a normal sandboxed session boundary.\n' >"$tty_path"
|
||||
printf 'Continue with host-network packet capture for this run? [y/N]: ' >"$tty_path"
|
||||
printf '%b' "$RESET" >"$tty_path"
|
||||
local input
|
||||
if ! IFS= read -r input <"$tty_path"; then
|
||||
error "host-network packet capture requires an interactive terminal acknowledgement"
|
||||
fi
|
||||
case "${input,,}" in
|
||||
y|yes)
|
||||
RUNTIME_PACKET_CAPTURE_ACKNOWLEDGED=true
|
||||
;;
|
||||
*)
|
||||
error "host-network packet capture not acknowledged"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
ensure_runtime_packet_capture_ack() {
|
||||
host_network_packet_capture_active || return 0
|
||||
$RUNTIME_PACKET_CAPTURE_ACKNOWLEDGED && return 0
|
||||
if $DRY_RUN; then
|
||||
warn "host networking with packet capture would require an interactive acknowledgement at runtime"
|
||||
RUNTIME_PACKET_CAPTURE_ACKNOWLEDGED=true
|
||||
return 0
|
||||
fi
|
||||
prompt_runtime_packet_capture_ack
|
||||
}
|
||||
|
||||
write_capability_build_stamp() {
|
||||
ensure_capability_state_paths
|
||||
if $DRY_RUN; then
|
||||
@@ -1732,8 +1718,12 @@ EOF
|
||||
|
||||
declare -a CONTAINER_SHARED_OPTS=()
|
||||
declare -a BASE_CONTAINER_CMD=()
|
||||
declare -a CAPTURE_POD_CREATE_CMD=()
|
||||
declare -a CAPTURE_HELPER_BASE_CMD=()
|
||||
SLOPTRAP_IMAGE_NAME=""
|
||||
SLOPTRAP_CONTAINER_NAME=""
|
||||
SLOPTRAP_CAPTURE_CONTAINER_NAME=""
|
||||
SLOPTRAP_POD_NAME=""
|
||||
SLOPTRAP_DOCKERFILE_PATH=""
|
||||
SLOPTRAP_BUILD_CONTEXT=""
|
||||
SLOPTRAP_DOCKERFILE_SOURCE=""
|
||||
@@ -1759,6 +1749,10 @@ SLOPTRAP_TMPFS_PATHS=""
|
||||
SLOPTRAP_ROOTFS_READONLY=""
|
||||
SLOPTRAP_ROOTFS_READONLY_DEFAULT=""
|
||||
SLOPTRAP_RUN_AS_ROOT=false
|
||||
SLOPTRAP_MAIN_ACTIVE_CAPABILITIES=""
|
||||
SLOPTRAP_PACKET_CAPTURE_ENABLED=false
|
||||
SLOPTRAP_CAPTURE_HELPER_DIR_CONT=""
|
||||
SLOPTRAP_CAPTURE_HELPER_DIR_HOST=""
|
||||
|
||||
get_env_default() {
|
||||
local var=$1
|
||||
@@ -1821,6 +1815,87 @@ run_or_print() {
|
||||
"$@"
|
||||
}
|
||||
|
||||
append_auth_mount_arg() {
|
||||
local writable=$1
|
||||
local -n out=$2
|
||||
local suffix=""
|
||||
if [[ $CONTAINER_ENGINE == "podman" ]]; then
|
||||
suffix=":Z"
|
||||
if [[ $writable != true ]]; then
|
||||
suffix=":Z,ro"
|
||||
fi
|
||||
elif [[ $writable != true ]]; then
|
||||
suffix=":ro"
|
||||
fi
|
||||
out+=(-v "$CODEX_AUTH_FILE_HOST:$SLOPTRAP_CODEX_HOME_CONT/auth.json$suffix")
|
||||
}
|
||||
|
||||
ensure_capability_engine_supported() {
|
||||
[[ -n $REQUESTED_CAPABILITIES ]] || return 0
|
||||
if [[ $CONTAINER_ENGINE != "podman" ]]; then
|
||||
error "capability-enabled runs require podman; docker is not supported for capabilities"
|
||||
fi
|
||||
}
|
||||
|
||||
packet_capture_enabled() {
|
||||
capability_list_contains "$ENABLED_CAPABILITIES" "packet-capture"
|
||||
}
|
||||
|
||||
stop_packet_capture_helper() {
|
||||
[[ -n $SLOPTRAP_POD_NAME ]] || return 0
|
||||
if $DRY_RUN; then
|
||||
print_command "$CONTAINER_ENGINE" pod rm -f "$SLOPTRAP_POD_NAME"
|
||||
return 0
|
||||
fi
|
||||
"$CONTAINER_ENGINE" pod rm -f "$SLOPTRAP_POD_NAME" >/dev/null 2>&1 || true
|
||||
}
|
||||
|
||||
wait_for_path() {
|
||||
local path=$1
|
||||
local attempts=${2:-50}
|
||||
local delay=${3:-0.1}
|
||||
local i
|
||||
for ((i=0; i<attempts; i+=1)); do
|
||||
[[ -e $path ]] && return 0
|
||||
sleep "$delay"
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
start_packet_capture_helper() {
|
||||
packet_capture_enabled || return 0
|
||||
ensure_runtime_packet_capture_ack
|
||||
ensure_codex_directory "$SLOPTRAP_CAPTURE_HELPER_DIR_HOST" "capture helper state"
|
||||
if $DRY_RUN; then
|
||||
print_command "${CAPTURE_POD_CREATE_CMD[@]}"
|
||||
print_command "${CAPTURE_HELPER_BASE_CMD[@]}"
|
||||
return 0
|
||||
fi
|
||||
stop_packet_capture_helper
|
||||
"${CAPTURE_POD_CREATE_CMD[@]}" >/dev/null
|
||||
if ! "${CAPTURE_HELPER_BASE_CMD[@]}" >/dev/null; then
|
||||
stop_packet_capture_helper
|
||||
return 1
|
||||
fi
|
||||
if ! wait_for_path "$SLOPTRAP_CAPTURE_HELPER_DIR_HOST/helperd.pid"; then
|
||||
stop_packet_capture_helper
|
||||
error "packet capture helper failed to start"
|
||||
fi
|
||||
}
|
||||
|
||||
run_runtime_container_cmd() {
|
||||
local -a cmd=("$@")
|
||||
start_packet_capture_helper
|
||||
local status=0
|
||||
if run_or_print "${cmd[@]}"; then
|
||||
status=0
|
||||
else
|
||||
status=$?
|
||||
fi
|
||||
stop_packet_capture_helper
|
||||
return "$status"
|
||||
}
|
||||
|
||||
ensure_codex_directory() {
|
||||
local path=$1
|
||||
local label=$2
|
||||
@@ -2057,7 +2132,17 @@ prepare_container_runtime() {
|
||||
SLOPTRAP_IMAGE_NAME=$(sanitize_engine_name "$SLOPTRAP_IMAGE_NAME")
|
||||
SLOPTRAP_CONTAINER_NAME=$(sanitize_engine_name "$SLOPTRAP_CONTAINER_NAME")
|
||||
|
||||
local -a network_opts=(--network "$SLOPTRAP_NETWORK_NAME" --init)
|
||||
SLOPTRAP_CAPTURE_CONTAINER_NAME=$(sanitize_engine_name "${PROJECT_NAME}-sloptrap-capture")
|
||||
SLOPTRAP_POD_NAME=$(sanitize_engine_name "${PROJECT_NAME}-sloptrap-pod")
|
||||
SLOPTRAP_CAPTURE_HELPER_DIR_CONT="$SLOPTRAP_CODEX_HOME_CONT/state/capture-helper"
|
||||
SLOPTRAP_CAPTURE_HELPER_DIR_HOST="$CODEX_STATE_HOME_HOST/state/capture-helper"
|
||||
|
||||
local -a network_opts=(--init)
|
||||
if packet_capture_enabled; then
|
||||
network_opts+=(--pod "$SLOPTRAP_POD_NAME")
|
||||
else
|
||||
network_opts+=(--network "$SLOPTRAP_NETWORK_NAME")
|
||||
fi
|
||||
local -a security_opts=(--cap-drop=ALL)
|
||||
local -a capability_opts=()
|
||||
if [[ -n $SLOPTRAP_SECURITY_OPTS_EXTRA ]]; then
|
||||
@@ -2082,13 +2167,19 @@ prepare_container_runtime() {
|
||||
done
|
||||
fi
|
||||
|
||||
SLOPTRAP_MAIN_ACTIVE_CAPABILITIES=""
|
||||
SLOPTRAP_PACKET_CAPTURE_ENABLED=false
|
||||
if capability_list_contains "$ENABLED_CAPABILITIES" "apt-install"; then
|
||||
SLOPTRAP_ROOTFS_READONLY=0
|
||||
SLOPTRAP_RUN_AS_ROOT=true
|
||||
SLOPTRAP_MAIN_ACTIVE_CAPABILITIES="apt-install"
|
||||
fi
|
||||
if capability_list_contains "$ENABLED_CAPABILITIES" "packet-capture"; then
|
||||
capability_opts+=(--cap-add NET_RAW --cap-add NET_ADMIN)
|
||||
SLOPTRAP_RUN_AS_ROOT=true
|
||||
SLOPTRAP_PACKET_CAPTURE_ENABLED=true
|
||||
fi
|
||||
local packet_capture_flag="0"
|
||||
if $SLOPTRAP_PACKET_CAPTURE_ENABLED; then
|
||||
packet_capture_flag="1"
|
||||
fi
|
||||
security_opts+=(--security-opt no-new-privileges)
|
||||
if $SLOPTRAP_RUN_AS_ROOT; then
|
||||
@@ -2096,8 +2187,6 @@ prepare_container_runtime() {
|
||||
--cap-add SETUID
|
||||
--cap-add SETGID
|
||||
--cap-add CHOWN
|
||||
--cap-add DAC_OVERRIDE
|
||||
--cap-add FOWNER
|
||||
)
|
||||
fi
|
||||
|
||||
@@ -2117,7 +2206,6 @@ prepare_container_runtime() {
|
||||
local -a volume_opts=(
|
||||
-v "$SLOPTRAP_SHARED_DIR_ABS:$SLOPTRAP_WORKDIR$SLOPTRAP_VOLUME_LABEL"
|
||||
-v "$CODEX_STATE_HOME_HOST:$SLOPTRAP_CODEX_HOME_CONT$SLOPTRAP_VOLUME_LABEL"
|
||||
-v "$CODEX_AUTH_FILE_HOST:$SLOPTRAP_CODEX_HOME_CONT/auth.json$SLOPTRAP_VOLUME_LABEL"
|
||||
)
|
||||
|
||||
local -a env_args=(
|
||||
@@ -2128,7 +2216,9 @@ prepare_container_runtime() {
|
||||
-e "CODEX_HOME=$SLOPTRAP_CODEX_HOME_CONT"
|
||||
-e "SLOPTRAP_WORKDIR=$SLOPTRAP_WORKDIR"
|
||||
-e "SLOPTRAP_HELPER_DIR=/tmp/sloptrap-helper"
|
||||
-e "SLOPTRAP_ACTIVE_CAPABILITIES=$ENABLED_CAPABILITIES"
|
||||
-e "SLOPTRAP_ACTIVE_CAPABILITIES=$SLOPTRAP_MAIN_ACTIVE_CAPABILITIES"
|
||||
-e "SLOPTRAP_PACKET_CAPTURE_ENABLED=$packet_capture_flag"
|
||||
-e "SLOPTRAP_CAPTURE_HELPER_DIR=$SLOPTRAP_CAPTURE_HELPER_DIR_CONT"
|
||||
-e "SLOPTRAP_CAPTURE_DIR=$SLOPTRAP_CODEX_HOME_CONT/state/captures"
|
||||
-e "SLOPTRAP_AUDIT_LOG=$SLOPTRAP_CODEX_HOME_CONT/state/capabilities.log"
|
||||
-e "SLOPTRAP_PREFER_CODEX_HOME=1"
|
||||
@@ -2156,6 +2246,55 @@ prepare_container_runtime() {
|
||||
fi
|
||||
fi
|
||||
|
||||
CAPTURE_POD_CREATE_CMD=()
|
||||
CAPTURE_HELPER_BASE_CMD=()
|
||||
if $SLOPTRAP_PACKET_CAPTURE_ENABLED; then
|
||||
local -a capture_env_args=(
|
||||
-e "HOME=$SLOPTRAP_CODEX_HOME_CONT"
|
||||
-e "XDG_CONFIG_HOME=$SLOPTRAP_CODEX_HOME_CONT/config"
|
||||
-e "XDG_CACHE_HOME=$SLOPTRAP_CODEX_HOME_CONT/cache"
|
||||
-e "XDG_STATE_HOME=$SLOPTRAP_CODEX_HOME_CONT/state"
|
||||
-e "CODEX_HOME=$SLOPTRAP_CODEX_HOME_CONT"
|
||||
-e "SLOPTRAP_WORKDIR=$SLOPTRAP_WORKDIR"
|
||||
-e "SLOPTRAP_HELPER_DIR=$SLOPTRAP_CAPTURE_HELPER_DIR_CONT"
|
||||
-e "SLOPTRAP_ACTIVE_CAPABILITIES=packet-capture"
|
||||
-e "SLOPTRAP_CAPTURE_DIR=$SLOPTRAP_CODEX_HOME_CONT/state/captures"
|
||||
-e "SLOPTRAP_AUDIT_LOG=$SLOPTRAP_CODEX_HOME_CONT/state/capabilities.log"
|
||||
-e "SLOPTRAP_HOST_UID=$uid"
|
||||
-e "SLOPTRAP_HOST_GID=$gid"
|
||||
)
|
||||
if [[ -n $user ]]; then
|
||||
capture_env_args+=(-e "SLOPTRAP_HOST_USER=$user")
|
||||
fi
|
||||
local -a capture_user_opts=(--userns="keep-id:uid=$uid,gid=$gid")
|
||||
CAPTURE_POD_CREATE_CMD=(
|
||||
"$CONTAINER_ENGINE" pod create
|
||||
--name "$SLOPTRAP_POD_NAME"
|
||||
--network "$SLOPTRAP_NETWORK_NAME"
|
||||
)
|
||||
CAPTURE_HELPER_BASE_CMD=(
|
||||
"$CONTAINER_ENGINE" run -d --rm
|
||||
--name "$SLOPTRAP_CAPTURE_CONTAINER_NAME"
|
||||
--pod "$SLOPTRAP_POD_NAME"
|
||||
--cap-drop=ALL
|
||||
--cap-add NET_RAW
|
||||
--cap-add SETUID
|
||||
--cap-add SETGID
|
||||
--cap-add CHOWN
|
||||
--security-opt no-new-privileges
|
||||
"${resource_opts[@]}"
|
||||
--read-only
|
||||
"${tmpfs_opts[@]}"
|
||||
"${volume_opts[@]}"
|
||||
"${IGNORE_MOUNT_ARGS[@]}"
|
||||
"${capture_env_args[@]}"
|
||||
"${capture_user_opts[@]}"
|
||||
-w "$SLOPTRAP_WORKDIR"
|
||||
"$SLOPTRAP_IMAGE_NAME"
|
||||
sleep infinity
|
||||
)
|
||||
fi
|
||||
|
||||
CONTAINER_SHARED_OPTS=(
|
||||
"${network_opts[@]}"
|
||||
"${security_opts[@]}"
|
||||
@@ -2301,6 +2440,7 @@ build_if_missing() {
|
||||
}
|
||||
|
||||
stop_container() {
|
||||
stop_packet_capture_helper
|
||||
if $DRY_RUN; then
|
||||
print_command "$CONTAINER_ENGINE" stop "$SLOPTRAP_CONTAINER_NAME"
|
||||
return 0
|
||||
@@ -2343,15 +2483,17 @@ prune_sloptrap_images() {
|
||||
run_codex_command() {
|
||||
local -a extra_args=("$@")
|
||||
local -a source_args=("$SLOPTRAP_IMAGE_NAME")
|
||||
local -a auth_mount=()
|
||||
ensure_codex_storage_paths
|
||||
local -a cmd=("${BASE_CONTAINER_CMD[@]}" "${source_args[@]}" "codex")
|
||||
append_auth_mount_arg false auth_mount
|
||||
local -a cmd=("${BASE_CONTAINER_CMD[@]}" "${auth_mount[@]}" "${source_args[@]}" "codex")
|
||||
if [[ ${#CODEX_ARGS_ARRAY[@]} -gt 0 ]]; then
|
||||
cmd+=("${CODEX_ARGS_ARRAY[@]}")
|
||||
fi
|
||||
if [[ ${#extra_args[@]} -gt 0 ]]; then
|
||||
cmd+=("${extra_args[@]}")
|
||||
fi
|
||||
run_or_print "${cmd[@]}"
|
||||
run_runtime_container_cmd "${cmd[@]}"
|
||||
}
|
||||
|
||||
run_codex() {
|
||||
@@ -2366,21 +2508,25 @@ run_codex() {
|
||||
run_login_target() {
|
||||
ensure_codex_storage_paths
|
||||
local -a source_args=("$SLOPTRAP_IMAGE_NAME")
|
||||
local -a auth_mount=()
|
||||
if ! $DRY_RUN; then
|
||||
status_line "Login %s\n" "$SLOPTRAP_IMAGE_NAME"
|
||||
fi
|
||||
local -a cmd=("${BASE_CONTAINER_CMD[@]}" "${source_args[@]}" "codex" login)
|
||||
run_or_print "${cmd[@]}"
|
||||
append_auth_mount_arg true auth_mount
|
||||
local -a cmd=("${BASE_CONTAINER_CMD[@]}" "${auth_mount[@]}" "${source_args[@]}" "codex" login)
|
||||
run_runtime_container_cmd "${cmd[@]}"
|
||||
}
|
||||
|
||||
run_shell_target() {
|
||||
ensure_codex_storage_paths
|
||||
local -a source_args=("$SLOPTRAP_IMAGE_NAME")
|
||||
local -a auth_mount=()
|
||||
if ! $DRY_RUN; then
|
||||
status_line "Shell %s\n" "$SLOPTRAP_IMAGE_NAME"
|
||||
fi
|
||||
local -a cmd=("${BASE_CONTAINER_CMD[@]}" "${source_args[@]}" /bin/bash)
|
||||
run_or_print "${cmd[@]}"
|
||||
append_auth_mount_arg false auth_mount
|
||||
local -a cmd=("${BASE_CONTAINER_CMD[@]}" "${auth_mount[@]}" "${source_args[@]}" /bin/bash)
|
||||
run_runtime_container_cmd "${cmd[@]}"
|
||||
}
|
||||
|
||||
run_resume_target() {
|
||||
@@ -2447,6 +2593,7 @@ DRY_RUN=false
|
||||
PRINT_CONFIG=false
|
||||
SKIP_BUILD_BANNER=false
|
||||
TRUST_CAPABILITIES=false
|
||||
RUNTIME_PACKET_CAPTURE_ACKNOWLEDGED=false
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
@@ -2599,6 +2746,7 @@ if [[ -n $PACKAGES_EXTRA ]]; then
|
||||
validate_package_list "packages_extra" "$PACKAGES_EXTRA"
|
||||
fi
|
||||
CONTAINER_ENGINE="$(detect_container_engine)"
|
||||
ensure_capability_engine_supported
|
||||
CODEX_ARGS_ARRAY=("${DEFAULT_CODEX_ARGS[@]}")
|
||||
ensure_safe_sandbox "${CODEX_ARGS_ARRAY[@]}"
|
||||
CODEX_ARGS_DISPLAY=$DEFAULT_CODEX_ARGS_DISPLAY
|
||||
|
||||
Reference in New Issue
Block a user