Kerentanan (CVE-2022-42841) yang dapat digunakan untuk memodifikasi paket penginstal yang ditandatangani tanpa membatalkan tanda tangannya. Kerentanan ini dapat disalahgunakan untuk mem-bypass Gatekeeper, SIP dan dalam kondisi tertentu meningkatkan hak istimewa ke root.
Kerentanan
Untuk paket yang ditandatangani, hash TOC perlu digunakan untuk dua pemeriksaan berbeda:
- Hash TOC yang dihitung harus sama dengan hash TOC yang disimpan di heap.
- Tanda tangan dan sertifikat harus sesuai dengan hash TOC.
Ini diterapkan di lokasi berikut dalam kode sumber xar.
Di sini, TOC yang dihitung dibandingkan dengan nilai yang disimpan di heap.
Ini pertama mengambil atribut atribut checksum dari dokumen XML sebagai nilai const char *. Kemudian, strtoull mengubahnya menjadi bilangan bulat 64-bit yang tidak ditandatangani dan disimpan dalam variabel offset.
Untuk mendapatkan hash TOC untuk memvalidasi tanda tangan, sedikit kode serupa digunakan:
https://github.com/Apple-oss-distributions/xar/blob/f67a3a8c43fdd35021fd3d1562b62d2da32b4f4b/xar/lib/signature.c#L244-L276
Perhatikan di sini perbedaan kecil tapi sangat penting: sementara perbandingan pertama menyimpan offset dalam offset uint64_t (integer unsigned 64-bit), di sini ia menggunakan offset uint32_t (integer unsigned 32-bit). Perbedaan ini berarti bahwa jika offset berada di luar rentang yang dapat disimpan dalam nilai 32-bit, kedua pemeriksaan tersebut dapat menggunakan offset heap yang berbeda.
Dengan demikian, dimungkinkan untuk memodifikasi file xar tanpa membatalkan tanda tangannya sebagai berikut:
- Ambil file xar yang ditandatangani dengan benar dan parsing TOC.
- Ubah nilai offset checksum menjadi 4294967296 (dan buat perubahan lain yang Anda inginkan pada file yang disertakan, seperti menambahkan skrip prainstal berbahaya atau mengganti skrip pemeriksaan instalasi).
- Tulis TOC yang dimodifikasi kembali ke file dan hitung hash TOC baru.
- Tambahkan padding hingga heap berukuran tepat 4294967296 byte (4 GiB).
- Tempatkan hash TOC baru di heap offset 4294967296, biarkan hash TOC asli di heap offset 0.
Perbaikan
Ini diperbaiki oleh Apple dengan perbaikan 2 karakter: mengubah uint32_t menjadi uint64_t di macOS 13.1.
selengkapnya : sector7