Ketika aplikasi ditandatangani dengan kode, bagian mana dari bundel .app yang menutupi tanda tangan?

13

Di Mountain Lion, saya tahu bahwa beberapa aplikasi, termasuk semua aplikasi di Mac App Store ditandatangani secara digital oleh pengembang, sehingga jika diubah, tanda tangan tidak akan cocok, dan itu akan memunculkan segala macam kesalahan (dan situasinya). akan meningkat dengan rilis berikutnya dari sistem operasi ...).

Pertanyaan saya adalah bagian bundel .app apa yang dicakup tanda tangan? Jika apa-apa di Appname.app/Contentsperubahan (termasuk metadata, seperti tanggal diubah untuk Contentsfolder), apakah itu istirahat tanda tangan? Apakah ini hanya biner Contents/MacOS? Apakah daftar. Termasuk dalam tanda tangan? Itu Resources? Sebagai pengguna akhir, apa yang bisa saya retas (jika ada) tanpa melanggar tanda tangan?

Daniel
sumber
Sepertinya Anda perlu memulai pengujian, dan beri tahu kami!
Adam Davis
Saya bisa, dan jika tidak ada yang tahu jawabannya, saya akan melakukannya, tetapi jika seseorang sudah menguji, saya tidak perlu menemukan kembali rodanya.
Daniel
1
Roda itu benar - benar bisa menggunakan beberapa perbaikan. Saya pikir pemintal krom adalah suatu keharusan, untuk satu hal.
Adam Davis

Jawaban:

14

TL; DR Terserah pengembang untuk memilih bagian mana dari aplikasi yang ditandatangani dan apakah merusak bagian itu menghasilkan tindakan apa pun saat aplikasi diluncurkan. Anda harus menggunakan coba-coba untuk mencari tahu berdasarkan aplikasi demi aplikasi.

Sebagian besar tergantung pada pengembang untuk memutuskan komponen mana dalam bundel aplikasi mereka yang diwakili dalam segel yang ditandatangani sebelum mereka mengirimkan aplikasi mereka. Apa pun yang ada di segel secara efektif merusak-bukti karena sebagian besar tidak mungkin untuk memodifikasi hal-hal ini tanpa mengubah tanda tangan hash mereka. Tetapi itu tidak berarti Anda tidak dapat merusaknya.

Panduan Pengembang Apple mengatakan ini tentang apa yang harus Anda tandatangani:

Anda harus menandatangani setiap yang dapat dieksekusi dalam produk Anda, termasuk aplikasi, alat, alat bantu tersembunyi, utilitas dan sebagainya. Menandatangani bundel aplikasi mencakup sumber dayanya, tetapi bukan subkomponennya seperti alat dan sub-bundel. Masing-masing harus ditandatangani secara independen.

Jika aplikasi Anda terdiri dari bagian UI besar dengan satu atau beberapa alat pembantu kecil yang mencoba menyajikan satu wajah kepada pengguna, Anda dapat membuatnya tidak bisa dibedakan dengan penandatanganan kode dengan memberi mereka semua pengidentifikasi penandatanganan kode yang sama persis. (Anda dapat melakukannya dengan memastikan bahwa mereka semua memiliki nilai CFBundleIdentifier yang sama di Info.plist mereka, atau dengan menggunakan opsi -i dalam perintah codesign, untuk menetapkan pengidentifikasi yang sama.) Dalam hal ini, semua komponen program Anda memiliki akses ke item gantungan kunci yang sama dan validasikan sebagai program yang sama. Lakukan ini hanya jika program yang terlibat benar-benar dimaksudkan untuk membentuk satu kesatuan, tanpa ada perbedaan.

Sebuah biner universal (bundel atau alat) secara otomatis memiliki tanda tangan individual yang diterapkan pada setiap komponen arsitektur. Ini independen, dan biasanya hanya arsitektur asli pada sistem pengguna akhir yang diverifikasi.

Dalam kasus paket pemasang (bundel .pkg dan .mpkg), semuanya ditandatangani secara implisit: Arsip CPIO berisi muatan, arsip CPIO yang berisi skrip pemasangan, dan bill of material (BOM) masing-masing memiliki hash yang dicatat dalam XAR header, dan header itu pada gilirannya ditandatangani. Oleh karena itu, jika Anda memodifikasi skrip instalasi (misalnya) setelah paket ditandatangani, tanda tangan tidak valid.

Anda mungkin juga ingin menandatangani plug-in dan perpustakaan Anda. Meskipun saat ini tidak diperlukan, itu akan di masa depan, dan tidak ada kerugian untuk memiliki tanda tangan pada komponen ini.

Bergantung pada situasinya, codesign dapat menambah file yang dapat dieksekusi Mach-O Anda, menambahkan atribut yang diperluas, atau membuat file baru di direktori Konten bundel Anda. Tidak ada file Anda yang lain yang dimodifikasi.

Juga dari sini , tidak selalu benar bahwa memiliki tanda tangan yang tidak valid untuk suatu aplikasi berarti ia akan gagal diluncurkan. Halaman itu mengatakan:

Terserah sistem atau program yang meluncurkan atau memuat kode yang ditandatangani untuk memutuskan apakah akan memverifikasi tanda tangan dan, jika ya, untuk menentukan cara mengevaluasi hasil verifikasi itu.

Aplikasi dapat memilih untuk mengizinkan modifikasi.

Taruhan terbaik Anda adalah pendekatan coba-coba dengan aplikasi apa pun yang Anda coba modifikasi. Mungkin berhasil, mungkin juga tidak. Tidak ada jawaban yang selalu benar yang bisa diberikan.

Jika aplikasi telah ditandatangani, Anda dapat mencari Contents/CodeResourcesfile atau Contents/_CodeSignature/CodeResourcesfile dalam bundel. File ini mencantumkan semua komponen yang ditandatangani dan nilai hash yang diharapkan dalam bundel. Ini adalah tempat yang baik untuk mulai memahami bagian aplikasi apa yang dianggap cukup penting oleh pengembang untuk diperhatikan.

Ian C.
sumber
0

Meskipun pertanyaan itu merujuk Mountain Lion secara khusus, ada perubahan penting dalam versi MacOS yang lebih baru. Pada macOS 10.11 dan yang lebih baru, tanda tangan yang tidak mencakup seluruh kode ditolak.

Lihat Catatan Teknis TN2206 - Kedalaman Penandatanganan Kode macOS .

Gunnar
sumber