エラーの発生状況
新しいツールをコンパイルし終えた、あるいはGitHubからユーティリティをダウンロードしたばかりだとします。しかし、MシリーズのMacで実行しようとすると、ターミナルが即座に動作を停止してしまいます。期待した出力の代わりに、次のような謎めいた1行が表示されます。
zsh: killed [command_name]
カーネルは、コードが1行も実行される前にプロセスを強制終了します。コンソールにはログもスタックトレースも説明も残りません。ただ停止するだけです。
Apple Siliconでこれが発生する理由
Apple Siliconは単に高速なだけではなく、セキュリティも重視されています。古いIntel Macは署名のないコードに対して比較的寛容でした。ARM64 Macでは、ハードウェアレベルの厳格なルールが導入され、すべての実行メモリページに有効な暗号署名が必要になりました。
この保護はApple Mobile File Integrity (AMFI) によって管理されています。システムがセキュリティ基準を満たさないバイナリを検出すると、即座に実行を遮断します。これは通常、以下の理由で発生します。
- バイナリが署名ステップなしでローカルでコンパイルされた。
- Intel Mac (x86_64) から Apple Silicon (arm64) マシンにツールを移動した。
- 署名後にファイルが変更された。
- ブラウザからのダウンロードにより、Gatekeeperがファイルを「クアランティン(隔離)」としてフラグを立てた。
ステップ1:手っ取り早い修正 - アドホック署名
これを修正するために、有料のApple Developerアカウントは必要ありません。「アドホック(自己署名)」署名を適用することで、そのバイナリがローカルマシンで実行可能であることをmacOSに伝えることができます。
ターミナルで次のコマンドを実行します:
codesign -s - --deep --force ./path/to/your/binary
各フラグの役割:
-s -: 「null identity(アドホック)」署名を適用します。--deep: バイナリ内部に含まれるネストされたライブラリやフレームワークを再帰的に署名します。--force: 競合の原因となっている可能性のある既存の無効な署名を上書きします。
ステップ2:クアランティンフラグの削除
Chrome、Safari、または curl 経由でツールをダウンロードした場合、macOSは com.apple.quarantine というメタデータ属性を付与します。署名があっても、Gatekeeperが実行をブロックする場合があります。
まず、属性が存在するか確認します:
xattr ./path/to/your/binary
もしリストに com.apple.quarantine が表示されたら、次のコマンドで削除します:
xattr -d com.apple.quarantine ./path/to/your/binary
ステップ3:高度なエンタイトルメント(デバッガ・JIT用)
カスタムデバッガやJust-In-Time (JIT) コンパイルを使用するツールなどの複雑なアプリケーションは、システムメモリとやり取りするために特定の権限を必要とします。基本的な署名で解決しない場合は、エンタイトルメント(entitlements)ファイルが必要になることがあります。
entitlements.plistという名前のファイルを作成します:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
</dict>
</plist>
- このplistを使用してバイナリに署名します:
codesign -s - --deep --force --entitlements entitlements.plist ./path/to/your/binary
検証:修正の確認
システムがバイナリを受け入れるようになったか確認するには、codesign ユーティリティを使用して検査します:
codesign -vvv ./path/to/your/binary
出力の中で valid on disk および satisfies its Designated Requirement を探してください。これらが表示されていれば、プログラムは zsh: killed エラーに阻まれることなく起動するはずです。
コマンドのまとめ
とりあえず今すぐ動かしたい場合は、次の2つのコマンドを順番に実行してください:
# ダウンロード制限を解除
xattr -cr ./path/to/your/binary
# ローカル署名を適用
codesign -s - --deep --force ./path/to/your/binary

