From b770acbde4775ef882f380292b9858e42e779ab4 Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 1 Oct 2025 01:54:27 +0000 Subject: [PATCH] Translated ['src/macos-hardening/macos-security-and-privilege-escalation --- src/SUMMARY.md | 1 + .../README.md | 9 +- .../mach-o-entitlements-and-ipsw-indexing.md | 213 ++++++++++++++ .../universal-binaries-and-mach-o-format.md | 277 +++++++++--------- .../macos-code-signing.md | 113 +++---- 5 files changed, 421 insertions(+), 192 deletions(-) create mode 100644 src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/mach-o-entitlements-and-ipsw-indexing.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 27f33cff3..2062b6f9d 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -61,6 +61,7 @@ - [Deofuscation vbs (cscript.exe)](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/desofuscation-vbs-cscript.exe.md) - [Discord Cache Forensics](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/discord-cache-forensics.md) - [Local Cloud Storage](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/local-cloud-storage.md) + - [Mach O Entitlements And Ipsw Indexing](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/mach-o-entitlements-and-ipsw-indexing.md) - [Office file analysis](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/office-file-analysis.md) - [PDF File analysis](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/pdf-file-analysis.md) - [PNG tricks](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/png-tricks.md) diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/README.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/README.md index 623347952..dd4d6c08a 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/README.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/README.md @@ -1,8 +1,8 @@ -# Trikovi za specifičan softver/format fajla +# Specifični trikovi za softver i tipove fajlova {{#include ../../../banners/hacktricks-training.md}} -Ovde možete pronaći zanimljive trikove za specifične tipove fajlova i/ili softver: +Ovde možete pronaći zanimljive trikove za određene tipove fajlova i/ili softver: {{#ref}} @@ -54,4 +54,9 @@ video-and-audio-file-analysis.md zips-tricks.md {{#endref}} + +{{#ref}} +mach-o-entitlements-and-ipsw-indexing.md +{{#endref}} + {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/mach-o-entitlements-and-ipsw-indexing.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/mach-o-entitlements-and-ipsw-indexing.md new file mode 100644 index 000000000..27bd40e74 --- /dev/null +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/mach-o-entitlements-and-ipsw-indexing.md @@ -0,0 +1,213 @@ +# Mach-O Entitlements Extraction & IPSW Indexing + +{{#include ../../../banners/hacktricks-training.md}} + +## Overview + +Ova stranica objašnjava kako programatski izvući entitlements iz Mach-O binarnih fajlova prolaskom kroz LC_CODE_SIGNATURE i parsiranjem code signing SuperBlob-a, i kako to skalirati preko Apple IPSW firmware-ova montiranjem i indeksiranjem njihovog sadržaja za forenzičko pretraživanje/razlike. + +Ako vam treba podsetnik o Mach-O formatu i code signing-u, pogledajte i: macOS code signing and SuperBlob internals. +- Check macOS code signing details (SuperBlob, Code Directory, special slots): [macOS Code Signing](../../../macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-code-signing.md) +- Check general Mach-O structures/load commands: [Universal binaries & Mach-O Format](../../../macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md) + + +## Entitlements in Mach-O: where they live + +Entitlements su smešteni unutar code signature podataka na koje pokazuje LC_CODE_SIGNATURE load command i nalaze se u __LINKEDIT segmentu. Potpis je CS_SuperBlob koji sadrži više blob-ova (Code Directory, requirements, entitlements, CMS, itd.). Entitlements blob je CS_GenericBlob čiji su podaci Apple Binary Property List (bplist00) koji mapira ključeve entitlements na njihove vrednosti. + +Key structures (from xnu): +```c +/* mach-o/loader.h */ +struct mach_header_64 { +uint32_t magic; +cpu_type_t cputype; +cpu_subtype_t cpusubtype; +uint32_t filetype; +uint32_t ncmds; +uint32_t sizeofcmds; +uint32_t flags; +uint32_t reserved; +}; + +struct load_command { +uint32_t cmd; +uint32_t cmdsize; +}; + +/* Entitlements live behind LC_CODE_SIGNATURE (cmd=0x1d) */ +struct linkedit_data_command { +uint32_t cmd; /* LC_CODE_SIGNATURE */ +uint32_t cmdsize; /* sizeof(struct linkedit_data_command) */ +uint32_t dataoff; /* file offset of data in __LINKEDIT */ +uint32_t datasize; /* file size of data in __LINKEDIT */ +}; + +/* osfmk/kern/cs_blobs.h */ +typedef struct __SC_SuperBlob { +uint32_t magic; /* CSMAGIC_EMBEDDED_SIGNATURE = 0xfade0cc0 */ +uint32_t length; +uint32_t count; +CS_BlobIndex index[]; +} CS_SuperBlob; + +typedef struct __BlobIndex { +uint32_t type; /* e.g., CSMAGIC_EMBEDDED_ENTITLEMENTS = 0xfade7171 */ +uint32_t offset; /* offset of entry */ +} CS_BlobIndex; + +typedef struct __SC_GenericBlob { +uint32_t magic; /* same as type when standalone */ +uint32_t length; +char data[]; /* Apple Binary Plist containing entitlements */ +} CS_GenericBlob; +``` +Important constants: +- LC_CODE_SIGNATURE cmd = 0x1d +- CS SuperBlob magic = 0xfade0cc0 +- Entitlements blob type (CSMAGIC_EMBEDDED_ENTITLEMENTS) = 0xfade7171 +- DER entitlements may be present via special slot (e.g., -7), see the macOS Code Signing page for special slots and DER entitlements notes + +Note: Multi-arch (fat) binaries contain multiple Mach-O slices. You must pick the slice for the architecture you want to inspect and then walk its load commands. + + +## Koraci ekstrakcije (generički, dovoljno bez gubitaka) + +1) Parsirajte Mach-O header; iterirajte kroz ncmds worth of load_command records. +2) Pronađite LC_CODE_SIGNATURE; pročitajte linkedit_data_command.dataoff/datasize da mapirate Code Signing SuperBlob smešten u __LINKEDIT. +3) Potvrdite CS_SuperBlob.magic == 0xfade0cc0; prođite kroz count unosa CS_BlobIndex. +4) Pronađite index.type == 0xfade7171 (embedded entitlements). Pročitajte adresirani CS_GenericBlob i parsirajte njegove podatke kao Apple binary plist (bplist00) u key/value entitlements. + +Napomene implementacije: +- Strukture Code signature koriste big-endian polja; pri parsiranju na little-endian hostovima zamenite redosled bajtova. +- Podaci entitlements GenericBlob-a su binary plist (rukuju im standardne plist biblioteke). +- Neki iOS binarni fajlovi mogu nositi DER entitlements; takođe neki stores/slots se razlikuju među platformama/versijama. Po potrebi proverite i standardne i DER entitlements. +- Za fat binarne fajlove, koristite fat headers (FAT_MAGIC/FAT_MAGIC_64) da locirate odgovarajući slice i offset pre nego što prođete kroz Mach-O load commands. + + +## Minimalni pregled parsiranja (Python) + +Sledeći kompaktni pregled prikazuje kontrolni tok za pronalaženje i dekodiranje entitlements. Namerno izostavlja robusne provere granica i punu podršku za fat binarne fajlove radi sažetosti. +```python +import plistlib, struct + +LC_CODE_SIGNATURE = 0x1d +CSMAGIC_EMBEDDED_SIGNATURE = 0xfade0cc0 +CSMAGIC_EMBEDDED_ENTITLEMENTS = 0xfade7171 + +# all code-signing integers are big-endian per cs_blobs.h +be32 = lambda b, off: struct.unpack_from(">I", b, off)[0] + +def parse_entitlements(macho_bytes): +# assume already positioned at a single-arch Mach-O slice +magic, = struct.unpack_from(" +``` +- Pregledajte montirane volumene da biste locirali Mach-O fajlove (proverite magic i/ili koristite file/otool), zatim parsirajte entitlements i imported frameworks. +- Sačuvajte normalizovani prikaz u relacionoj bazi podataka da biste izbegli linearni rast kroz hiljade IPSWs: +- executables, operating_system_versions, entitlements, frameworks +- many-to-many: executable↔OS version, executable↔entitlement, executable↔framework + +Primer upita za listanje svih OS verzija koje sadrže dati executable name: +```sql +SELECT osv.version AS "Versions" +FROM device d +LEFT JOIN operating_system_version osv ON osv.device_id = d.id +LEFT JOIN executable_operating_system_version eosv ON eosv.operating_system_version_id = osv.id +LEFT JOIN executable e ON e.id = eosv.executable_id +WHERE e.name = "launchd"; +``` +Napomene o DB prenosivosti (ako implementirate sopstveni indeksator): +- Koristite ORM/abstrakciju (npr., SeaORM) kako bi kod bio nezavisan od DB-a (SQLite/PostgreSQL). +- SQLite zahteva AUTOINCREMENT samo za INTEGER PRIMARY KEY; ako želite i64 PK-ove u Rust-u, generišite entitete kao i32 i konvertujte tipove — SQLite interno čuva INTEGER kao 8-bajtni potpisani tip. + + +## Open-source alati i reference za entitlement hunting + +- Firmware mount/download: https://github.com/blacktop/ipsw +- Entitlement databases and references: +- Jonathan Levin’s entitlement DB: https://newosxbook.com/ent.php +- entdb: https://github.com/ChiChou/entdb +- Indeksator velike razmere (Rust, self-hosted Web UI + OpenAPI): https://github.com/synacktiv/appledb_rs +- Apple zaglavlja za strukture i konstante: +- loader.h (Mach-O headers, load commands) +- cs_blobs.h (SuperBlob, GenericBlob, CodeDirectory) + +Za više o internim detaljima code signing (Code Directory, special slots, DER entitlements), vidi: [macOS Code Signing](../../../macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-code-signing.md) + + +## References + +- [appledb_rs: a research support tool for Apple platforms](https://www.synacktiv.com/publications/appledbrs-un-outil-daide-a-la-recherche-sur-plateformes-apple.html) +- [synacktiv/appledb_rs](https://github.com/synacktiv/appledb_rs) +- [blacktop/ipsw](https://github.com/blacktop/ipsw) +- [Jonathan Levin’s entitlement DB](https://newosxbook.com/ent.php) +- [ChiChou/entdb](https://github.com/ChiChou/entdb) +- [XNU cs_blobs.h](https://github.com/apple-oss-distributions/xnu/blob/main/osfmk/kern/cs_blobs.h) +- [XNU mach-o/loader.h](https://github.com/apple-oss-distributions/xnu/blob/main/EXTERNAL_HEADERS/mach-o/loader.h) +- [SQLite Datatypes](https://sqlite.org/datatype3.html) + +{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md index aabcb29dd..a35ce0ebe 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md @@ -2,60 +2,60 @@ {{#include ../../../banners/hacktricks-training.md}} -## Osnovne informacije +## Basic Information -Mac OS binarni fajlovi obično se kompajliraju kao **univerzalni binarni fajlovi**. **Univerzalni binarni fajl** može **podržavati više arhitektura u istom fajlu**. +Mac OS binarni fajlovi obično su kompajlirani kao **universal binaries**. **Universal binary** može **podržavati više arhitektura u istom fajlu**. -Ovi binarni fajlovi prate **Mach-O strukturu** koja se u osnovi sastoji od: +Ovi binarni fajlovi prate **Mach-O strukturu** koja se u suštini sastoji od: -- Header +- Zaglavlje - Load Commands -- Data +- Podaci ![https://alexdremov.me/content/images/2022/10/6XLCD.gif](<../../../images/image (470).png>) ## Fat Header -Pretražujte fajl sa: `mdfind fat.h | grep -i mach-o | grep -E "fat.h$"` +Potražite fajl sa: `mdfind fat.h | grep -i mach-o | grep -E "fat.h$"`
#define FAT_MAGIC	0xcafebabe
 #define FAT_CIGAM	0xbebafeca	/* NXSwapLong(FAT_MAGIC) */
 
 struct fat_header {
-	uint32_t	magic;		/* FAT_MAGIC ili FAT_MAGIC_64 */
-	uint32_t	nfat_arch;	/* broj struktura koje slede */
+	uint32_t	magic;		/* FAT_MAGIC or FAT_MAGIC_64 */
+	uint32_t	nfat_arch;	/* number of structs that follow */
 };
 
 struct fat_arch {
-cpu_type_t	cputype;	/* specifikator cpu (int) */
-cpu_subtype_t	cpusubtype;	/* specifikator mašine (int) */
-uint32_t	offset;		/* pomeraj fajla do ovog objektnog fajla */
-uint32_t	size;		/* veličina ovog objektnog fajla */
-uint32_t	align;		/* poravnanje kao stepen od 2 */
+cpu_type_t	cputype;	/* cpu specifier (int) */
+cpu_subtype_t	cpusubtype;	/* machine specifier (int) */
+uint32_t	offset;		/* file offset to this object file */
+uint32_t	size;		/* size of this object file */
+uint32_t	align;		/* alignment as a power of 2 */
 };
 
-Header ima **magic** bajtove praćene **brojem** **arhitektura** koje fajl **sadrži** (`nfat_arch`) i svaka arhitektura će imati `fat_arch` strukturu. +Zaglavlje ima **magic** bajtove praćene brojem **arhitektura** koje fajl **sadrži** (`nfat_arch`) i svaka arhitektura će imati `fat_arch` strukturu. Proverite to sa:
% file /bin/ls
-/bin/ls: Mach-O univerzalni binarni fajl sa 2 arhitekture: [x86_64:Mach-O 64-bit izvršni fajl x86_64] [arm64e:Mach-O 64-bit izvršni fajl arm64e]
-/bin/ls (za arhitekturu x86_64):	Mach-O 64-bit izvršni fajl x86_64
-/bin/ls (za arhitekturu arm64e):	Mach-O 64-bit izvršni fajl arm64e
+/bin/ls: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64e:Mach-O 64-bit executable arm64e]
+/bin/ls (for architecture x86_64):	Mach-O 64-bit executable x86_64
+/bin/ls (for architecture arm64e):	Mach-O 64-bit executable arm64e
 
 % otool -f -v /bin/ls
 Fat headers
 fat_magic FAT_MAGIC
 nfat_arch 2
