You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Stop publishing a System Extension nobody can install
The release built, signed, notarized, stapled and published
USBIPDSystemExtension.systemextension.tar.gz on every tag. No installed
component could locate it, and it was not a System Extension bundle by
structure: the workflow's `find` for a SwiftPM-produced bundle never matched,
so the fallback synthesised one from an inline heredoc with no NSExtension
dict and no IOKitPersonalities. It also wrote Contents/embedded.provisionprofile
empty whenever DRIVERKIT_PROVISIONING_PROFILE was unset, which was always —
so the managed DriverKit entitlements it was signed with were inert.
Removed: the product build, the hand-rolled bundle, the profile embed, the
signing, the notarization and stapling, the tarball, the checksum
extraction, and the systemextension_url / systemextension_sha256 fields in
the Homebrew metadata. Verified before removing that nothing consumes them:
validate-homebrew-metadata.sh requires only version, archive_url, sha256 and
timestamp, and the tap's formula-sync.yml reads only the two per-arch
binaries.
Signing collapses to one path. usbipd carried
com.apple.developer.system-extension.install, a restricted entitlement AMFI
kills without an authorising profile — measured as exit 137 on launch — so
the workflow had to withhold entitlements whenever no profile was present.
With nothing to install, there is nothing restricted to claim:
usbipd.entitlements is deleted and every artifact is signed the same way.
If a DriverKit extension arrives it will live in an app bundle in
/Applications, and that app, not this binary, will need the entitlement.
The release notes no longer tell people to run
`sudo usbipd install-system-extension`, a command removed some releases ago,
and point at the per-arch binaries rather than the compatibility copy.
Also drops the CI step that built the deleted product.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017rmyikdjWveP99ZUCDLY89
echo "::warning::DRIVERKIT_PROVISIONING_PROFILE set but no system extension bundle to embed it in"
273
-
fi
274
-
else
275
-
echo "::warning::No DRIVERKIT_PROVISIONING_PROFILE secret configured. The DriverKit entitlements will be signed into the bundle but will not take effect, so device claiming will fail at runtime. See Documentation/development/entitlement-validation.md"
276
-
fi
277
211
278
212
# Package QEMU test server if available
279
213
if [ -f .build/release/QEMUTestServer ]; then
@@ -284,97 +218,34 @@ jobs:
284
218
# Code sign binaries if certificates available
285
219
if [ -n "$DEVELOPER_ID_CERTIFICATE" ]; then
286
220
echo "🔒 Code signing release artifacts..."
287
-
# usbipd carries com.apple.developer.system-extension.install, which is a
288
-
# RESTRICTED entitlement: AMFI kills a binary that claims it without a
289
-
# provisioning profile authorising it. Measured, not assumed — a binary
290
-
# signed with just that key and no profile exits 137 on launch.
221
+
# usbipd needs no entitlements. It used to carry
222
+
# com.apple.developer.system-extension.install so it could activate the
223
+
# extension — a RESTRICTED entitlement that AMFI kills without an
224
+
# authorising provisioning profile, measured as exit 137 on launch. The
225
+
# signing step therefore had to withhold it whenever no profile was
226
+
# present, which was always. With the extension gone there is nothing to
227
+
# install and nothing restricted to claim, so there is one path.
228
+
#
229
+
# If a DriverKit extension arrives it will live in an app bundle in
230
+
# /Applications, and that app — not this binary — is what will need the
231
+
# install entitlement and a profile.
291
232
#
292
-
# So the entitlements are only applied when a profile is present. Without
293
-
# one, sign exactly as before: hardened runtime for notarization, no
294
-
# entitlements, and a daemon that actually starts.
295
233
# Every usbipd artifact is signed, including both architecture slices:
296
234
# lipo -thin strips the signature, so an unsigned slice would ship.
297
235
for target in "$USBIPD_PATH" "$USBIPD_ARM64" "$USBIPD_X86_64"; do
298
236
[ -f "$target" ] || continue
299
-
if [ -n "$DRIVERKIT_PROVISIONING_PROFILE" ]; then
300
-
echo " signing $(basename "$target") with entitlements (provisioning profile present)"
301
-
codesign --sign "Developer ID Application" --entitlements "$ARTIFACTS_DIR/usbipd.entitlements" --options runtime --timestamp "$target" || echo "::warning::Code signing failed for $(basename "$target")"
302
-
else
303
-
echo " signing $(basename "$target") without entitlements (no provisioning profile)"
304
-
codesign --sign "Developer ID Application" --options runtime --timestamp "$target" || echo "::warning::Code signing failed for $(basename "$target")"
305
-
fi
237
+
echo " signing $(basename "$target")"
238
+
codesign --sign "Developer ID Application" --options runtime --timestamp "$target" || echo "::warning::Code signing failed for $(basename "$target")"
306
239
done
307
-
if [ -z "$DRIVERKIT_PROVISIONING_PROFILE" ]; then
308
-
echo "::warning::usbipd signed without entitlements. It cannot install the System Extension, but it will launch. Set DRIVERKIT_PROVISIONING_PROFILE to enable them."
309
-
fi
310
240
311
-
# Sign system extension bundle
312
-
if [ -d "$ARTIFACTS_DIR/USBIPDSystemExtension.systemextension" ]; then
313
-
echo "🔒 Code signing system extension bundle..."
314
-
codesign --sign "Developer ID Application" --entitlements "$ARTIFACTS_DIR/SystemExtension.entitlements" --options runtime --timestamp "$ARTIFACTS_DIR/USBIPDSystemExtension.systemextension" || echo "::warning::Code signing failed for system extension"
315
-
fi
316
-
317
241
if [ -f "$QEMU_SERVER_PATH" ]; then
318
242
codesign --sign "Developer ID Application" --timestamp "$QEMU_SERVER_PATH" || echo "::warning::Code signing failed for QEMUTestServer"
319
243
fi
320
244
echo "✅ Code signing completed"
321
-
322
-
# Read the entitlements back out of the signatures rather than trusting
323
-
# what we passed in. A managed capability that was silently dropped looks
324
-
# identical to a successful signing run without this check.
325
-
echo "🔍 Verifying embedded entitlements..."
326
-
codesign -d --entitlements - --xml "$USBIPD_PATH" 2>/dev/null || echo "::warning::Could not read back usbipd entitlements"
327
-
if [ -d "$ARTIFACTS_DIR/USBIPDSystemExtension.systemextension" ]; then
0 commit comments