hacktricks/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/README.md

26 KiB
Raw Blame History

macOSセキュリティ保護

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Gatekeeper

Gatekeeperは、Macオペレーティングシステム向けに開発されたセキュリティ機能で、ユーザーがシステム上で信頼されたソフトウェアのみを実行することを保証するために設計されています。これは、ユーザーがアプリ、プラグイン、またはインストーラーパッケージなどのApp Store以外のソースからダウンロードして開こうとするソフトウェアを検証することによって機能します。

Gatekeeperの主要なメカニズムは、その検証プロセスにあります。ダウンロードしたソフトウェアが認識された開発者によって署名されているかどうかをチェックし、ソフトウェアの信頼性を確認します。さらに、ソフトウェアがAppleによって公証されているかどうかも確認し、既知の悪意のあるコンテンツが含まれていないこと、および公証後に改ざんされていないことを確認します。

さらに、Gatekeeperは、ユーザーがダウンロードしたソフトウェアの初回の実行を承認するようユーザーにプロンプトを表示することで、ユーザーの制御とセキュリティを強化します。この保護機能により、ユーザーが無害なデータファイルと間違えて実行する可能性のある潜在的に有害な実行可能コードを誤って実行することを防ぎます。

アプリケーションの署名

アプリケーションの署名は、Appleのセキュリティインフラストラクチャの重要な要素です。これは、ソフトウェアの作成者開発者身元を確認し、コードが最後に署名されてから改ざんされていないことを保証するために使用されます。

以下は、その動作方法です。

  1. アプリケーションの署名: 開発者がアプリケーションを配布する準備ができたら、開発者が秘密鍵を使用してアプリケーションに署名します。この秘密鍵は、開発者がApple Developer Programに登録する際にAppleから発行される証明書に関連付けられています。署名プロセスでは、アプリのすべての部分の暗号ハッシュを作成し、このハッシュを開発者の秘密鍵で暗号化することが含まれます。
  2. アプリケーションの配布: 署名されたアプリケーションは、開発者の証明書と共にユーザーに配布されます。この証明書には、対応する公開鍵が含まれています。
  3. アプリケーションの検証: ユーザーがアプリケーションをダウンロードして実行しようとすると、Macオペレーティングシステムは開発者の証明書から公開鍵を使用してハッシュを復号化します。その後、アプリケーションの現在の状態に基づいてハッシュを再計算し、これを復号化されたハッシュと比較します。一致する場合、開発者が署名した後にアプリケーションが変更されていないことを意味し、システムはアプリケーションの実行を許可します。

アプリケーションの署名は、AppleのGatekeeperテクロジーの重要な部分です。ユーザーがインターネットからダウンロードしたアプリケーションを開こうとすると、Gatekeeperはアプリケーションの署名を検証します。Appleが既知の開発者に発行した証明書で署名されており、コードが改ざんされていない場合、Gatekeeperはアプリケーションの実行を許可します。それ以外の場合、アプリケーションをブロックし、ユーザーに警告します。

macOS Catalina以降、GatekeeperはアプリケーションがAppleによって公証されているかどうかもチェックします。公証プロセスでは、アプリケーションが既知のセキュリティの問題や悪意のあるコードを含んでいないかどうかをチェックし、これらのチェックに合格した場合、AppleはGatekeeperが検証できるアプリケーションにチケットを追加します。

署名の確認

マルウェアサンプルをチェックする際には、常にバイナリの署名を確認する必要があります。署名した開発者が既にマルウェアと関連している可能性があるためです。

# Get signer
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"

# Check if the apps contents have been modified
codesign --verify --verbose /Applications/Safari.app

# Get entitlements from the binary
codesign -d --entitlements :- /System/Applications/Automator.app # Check the TCC perms

# Check if the signature is valid
spctl --assess --verbose /Applications/Safari.app

# Sign a binary
codesign -s <cert-name-keychain> toolsdemo

Notarization公証

Appleの公証プロセスは、ユーザーを潜在的に有害なソフトウェアから保護するための追加の安全策として機能します。これは、開発者が自分のアプリケーションをAppleの公証サービスに提出することを含みます。このサービスは、App Reviewとは異なるものであり、提出されたソフトウェアを悪意のあるコンテンツやコード署名の潜在的な問題から検査する自動化システムです。

ソフトウェアがこの検査を通過し、懸念事項がない場合、公証サービスは公証チケットを生成します。その後、開発者はこのチケットをソフトウェアに添付する必要があります。このプロセスは「ステープリング」と呼ばれます。さらに、公証チケットはオンラインでも公開され、Appleのセキュリティ技術であるGatekeeperがアクセスできるようになります。

