Skip to content

Commit 384c527

Browse files
authored
Merge pull request #18 from GlitchSlayed/codex/add-post-build-verification-stage-to-uki-build.sh
Add post-build UKI verification gate before EFI registration
2 parents f8f7f6a + 890ad8f commit 384c527

2 files changed

Lines changed: 83 additions & 2 deletions

File tree

‎tests/test_uki_setup.sh‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ grep -q 'BOOT_SUCCESS_DIR="/var/lib/uki-ukify/boot-success"' "$BUILD_SCRIPT"
5454
grep -q 'list_installed_kernels()' "$BUILD_SCRIPT"
5555
grep -q 'reconcile_kernel_ukis()' "$BUILD_SCRIPT"
5656
grep -q 'if \[\[ "\${1:-}" == "--reconcile" \]\]' "$BUILD_SCRIPT"
57+
grep -q 'require_cmd file' "$BUILD_SCRIPT"
58+
grep -q 'require_cmd objdump' "$BUILD_SCRIPT"
59+
grep -q 'verify_uki_post_build()' "$BUILD_SCRIPT"
60+
grep -q 'Stage 3/3: Verifying UKI artifact integrity and metadata' "$BUILD_SCRIPT"
61+
grep -q '/var/log/uki-setup.log' "$BUILD_SCRIPT"
5762

5863
phase_write_plugin
5964

‎uki-setup.sh‎

