個人的に2023年はHackintoshのナレッジが結構蓄積できた年だったのですが、アウトプットは全然できていなかったのでこれから小ネタ的にちょくちょくまとめていければなと思っています。
ということでOpenCore Legacy Patcher (OCLP) です。
OCLPは本来HackintoshではなくリアルMac向けのツールではあるのですが、Hackintoshにおいても有用な機能があります。しかし、「リアルMacでOCLPを使う」需要と「HackintoshでOCLPを使う」需要で言えば前者が圧倒的なため、Hackintosh側面での情報に乏しいのが現状です。
おそらくSonomaでのWiFiトラブルで初めてOCLPを使ったHackintoshユーザーも多いと思うのですが、これからmacOSでの互換性切りが起こる度にOCLPの出番は増えていくと思うので、ここでちょっと取り上げようかなと。
ただ、個人的に興味のあったAMFIPassについての説明など、実用上そこまで有用ではない話もしていきます。
先に注意しておきますが、OCLPの本来の用途はリアルMac用でありHackintoshで使えるのは副次的なものですので、Hackintoshで上手く動かないときでも決してOCLPチームにバグレポートを送りつけたりしてはいけません。
OpenCoreとOCLPの関係
今回は、Hackintoshツール(ブートローダー)としてのOpenCore自体は知っている前提で話を進めていきます。
OpenCore Legacy Patcherはその名の通りOpenCoreを基幹コンポーネントとして構築されたツールです。何のためのツールかというと、Appleによるサポートが切られた古いMacでBig Sur以降の最新macOSを動作させることが目的となっています。
大げさに言えば、最新のmacOSから見ればサポートしていない古いMacはHackintoshと同様の「知らないコンピュータ」ですので、Hackintoshを動作させるのと近しいテクニックが適用でき、そこでOpenCoreの出番となるわけです。
通常のHackintoshはハードウェア構成を考えてユーザーが各々にconfigを組んでいくわけですが、Macはターゲットのモデルがわかっていればハードウェア構成も決まるので、決め打ちのconfigを導入してくれるのがOCLPの一つの側面です。(とは言っても、実際のOCLPは非常に緻密に構築されており、単なるconfig.plist集とは決して言えないものになっています。)
というわけで、OCLPは「リアルMac向けのOpenCore/config/kext等の導入ツール」ということになります。
Hackintoshでの用途
さて、OCLPで提供されている各種configはリアルMac向けのため、Hackintoshに使えるものではありません。(例えば、Hackintoshに必須でリアルMacで不要なVirtualSMCは使われていません)
しかし、サポートが切られた古いMacに載っている世代のハードウェアを新しいmacOSで利用するために、OCLPの機能を利用することができます。
具体的には、Post-Install Root Patchと呼ばれるものです。これは、古いハードウェア用のコンポーネントを以前のmacOSから持ってくる際に、OpenCoreによるパッチやkext injectionでは対応しきれない、macOSのシステムボリューム自体にパッチを当てる(Root Patch)必要がある場合に利用できる機能になります。
例えば、SonomaではDW1560やBCM94360NGなどのBroadcom WiFiカードが同世代カード搭載Macのサポート切れに伴い利用できなくなり、古いkextのinjectionだけでは動作させられないため、Root Patchが必要となりました。OCLPを利用してRoot Patchを行うことで、比較的簡単にWiFiを復活させることができます。これを手動でやるとしたら中々の苦行です。
また、macOSが新しくなる度に古いGPUのサポートが切られていきますが、これについてもOCLPのRoot Patchで対応可能です。恐るべきことにTiger(10.4)〜Leopard(10.5)時代のGeForce 8800 GTSですらSonomaで辛うじて動作させることができています。GTX 1080 Tiなど、Mojave以降でサポートされなくなったWebDriverを要求するNVIDIA GPUも制約はありますが使えるようになります。
今後、macOSのバージョンが上がるたび(といってもIntel向けは多くてあと2回程度でしょうが)サポートされないハードウェアは増えていくので、HackintoshにおいてもOCLPとRoot Patchの重要性は上がっていくと思います。
実例 : SonomaでBroadcom WiFiを動作させる
というわけで一例として、今一番OCLPのHackintosh向け用途として一般的かもしれないSonomaでのBroadcomパッチについて軽く触れていきます。
といっても、詳細な手順はOC-Little-Translatedで解説されているので、基本的にはそちらを読めば大丈夫です。ちなみにOC-Little-TranslatedにはHackintoshに関する情報が膨大に載っているのでおすすめです。あまりに膨大すぎて情報を探しづらいですが・・・
さて、現在主流と思われる、いわゆる"Modern"カードに絞って書いていくと、
- まずはVentura以前で動作するようにする
- BCM94360NGや純正カードならそのまま動くはず
- DW1560のようなカードではAirportBrcmFixup導入等
- OCLPのリポジトリから下記のkextをDL
- kextを以下の順番でconfig.plistに追加
- IOSkywalkFamily.kext
- IO80211FamilyLegacy.kext
- AirPortBrcmNIC.kext
- (AirportBrcmFixup等、Ventura以前で必要なkext)
- AMFIPass.kext
- これに関しては順番は不問です
- 追加したIOSkywalkFamilyがロードされるよう、Sonomaの同kextをBlock
- com.apple.iokit.IOSkywalkFamily を Exclude で Block します
- csr-active-config (SIP) を 03080000 に変更
- この設定でSonomaを起動後、OCLPアプリからPost-Install Root Patchを適用
- 適用すべきパッチは自動で選択されています
このような手順で、OpenCoreで導入できるものはOpenCoreで導入しつつ、それ以外に導入が必要なものはOCLPが自動で導入してくれます。
Root Patch適用環境でも差分アップデートを有効にする
これはOCLPによる問題ではなくRoot Patch自体の制約ですが、Root Patchを適用するとmacOSの差分アップデートが適用できず、十数GBのフルインストールによるアップデートになってしまいます。差分アップデートはアップデート元の環境が固定であることが前提なので、Root Patchを適用すると成り立たないのは感覚的に理解できると思います。
また、Root PatchではSIPの一部無効化も必要になっていることから、差分アップデート以前にアップデート通知自体を受け取れない問題もあります。
これらの問題についてはRestrictEventsで解消できます。この作用機序もまあまあ面白いですがOCLPにあまり関係ないので興味のある人はやはりOC-Little-Translatedのこのへんを読んでみてください。
事前の設定としては、RestrictEvents.kextを導入した上でboot-argsまたはNVRAM変数に revpatch=sbvmm を設定しておくだけです。sbvmm以外のrevpatchを既に使用している場合はカンマ区切りで併用できます。
あとは、macOSアップデートの適用前にOCLPアプリからRevert Root Patchesを実行し、一時的にRoot PatchをロールバックしてmacOSアップデート後に再適用すればOKです。
ただ、この方法だと当然macOSアップデート中はRoot Patchが効いていないため、WiFiでRoot Patchを使用しており、有線LANが別途用意できない場合はアップデートがダウンロードできないという問題は起きます。この場合は仕方ないのでフルサイズのアップデートをかけることになりますね。
余談 : AMFIPassは何をしているのか?
ここからはHackintoshの実用には関係のない純粋に技術的な興味の話です。
Sonoma WiFiパッチの話でAMFIPass.kextを導入するという話を書きました。このkextはWiFi固有のものではなく、Root Patch全般で必要なkextとなっており、名前の通りAMFIというmacOSのセキュリティ機能をバイパスするものになります。
AMFIはざっくり言うとプログラム・ライブラリの改竄対策として署名検証を行う機構で、Root Patchで導入されるバイナリがこれに引っかかってしまうため、Root Patchを適用するだけだとAMFIにより起動できなくなってしまいます。
そこで、従来はブートオプションによりAMFI自体を(SIPのように)無効化するしかなかったのですが、これはこれでもちろんセキュリティが低下しますし、逆にAMFIが動いていないことで「このアプリを信頼しますか?」的なアレも動かなくなったり、仮想化アプリケーションも動かないなど色々副作用がありました。
そこで去年登場したのがAMFIPassで、AMFIを有効にしつつRoot Patchの適用が可能になりました。
と、巷に説明されているのはここまでです。でもどうやって?これについては特に説明を見つけられなかったのでちょっと調べてみました。
結論から言うと、OCLPではRoot Patch用に提供する全てのバイナリに独自の署名を施した上で、AMFIPass.kextではAppleのものに加えてこの独自署名も有効になる証明書を組み込むことで、Root Patchに用いたバイナリだけがAMFIをバイパスできるようにしているようです。
順に追っていきましょう。
まずAMFIPass.kextは単体で機能するわけではありません。例えば、macOS Catalina PatcherなどOCLPとは異なるpatcherを適用した環境にAMFIPass.kextを導入しても、AMFIを有効化することはできません(起動しません)。あくまでOCLPのRoot Patchによって導入されたバイナリについてのみAMFIを回避できるようになっています。
というわけで、バイナリの方にも秘密がありそうです。
OCLPのアプリに含まれているRoot Patch用のバイナリは、実体としてはこのUniversal-Binaries.dmgに格納されています。
https://github.com/dortania/OpenCore-Legacy-Patcher/blob/1.3.0/Build-Binary.command#L270-L299
このUniversal-Binaries.dmgはOCLPのリポジトリに含まれておらず、PatcherSupportPkgからダウンロードしていることがわかります。
PatcherSupportPkgリポジトリには各種Root Patch用バイナリが配置されているわけですが、それをそのままdmg化しているわけではありません。
https://github.com/dortania/PatcherSupportPkg/blob/1.4.7/ci.py
ここにはci.pyというバイナリ署名用のスクリプトが配置されています。
https://github.com/dortania/PatcherSupportPkg/blob/1.4.7/.github/workflows/build.yml#L19-L28
そして、dmgビルド用のワークフローにおいて秘密鍵を読み込み、ci.pyで署名してからdmg化していることがわかります。
https://github.com/dortania/PatcherSupportPkg/blob/1.4.7/ci.py#L140
署名済みチェックの対象がDortania Root CA(DortaniaはOCLPのgithub org名)であることからも、例えばどこかから不正に入手した秘密鍵などではなく、自身で作った鍵で署名しています。
AMFIPass.kextの方はソースコードが公開されていないので実際に何をしているかははっきりしないものの、秘密鍵と対応するDortaniaの証明書を組み込んで、署名がDortaniaの鍵によるものであってもAMFIが通る(Pass)ようにしているのはUniversal-Binaries.dmgの作り方からして間違いないでしょう。おそらく、macOSにはAMFIが参照する証明書ストアのようなものがあり、そこにDortaniaの証明書をinjectしているんじゃないかと思います。
昨今のHackintosh用kextにしては珍しくソースコードが公開されていないのも、証明書を注ぎ足した偽のAMFIPass.kextが流通することを懸念しているのでは?と思います。偽AMFIPass.kext入り海賊版OCLPのようなものを作られてしまうと、攻撃者のよる署名付きの悪意あるバイナリを入れ放題になってしまいますからね。まあOCLPを使っている時点でOCLPに全てを委ねているので、海賊版OCLPなんてあったらそんな回りくどいことせずSIPもAMFIも無効化されて乗っ取られる気がしますが・・・ただ偽物が配布されることはなかったものの、OCLP偽サイト騒動は実際ありました。
小ネタと言いつつまた長くなってしまいましたが、Hackintosh側面でのOCLPの解説でした。Sonoma + Broadcom WiFiユーザーはまた14.4アップデートでお世話になることでしょうし、macOS 15が出たときにはもっと出番が増えるかもしれません。
ではでは。
0 件のコメント:
コメントを投稿