ユーザーがソフトウェアを初めてインストールまたは実行する際、実行可能ファイルにステープルされているか、オンラインで見つかるかにかかわらず、公証チケットの存在はGatekeeperにソフトウェアがAppleによって公証されたことを通知します。その結果、Gatekeeperは初回起動ダイアログに説明的なメッセージを表示し、ソフトウェアがAppleによって悪意のあるコンテンツのチェックを受けたことを示します。このプロセスにより、ユーザーは自分のシステムにインストールまたは実行するソフトウェアのセキュリティに対する信頼性が向上します。

GateKeeperの列挙

GateKeeperは、信頼されていないアプリケーションの実行を防止するいくつかのセキュリティコンポーネントであり、またその一部でもあります。

GateKeeperの状態は、次のコマンドで確認することができます

# Check the status
spctl --status

{% hint style="danger" %} GateKeeperの署名チェックは、Quarantine属性を持つファイルに対してのみ実行されます。 {% endhint %}

GateKeeperは、設定と署名に基づいてバイナリが実行可能かどうかをチェックします。

この設定を保持するデータベースは、**/var/db/SystemPolicy**にあります。ルートとしてこのデータベースを確認することができます。

# Open database
sqlite3 /var/db/SystemPolicy

# Get allowed rules
SELECT requirement,allow,disabled,label from authority where label != 'GKE' and disabled=0;
requirement|allow|disabled|label
anchor apple generic and certificate 1[subject.CN] = "Apple Software Update Certification Authority"|1|0|Apple Installer
anchor apple|1|0|Apple System
anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.9] exists|1|0|Mac App Store
anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] exists and (certificate leaf[field.1.2.840.113635.100.6.1.14] or certificate leaf[field.1.2.840.113635.100.6.1.13]) and notarized|1|0|Notarized Developer ID
[...]

最初のルールが「App Store」で終わり、2番目のルールが「Developer ID」で終わっていることに注目し、前のイメージではApp Storeと識別された開発者からのアプリの実行が有効になっていることがわかります。
その設定をApp Storeに変更すると、「Notarized Developer ID」のルールが消えます。

また、GKEタイプのルールは数千あります。

SELECT requirement,allow,disabled,label from authority where label = 'GKE' limit 5;
cdhash H"b40281d347dc574ae0850682f0fd1173aa2d0a39"|1|0|GKE
cdhash H"5fd63f5342ac0c7c0774ebcbecaf8787367c480f"|1|0|GKE
cdhash H"4317047eefac8125ce4d44cab0eb7b1dff29d19a"|1|0|GKE
cdhash H"0a71962e7a32f0c2b41ddb1fb8403f3420e1d861"|1|0|GKE
cdhash H"8d0d90ff23c3071211646c4c9c607cdb601cb18f"|1|0|GKE

これらは、/var/db/SystemPolicyConfiguration/gke.bundle/Contents/Resources/gke.auth/var/db/gke.bundle/Contents/Resources/gk.db、および**/var/db/gkopaque.bundle/Contents/Resources/gkopaque.db**から取得されたハッシュです。

spctlのオプション--master-disable--global-disableは、これらの署名チェックを完全に無効化します。

# Disable GateKeeper
spctl --global-disable
spctl --master-disable

# Enable it
spctl --global-enable
spctl --master-enable

完全に有効にされると、新しいオプションが表示されます:

GateKeeperによってアプリが許可されるかどうかを確認することができます。

spctl --assess -v /Applications/App.app

GateKeeperに新しいルールを追加して、特定のアプリの実行を許可することが可能です。以下の手順を実行します。

  1. ターミナルを開きます。
  2. sudo spctl --add /path/to/application.appと入力します。/path/to/application.appの部分は、許可するアプリのパスを指定します。
  3. 管理者パスワードを入力します。
  4. GateKeeperがアプリの実行を許可するように設定されます。

これにより、指定したアプリはGateKeeperによってブロックされずに実行されるようになります。

# Check if allowed - nop
spctl --assess -v /Applications/App.app
/Applications/App.app: rejected
source=no usable signature

# Add a label and allow this label in GateKeeper
sudo spctl --add --label "whitelist" /Applications/App.app
sudo spctl --enable --label "whitelist"

# Check again - yep
spctl --assess -v /Applications/App.app
/Applications/App.app: accepted

ファイルの隔離

アプリケーションやファイルをダウンロードする際、macOSの特定のアプリケーションウェブブラウザやメールクライアントなどは、ダウンロードされたファイルに一般的に知られている「隔離フラグ」と呼ばれる拡張ファイル属性を付加します。この属性は、ファイルが信頼されていないソースインターネットから来ており、潜在的なリスクを持っている可能性があることを示すセキュリティ対策として機能します。ただし、すべてのアプリケーションがこの属性を付加するわけではありません。たとえば、一般的なBitTorrentクライアントソフトウェアは通常、このプロセスをバイパスします。

