mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/macos-hardening/macos-security-and-privilege-escalation
This commit is contained in:
parent
e5db817a3e
commit
636bc6ea19
@ -9,47 +9,47 @@
|
||||
|
||||
## 1. Thread Hijacking
|
||||
|
||||
Başlangıçta, **`task_threads()`** fonksiyonu, uzaktaki görevden bir iş parçacığı listesi almak için görev portunda çağrılır. Ele geçirilmek üzere bir iş parçacığı seçilir. Bu yaklaşım, yeni önlemlerin `thread_create_running()`'i engellemesi nedeniyle yeni bir uzaktan iş parçacığı oluşturmanın yasak olduğu geleneksel kod enjeksiyon yöntemlerinden sapmaktadır.
|
||||
Başlangıçta, `task_threads()` fonksiyonu, uzaktaki görevden bir iş parçacığı listesi almak için görev portu üzerinde çağrılır. Bir iş parçacığı ele geçirilmek üzere seçilir. Bu yaklaşım, `thread_create_running()`'i engelleyen önlemler nedeniyle yeni bir uzaktan iş parçacığı oluşturmanın yasak olduğu geleneksel kod enjekte etme yöntemlerinden sapmaktadır.
|
||||
|
||||
İş parçacığını kontrol etmek için, **`thread_suspend()`** çağrılır ve yürütmesi durdurulur.
|
||||
İş parçacığını kontrol etmek için, `thread_suspend()` çağrılır ve yürütmesi durdurulur.
|
||||
|
||||
Uzaktaki iş parçacığında yalnızca **durdurma** ve **başlatma**, **kayıt değerlerini alma** ve **değiştirme** işlemlerine izin verilir. Uzaktan fonksiyon çağrıları, `x0` ile `x7` kayıtlarını **argümanlar** ile ayarlayarak, **`pc`**'yi hedeflenen fonksiyona yapılandırarak ve iş parçacığını etkinleştirerek başlatılır. İş parçacığının dönüşten sonra çökmediğinden emin olmak, dönüşün tespit edilmesini gerektirir.
|
||||
Uzaktaki iş parçacığı üzerinde yalnızca **durdurma** ve **başlatma** ile **kayıt değerlerini alma/değiştirme** işlemlerine izin verilir. Uzaktan fonksiyon çağrıları, `x0` ile `x7` kayıtlarını **argümanlar** ile ayarlayarak, `pc`'yi hedeflenen fonksiyona yapılandırarak ve iş parçacığını yeniden başlatarak başlatılır. İş parçacığının dönüşten sonra çökmediğinden emin olmak, dönüşün tespit edilmesini gerektirir.
|
||||
|
||||
Bir strateji, uzaktaki iş parçacığı için `thread_set_exception_ports()` kullanarak **bir istisna işleyicisi kaydetmektir**, `lr` kaydını fonksiyon çağrısından önce geçersiz bir adrese ayarlamaktır. Bu, fonksiyon yürütüldükten sonra bir istisna tetikler, istisna portuna bir mesaj gönderir ve dönüş değerini kurtarmak için iş parçacığının durumunu incelemeyi sağlar. Alternatif olarak, Ian Beer’in triple_fetch istismarından benimsenen bir yöntemle, `lr` sonsuz döngüye ayarlanır. İş parçacığının kayıtları, **`pc` o talimata işaret edene kadar** sürekli izlenir.
|
||||
Bir strateji, uzaktaki iş parçacığı için `thread_set_exception_ports()` kullanarak bir **istisna işleyici** kaydetmektir; bu işlem, fonksiyon çağrısından önce `lr` kaydını geçersiz bir adrese ayarlamayı içerir. Bu, fonksiyon yürütüldükten sonra bir istisna tetikler ve istisna portuna bir mesaj gönderir, böylece iş parçacığının durumunu inceleyerek dönüş değerini kurtarmaya olanak tanır. Alternatif olarak, Ian Beer’in *triple_fetch* istismarından alınan bir yöntemle, `lr` sonsuz döngüye ayarlanır; iş parçacığının kayıtları, `pc` o talimata işaret edene kadar sürekli izlenir.
|
||||
|
||||
## 2. Mach ports for communication
|
||||
|
||||
Sonraki aşama, uzaktaki iş parçacığı ile iletişimi kolaylaştırmak için Mach portları kurmaktır. Bu portlar, görevler arasında keyfi gönderme ve alma haklarının aktarımında önemli bir rol oynar.
|
||||
Sonraki aşama, uzaktaki iş parçacığı ile iletişimi kolaylaştırmak için Mach portları kurmaktır. Bu portlar, görevler arasında keyfi gönderme/alma haklarının aktarımında önemlidir.
|
||||
|
||||
İki yönlü iletişim için, bir yerel ve diğeri uzaktaki görevde olmak üzere iki Mach alma hakkı oluşturulur. Ardından, her port için bir gönderme hakkı karşıt göreve aktarılır ve mesaj alışverişine olanak tanır.
|
||||
|
||||
Yerel port üzerinde odaklanıldığında, alma hakkı yerel görev tarafından tutulur. Port, `mach_port_allocate()` ile oluşturulur. Bu port için bir gönderme hakkını uzaktaki göreve aktarmak zorluk teşkil eder.
|
||||
|
||||
Bir strateji, `thread_set_special_port()` kullanarak yerel port için bir gönderme hakkını uzaktaki iş parçacığının `THREAD_KERNEL_PORT`'una yerleştirmektir. Ardından, uzaktaki iş parçacığına `mach_thread_self()` çağrısı yapması talimatı verilir, böylece gönderme hakkını alır.
|
||||
Bir strateji, `thread_set_special_port()` kullanarak yerel port için bir gönderme hakkını uzaktaki iş parçacığının `THREAD_KERNEL_PORT`'una yerleştirmeyi içerir. Ardından, uzaktaki iş parçacığına `mach_thread_self()` çağrısı yapması talimatı verilir, böylece gönderme hakkı alınır.
|
||||
|
||||
Uzaktaki port için süreç esasen tersine çevrilir. Uzaktaki iş parçacığı, `mach_reply_port()` aracılığıyla bir Mach portu oluşturması için yönlendirilir (çünkü `mach_port_allocate()` dönüş mekanizması nedeniyle uygun değildir). Port oluşturulduktan sonra, uzaktaki iş parçacığında bir gönderme hakkı oluşturmak için `mach_port_insert_right()` çağrılır. Bu hak daha sonra `thread_set_special_port()` kullanılarak çekirdekte saklanır. Yerel görevde, uzaktaki iş parçacığı üzerinde `thread_get_special_port()` kullanılarak uzaktaki görevde yeni tahsis edilen Mach portuna bir gönderme hakkı edinilir.
|
||||
Uzaktaki port için süreç esasen tersine çevrilir. Uzaktaki iş parçacığı, `mach_reply_port()` aracılığıyla bir Mach portu oluşturması için yönlendirilir (çünkü `mach_port_allocate()` dönüş mekanizması nedeniyle uygun değildir). Port oluşturulduktan sonra, uzaktaki iş parçacığında bir gönderme hakkı oluşturmak için `mach_port_insert_right()` çağrılır. Bu hak daha sonra `thread_set_special_port()` kullanılarak çekirdekte saklanır. Yerel görevde, uzaktaki iş parçacığı üzerinde `thread_get_special_port()` kullanılarak uzaktaki görevde yeni tahsis edilen Mach portuna bir gönderme hakkı alınır.
|
||||
|
||||
Bu adımların tamamlanması, Mach portlarının kurulmasını sağlar ve iki yönlü iletişim için zemin hazırlar.
|
||||
|
||||
## 3. Basic Memory Read/Write Primitives
|
||||
|
||||
Bu bölümde, temel bellek okuma ve yazma ilkelini oluşturmak için yürütme ilkesinin kullanılması üzerine odaklanılmaktadır. Bu ilk adımlar, uzaktaki süreç üzerinde daha fazla kontrol elde etmek için kritik öneme sahiptir, ancak bu aşamadaki ilkelere pek çok amaç için hizmet etmeyeceklerdir. Yakında, daha gelişmiş versiyonlara yükseltileceklerdir.
|
||||
Bu bölümde, temel bellek okuma/yazma ilkelilerini oluşturmak için yürütme ilkesinin kullanılması üzerine odaklanılmaktadır. Bu ilk adımlar, uzaktaki süreç üzerinde daha fazla kontrol elde etmek için kritik öneme sahiptir, ancak bu aşamadaki ilkeliler pek çok amaca hizmet etmeyecektir. Kısa süre içinde daha gelişmiş versiyonlara yükseltilecektir.
|
||||
|
||||
### Memory Reading and Writing Using Execute Primitive
|
||||
### Memory reading and writing using the execute primitive
|
||||
|
||||
Amaç, belirli fonksiyonlar kullanarak bellek okuma ve yazma gerçekleştirmektir. Bellek okumak için, aşağıdaki yapıya benzeyen fonksiyonlar kullanılır:
|
||||
Amaç, belirli fonksiyonlar kullanarak bellek okuma ve yazma gerçekleştirmektir. **Bellek okuma** için:
|
||||
```c
|
||||
uint64_t read_func(uint64_t *address) {
|
||||
return *address;
|
||||
}
|
||||
```
|
||||
Ve belleğe yazmak için, bu yapıya benzer fonksiyonlar kullanılır:
|
||||
**bellek yazma**:
|
||||
```c
|
||||
void write_func(uint64_t *address, uint64_t value) {
|
||||
*address = value;
|
||||
}
|
||||
```
|
||||
Bu fonksiyonlar verilen assembly talimatlarına karşılık gelir:
|
||||
Bu fonksiyonlar aşağıdaki assembly'e karşılık gelir:
|
||||
```
|
||||
_read_func:
|
||||
ldr x0, [x0]
|
||||
@ -62,100 +62,112 @@ ret
|
||||
|
||||
Yaygın kütüphanelerin taranması, bu işlemler için uygun adayları ortaya çıkardı:
|
||||
|
||||
1. **Belleği Okuma:**
|
||||
`property_getName()` fonksiyonu, [Objective-C runtime kütüphanesi](https://opensource.apple.com/source/objc4/objc4-723/runtime/objc-runtime-new.mm.auto.html) için bellek okumak üzere uygun bir fonksiyon olarak belirlenmiştir. Fonksiyon aşağıda özetlenmiştir:
|
||||
1. **Belleği Okuma — `property_getName()`** (libobjc):
|
||||
```c
|
||||
const char *property_getName(objc_property_t prop) {
|
||||
return prop->name;
|
||||
}
|
||||
```
|
||||
Bu fonksiyon, `objc_property_t`'nin ilk alanını döndürerek `read_func` gibi etkili bir şekilde çalışır.
|
||||
|
||||
2. **Bellek Yazma:**
|
||||
Bellek yazmak için önceden oluşturulmuş bir fonksiyon bulmak daha zordur. Ancak, libxpc'den `_xpc_int64_set_value()` fonksiyonu, aşağıdaki ayrıştırma ile uygun bir adaydır:
|
||||
2. **Bellek yazma — `_xpc_int64_set_value()`** (libxpc):
|
||||
```c
|
||||
__xpc_int64_set_value:
|
||||
str x1, [x0, #0x18]
|
||||
ret
|
||||
```
|
||||
Belirli bir adrese 64-bit yazma işlemi gerçekleştirmek için, uzak çağrı şu şekilde yapılandırılır:
|
||||
Rastgele bir adrese 64-bit yazma işlemi gerçekleştirmek için:
|
||||
```c
|
||||
_xpc_int64_set_value(address - 0x18, value)
|
||||
_xpc_int64_set_value(address - 0x18, value);
|
||||
```
|
||||
Bu temel unsurlar belirlendikten sonra, paylaşılan bellek oluşturmak için sahne hazırlanmış olur ve bu, uzaktaki süreci kontrol etmede önemli bir ilerlemeyi işaret eder.
|
||||
Bu ilkelere dayanarak, paylaşılan bellek oluşturmak için sahne hazırlandı ve bu, uzaktaki süreci kontrol etmede önemli bir ilerleme kaydedildi.
|
||||
|
||||
## 4. Paylaşılan Bellek Kurulumu
|
||||
|
||||
Amaç, yerel ve uzaktaki görevler arasında paylaşılan bellek oluşturarak veri transferini basitleştirmek ve birden fazla argümanla fonksiyon çağrısını kolaylaştırmaktır. Yaklaşım, Mach bellek girişleri üzerine inşa edilmiş `libxpc` ve onun `OS_xpc_shmem` nesne türünü kullanmayı içerir.
|
||||
Amaç, yerel ve uzaktaki görevler arasında paylaşılan bellek oluşturarak veri transferini basitleştirmek ve birden fazla argümanla fonksiyon çağrılarını kolaylaştırmaktır. Bu yaklaşım, Mach bellek girişleri üzerine inşa edilmiş `libxpc` ve onun `OS_xpc_shmem` nesne türünü kullanır.
|
||||
|
||||
### Süreç Genel Görünümü:
|
||||
### Süreç genel görünümü
|
||||
|
||||
1. **Bellek Tahsisi**:
|
||||
|
||||
- Paylaşım için belleği `mach_vm_allocate()` kullanarak tahsis edin.
|
||||
- Tahsis edilen bellek bölgesi için bir `OS_xpc_shmem` nesnesi oluşturmak üzere `xpc_shmem_create()` kullanın. Bu fonksiyon, Mach bellek girişinin oluşturulmasını yönetecek ve `OS_xpc_shmem` nesnesinin `0x18` ofsetinde Mach gönderim hakkını saklayacaktır.
|
||||
|
||||
2. **Uzaktaki Süreçte Paylaşılan Bellek Oluşturma**:
|
||||
|
||||
- Uzaktaki süreçte `OS_xpc_shmem` nesnesi için bellek tahsis edin ve `malloc()` ile uzaktan çağrı yapın.
|
||||
- Yerel `OS_xpc_shmem` nesnesinin içeriğini uzaktaki sürece kopyalayın. Ancak, bu ilk kopya `0x18` ofsetinde yanlış Mach bellek girişi adlarına sahip olacaktır.
|
||||
|
||||
3. **Mach Bellek Girişini Düzeltme**:
|
||||
|
||||
- Uzaktaki görevde Mach bellek girişi için bir gönderim hakkı eklemek üzere `thread_set_special_port()` yöntemini kullanın.
|
||||
- Uzaktaki bellek girişinin adını yazarak `0x18` ofsetindeki Mach bellek girişi alanını düzeltin.
|
||||
|
||||
4. **Paylaşılan Bellek Kurulumunu Tamamlama**:
|
||||
- Uzaktaki `OS_xpc_shmem` nesnesini doğrulayın.
|
||||
- `xpc_shmem_remote()` ile uzaktan çağrı yaparak paylaşılan bellek haritasını oluşturun.
|
||||
|
||||
Bu adımları izleyerek, yerel ve uzaktaki görevler arasında paylaşılan bellek verimli bir şekilde kurulacak ve veri transferleri ile birden fazla argüman gerektiren fonksiyonların yürütülmesi kolaylaşacaktır.
|
||||
|
||||
## Ek Kod Parçacıkları
|
||||
|
||||
Bellek tahsisi ve paylaşılan bellek nesnesi oluşturma için:
|
||||
```c
|
||||
mach_vm_allocate();
|
||||
xpc_shmem_create();
|
||||
```
|
||||
Uzak süreçte paylaşılan bellek nesnesini oluşturmak ve düzeltmek için:
|
||||
```c
|
||||
malloc(); // for allocating memory remotely
|
||||
thread_set_special_port(); // for inserting send right
|
||||
```
|
||||
Mach portları ve bellek giriş adlarını doğru bir şekilde ele almayı unutmayın, böylece paylaşılan bellek kurulumu düzgün çalışsın.
|
||||
1. **Bellek tahsisi**
|
||||
* `mach_vm_allocate()` kullanarak paylaşım için bellek tahsis edin.
|
||||
* Tahsis edilen bölge için bir `OS_xpc_shmem` nesnesi oluşturmak üzere `xpc_shmem_create()` kullanın.
|
||||
2. **Uzaktaki süreçte paylaşılan bellek oluşturma**
|
||||
* Uzaktaki süreçte `OS_xpc_shmem` nesnesi için bellek tahsis edin (`remote_malloc`).
|
||||
* Yerel şablon nesnesini kopyalayın; gömülü Mach gönderim hakkının `0x18` ofsetinde düzeltilmesi hala gereklidir.
|
||||
3. **Mach bellek girişini düzeltme**
|
||||
* `thread_set_special_port()` ile bir gönderim hakkı ekleyin ve `0x18` alanını uzaktaki girişin adıyla üzerine yazın.
|
||||
4. **Tamamlama**
|
||||
* Uzaktaki nesneyi doğrulayın ve `xpc_shmem_remote()` ile uzaktan bir çağrı yaparak haritalayın.
|
||||
|
||||
## 5. Tam Kontrol Sağlama
|
||||
|
||||
Paylaşılan belleği başarıyla kurduktan ve keyfi yürütme yetenekleri kazandıktan sonra, esasen hedef süreç üzerinde tam kontrol elde etmiş oluyoruz. Bu kontrolü sağlayan ana işlevler şunlardır:
|
||||
Rastgele yürütme ve paylaşılan bellek geri kanalı mevcut olduğunda, hedef süreci etkili bir şekilde kontrol altına alırsınız:
|
||||
|
||||
1. **Keyfi Bellek İşlemleri**:
|
||||
* **Rastgele bellek R/W** — yerel ve paylaşılan bölgeler arasında `memcpy()` kullanın.
|
||||
* **> 8 argümanlı fonksiyon çağrıları** — ek argümanları arm64 çağrı konvansiyonunu takip ederek yığın üzerine yerleştirin.
|
||||
* **Mach port transferi** — kurulan portlar aracılığıyla Mach mesajlarında hakları geçirin.
|
||||
* **Dosya tanımlayıcı transferi** — dosya portlarını kullanın (bkz. *triple_fetch*).
|
||||
|
||||
- Paylaşılan bölgeden veri kopyalamak için `memcpy()` çağrısını yaparak keyfi bellek okumaları gerçekleştirin.
|
||||
- Paylaşılan bölgeye veri aktarmak için `memcpy()` kullanarak keyfi bellek yazmaları gerçekleştirin.
|
||||
Tüm bunlar, kolay yeniden kullanım için [`threadexec`](https://github.com/bazad/threadexec) kütüphanesinde sarılmıştır.
|
||||
|
||||
2. **Birden Fazla Argümanla Fonksiyon Çağrıları Yönetimi**:
|
||||
---
|
||||
|
||||
- 8'den fazla argüman gerektiren fonksiyonlar için, ek argümanları çağrı konvansiyonuna uygun olarak yığında düzenleyin.
|
||||
## 6. Apple Silicon (arm64e) Nuanları
|
||||
|
||||
3. **Mach Port Transferi**:
|
||||
Apple Silicon cihazlarında (arm64e) **Pointer Authentication Codes (PAC)** tüm dönüş adreslerini ve birçok fonksiyon işaretçisini korur. Mevcut kodu *yeniden kullanan* thread-hijacking teknikleri, `lr`/`pc` içindeki orijinal değerler zaten geçerli PAC imzaları taşıdığı için çalışmaya devam eder. Saldırgan kontrolündeki belleğe atlamaya çalıştığınızda sorunlar ortaya çıkar:
|
||||
|
||||
- Daha önce kurulmuş portlar aracılığıyla görevler arasında Mach portlarını Mach mesajları ile aktarın.
|
||||
1. Hedef içinde yürütülebilir bellek tahsis edin (uzak `mach_vm_allocate` + `mprotect(PROT_EXEC)`).
|
||||
2. Payload'unuzu kopyalayın.
|
||||
3. *Uzak* süreçte işaretçiyi imzalayın:
|
||||
```c
|
||||
uint64_t ptr = (uint64_t)payload;
|
||||
ptr = ptrauth_sign_unauthenticated((void*)ptr, ptrauth_key_asia, 0);
|
||||
```
|
||||
4. Ele geçirilmiş thread durumunda `pc = ptr` olarak ayarlayın.
|
||||
|
||||
4. **Dosya Tanımlayıcı Transferi**:
|
||||
- `triple_fetch` tekniği ile Ian Beer tarafından vurgulanan dosyaportları kullanarak süreçler arasında dosya tanımlayıcılarını aktarın.
|
||||
Alternatif olarak, mevcut gadget'ları/fonksiyonları zincirleyerek PAC uyumlu kalın (geleneksel ROP).
|
||||
|
||||
Bu kapsamlı kontrol, [threadexec](https://github.com/bazad/threadexec) kütüphanesi içinde kapsüllenmiştir ve kurban süreci ile etkileşim için ayrıntılı bir uygulama ve kullanıcı dostu bir API sağlar.
|
||||
## 7. Tespit & EndpointSecurity ile Güçlendirme
|
||||
|
||||
## Önemli Hususlar:
|
||||
**EndpointSecurity (ES)** çerçevesi, savunucuların thread-enjeksiyon girişimlerini gözlemlemesine veya engellemesine olanak tanıyan çekirdek olaylarını açığa çıkarır:
|
||||
|
||||
- Sistem kararlılığını ve veri bütünlüğünü korumak için bellek okuma/yazma işlemleri için `memcpy()`'nin doğru kullanımını sağlayın.
|
||||
- Mach portları veya dosya tanımlayıcıları aktarırken, uygun protokollere uyun ve kaynakları sorumlu bir şekilde yönetin, sızıntıları veya istenmeyen erişimleri önleyin.
|
||||
* `ES_EVENT_TYPE_AUTH_GET_TASK` – bir süreç başka bir görevin portunu talep ettiğinde tetiklenir (örneğin `task_for_pid()`).
|
||||
* `ES_EVENT_TYPE_NOTIFY_REMOTE_THREAD_CREATE` – bir thread *farklı* bir görevde oluşturulduğunda yayımlanır.
|
||||
* `ES_EVENT_TYPE_NOTIFY_THREAD_SET_STATE` (macOS 14 Sonoma'da eklendi) – mevcut bir thread'in kayıt manipülasyonunu gösterir.
|
||||
|
||||
Bu yönergelere uyarak ve `threadexec` kütüphanesini kullanarak, süreçleri ayrıntılı bir düzeyde etkili bir şekilde yönetebilir ve etkileşimde bulunarak hedef süreç üzerinde tam kontrol elde edebilirsiniz.
|
||||
Uzak-thread olaylarını yazdıran minimal Swift istemcisi:
|
||||
```swift
|
||||
import EndpointSecurity
|
||||
|
||||
## Referanslar
|
||||
let client = try! ESClient(subscriptions: [.notifyRemoteThreadCreate]) {
|
||||
(_, msg) in
|
||||
if let evt = msg.remoteThreadCreate {
|
||||
print("[ALERT] remote thread in pid \(evt.target.pid) by pid \(evt.thread.pid)")
|
||||
}
|
||||
}
|
||||
RunLoop.main.run()
|
||||
```
|
||||
**osquery** ≥ 5.8 ile Sorgulama:
|
||||
```sql
|
||||
SELECT target_pid, source_pid, target_path
|
||||
FROM es_process_events
|
||||
WHERE event_type = 'REMOTE_THREAD_CREATE';
|
||||
```
|
||||
### Hardened-runtime considerations
|
||||
|
||||
Uygulamanızı `com.apple.security.get-task-allow` yetkisi **olmadan** dağıtmak, kök olmayan saldırganların görev-portunu elde etmesini engeller. Sistem Bütünlüğü Koruması (SIP) hala birçok Apple ikili dosyasına erişimi engelliyor, ancak üçüncü taraf yazılımlar açıkça opt-out yapmalıdır.
|
||||
|
||||
## 8. Recent Public Tooling (2023-2025)
|
||||
|
||||
| Tool | Year | Remarks |
|
||||
|------|------|---------|
|
||||
| [`task_vaccine`](https://github.com/rodionovd/task_vaccine) | 2023 | Ventura/Sonoma üzerinde PAC farkında thread kaçırmayı gösteren kompakt PoC |
|
||||
| `remote_thread_es` | 2024 | Birçok EDR satıcısı tarafından `REMOTE_THREAD_CREATE` olaylarını yüzeye çıkarmak için kullanılan EndpointSecurity yardımcı programı |
|
||||
|
||||
> Bu projelerin kaynak kodunu okumak, macOS 13/14'te tanıtılan API değişikliklerini anlamak ve Intel ↔ Apple Silicon arasında uyumlu kalmak için faydalıdır.
|
||||
|
||||
## References
|
||||
|
||||
- [https://bazad.github.io/2018/10/bypassing-platform-binary-task-threads/](https://bazad.github.io/2018/10/bypassing-platform-binary-task-threads/)
|
||||
- [https://github.com/rodionovd/task_vaccine](https://github.com/rodionovd/task_vaccine)
|
||||
- [https://developer.apple.com/documentation/endpointsecurity/es_event_type_notify_remote_thread_create](https://developer.apple.com/documentation/endpointsecurity/es_event_type_notify_remote_thread_create)
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user