-arhitektura x86_64
+architecture x86_64
     cputype CPU_TYPE_X86_64
 cpusubtype CPU_SUBTYPE_X86_64_ALL
 capabilities 0x0
     offset 16384
     size 72896
     align 2^14 (16384)
-arhitektura arm64e
+architecture arm64e
     cputype CPU_TYPE_ARM64
 cpusubtype CPU_SUBTYPE_ARM64E
 capabilities PTR_AUTH_VERSION USERSPACE 0
@@ -64,15 +64,15 @@ capabilities PTR_AUTH_VERSION USERSPACE 0
     align 2^14 (16384)
 
-ili koristeći [Mach-O View](https://sourceforge.net/projects/machoview/) alat: +or using the [Mach-O View](https://sourceforge.net/projects/machoview/) tool:
-Kao što možda mislite, obično univerzalni binarni fajl kompajliran za 2 arhitekture **udvostručuje veličinu** jednog kompajliranog za samo 1 arhitekturu. +Kao što verovatno mislite, univerzalni binarni fajl kompajliran za 2 arhitekture obično je dvostruko veći od onog kompajliranog samo za 1 arhitekturu. ## **Mach-O Header** -Header sadrži osnovne informacije o fajlu, kao što su magic bajtovi koji ga identifikuju kao Mach-O fajl i informacije o ciljnoj arhitekturi. Možete ga pronaći u: `mdfind loader.h | grep -i mach-o | grep -E "loader.h$"` +Zaglavlje sadrži osnovne informacije o fajlu, kao što su magic bajtovi koji ga identifikuju kao Mach-O fajl i informacije o cilјnoj arhitekturi. Možete ga pronaći u: `mdfind loader.h | grep -i mach-o | grep -E "loader.h$"` ```c #define MH_MAGIC 0xfeedface /* the mach magic number */ #define MH_CIGAM 0xcefaedfe /* NXSwapInt(MH_MAGIC) */ @@ -99,20 +99,20 @@ uint32_t flags; /* flags */ uint32_t reserved; /* reserved */ }; ``` -### Mach-O Tipovi Fajlova +### Mach-O tipovi datoteka -Postoje različiti tipovi fajlova, možete ih pronaći definisane u [**izvoru koda, na primer ovde**](https://opensource.apple.com/source/xnu/xnu-2050.18.24/EXTERNAL_HEADERS/mach-o/loader.h). Najvažniji su: +Postoje različiti tipovi datoteka, možete ih pronaći definisane u [**source code for example here**](https://opensource.apple.com/source/xnu/xnu-2050.18.24/EXTERNAL_HEADERS/mach-o/loader.h). Najvažniji su: -- `MH_OBJECT`: Relokabilni objekat fajl (intermedijarni proizvodi kompajlacije, još nisu izvršni). +- `MH_OBJECT`: Relokabilni objekt fajl (međuproizvodi kompajliranja, još nisu izvršni). - `MH_EXECUTE`: Izvršni fajlovi. -- `MH_FVMLIB`: Fiksni VM bibliotečki fajl. -- `MH_CORE`: Dumpovi koda -- `MH_PRELOAD`: Preučitani izvršni fajl (više nije podržan u XNU) -- `MH_DYLIB`: Dinamičke biblioteke -- `MH_DYLINKER`: Dinamički linker -- `MH_BUNDLE`: "Plugin fajlovi". Generisani korišćenjem -bundle u gcc i eksplicitno učitani od strane `NSBundle` ili `dlopen`. -- `MH_DYSM`: Prateći `.dSym` fajl (fajl sa simbolima za debagovanje). -- `MH_KEXT_BUNDLE`: Ekstenzije jezgra. +- `MH_FVMLIB`: Fajl fiksne VM biblioteke. +- `MH_CORE`: Dump-ovi koda. +- `MH_PRELOAD`: Prethodno učitani izvršni fajl (više nije podržan u XNU). +- `MH_DYLIB`: Dinamičke biblioteke. +- `MH_DYLINKER`: Dinamički linker. +- `MH_BUNDLE`: "Plugin files". Generisani korišćenjem -bundle u gcc i eksplicitno učitavani putem `NSBundle` ili `dlopen`. +- `MH_DYSM`: Prateći `.dSym` fajl (fajl sa simbolima za otklanjanje grešaka). +- `MH_KEXT_BUNDLE`: Ekstenzije kernela. ```bash # Checking the mac header of a binary otool -arch arm64e -hv /bin/ls @@ -120,75 +120,75 @@ Mach header magic cputype cpusubtype caps filetype ncmds sizeofcmds flags MH_MAGIC_64 ARM64 E USR00 EXECUTE 19 1728 NOUNDEFS DYLDLINK TWOLEVEL PIE ``` -Ili korišćenjem [Mach-O View](https://sourceforge.net/projects/machoview/): +Ili koristeći [Mach-O View](https://sourceforge.net/projects/machoview/):
-## **Mach-O Zastavice** +## **Mach-O zastavke** -Izvorni kod takođe definiše nekoliko zastavica korisnih za učitavanje biblioteka: +The source code also defines several flags useful for loading libraries: -- `MH_NOUNDEFS`: Nema neodređenih referenci (potpuno povezano) -- `MH_DYLDLINK`: Dyld povezivanje -- `MH_PREBOUND`: Dinamičke reference su unapred povezane. -- `MH_SPLIT_SEGS`: Datoteka deli r/o i r/w segmente. -- `MH_WEAK_DEFINES`: Binarni fajl ima slabo definisane simbole -- `MH_BINDS_TO_WEAK`: Binarni fajl koristi slabe simbole -- `MH_ALLOW_STACK_EXECUTION`: Omogućava izvršavanje steka +- `MH_NOUNDEFS`: Bez nedefinisanih referenci (potpuno povezano) +- `MH_DYLDLINK`: Linkovanje preko dyld-a +- `MH_PREBOUND`: Dinamičke reference unapred vezane. +- `MH_SPLIT_SEGS`: Fajl razdvaja r/o i r/w segmente. +- `MH_WEAK_DEFINES`: Binar ima slabe definicije simbola +- `MH_BINDS_TO_WEAK`: Binar koristi slabe simbole +- `MH_ALLOW_STACK_EXECUTION`: Dozvoli izvršavanje na steku - `MH_NO_REEXPORTED_DYLIBS`: Biblioteka nema LC_REEXPORT komande -- `MH_PIE`: Nezavisni izvršni fajl -- `MH_HAS_TLV_DESCRIPTORS`: Postoji sekcija sa lokalnim promenljivama niti -- `MH_NO_HEAP_EXECUTION`: Nema izvršavanja za heap/podatkovne stranice -- `MH_HAS_OBJC`: Binarni fajl ima oBject-C sekcije +- `MH_PIE`: Poziciono nezavisan izvršni fajl +- `MH_HAS_TLV_DESCRIPTORS`: Postoji sekcija sa promenljivim lokalnim za niti +- `MH_NO_HEAP_EXECUTION`: Nije dozvoljeno izvršavanje na heap/data stranicama +- `MH_HAS_OBJC`: Binar ima Objective-C sekcije - `MH_SIM_SUPPORT`: Podrška za simulator - `MH_DYLIB_IN_CACHE`: Koristi se za dylibs/frameworks u kešu deljenih biblioteka. -## **Mach-O Učitavanje komandi** +## **Mach-O komande za učitavanje** -**Raspored datoteke u memoriji** je ovde specificiran, detaljno opisuje **lokaciju tabele simbola**, kontekst glavne niti na početku izvršavanja i potrebne **deljene biblioteke**. Uputstva su data dinamičkom učitaču **(dyld)** o procesu učitavanja binarnog fajla u memoriju. +Ovde se određuje raspored fajla u memoriji, detaljno navodeći lokaciju tabele simbola, kontekst glavne niti pri pokretanju i potrebne deljene biblioteke. Daju se instrukcije dinamičkom učitaču (dyld) o procesu učitavanja binarnog fajla u memoriju. -Koristi **load_command** strukturu, definisanu u pomenutom **`loader.h`**: +Koristi se struktura `load_command`, definisana u pomenutom `loader.h`: ```objectivec struct load_command { uint32_t cmd; /* type of load command */ uint32_t cmdsize; /* total size of command in bytes */ }; ``` -Postoji oko **50 različitih tipova komandi za učitavanje** koje sistem obrađuje na različite načine. Najčešći su: `LC_SEGMENT_64`, `LC_LOAD_DYLINKER`, `LC_MAIN`, `LC_LOAD_DYLIB` i `LC_CODE_SIGNATURE`. +Postoji otprilike **50 different types of load commands** koje sistem obrađuje na različite načine. Najčešći su: `LC_SEGMENT_64`, `LC_LOAD_DYLINKER`, `LC_MAIN`, `LC_LOAD_DYLIB` i `LC_CODE_SIGNATURE`. ### **LC_SEGMENT/LC_SEGMENT_64** > [!TIP] -> U suštini, ovaj tip komande za učitavanje definiše **kako učitati \_\_TEXT** (izvršni kod) **i \_\_DATA** (podaci za proces) **segmente** prema **offsetima navedenim u Data sekciji** kada se binarni fajl izvršava. +> Suštinski, ovaj tip Load Command definiše **how to load the \_\_TEXT** (izvršni kod) **and \_\_DATA** (podatke procesa) **segments** u skladu sa **offsets indicated in the Data section** kada se binar izvršava. -Ove komande **definišu segmente** koji su **mapirani** u **virtuelni memorijski prostor** procesa kada se izvršava. +Ove komande **definišu segmente** koji se **mapiraju** u **virtuelni adresni prostor** procesa kada se izvrše. -Postoje **različiti tipovi** segmenata, kao što je **\_\_TEXT** segment, koji sadrži izvršni kod programa, i **\_\_DATA** segment, koji sadrži podatke koje koristi proces. Ovi **segmenti se nalaze u data sekciji** Mach-O fajla. +Postoje **različiti tipovi** segmenata, kao što je **\_\_TEXT** segment, koji sadrži izvršni kod programa, i **\_\_DATA** segment, koji sadrži podatke korišćene od strane procesa. Ovi **segmenti se nalaze u data section** Mach-O fajla. -**Svaki segment** može biti dalje **podeljen** na više **sekcija**. **Struktura komande za učitavanje** sadrži **informacije** o **tim sekcijama** unutar odgovarajućeg segmenta. +**Svaki segment** može biti dalje **podeljen** na više **sekcija**. Struktura load command-a sadrži **informacije** o **ovim sekcijama** unutar odgovarajućeg segmenta. -U zaglavlju prvo nalazite **zaglavlje segmenta**: +U hederu prvo nalazite **segment header**: -
struct segment_command_64 { /* za 64-bitne arhitekture */
+
struct segment_command_64 { /* for 64-bit architectures */
 uint32_t	cmd;		/* LC_SEGMENT_64 */
-uint32_t	cmdsize;	/* uključuje sizeof section_64 strukture */
-char		segname[16];	/* ime segmenta */
-uint64_t	vmaddr;		/* memorijska adresa ovog segmenta */
-uint64_t	vmsize;		/* memorijska veličina ovog segmenta */
-uint64_t	fileoff;	/* offset u fajlu ovog segmenta */
-uint64_t	filesize;	/* količina za mapiranje iz fajla */
-int32_t		maxprot;	/* maksimalna VM zaštita */
-int32_t		initprot;	/* inicijalna VM zaštita */
-	uint32_t	nsects;		/* broj sekcija u segmentu */
-	uint32_t	flags;		/* zastavice */
+uint32_t	cmdsize;	/* includes sizeof section_64 structs */
+char		segname[16];	/* segment name */
+uint64_t	vmaddr;		/* memory address of this segment */
+uint64_t	vmsize;		/* memory size of this segment */
+uint64_t	fileoff;	/* file offset of this segment */
+uint64_t	filesize;	/* amount to map from the file */
+int32_t		maxprot;	/* maximum VM protection */
+int32_t		initprot;	/* initial VM protection */
+	uint32_t	nsects;		/* number of sections in segment */
+	uint32_t	flags;		/* flags */
 };
 
-Primer zaglavlja segmenta: +Example of segment header:
-Ovo zaglavlje definiše **broj sekcija čija se zaglavlja pojavljuju nakon** njega: +Ovaj heder definiše **broj sekcija čiji se hederi nalaze posle njega**: ```c struct section_64 { /* for 64-bit architectures */ char sectname[16]; /* name of this section */ @@ -205,62 +205,62 @@ uint32_t reserved2; /* reserved (for count or sizeof) */ uint32_t reserved3; /* reserved */ }; ``` -Primer **naslova sekcije**: +Primer **section header**:
-Ako **dodate** **offset sekcije** (0x37DC) + **offset** gde **arch počinje**, u ovom slučaju `0x18000` --> `0x37DC + 0x18000 = 0x1B7DC` +Ako **sabereš** **section offset** (0x37DC) + **offset** gde **arch** počinje, u ovom slučaju `0x18000` --> `0x37DC + 0x18000 = 0x1B7DC`
-Takođe je moguće dobiti **informacije o header-ima** iz **komandne linije** sa: +Takođe je moguće dobiti **headers information** iz **command line** pomoću: ```bash otool -lv /bin/ls ``` -Uobičajeni segmenti učitani ovim cmd: +Uobičajeni segmenti učitani ovim cmd-om: -- **`__PAGEZERO`:** Upravlja kernelom da **mapira** **adresu nula** tako da **ne može biti čitana, pisana ili izvršena**. Varijable maxprot i minprot u strukturi su postavljene na nulu da označe da nema **prava za čitanje-pisanje-izvršavanje na ovoj stranici**. -- Ova alokacija je važna za **ublažavanje ranjivosti dereferenciranja NULL pokazivača**. To je zato što XNU primenjuje strogu stranicu nula koja osigurava da je prva stranica (samo prva) memorije nedostupna (osim u i386). Binarni fajl može ispuniti ove zahteve kreiranjem male \_\_PAGEZERO (koristeći `-pagezero_size`) da pokrije prvih 4k i da ostatak 32-bitne memorije bude dostupan u korisničkom i kernel modu. -- **`__TEXT`**: Sadrži **izvršni** **kod** sa **pravima za čitanje** i **izvršavanje** (bez mogućnosti pisanja). Uobičajeni delovi ovog segmenta: +- **`__PAGEZERO`:** Naređuje kernelu da **mapira** **adresu nula** tako da ona **ne može biti čitana, pisana ili izvršavana**. The maxprot and minprot variables in the structure are set to zero to indicate there are **no read-write-execute rights on this page**. +- This allocation is important to **mitigate NULL pointer dereference vulnerabilities**. This is because XNU enforces a hard page zero that ensures the first page (only the first) of memory is innaccesible (except in i386). A binary could fulfil this requirements by crafting a small \_\_PAGEZERO (using the `-pagezero_size`) to cover the first 4k and having the rest of 32bit memory accessible in both user and kernel mode. +- **`__TEXT`**: Sadrži **izvršni** **kod** sa dozvolama za **čitanje** i **izvršavanje** (bez dozvole za pisanje)**.** Uobičajene sekcije ovog segmenta: - `__text`: Kompajlirani binarni kod - `__const`: Konstantni podaci (samo za čitanje) -- `__[c/u/os_log]string`: C, Unicode ili os log string konstante -- `__stubs` i `__stubs_helper`: Uključeni tokom procesa učitavanja dinamičke biblioteke -- `__unwind_info`: Podaci o vraćanju steka. -- Imajte na umu da je sav ovaj sadržaj potpisan, ali takođe označen kao izvršan (stvarajući više opcija za eksploataciju delova koji ne moraju nužno imati ovo pravo, poput delova posvećenih stringovima). -- **`__DATA`**: Sadrži podatke koji su **čitljivi** i **pisljivi** (bez izvršavanja). -- `__got:` Globalna tabela ofseta -- `__nl_symbol_ptr`: Nepasivan (vezan pri učitavanju) pokazivač simbola -- `__la_symbol_ptr`: Pasivan (vezan pri korišćenju) pokazivač simbola -- `__const`: Trebalo bi da budu podaci samo za čitanje (ne baš) +- `__[c/u/os_log]string`: C, Unicode ili os_log string konstante +- `__stubs` and `__stubs_helper`: Uključeni u proces učitavanja dinamičkih biblioteka +- `__unwind_info`: Podaci za povratak steka (unwind). +- Note that all this content is signed but also marked as executable (creating more options for exploitation of sections that doesn't necessarily need this privilege, like string dedicated sections). +- **`__DATA`**: Sadrži podatke koji su **čitljivi** i **pisivi** (bez izvršnih prava)**.** +- `__got:` Globalna tabela pomaka (GOT) +- `__nl_symbol_ptr`: Non-lazy (poveži pri učitavanju) pokazivač simbola +- `__la_symbol_ptr`: Lazy (poveži pri upotrebi) pokazivač simbola +- `__const`: Trebalo bi da bude samo-za-čitanje podatak (nije u potpunosti tako) - `__cfstring`: CoreFoundation stringovi - `__data`: Globalne promenljive (koje su inicijalizovane) -- `__bss`: Staticke promenljive (koje nisu inicijalizovane) -- `__objc_*` (\_\_objc_classlist, \_\_objc_protolist, itd): Informacije koje koristi Objective-C runtime -- **`__DATA_CONST`**: \_\_DATA.\_\_const nije garantovano da bude konstantno (prava za pisanje), niti su drugi pokazivači i GOT. Ovaj segment čini `__const`, neke inicijalizatore i GOT tabelu (jednom kada je rešena) **samo za čitanje** koristeći `mprotect`. -- **`__LINKEDIT`**: Sadrži informacije za linker (dyld) kao što su, simbol, string i unosi tabele relokacije. To je generički kontejner za sadržaje koji nisu ni u `__TEXT` ni u `__DATA`, a njegov sadržaj je opisan u drugim komandama učitavanja. -- dyld informacije: Rebase, Nepasivni/pasivni/slabi binding opkodi i informacije o izvozu -- Funkcije počinju: Tabela start adresa funkcija -- Podaci u kodu: Podaci ostrva u \_\_text -- Tabela simbola: Simboli u binarnom -- Indirektna tabela simbola: Pokazivači/stub simboli -- Tabela stringova -- Potpis koda -- **`__OBJC`**: Sadrži informacije koje koristi Objective-C runtime. Iako se ove informacije mogu naći i u \_\_DATA segmentu, unutar raznih \_\_objc\_\* sekcija. -- **`__RESTRICT`**: Segment bez sadržaja sa jednom sekcijom nazvanom **`__restrict`** (takođe prazna) koja osigurava da kada se izvršava binarni fajl, ignoriše DYLD promenljive okruženja. +- `__bss`: Statičke promenljive (koje nisu inicijalizovane) +- `__objc_*` (\_\_objc_classlist, \_\_objc_protolist, etc): Informacije koje koristi Objective-C runtime +- **`__DATA_CONST`**: \_\_DATA.\_\_const is not guaranteed to be constant (write permissions), nor are other pointers and the GOT. This section makes `__const`, some initializers and the GOT table (once resolved) **read only** using `mprotect`. +- **`__LINKEDIT`**: Sadrži informacije za linker (dyld) kao što su unosi u tabeli simbola, stringova i relokacija. To je generički kontejner za sadržaje koji nisu ni u `__TEXT` ili `__DATA` i njegov sadržaj je opisan u drugim load komandama. +- dyld information: Rebase, Non-lazy/lazy/weak binding opcodes and export info +- Functions starts: Tabela početnih adresa funkcija +- Data In Code: Data islands in \_\_text +- SYmbol Table: Simboli u binarnom fajlu +- Indirect Symbol Table: Pokazivački / stub simboli +- String Table +- Code Signature +- **`__OBJC`**: Sadrži informacije koje koristi Objective-C runtime. Ipak, ove informacije se takođe mogu naći u segmentu \_\_DATA, unutar različitih \_\_objc\_\* sekcija. +- **`__RESTRICT`**: Segment bez sadržaja sa jednom sekcijom zvanom **`__restrict`** (takođe praznom) koji osigurava da će pri pokretanju binarnog fajla ignorisati DYLD promenljive okruženja. -Kao što je bilo moguće videti u kodu, **segmenti takođe podržavaju zastavice** (iako se ne koriste često): +As it was possible to see in the code, **segments also support flags** (although they aren't used very much): -- `SG_HIGHVM`: Samo core (nije korišćeno) -- `SG_FVMLIB`: Nije korišćeno -- `SG_NORELOC`: Segment nema relokaciju -- `SG_PROTECTED_VERSION_1`: Enkripcija. Koristi se na primer od strane Findera za enkripciju teksta `__TEXT` segmenta. +- `SG_HIGHVM`: Core only (not used) +- `SG_FVMLIB`: Not used +- `SG_NORELOC`: Segment has no relocation +- `SG_PROTECTED_VERSION_1`: Encryption. Used for example by Finder to encrypt text `__TEXT` segment. ### **`LC_UNIXTHREAD/LC_MAIN`** -**`LC_MAIN`** sadrži ulaznu tačku u **atributu entryoff.** Pri učitavanju, **dyld** jednostavno **dodaje** ovu vrednost na (u memoriji) **bazu binarnog fajla**, a zatim **skače** na ovu instrukciju da započne izvršavanje koda binarnog fajla. +**`LC_MAIN`** sadrži ulaznu tačku u atributu **entryoff.** Pri učitavanju, **dyld** jednostavno **dodaje** ovu vrednost na (u-memoriji) **baznu adresu binarnog fajla**, pa zatim **skače** na tu instrukciju da započne izvršavanje koda binarnog fajla. -**`LC_UNIXTHREAD`** sadrži vrednosti koje registri moraju imati prilikom pokretanja glavne niti. Ovo je već zastarelo, ali **`dyld`** ga i dalje koristi. Moguće je videti vrednosti registara postavljene ovim: +**`LC_UNIXTHREAD`** sadrži vrednosti koje registri moraju imati pri pokretanju glavne niti. Ovo je već zastarelo, ali **`dyld`** ga i dalje koristi. Vrednosti registara postavljene ovim možete videti pomoću: ```bash otool -l /usr/lib/dyld [...] @@ -286,34 +286,39 @@ cpsr 0x00000000 ``` ### **`LC_CODE_SIGNATURE`** -Sadrži informacije o **digitalnom potpisu Macho-O datoteke**. Sadrži samo **offset** koji **pokazuje** na **blob potpisa**. Ovo je obično na samom kraju datoteke.\ -Međutim, možete pronaći neke informacije o ovoj sekciji u [**ovom blog postu**](https://davedelong.com/blog/2018/01/10/reading-your-own-entitlements/) i u ovom [**gistu**](https://gist.github.com/carlospolop/ef26f8eb9fafd4bc22e69e1a32b81da4). +{{#ref}} +../../../generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/mach-o-entitlements-and-ipsw-indexing.md +{{#endref}} + + +Sadrži informacije o **code signature of the Macho-O file**. Sadrži samo **offset** koji **pokazuje** na **signature blob**. Ovo se obično nalazi na samom kraju fajla.\ +Međutim, možete naći neke informacije o ovom odeljku u [**this blog post**](https://davedelong.com/blog/2018/01/10/reading-your-own-entitlements/) i ovom [**gists**](https://gist.github.com/carlospolop/ef26f8eb9fafd4bc22e69e1a32b81da4). ### **`LC_ENCRYPTION_INFO[_64]`** -Podrška za enkripciju binarnih datoteka. Međutim, naravno, ako napadač uspe da kompromituje proces, moći će da isprazni memoriju neenkriptovanu. +Podrška za enkapsulaciju binarnog fajla (binary encryption). Ipak, naravno, ako napadač uspe da kompromituje proces, biće u mogućnosti da dump-uje memoriju nekriptovanu. ### **`LC_LOAD_DYLINKER`** -Sadrži **putanju do izvršne datoteke dinamičkog linkera** koja mapira deljene biblioteke u adresni prostor procesa. **Vrednost je uvek postavljena na `/usr/lib/dyld`**. Važno je napomenuti da se u macOS-u, dylib mapiranje dešava u **korisničkom režimu**, a ne u režimu jezgra. +Sadrži **putanju do dynamic linker executable** koji mapira shared libraries u adresni prostor procesa. Vrednost je uvek postavljena na `/usr/lib/dyld`. Važno je napomenuti da na macOS-u, dylib mapping događa u user mode, a ne u kernel mode. ### **`LC_IDENT`** -Zastarjela, ali kada je konfigurisana da generiše dump-ove na paniku, Mach-O core dump se kreira i verzija jezgra se postavlja u `LC_IDENT` komandi. +Zastarelo, ali kada je konfigurisano da generiše dump-ove na panic, kreira se Mach-O core dump i verzija kernela se postavlja u `LC_IDENT` komandu. ### **`LC_UUID`** -Nasumični UUID. Koristan je za bilo šta direktno, ali XNU ga kešira sa ostatkom informacija o procesu. Može se koristiti u izveštajima o padu. +Nasumični UUID. Sam po sebi nije direktno koristan za mnogo toga, ali XNU ga kešira zajedno sa ostatkom informacija o procesu. Može se koristiti u crash reports. ### **`LC_DYLD_ENVIRONMENT`** -Omogućava da se navedu promenljive okruženja za dyld pre nego što se proces izvrši. Ovo može biti veoma opasno jer može omogućiti izvršavanje proizvoljnog koda unutar procesa, tako da se ova komanda učitavanja koristi samo u dyld build-u sa `#define SUPPORT_LC_DYLD_ENVIRONMENT` i dodatno ograničava obradu samo na promenljive oblika `DYLD_..._PATH` koje specificiraju putanje učitavanja. +Omogućava navođenje environment variables za dyld pre nego što se proces izvrši. Ovo može biti vrlo opasno jer može omogućiti izvršavanje proizvoljnog koda unutar procesa, pa se ovaj load command koristi samo u dyld build sa `#define SUPPORT_LC_DYLD_ENVIRONMENT` i dodatno ograničava obradu samo na varijable oblika `DYLD_..._PATH` koje specifikuju load paths. ### **`LC_LOAD_DYLIB`** -Ova komanda učitavanja opisuje **dinamičku** **biblioteku** zavisnost koja **naredjuje** **učitaču** (dyld) da **učita i poveže navedenu biblioteku**. Postoji `LC_LOAD_DYLIB` komanda učitavanja **za svaku biblioteku** koja je potrebna Mach-O binarnoj datoteci. +Ovaj load command opisuje zavisnost od **dynamic** **library** koja **instructs** the **loader** (dyld) da **load and link said library**. Postoji po jedan `LC_LOAD_DYLIB` load command **za svaku biblioteku** koju Mach-O binarni fajl zahteva. -- Ova komanda učitavanja je struktura tipa **`dylib_command`** (koja sadrži strukturu dylib, opisujući stvarnu zavisnu dinamičku biblioteku): +- Ovaj load command je struktura tipa **`dylib_command`** (koja sadrži struct dylib, opisuje stvarnu dependent dynamic library): ```objectivec struct dylib_command { uint32_t cmd; /* LC_LOAD_{,WEAK_}DYLIB */ @@ -330,7 +335,7 @@ uint32_t compatibility_version; /* library's compatibility vers number*/ ``` ![](<../../../images/image (486).png>) -Takođe možete dobiti ove informacije iz cli-a sa: +Možete takođe dobiti ove informacije iz cli pomoću: ```bash otool -L /bin/ls /bin/ls: @@ -338,40 +343,40 @@ otool -L /bin/ls /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1319.0.0) ``` -Neke potencijalne biblioteke povezane sa malverom su: +Some potential malware related libraries are: -- **DiskArbitration**: Praćenje USB drajvova +- **DiskArbitration**: Praćenje USB diskova - **AVFoundation:** Snimanje zvuka i videa -- **CoreWLAN**: Wifi skeniranja. - -> [!NOTE] -> Mach-O binarni fajl može sadržati jednog ili **više** **konstruktora**, koji će biti **izvršeni** **pre** adrese navedene u **LC_MAIN**.\ -> Offseti svih konstruktora se čuvaju u **\_\_mod_init_func** sekciji **\_\_DATA_CONST** segmenta. - -## **Mach-O Podaci** - -U srži fajla se nalazi region podataka, koji se sastoji od nekoliko segmenata kako je definisano u regionu komandi za učitavanje. **Različite sekcije podataka mogu biti smeštene unutar svakog segmenta**, pri čemu svaka sekcija **sadrži kod ili podatke** specifične za tip. +- **CoreWLAN**: Skeniranje Wifi mreža. > [!TIP] -> Podaci su u suštini deo koji sadrži sve **informacije** koje se učitavaju komandom za učitavanje **LC_SEGMENTS_64** +> A Mach-O binary can contain one or **more** **constructors**, that will be **executed** **before** the address specified in **LC_MAIN**.\ +> The offsets of any constructors are held in the **\_\_mod_init_func** section of the **\_\_DATA_CONST** segment. + +## **Mach-O Data** + +U srcu fajla nalazi se data region, koji se sastoji od više segmenata definisanih u delu load-commands. **U okviru svakog segmenta može biti smešten različit skup data sekcija**, pri čemu svaka sekcija **sadrži kod ili podatke** specifične za taj tip. + +> [!TIP] +> The data is basically the part containing all the **information** that is loaded by the load commands **LC_SEGMENTS_64** ![https://www.oreilly.com/api/v2/epubs/9781785883378/files/graphics/B05055_02_38.jpg](<../../../images/image (507) (3).png>) -To uključuje: +This includes: -- **Tabela funkcija:** Koja sadrži informacije o funkcijama programa. -- **Tabela simbola**: Koja sadrži informacije o spoljnim funkcijama koje koristi binarni fajl -- Takođe može sadržati interne funkcije, imena varijabli i još mnogo toga. +- **Function table:** Koji sadrži informacije o funkcijama programa. +- **Symbol table**: Koji sadrži informacije o eksternim funkcijama koje koristi binary +- Može takođe sadržati interne funkcije, nazive promenljivih i još mnogo toga. -Da biste to proverili, možete koristiti [**Mach-O View**](https://sourceforge.net/projects/machoview/) alat: +To check it you could use the [**Mach-O View**](https://sourceforge.net/projects/machoview/) tool:
-Ili iz cli: +Or from the cli: ```bash size -m /bin/ls ``` -## Objetive-C Zajedničke Sekcije +## Objetive-C Uobičajene sekcije U `__TEXT` segmentu (r-x): @@ -383,8 +388,8 @@ U `__DATA` segmentu (rw-): - `__objc_classlist`: Pokazivači na sve Objetive-C klase - `__objc_nlclslist`: Pokazivači na Non-Lazy Objective-C klase -- `__objc_catlist`: Pokazivač na Kategorije -- `__objc_nlcatlist`: Pokazivač na Non-Lazy Kategorije +- `__objc_catlist`: Pokazivač na Categories +- `__objc_nlcatlist`: Pokazivač na Non-Lazy Categories - `__objc_protolist`: Lista protokola - `__objc_const`: Konstantni podaci - `__objc_imageinfo`, `__objc_selrefs`, `objc__protorefs`... diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-code-signing.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-code-signing.md index 69db4fcf4..21fe1971a 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-code-signing.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-code-signing.md @@ -1,15 +1,20 @@ -# macOS Potpisivanje Koda +# macOS Potpisivanje koda {{#include ../../../banners/hacktricks-training.md}} -## Osnovne Informacije +## Osnovne informacije -Mach-o binarni fajlovi sadrže komandu za učitavanje pod nazivom **`LC_CODE_SIGNATURE`** koja označava **offset** i **veličinu** potpisa unutar binarnog fajla. U stvari, koristeći GUI alat MachOView, moguće je pronaći na kraju binarnog fajla sekciju pod nazivom **Code Signature** sa ovom informacijom: +{{#ref}} +../../../generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/mach-o-entitlements-and-ipsw-indexing.md +{{#endref}} + + +Mach-o binarni fajlovi sadrže load command nazvan **`LC_CODE_SIGNATURE`** koji označava **offset** i **size** potpisa unutar binarnog fajla. Zapravo, koristeći GUI alat MachOView, moguće je pronaći na kraju binarnog fajla sekciju nazvanu **Code Signature** sa ovim informacijama:
-Magični zaglavlje Potpisa Koda je **`0xFADE0CC0`**. Zatim imate informacije kao što su dužina i broj blobova superBlob-a koji ih sadrže.\ -Moguće je pronaći ove informacije u [izvoru ovde](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs_blobs.h#L276): +Magijski header Code Signature-a je **`0xFADE0CC0`**. Zatim sadrži informacije kao što su length i broj blobs superBlob-a koji ih sadrži.\ +It's possible to find this information in the [source code here](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs_blobs.h#L276): ```c /* * Structure of an embedded-signature SuperBlob @@ -39,9 +44,9 @@ char data[]; __attribute__ ((aligned(1))); ``` Uobičajeni blobovi koji se nalaze su Code Directory, Requirements i Entitlements i Cryptographic Message Syntax (CMS).\ -Pored toga, obratite pažnju na to kako su podaci kodirani u blobovima kodirani u **Big Endian.** +Obratite pažnju da su podaci u blobovima enkodirani u **Big Endian.** -Pored toga, potpisi se mogu odvojiti od binarnih datoteka i čuvati u `/var/db/DetachedSignatures` (koristi se u iOS-u). +Takođe, potpisi mogu biti odvojeni od binarnih fajlova i smešteni u `/var/db/DetachedSignatures` (koristi se na iOS). ## Code Directory Blob @@ -101,12 +106,12 @@ char end_withLinkage[0]; } CS_CodeDirectory __attribute__ ((aligned(1))); ``` -Napomena da postoje različite verzije ove strukture gde starije verzije mogu sadržati manje informacija. +Imajte na umu da postoje različite verzije ovog struct-a, pri čemu starije mogu sadržati manje informacija. -## Stranice za potpisivanje koda +## Potpisivanje stranica koda -Hashovanje celog binarnog fajla bi bilo neefikasno i čak beskorisno ako je učitan samo delimično u memoriji. Stoga, potpis koda je zapravo hash hash-eva gde je svaka binarna stranica hash-ovana pojedinačno.\ -U stvari, u prethodnom **Code Directory** kodu možete videti da je **veličina stranice specificirana** u jednom od njegovih polja. Štaviše, ako veličina binarnog fajla nije višekratnik veličine stranice, polje **CodeLimit** specificira gde je kraj potpisa. +Heširanje celokupnog binarnog fajla bilo bi neefikasno, pa čak i besmisleno ako se u memoriji učitava samo delimično. Zbog toga je potpis koda zapravo heš heševa gde se svaka binarna stranica hešira pojedinačno.\ +U stvari, u prethodnom **Code Directory** kodu možete videti da je **page size is specified** u jednom od njegovih polja. Štaviše, ako veličina binarnog fajla nije višekratnik veličine stranice, polje **CodeLimit** određuje gde je kraj potpisa. ```bash # Get all hashes of /bin/ps codesign -d -vvvvvv /bin/ps @@ -144,25 +149,25 @@ openssl sha256 /tmp/*.page.* ``` ## Entitlements Blob -Napomena da aplikacije mogu sadržati **entitlement blob** gde su svi entitlements definisani. Štaviše, neki iOS binarni fajlovi mogu imati svoje entitlements specifične u posebnom slotu -7 (umesto u -5 entitlements posebnom slotu). +Napomena: aplikacije takođe mogu sadržati **entitlement blob** gde su definisana sva entitlements. Pored toga, neki iOS binarni fajlovi mogu imati entitlements u specijalnom slotu -7 (umesto u -5 entitlements special slot). ## Special Slots -MacOS aplikacije nemaju sve što im je potrebno za izvršavanje unutar binarnog fajla, već koriste i **spoljne resurse** (obično unutar **bundle** aplikacija). Stoga, postoje neki slotovi unutar binarnog fajla koji će sadržati hashove nekih interesantnih spoljašnjih resursa kako bi se proverilo da nisu modifikovani. +MacOS applications nemaju sve što im je potrebno za izvršavanje unutar samog binarnog fajla, već koriste i **external resources** (obično unutar aplikacionog **bundle**). Zbog toga postoje specijalni slotovi unutar binarnog fajla koji sadrže hešove nekih važnih eksternih resursa kako bi se proverilo da li su izmenjeni. -U stvari, moguće je videti u Code Directory strukturama parametar nazvan **`nSpecialSlots`** koji označava broj posebnih slotova. Ne postoji poseban slot 0, a najčešći (od -1 do -6) su: +U Code Directory strukturama postoji parametar **`nSpecialSlots`** koji označava broj specijalnih slotova. Ne postoji specijalni slot 0, a najčešći su (od -1 do -6): -- Hash `info.plist` (ili onaj unutar `__TEXT.__info__plist`). -- Hash Zahteva -- Hash Resursnog Direktorijuma (hash fajla `_CodeSignature/CodeResources` unutar bundle-a). -- Specifično za aplikaciju (neiskorišćeno) -- Hash entitlements -- DMG kodne potpise samo +- Hash of `info.plist` (or the one inside `__TEXT.__info__plist`). +- Hash of the Requirements +- Hash of the Resource Directory (hash of `_CodeSignature/CodeResources` file inside the bundle). +- Application specific (unused) +- Hash of the entitlements +- DMG code signatures only - DER Entitlements ## Code Signing Flags -Svaki proces ima povezan bitmask poznat kao `status` koji pokreće kernel, a neki od njih mogu biti prepisani **kodnom potpisom**. Ove zastavice koje se mogu uključiti u kodnu potpisivanje su [definisane u kodu](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs_blobs.h#L36): +Svaki proces ima pridružen bitmasku poznatu kao `status` koju postavlja kernel, a neki od tih bitova mogu biti prepisani od strane **code signature**. Ovi flagovi koji se mogu uključiti u code signing su [definisani u kodu](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs_blobs.h#L36): ```c /* code signing attributes of a process */ #define CS_VALID 0x00000001 /* dynamically valid */ @@ -207,13 +212,13 @@ CS_RESTRICT | CS_ENFORCEMENT | CS_REQUIRE_LV | CS_RUNTIME | CS_LINKER_SIGNED) #define CS_ENTITLEMENT_FLAGS (CS_GET_TASK_ALLOW | CS_INSTALLER | CS_DATAVAULT_CONTROLLER | CS_NVRAM_UNRESTRICTED) ``` -Napomena da funkcija [**exec_mach_imgact**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_exec.c#L1420) takođe može dinamički dodati `CS_EXEC_*` zastavice prilikom pokretanja izvršenja. +Note that the function [**exec_mach_imgact**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_exec.c#L1420) can also add the `CS_EXEC_*` flags dynamically when starting the execution. -## Zahtevi za potpisivanje koda +## Zahtevi potpisa koda -Svaka aplikacija čuva neke **zahteve** koje mora **ispuniti** da bi mogla da se izvrši. Ako **aplikacija sadrži zahteve koji nisu ispunjeni**, neće biti izvršena (jer je verovatno izmenjena). +Svaka aplikacija čuva neke **zahteve** koje mora **ispuniti** da bi mogla da se izvrši. Ako zahtevi koje aplikacija sadrži nisu ispunjeni, ona se neće izvršiti (verovatno je izmenjena). -Zahtevi binarnog fajla koriste **posebnu gramatiku** koja je niz **izraza** i kodirani su kao blobovi koristeći `0xfade0c00` kao magični broj čiji je **hash sačuvan u posebnom kodnom slotu**. +Zahtevi binarnog fajla koriste **posebnu gramatiku** koja je niz **izraza** i enkodirani su kao blobovi koristeći `0xfade0c00` kao magic, čiji se **hash čuva u posebnom code slot-u**. Zahtevi binarnog fajla mogu se videti pokretanjem: ```bash @@ -225,8 +230,8 @@ codesign -d -r- /Applications/Signal.app/ Executable=/Applications/Signal.app/Contents/MacOS/Signal designated => identifier "org.whispersystems.signal-desktop" and 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.13] /* exists */ and certificate leaf[subject.OU] = U68MSDN6DR ``` -> [!NOTE] -> Obratite pažnju na to kako ove potpise mogu proveriti stvari kao što su informacije o sertifikaciji, TeamID, ID-ovi, prava i mnoge druge podatke. +> [!TIP] +> Obratite pažnju kako ovi potpisi mogu proveriti stvari kao što su informacije o sertifikatu, TeamID, IDs, entitlements i mnogo drugih podataka. Pored toga, moguće je generisati neke kompajlirane zahteve koristeći alat `csreq`: ```bash @@ -240,57 +245,57 @@ od -A x -t x1 /tmp/output.csreq 0000020 00 00 00 21 6f 72 67 2e 77 68 69 73 70 65 72 73 [...] ``` -Moguće je pristupiti ovim informacijama i kreirati ili modifikovati zahteve pomoću nekih API-ja iz `Security.framework` kao što su: +Moguće je pristupiti ovim informacijama i kreirati ili izmeniti zahteve pomoću nekih API-ja iz `Security.framework`, kao što su: -#### **Proveravanje Validnosti** +#### **Provera validnosti** -- **`Sec[Static]CodeCheckValidity`**: Proverava validnost SecCodeRef po zahtevu. -- **`SecRequirementEvaluate`**: Validira zahtev u kontekstu sertifikata. -- **`SecTaskValidateForRequirement`**: Validira pokrenuti SecTask protiv `CFString` zahteva. +- **`Sec[Static]CodeCheckValidity`**: Proverava validnost `SecCodeRef` u odnosu na Requirement. +- **`SecRequirementEvaluate`**: Validira requirement u kontekstu sertifikata. +- **`SecTaskValidateForRequirement`**: Validira pokrenuti `SecTask` u odnosu na `CFString` requirement. -#### **Kreiranje i Upravljanje Kodnim Zahtevima** +#### **Kreiranje i upravljanje zahtevima koda** - **`SecRequirementCreateWithData`:** Kreira `SecRequirementRef` iz binarnih podataka koji predstavljaju zahtev. - **`SecRequirementCreateWithString`:** Kreira `SecRequirementRef` iz string izraza zahteva. -- **`SecRequirementCopy[Data/String]`**: Preuzima binarnu reprezentaciju podataka `SecRequirementRef`. -- **`SecRequirementCreateGroup`**: Kreira zahtev za članstvo u grupi aplikacija. +- **`SecRequirementCopy[Data/String]`**: Vraća binarne podatke `SecRequirementRef`. +- **`SecRequirementCreateGroup`**: Kreira zahtev za članstvo u app-group. -#### **Pristupanje Informacijama o Potpisivanju Koda** +#### **Pristup informacijama o potpisivanju koda** -- **`SecStaticCodeCreateWithPath`**: Inicijalizuje `SecStaticCodeRef` objekat iz putanje u fajl sistemu za inspekciju potpisa koda. +- **`SecStaticCodeCreateWithPath`**: Inicijalizuje `SecStaticCodeRef` objekat iz putanje u fajl-sistemu radi inspekcije potpisa koda. - **`SecCodeCopySigningInformation`**: Dobija informacije o potpisivanju iz `SecCodeRef` ili `SecStaticCodeRef`. -#### **Modifikovanje Kodnih Zahteva** +#### **Izmena zahteva koda** - **`SecCodeSignerCreate`**: Kreira `SecCodeSignerRef` objekat za izvođenje operacija potpisivanja koda. -- **`SecCodeSignerSetRequirement`**: Postavlja novi zahtev za potpisnika koda koji će se primeniti tokom potpisivanja. -- **`SecCodeSignerAddSignature`**: Dodaje potpis kodu koji se potpisuje sa specificiranim potpisnikom. +- **`SecCodeSignerSetRequirement`**: Postavlja novi zahtev koji će potpisivač koda primeniti tokom potpisivanja. +- **`SecCodeSignerAddSignature`**: Dodaje potpis kodu koji se potpisuje koristeći navedeni potpisivač. -#### **Validacija Koda sa Zahtevima** +#### **Validacija koda prema zahtevima** -- **`SecStaticCodeCheckValidity`**: Validira statički kod objekat protiv specificiranih zahteva. +- **`SecStaticCodeCheckValidity`**: Validira statički objekat koda prema specificiranim zahtevima. -#### **Dodatni Korisni API-ji** +#### **Dodatni korisni API-ji** -- **`SecCodeCopy[Internal/Designated]Requirement`: Dobija SecRequirementRef iz SecCodeRef** -- **`SecCodeCopyGuestWithAttributes`**: Kreira `SecCodeRef` koji predstavlja kod objekat na osnovu specifičnih atributa, korisno za sandboxing. -- **`SecCodeCopyPath`**: Preuzima putanju u fajl sistemu povezanu sa `SecCodeRef`. -- **`SecCodeCopySigningIdentifier`**: Dobija identifikator potpisivanja (npr. Team ID) iz `SecCodeRef`. -- **`SecCodeGetTypeID`**: Vraća identifikator tipa za `SecCodeRef` objekte. +- **`SecCodeCopy[Internal/Designated]Requirement`: Get SecRequirementRef from SecCodeRef** +- **`SecCodeCopyGuestWithAttributes`**: Kreira `SecCodeRef` koji predstavlja objekat koda baziran na određenim atributima, koristan za sandboxing. +- **`SecCodeCopyPath`**: Vraća putanju u fajl-sistemu povezanu sa `SecCodeRef`. +- **`SecCodeCopySigningIdentifier`**: Dobija signing identifier (npr. Team ID) iz `SecCodeRef`. +- **`SecCodeGetTypeID`**: Vraća tip identifikator za `SecCodeRef` objekte. - **`SecRequirementGetTypeID`**: Dobija CFTypeID za `SecRequirementRef`. -#### **Zastavice i Konstantne Vrednosti za Potpisivanje Koda** +#### **Zastavice i konstante za potpisivanje koda** -- **`kSecCSDefaultFlags`**: Podrazumevane zastavice korišćene u mnogim funkcijama Security.framework za operacije potpisivanja koda. -- **`kSecCSSigningInformation`**: Zastavica koja se koristi za specificiranje da treba preuzeti informacije o potpisivanju. +- **`kSecCSDefaultFlags`**: Podrazumevane zastavice korišćene u mnogim funkcijama iz Security.framework za operacije potpisivanja koda. +- **`kSecCSSigningInformation`**: Zastavica koja označava da treba dohvatiti informacije o potpisivanju. -## Sprovođenje Potpisa Koda +## Sprovodjenje provere potpisa koda -**Kernel** je taj koji **proverava potpis koda** pre nego što dozvoli izvršavanje koda aplikacije. Štaviše, jedan od načina da se omogući pisanje i izvršavanje novog koda u memoriji je zloupotreba JIT ako je `mprotect` pozvan sa `MAP_JIT` zastavicom. Imajte na umu da aplikacija treba posebnu dozvolu da bi mogla to da uradi. +Jezgro (kernel) je odgovorno za proveru potpisa koda pre nego što dozvoli izvršenje koda aplikacije. Pored toga, jedan način da se može upisivati i izvršavati novi kod u memoriji je zloupotreba JIT-a ako se `mprotect` pozove sa `MAP_JIT` zastavicom. Napomena: aplikaciji je potreban poseban entitlement da bi ovo mogla da uradi. ## `cs_blobs` & `cs_blob` -[**cs_blob**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ubc_internal.h#L106) struktura sadrži informacije o dozvoli pokrenutog procesa na njemu. `csb_platform_binary` takođe obaveštava da li je aplikacija platforma binarni (što OS proverava u različitim momentima da bi primenio bezbednosne mehanizme kao što je zaštita SEND prava na portovima zadataka ovih procesa). +[**cs_blob**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ubc_internal.h#L106) struct sadrži informacije o entitlement-u pokrenutog procesa na njemu. `csb_platform_binary` takođe informiše da li je aplikacija platform binary (što se proverava u različitim trenucima od strane OS-a kako bi se primenile bezbednosne mere, npr. zaštita SEND prava na task portovima ovih procesa). ```c struct cs_blob { struct cs_blob *csb_next;