隔離フラグが存在しない場合一部のBitTorrentクライアントを介してダウンロードされたファイルなど、Gatekeeperのチェックは実行されない場合があります。したがって、安全性の低いまたは不明なソースからダウンロードされたファイルを開く際には注意が必要です。

{% hint style="info" %} コード署名の妥当性をチェックすることは、コードとそのバンドルされたリソースの暗号ハッシュを生成するなど、リソースを多く消費するプロセスです。さらに、証明書の妥当性をチェックするには、発行後に取り消されていないかをAppleのサーバーにオンラインで確認する必要があります。これらの理由から、完全なコード署名と公証チェックは、アプリが起動するたびに実行するのは現実的ではありません

したがって、これらのチェックは隔離属性を持つアプリを実行するときにのみ実行されます。 {% endhint %}

{% hint style="warning" %} この属性は、ファイルを作成/ダウンロードするアプリケーションによって設定する必要があります

ただし、サンドボックス化されたファイルは、作成されるすべてのファイルにこの属性が設定されます。また、サンドボックス化されていないアプリは、自分自身で設定するか、Info.plistLSFileQuarantineEnabledキーを指定することで、システムが作成されたファイルにcom.apple.quarantineの拡張属性を設定します。 {% endhint %}

次のコマンドで、その状態を確認し、有効/無効にすることができます(ルート権限が必要です):

spctl --status
assessments enabled

spctl --enable
spctl --disable
#You can also allow nee identifies to execute code using the binary "spctl"

次のコマンドを使用して、ファイルに拡張属性があるかどうかを確認することもできます:

xattr -p com.apple.quarantine <file>

このコマンドは、指定した <file> に拡張属性 com.apple.quarantine がある場合、その値を表示します。

xattr portada.png
com.apple.macl
com.apple.quarantine

次に、拡張属性の値を確認し、quarantine属性を書き込んだアプリを特定します。

xattr -l portada.png
com.apple.macl:
00000000  03 00 53 DA 55 1B AE 4C 4E 88 9D CA B7 5C 50 F3  |..S.U..LN.....P.|
00000010  16 94 03 00 27 63 64 97 98 FB 4F 02 84 F3 D0 DB  |....'cd...O.....|
00000020  89 53 C3 FC 03 00 27 63 64 97 98 FB 4F 02 84 F3  |.S....'cd...O...|
00000030  D0 DB 89 53 C3 FC 00 00 00 00 00 00 00 00 00 00  |...S............|
00000040  00 00 00 00 00 00 00 00                          |........|
00000048
com.apple.quarantine: 00C1;607842eb;Brave;F643CD5F-6071-46AB-83AB-390BA944DEC5
# 00c1 -- It has been allowed to eexcute this file
# 607842eb -- Timestamp
# Brave -- App
# F643CD5F-6071-46AB-83AB-390BA944DEC5 -- UID assigned to the file downloaded

そして、次のコマンドでその属性を削除します:

xattr -d com.apple.quarantine portada.png
#You can also remove this attribute from every file with
find . -iname '*' -print0 | xargs -0 xattr -d com.apple.quarantine

次のコマンドを使用して、隔離されたすべてのファイルを検索します:

{% code overflow="wrap" %}

find / -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.quarantine"

{% endcode %}

クラウド/SaaSプラットフォーム名Workspace、aws、gcpなど、'leak'、ペンテスト、およびマークダウンタグのようなものを翻訳しないでください。また、翻訳とマークダウン構文以外の追加の要素は追加しないでください。

{% endcode %}

クラウド/SaaSプラットフォーム名Workspace、aws、gcpなど、'leak'、ペンテスト、およびマークダウンタグのようなものを翻訳しないでください。また、翻訳とマークダウン構文以外の追加の要素は追加しないでください。

Quarantine情報は、LaunchServicesによって管理される中央データベースにも保存されます。データベースの場所は**~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2**です。

XProtect

XProtectは、macOSに組み込まれたアンチマルウェア機能です。XProtectは、アプリケーションが初めて起動されるか変更される際に、既知のマルウェアと危険なファイルタイプのデータベースと照合して、アプリケーションをチェックします。Safari、Mail、またはMessagesなどの特定のアプリを介してファイルをダウンロードすると、XProtectは自動的にファイルをスキャンします。データベース内の既知のマルウェアと一致する場合、XProtectはファイルの実行を防止し、脅威を警告します。

