アプリケーションがコード署名される場合、.appバンドルのどの部分が署名をカバーしますか?


13

Mountain Lionでは、Mac App Storeのすべてのアプリケーションを含むいくつかのアプリケーションが開発者によってデジタル署名されているため、それらが変更された場合、署名は一致せず、あらゆる種類のエラー(および状況オペレーティングシステムの次のリリースでエスカレートします...)。

私の質問は、.appバンドルのどの部分が署名をカバーするかということです。変更(フォルダーの変更日などのメタデータを含む)に何かがある場合、それは署名を壊しますか?それは単なるバイナリですか?.plistsは署名に含まれていますか??エンドユーザーとして、署名を壊さずに(もしあれば)何をハッキングできますか?Appname.app/ContentsContentsContents/MacOSResources


テストを開始する必要があるようです。
アダムデイビス

答えがわからない場合はできますが、誰かが既にテストしている場合は、車輪を再発明する必要はありません。
ダニエル

1
しかし、そのホイールは完全にいくつかの改善を使用できます。クロムスピナーは必須だと思う。
アダムデイビス

回答:


14

TL; DRアプリのどの部分に署名するか、それらの部分を改ざんするとアプリの起動時に何らかのアクションが発生するかどうかを選択するのは開発者の責任です。アプリごとに試行錯誤を繰り返す必要があります。

アプリケーションバンドルのどのコンポーネントを、アプリケーションを配信する前に署名するシールに表示するかを決定するのは、主に開発者次第です。シール内のすべてのものは、それらのハッシュ署名を変更せずにこれらを変更することはほとんど不可能であるため、実質的に改ざん防止されています。しかし、実際には、それらを改ざんできないというわけではありません。

Apple開発者ガイドには、署名する必要があるものについての説明があります。

アプリケーション、ツール、非表示のヘルパーツール、ユーティリティなど、製品のすべての実行可能ファイルに署名する必要があります。アプリケーションバンドルに署名すると、そのリソースがカバーされますが、ツールやサブバンドルなどのサブコンポーネントはカバーされません。これらはそれぞれ独立して署名する必要があります。

アプリケーションが、ユーザーに単一の顔を見せようとする1つまたは複数の小さなヘルパーツールを備えた大きなUIパーツで構成されている場合、まったく同じコード署名識別子を与えることで、それらをコード署名と区別できなくすることができます。(Info.plistでCFBundleIdentifierの値がすべて同じであることを確認するか、codesignコマンドで-iオプションを使用して同じ識別子を割り当てることで確認できます。)その場合、すべてのプログラムコンポーネントは同じキーチェーン項目にアクセスし、同じプログラムとして検証します。これを行うのは、関係するプログラムが本当に区別なく単一のエンティティを形成することを意図している場合のみです。

ユニバーサルバイナリ(バンドルまたはツール)には、各アーキテクチャコンポーネントに個別の署名が自動的に適用されます。これらは独立しており、通常、エンドユーザーのシステム上のネイティブアーキテクチャのみが検証されます。

インストーラーパッケージ(.pkgおよび.mpkgバンドル)の場合、すべてが暗黙的に署名されます。ペイロードを含むCPIOアーカイブ、インストールスクリプトを含むCPIOアーカイブ、および部品表(BOM)にはそれぞれXARに記録されたハッシュがありますヘッダー、そのヘッダーは順番に署名されます。したがって、パッケージに署名した後にインストールスクリプトを変更すると(たとえば)、署名は無効になります。

プラグインとライブラリに署名することもできます。これは現在必須ではありませんが、将来的にはそうであり、これらのコンポーネントに署名を付けることに不利な点はありません。

状況に応じて、codesignはMach-O実行可能ファイルに追加、拡張属性を追加、またはバンドルのコンテンツディレクトリに新しいファイルを作成します。他のファイルは変更されません。

また、ここから、アプリケーションに無効な署名があると、起動に失敗することになるとは限りません。ページは言う:

署名を検証するかどうかを決定し、検証する場合はその検証結果を評価する方法を決定するのは、署名されたコードを起動またはロードするシステムまたはプログラム次第です。

アプリケーションは、変更を許可することを選択できます。

最善の策は、修正しようとしているアプリケーションで試行錯誤することです。機能する場合もあれば、機能しない場合もあります。常に真実の答えを与えることはできません。

アプリが署名されている場合、Contents/CodeResourcesファイルまたはContents/_CodeSignature/CodeResourcesバンドル内のファイルを 検索できます。このファイルには、すべての署名済みコンポーネントと、バンドル内の予想されるハッシュ値がリストされています。開発者が変更を監視するのに十分重要であると考えるアプリケーションの部分を理解し始めるのに適した場所です。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.