Lines changed: 78 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -554,7 +554,7 @@ phase_deps() {
554554
hr
555555
info "Phase 2: Installing dependencies"
556556

557-
local pkgs=(dracut efibootmgr binutils)
557+
local pkgs=(dracut efibootmgr binutils file)
558558

559559
case "$PKG_MGR" in
560560
dnf) pkgs+=(systemd-ukify) ;;
@@ -1098,12 +1098,14 @@ UKI_OUT="${EFI_DIR}/linux-${KERNEL_VER}.efi"
10981098
[[ $EUID -eq 0 ]] || die "Must run as root."
10991099
require_cmd dracut
11001100
require_cmd ukify
1101+
require_cmd file
11011102
require_cmd lsinitrd
11021103
require_cmd findmnt
11031104
require_cmd lsblk
11041105
require_cmd blkid
11051106
require_cmd df
11061107
require_cmd efibootmgr
1108+
require_cmd objdump
11071109
require_cmd rpm
11081110
[[ -f "$KERNEL_IMG" ]] || die "Kernel image not found: ${KERNEL_IMG}"
11091111
mkdir -p "$EFI_DIR"
@@ -1161,7 +1163,81 @@ trap cleanup EXIT
11611163
info "Stage 2/2: Assembling UKI via ukify: ${UKI_OUT}"
11621164
ukify "${UKIFY_ARGS[@]}"
11631165
1164-
info "UKI built successfully: ${UKI_OUT} ($(du -sh "$UKI_OUT" | cut -f1))"
1166+
extract_uki_section_text() {
1167+
local image="$1" section="$2" hex
1168+
hex=$(objdump -s -j "$section" "$image" 2>/dev/null \
1169+
| awk '/^[[:space:]]*[0-9a-f]+[[:space:]]/ {for (i=2; i<=5; i++) if ($i ~ /^[0-9a-fA-F]{8}$/) printf "%s", $i}')
1170+
[[ -n "$hex" ]] || return 1
1171+
printf '%s' "$hex" | xxd -r -p | tr -d '\000' | tr -d '\r\n'
1172+
}
1173+
1174+
extract_ukify_inspect_field() {
1175+
local image="$1" key="$2" line value
1176+
while IFS= read -r line; do
1177+
if [[ "$line" =~ ^[[:space:]]*${key}[[:space:]]*:[[:space:]]*(.+)$ ]]; then
1178+
value="${BASH_REMATCH[1]}"
1179+
value="${value%\"}"
1180+
value="${value#\"}"
1181+
printf '%s\n' "$value"
1182+
return 0
1183+
fi
1184+
done < <(ukify inspect "$image" 2>/dev/null || true)
1185+
return 1
1186+
}
1187+
1188+
verify_uki_post_build() {
1189+
local image="$1" kernel_ver="$2" intended_cmdline="$3"
1190+
local min_size_bytes=$((10 * 1024 * 1024))
1191+
local size_bytes file_desc file_fmt embedded_cmdline embedded_uname sha ts
1192+
1193+
[[ -e "$image" ]] || die "Post-build verification failed: UKI artifact is missing: ${image}"
1194+
[[ -s "$image" ]] || die "Post-build verification failed: UKI artifact is empty (0 bytes): ${image}"
1195+
1196+
size_bytes=$(stat -c '%s' "$image")
1197+
(( size_bytes > 0 )) || die "Post-build verification failed: UKI size is 0 bytes: ${image}"
1198+
(( size_bytes >= min_size_bytes )) || die "Post-build verification failed: UKI size ${size_bytes} bytes is below minimum threshold ${min_size_bytes} bytes."
1199+
1200+
file_desc=$(file -Lb "$image")
1201+
if [[ ! "$file_desc" =~ PE32 ]]; then
1202+
die "Post-build verification failed: file(1) does not report PE/COFF EFI image (${file_desc})."
1203+
fi
1204+
1205+
file_fmt=$(objdump -f "$image" 2>/dev/null | awk -F'file format ' 'NF>1 {print $2; exit}')
1206+
if [[ -z "$file_fmt" || ! "$file_fmt" =~ ^pei- ]]; then
1207+
die "Post-build verification failed: objdump reports unexpected file format '${file_fmt:-unknown}' (expected pei-*)."
1208+
fi
1209+
1210+
embedded_cmdline=""
1211+
if embedded_cmdline=$(extract_ukify_inspect_field "$image" "cmdline"); then
1212+
:
1213+
elif embedded_cmdline=$(extract_uki_section_text "$image" ".cmdline"); then
1214+
:
1215+
else
1216+
die "Post-build verification failed: unable to extract embedded cmdline via ukify inspect or objdump section parsing."
1217+
fi
1218+
[[ "$embedded_cmdline" == "$intended_cmdline" ]] \
1219+
|| die "Post-build verification failed: embedded cmdline mismatch. Intended='${intended_cmdline}' Embedded='${embedded_cmdline}'"
1220+
1221+
embedded_uname=""
1222+
if embedded_uname=$(extract_ukify_inspect_field "$image" "uname"); then
1223+
:
1224+
elif embedded_uname=$(extract_uki_section_text "$image" ".uname"); then
1225+
:
1226+
else
1227+
die "Post-build verification failed: unable to extract embedded uname metadata via ukify inspect or objdump section parsing."
1228+
fi
1229+
[[ "$embedded_uname" == "$kernel_ver" ]] \
1230+
|| die "Post-build verification failed: embedded uname mismatch. Expected='${kernel_ver}' Embedded='${embedded_uname}'"
1231+
1232+
sha=$(sha256sum "$image" | awk '{print $1}')
1233+
ts=$(date -u +%Y-%m-%dT%H:%M:%SZ)
1234+
printf '%s kernel=%s uki=%s sha256=%s\n' "$ts" "$kernel_ver" "$image" "$sha" >> /var/log/uki-setup.log
1235+
1236+
info "Post-build verification passed: ${image} ($(du -sh "$image" | cut -f1)), sha256=${sha}"
1237+
}
1238+
1239+
info "Stage 3/3: Verifying UKI artifact integrity and metadata"
1240+
verify_uki_post_build "$UKI_OUT" "$KERNEL_VER" "$EFFECTIVE_CMDLINE"
11651241
11661242
# Register / refresh UEFI boot entry
11671243
LABEL="Linux UKI ${KERNEL_VER}"

0 commit comments

Comments
 (0)