XProtectデータベースは、Appleによって定期的に新しいマルウェアの定義で更新され、これらの更新は自動的にMacにダウンロードおよびインストールされます。これにより、XProtectは常に最新の既知の脅威と同期されます。

ただし、XProtectは完全なアンチウイルスソリューションではないことに注意してください。XProtectは特定の既知の脅威のリストのみをチェックし、ほとんどのアンチウイルスソフトウェアのようにオンアクセススキャンを実行しません。

最新のXProtectの更新に関する情報を取得するには、次のコマンドを実行します

{% code overflow="wrap" %}

system_profiler SPInstallHistoryDataType 2>/dev/null | grep -A 4 "XProtectPlistConfigData" | tail -n 5

{% endcode %}

XProtectは、SIPで保護された場所にあります。/Library/Apple/System/Library/CoreServices/XProtect.bundleにあり、バンドル内にはXProtectが使用する情報が含まれています

  • XProtect.bundle/Contents/Resources/LegacyEntitlementAllowlist.plistこれらのcdhashを持つコードがレガシー権限を使用できるようにします。
  • XProtect.bundle/Contents/Resources/XProtect.meta.plistBundleIDとTeamIDまたは最小バージョンを示すことで、ロードが禁止されるプラグインと拡張機能のリスト。
  • XProtect.bundle/Contents/Resources/XProtect.yaraマルウェアを検出するためのYaraルール。
  • XProtect.bundle/Contents/Resources/gk.dbブロックされたアプリケーションとTeamIDのハッシュを含むSQLite3データベース。

XProtectに関連する別のアプリケーションが**/Library/Apple/System/Library/CoreServices/XProtect.app**にありますが、アプリが実行される際には関与しません。

MRT - マルウェア除去ツール

マルウェア除去ツールMRTは、macOSのセキュリティインフラのもう一つの部分です。その名前からもわかるように、MRTの主な機能は、感染したシステムから既知のマルウェアを除去することです。

マルウェアがMacで検出されるとXProtectまたは他の手段によって、MRTを使用してマルウェアを自動的に除去することができます。MRTはバックグラウンドで静かに動作し、通常はシステムが更新されるか、新しいマルウェア定義がダウンロードされると実行されますマルウェアを検出するためのルールはバイナリ内にあるようです

XProtectとMRTは、macOSのセキュリティ対策の一部ですが、異なる機能を持っています

  • XProtectは予防ツールです。ファイルがダウンロードされる際に(特定のアプリケーションを介して)、ファイルをチェックし、既知のマルウェアを検出した場合は、ファイルを開かないようにして、システムへのマルウェア感染を最初から防止します。
  • 一方、MRT反応型のツールです。マルウェアがシステムで検出された後、問題のあるソフトウェアを除去してシステムをクリーンアップすることを目的としています。

MRTアプリケーションは**/Library/Apple/System/Library/CoreServices/MRT.app**にあります。

プロセス制限

SIP - システム整合性保護

{% content-ref url="macos-sip.md" %} macos-sip.md {% endcontent-ref %}

サンドボックス

MacOSサンドボックスは、サンドボックスプロファイルで指定された許可されたアクションに制限されたアプリケーションの実行を制限します。これにより、アプリケーションが予期されたリソースにのみアクセスすることが保証されます。

{% content-ref url="macos-sandbox/" %} macos-sandbox {% endcontent-ref %}

TCC - 透明性、同意、および制御

**TCC透明性、同意、および制御**は、macOSの機能へのアプリケーションのアクセスを制限および制御するためのメカニズムです。これには、位置情報サービス、連絡先、写真、マイク、カメラ、アクセシビリティ、フルディスクアクセスなどが含まれます。

{% content-ref url="macos-tcc/" %} macos-tcc {% endcontent-ref %}

信頼キャッシュ

Apple macOSの信頼キャッシュ、またはAMFIApple Mobile File Integrityキャッシュは、macOSのセキュリティメカニズムで、許可されていないまたは悪意のあるソフトウェアの実行を防止するために設計されています。基本的には、ソフトウェアの整合性と信頼性を検証するために、オペレーティングシステムが使用する暗号ハッシュのリストです。

macOSでアプリケーションまたは実行可能ファイルを実行しようとすると、オペレーティングシステムはAMFI信頼キャッシュをチェックします。ファイルのハッシュが信頼キャッシュに見つかった場合、システムはそのプログラムを実行を許可します。なぜなら、それを信頼されたものと認識するからです。

起動制約

Appleの署名されたバイナリを起動できる場所と起動できるものを制御します

  • launchdによって実行されるべきアプリを直接起動することはできません。
  • /System/のような信頼された場所の外部でアプリを実行することはできません。
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