MSMQ QueueJumper (kerentanan RCE): analisis teknis mendalam.

Bekerja di malam hari di beberapa layar

Pembaruan keamanan yang dirilis oleh Microsoft pada 11 April 2023, membahas lebih dari 90 kerentanan individu. Yang menjadi perhatian khusus adalah CVE-2023-21554, dijuluki QueueJumper, kerentanan eksekusi kode jarak jauh yang mempengaruhi layanan Microsoft MessageQueueing (MSMQ). MSMQ adalah komponen Windows opsional yang memungkinkan aplikasi untuk bertukar pesan melalui antrian pesan yang dapat dijangkau baik secara lokal maupun jarak jauh. Analisis ini dilakukan bekerja sama dengan tim Randori dan X-Force Adversary Services, oleh Valentina Palmiotti, Fabius Watson, dan Aaron Portnoy.

Motivasi riset

Kualitas CVE-2023-21554 berikut menarik perhatian awal:

  • Karena berbagai penggunaan antrian MSMQ oleh aplikasi pihak ketiga, ada tantangan dalam mengidentifikasi luasnya dampak kerentanan antara dan lintas lingkungan.
  • Laporan awal menggambarkan 360.000 hostyang dapat diakses di Internet dengan layanan MSMQ terekspos. Konsultasi Shodan pada saat itu hanya menampilkan 250. Perbedaan ini membuatnya kurang jelas sejauh mana kemungkinan paparan.
  • Kerentanan ini diklasifikasikan sebagai eksekusi kode jarak jauh yang tidak memerlukan otentikasi dan juga memengaruhi berbagai platform Windows.
  • Satu-satunya persyaratan yang jelas adalah bahwa layanan dapat dijangkau pada port TCP 1801.

Triase awal

Mengidentifikasi titik akhir MSMQ

Untuk menentukan cara mendeteksi keberadaan MSMQ, sistem uji dikonfigurasi dengan komponen di lingkungan lab. Saat menghubungkan ke titik akhir MSMQ pada port 1801, server tidak merespons dengan data apa pun. Dapat diasumsikan server tidak akan membalas tanpa menerima data yang dibentuk secara wajar. Untuk memahami cara melakukan percakapan dengan titik akhir, diperlukan pemeriksaan lebih lanjut terhadap kode yang mendasarinya.

Menemukan kode MSMQ

Nasihat tersebut tidak secara langsung menunjukkan biner mana yang telah diperbaiki dengan patch. Langkah pertama untuk mengidentifikasi kode yang diubah adalah mengunduh file pembaruan. Hal ini diperoleh dengan mencari KB5025224 di Katalog Pembaruan Microsoft.

Tangkapan layar untuk menemukan kode MSMQ

Hasil pencarian Katalog Pembaruan Microsoft untuk KB5025224

Secara khusus, file pembaruan kumulatif 

windows10.0-kb5025224-x64_3522b1b562ed44bc949541dd1c7d08e1e967d925.msu 

untuk Windows 11 untuk Sistem berbasis x86 diambil.

Ekstraktor 7-Zip digunakan untuk membongkar isi file MSU dan file CAB yang dikandungnya. Mencari string “msmq” di semua file di folder yang dihasilkan menghasilkan file Indeks Kontainer, 

Windows11.0-KB5025239-x64/express.psf.cix.xml,

yang termasuk entri berikut:

<File id="21296" name="amd64_microsoft-windows-msmq-queuemanager-core_31bf3856ad364e35_10.0.22621.1555_none_5f975f8fdb349517\f\mqqm.dll" length="34811" time="133245266510000000" attr="128">

Catatan ini referensi MQQM.dll  , yang diidentifikasi sebagai target untuk analisis lebih lanjut.

Mengidentifikasi kode yang telah ditambal

Untuk mengidentifikasi perubahan yang dibuat antara versi yang ditambal dan tidak ditambal dari fileMQQM.dll , alat BinDiffdari Zynamics digunakan. Gambar berikut menunjukkan fungsi yang cocok dengan skor kesamaan kurang dari1.00 :

Tangkapan layar kode yang telah ditambal

Hasil Bindiff antara file MQQM.dll yang ditambal dan tidak ditambal 

Analisis fungsi-fungsi ini menggunakan Hex-Rays Decompiler mengungkapkan simbol untuk versi yang ditambal yang berisi nama fungsi verbose yang tampaknya merujuk pada pengidentifikasi kerentanan Microsoft Security Research Center (MSRC):

Tangkapan layar referensi Pusat Riset Keamanan Microsoft (MSRC)

Simbol feature flag di dalam MQQM.dll

Analisis feature flag

Setelah diperiksa lebih dekat, simbol yang berisi nomor kasus MSRC sesuai dengan featureflaf untuk perbaikan kerentanan. Feature flad adalah komponen Windows yang mengalihkan berbagai fungsionalitas dan eksperimen. Di sini, “feature” yang ditemukan sebenarnya adalah tambalan untuk kerentanan. Jika fitur diaktifkan, jalur kode yang aman dan ditambal dijalankan. Jika tidak, jalur kode asli yang belum ditambal dijalankan.

Tangkapan layar jalur kode asli yang tidak ditambal yang dieksekusi

Cuplikan kode yang didekompilasi menunjukkan feature flag untuk perbaikan kerentanan

Pemeriksaan bendera fitur hadir untuk setiap kerentanan yang terdiri dari CVE-2023-21554 di komponen pengguna dan kernel. Analisis terhadap sisa biner yang terdapat dalam paket pembaruan keamanan menunjukkan bahwa feature flag juga diperkenalkan untuk sebagian besar atau seluruh kerentanan yang diperbaiki pada Patch Tuesday April 2023.

Analisis akar masalah

Dengan mencocokkan flag-flag ini, kami dapat dengan cepat menemukan lokasi kode yang telah ditambal. Secara khusus, perubahan di CQmPacket::CQmPacket dalam yang terkait denganMSRC76146_MSMQ_OOBRWF bendera ixes tampak paling menarik.

Pemeriksaan untuk bendera fitur ini terjadi delapan kali dalam fungsi. Salah satu contoh pengecekan tersebut digambarkan di bawah ini:

Tangkapan layar analisis Akar masalah

Cuplikan kode yang didekompilasi yang menunjukkan perbaikan kerentanan 

Dalam cuplikan kode yang didekompilasi yang ditunjukkan di atas, jalur kode yang ditambal memperoleh pointer ke bagian berikutnya dari pesan MSMQ melalui panggilan ke GetNextSectionPtrSafe. Di jalur yang tidak ditambal, pointer diperoleh hanya dengan menambahkan ukuran bagian tanpa pemeriksaan. Fungsi baru GetNextSectionPtrSafe  memverifikasi bahwa pointer yang dihitung menuju bagian paket berikutnya tidak melampaui panjang paket itu sendiri.

Tangkapan layar fungsi

Cuplikan dekompilasi fungsi GetNextSectionPtrSafe

Setelah menelaah seluruh kemunculan feature flag ini dan yang lainnya, disimpulkan bahwa CVE-2023-21554 terdiri dari beberapa bug yang tidak memeriksa ukuran berbagai tipe section pesan MSMQ secara memadai. Kerentanan ini memungkinkan pointer ke akhir pesan MSMQ ditingkatkan oleh offset 32-bit arbitrer ke luar batas buffer yang awalnya dialokasikan.

Setelah pemrosesan paket, langkah terakhir di CQmPacket::CQmPacket  akan menambahkan OnDiskExtensionHeader  sampai akhir buffer paket. Karena kerentanan yang disebutkan di atas, dimungkinkan bagi pointer yang dihitung ke akhir pesan untuk keluar dari batas. Dengan demikian, penambahan OnDiskExtensionHeader dapat hasil beberapa penulisan di luar batas. Kode yang didekompilasi di bawah ini menunjukkan pemeriksaan yang ditambal untuk pointer akhir pesan yang rentan sebelum penulisan OOB terjadi:

Tangkapan layar dari pemeriksaan yang telah diperbaiki untuk penunjuk akhir pesan yang rentan sebelum penulisan OOB terjadi

Pemeriksaan akses memori di luar batas untuk akhir pesan

Varian kernel

Saat mengevaluasi eksploitabilitas kerentanan, kerentanan kernel tambahan diidentifikasi di driver kernel yang sesuai untuk layanan MSMQ, mqac.sys . Kerentanan sekali lagi ditunjukkan oleh simbol-simbol bendera fitur, yang juga merujuk pada kasus MSRC 76146 seperti yang diamati dalam MQQM.dll .

Tangkapan layar fitur

Simbol feature flag dalam mqac.sys

Analisis dari feature flagKernelVariants  mengungkapkan bahwa kerentanan yang sesuai adalah analog dari yang ditemukan di komponen ruang pengguna. Komponen kernel mqac.sys  terlibat dalam berbagai operasi untuk layanan MSMQ seperti meneruskan pesan ke  antreandead letter, mengirim  pesanpengakuan, dan manajemen memori untuk buffer paket MSMQ.

Untuk melakukan operasi terkait, komponen kernel mengurai berbagai bagian buffer paket MSMQ. Dua contoh seperti itu digambarkan di bawah ini:

Tangkapan layar Untuk melakukan operasi terkait, komponen kernel mengurai berbagai bagian buffer paket MSMQ

Cuplikan kode yang didekompilasi menunjukkan feature flag untuk perbaikan kerentanan di driver kernel mqac.sys

Seperti yang terlihat pada cuplikan kode yang didekompilasi di atas, jika bendera fitur diaktifkan, fungsi “aman” CPacketBuffer::MsgDeadletterHeaderSafe  dan CPacketBuffer::MsgOnDiskExtensionHeaderSafe   dipanggil untuk mengambil header yang sesuai dari buffer paket. Jika tidak diaktifkan, fungsi “tidak aman” dipanggil, yang tidak memiliki pemeriksaan yang cukup pada ukuran bagian.

Memicu kerentanan

Rekayasa balik protokol

Sebagian besar kode yang berkaitan dengan parsing protokol berada di dalam perpustakaan MQQM.dll , yang dimuat oleh prosesmqsvc.exe . Untuk mencapai kode yang direferensikan oleh MSRC76146_MSMQ_OOBRWFixes , permintaan MSMQ yang valid harus dikirim dari klien. Spesifikasi dan protokol pesan MSMQ sangat luas dan kompleks. Awalnya, kode publik ditemukan untuk memindai server MSMQ di GitHub yang menyediakan dasar untuk eksplorasi lebih mendalam dari pemrosesan paket. Selain itu, dokumentasi Microsoft sangat membantu untuk memahami formatpesan MSMQ.

Kode dalam DLL menerima data melalui port 1801 menggunakan panggilan ke fungsi WSARecv, seperti yang dapat dilihat dalam sesi debugging di bawah ini:

0:020> bp ws2_32!wsarecv ; g

Breakpoint 0 hit

WS2_32!WSARecv:

00007ffd`651115c0 48895c2408      mov     qword ptr [rsp+8],rbx ss:000000aa`f07fef30=0000000000000006

 

0:019> k

# Child-SP          RetAddr               Call Site

00 000000aa`f07fef28 00007ffd`57ba9cb0 WS2_32!WSARecv

01 000000aa`f07fef30 00007ffd`57b9683d    

MQQM!NoReceivePartialBuffer+0x38

02 000000aa`f07fefb0 00007ffd`57b2078e     MQQM!CWinsockConnection::ReceivePartialBuffer+0x7d

03 000000aa`f07ff010 00007ffd`57b25b28    

MQQM!CSockTransport::BeginReceive+0xe6

04 000000aa`f07ff060 00007ffd`57b2d40b    

MQQM!CSockTransport::NewSession+0x194

05 000000aa`f07ff3f0 00007ffd`57b2d367     MQQM!CSessionMgr::AcceptSockSession+0x6f

06 000000aa`f07ff430 00007ffd`645e26bd     MQQM!AcceptIPThread+0x6a7

07 000000aa`f07ff7d0 00007ffd`6650a9f8    

KERNEL32!BaseThreadInitThunk+0x1d

08 000000aa`f07ff800 00000000`00000000     ntdll!RtlUserThreadStart+0x28

 

0:019> r @$t0=@rdx

0:019> pt

WS2_32!WSARecv+0x19f:

00007ffd`6511175f c3              ret

0:019> dc poi(@$t0+8) LC

000001b5`880ff490  62f06110 524f494c 00000070 5a5a5a5a  .a.bLIORp…ZZZZ

000001b5`880ff4a0  0073006e 00610074 0063006e 00200065  n.s.t.a.n.c.e. .

000001b5`880ff4b0  00440049 00000000 00000000 00000000  I.D………….

 

0:019> ba r1 poi(@$t0+8) ; g

Breakpoint 1 hit

MQQM!CBaseHeader::SectionIsValid+0x154:

00007ffd`57b53450 7462            je     

MQQM!CBaseHeader::SectionIsValid+0x1b8 (00007ffd`57b534b4) [br=1]
 

Fungsi CBaseHeader::SectionIsValid bertanggung jawab untuk mem-parsing awal pesan baru, yang dimulai dengan struktur BaseHeader dari bentuk:

Tangkapan layar struktur BaseHeader dari formulir

Struktur objek BaseHeader

Bidang pesan masuk divalidasi oleh SectionIsValid  sebelum server mengirimkan respons:

Tangkapan layar bidang pesan

Kode pembongkaran untuk SectionIsValid dalam MQQM.dll 

Setelah validasi awal, sebagian besar penguraian protokol terjadi dalam CQmPacket:: CQmPacket  fungsi konstruktor. Untuk memicu kerentanan CVE-2023-21554, pesan MSMQ dapat dikirim berisi header bagian yang salah format yang salah ditangani. Contoh berikut ini memerinci pemicuan kerentanan menggunakan EodHeader  untuk bagian Eod (tepat-sekali-pengiriman).

Tangkapan layar memicu kerentanan menggunakan eodHeader untuk Eod

Dekompilasi menunjukkan kerentanan dalam penanganan eodHeader

Dekompilasi di atas menunjukkan jalur yang telah ditambal memanggil fungsi bernama CEodHeader::GetNextSectionSafe. T ,sementara itu, jalur yang belum ditambal hanya melakukan penjumlahan pointer dengan menggunakan nilai pada header untuk menghitung awal dari section berikutnya.

Struktur dari EodHeader  tidak didokumentasikan; bit flag menunjukkan adanya EodHeader  di  UserHeader  disebutkan sebagai “dicadangkan” dalam dokumentasi Microsoft, yang menyatakan bahwa bit flag tidak boleh diatur saat dikirim. Dengan meninjau pembongkaran ini, kita bisa memperoleh insight mengenai susunan header:

Tangkapan layar dari struktur header

Pembongkaran menghitung ukuran total bagian EODHeader

Pada pembongkaran di atas, penunjuk ke awal EodHeader  dimuat ke dalam register rdx  . Dapat berspekulasi bahwa bidang pertama dan kedua dari header menggambarkan ukuran integer (ukuran header dan ukuran data, atau sesuatu yang serupa). Dua ukuran plus 0xF  menunjukkan ukuran total bagian Eod dalam byte. Dengan mengirim pesan dengan EodHeader  yang bidang ukuran yang sesuai diatur ke nilai besar, penulisan di luar batas dipicu. Hal ini menyebabkan pelanggaran akses ketika OnDiskExtensionHeader  dituliskan ke lokasi yang (menurut program) merupakan akhir pesan:

Tangkapan layar header ekstensi

Sesi WinDbg menunjukkan pelanggaran akses saat menulis ke akhir pesan MSMQ yang salah format

Eksploitabilitas

Manajemen dan manipulasi memori

Untuk mengevaluasi kekuatan out-of-bounds write yang diperoleh dari kerentanan tersebut, kami terlebih dahulu meneliti alokasi dan pengelolaan memori yang mendasarinya.

SebelumMSMQ paket pesan diproses, isinya disalin ke buffer yang dialokasikan dalam fungsi QmAcAllocatePacket . Fungsi ini memanggil mqac.sys driver kernel melaluiNtDeviceIoControl.

Tangkapan layar dari panggilan fungsi ke mqac.sys

Dekompilasi fungsi alokasi buffer paket

Komponen kernel mengembalikan buffer yang dipartisi dari tampilan file yang dipetakan pada disk, disimpan di direktori C:\Windows\System32\msmq\storage  dengan ekstensi .mq  . Setiap file dapat menampung hingga 4MB dan dapat berisi pesan dari beberapa antrean.

Tangkapan layar komponen kernel

Tata letak memori ProcessHacker dari proses MQSVC yang menunjukkan memori buffer paket adalah pemetaan file

Alamat buffer paket, bersama dengan penanganan paket acak, dikembalikan ke ruang pengguna setelah permintaan alokasi melalui IOCTL. Driver menggunakan handle untuk menghitung alamat buffer paket saat menangani permintaan dari ruang pengguna.

Penataan perawatan

Memori pendukung untuk buffer yang rentan berada di dalam file yang dipetakan, dan karenanya tidak berada di dalam heap proses. Selain itu, memori yang terpengaruh tidak menyimpan objek apa pun. Satu-satunya hal yang terkandung dalam pemetaan file adalah isi pesan MSMQ bersama dengan metadata yang disimpan di OnDiskExtension.

Selanjutnya, tanpa pengetahuan sebelumnya tentang tata letak memori, tidak mungkin untuk mengetahui posisi relatif dari pemetaan file ke tumpukan proses untuk mengganti penunjuk objek. Oleh karena itu, untuk mendapatkan eksekusi kode jarak jauh secara layak, kami memerlukan beberapa metode untuk membentuk memori ke posisi yang dapat diprediksi.

Setelah melakukan percobaan dengan mengirim pesan MSMQ yang valid ke target, ditemukan bahwa alokasi heap baru yang bersebelahan dengan pemetaan file .mq  dapat dipaksa terjadi dengan melakukan spraying menggunakan banyak pesan. Pesan ditulis secara berurutan dalam memori hingga saat diterima, dan menggunakan pesan MSMQ properti TimeToBeReceived  , pembebasan pesan tertentu dapat diatur dengan hati-hati.

Tangkapan layar komponen kernel

Tata letak memori proses MQSVC menunjukkan heap baru yang dialokasikan berdekatan ke pemetaan file MQ

Namun, hal ini mengharuskan penyerang memiliki akses untuk mengirim pesan ke setidaknya satu antrean pada target; jika tidak, pesan akan dibuang dan ditimpa sehingga tidak menempati memori paket secara terus-menerus.

Dalam riset yang dilakukan, ditemukan bahwa pengguna yang tidak memiliki hak istimewa dapat membuat antrean yang terbuka bagi siapa saja untuk mengirim pesan dari jarak jauh, secara default.  Antrean tersebut akan terus ada di sistem tanpa batas waktu. Meskipun sebagian besar penggunaan modern MSMQ ada sebagai komponen dan adaptor opsional, vendor seperti Oracle, Veritas, dan Xerox menawarkan perangkat lunak perusahaan yang mengandalkan MSMQ sebagai ketergantungan inti. Oleh karena itu, skenario serangan tidak realistis.

Mengeksploitasi hal-hal primitif

Kerentanan akses memori di luar batas memperkenalkan eksploitasi primitif yang memungkinkan
klien jahat untuk menulisOnDiskExtensionHeader melampaui batas-batas memori
dialokasikan untuk paket.

Saat menilai kerentanan yang memungkinkan penulisan nilai ke offset, beberapa properti
harus dipertimbangkan:

  • Bisakah offset dikontrol
  • Dapatkah nilai yang ditulis dikontrol

Dalam kasus kerentanan QueueJumper, offset buffer yang dialokasikan ke penulisan OOB dapat dikontrol karena dihitung menggunakan data yang dikendalikan penyerang. Isi penulisan OOB, bagaimanapun, memiliki kontrol terbatas.

Di sini,Address merepresentasikan pointer yang telah rusak menuju akhir pesan paket tempat header OnDiskExtension akan ditulis. Rangkaian operasi yang terjadi adalah sebagai berikut:

  • Nilai 0x000000000000000C ditulis untukAddress
  • Nilai0x00000000 ditulis ke Address+0x2
  • Nilai0x0000000000000000 ditulis ke Address+0x12
  • Nilai 0x0000000000000000 ditulis ke Address+0x1A
  • Nilai 0x00000094 ditulis Address+0xE
  • Nilai0x0000 ditulisAddress+0x22
  • Nilai 0x0000 ditulis ke Address+0x62
  • memcpy(Address+0xA6, Source, Source->AddressLength+0x08)

Source yang digunakan dalam pemanggilan kememcpy di atas mengacu pada objek TA_ADDRESS. Struktur TA_ADDRESS mendefinisikan alamat transportasi tunggal dari jenis tertentu (misalnya, NetBIOS). Definisinya sebagai berikut:

typedef struct _TA_ADDRESS {

    USHORT AddressLength;;

    USHORT AddressType; Info;

    UCHAR Address[1];;

} TA_ADDRESS, *PTA_ADDRESS;

AddressLength

Menentukan jumlah byte dalam alamat dari AddressType yang ditentukan.

AddressType

Menentukan jenis alamat transportasi.

Address

Menentukan array berukuran variabel yang berisi alamat transportasi.

Dalam sesi debugging di bawah ini,TA_ADDRESS berisi data yang dipengaruhi penyerang dalam bentuk alamat IP:

rax=0000014e1d110180 rbx=0000014e1d110180 rcx=0000014e1d110184

rdx=0000014e1ce86b10 rsi=0000014e1d110001 rdi=0000000545d7fa50

rip=00007ff843208074 rsp=0000000545d7f940 rbp=0000000545d7f980

r8=000000000000000c  r9=0000000000000002 r10=0000000000000000

r11=0000000545d7f938 r12=0000000000000002 r13=0000000000001000

r14=0000014e1ce86b10 r15=0000000000000000

iopl=0         nv up ei pl nz na po nc

cs=0033  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000206

MQQM!CQmPacket::CQmPacket+0x89c:

00007ff8`43208074 e8a5780a00      call    MQQM!memcpy (00007ff8`432af91e)

0:017> dc rcx

0000014e`1d110184  00010004 00000000 8620a8c0 00000000  ………. …..
 

Di atas, objekTA_ADDRESS memiliki panjang 4 , sebuah tipe dari1 , dan sebuah nilai dari 0x8620a8c0 . Mengonversi setiap byte ke oktet IPv4 menghasilkan alamat192.168.32.134 , yang merupakan alamat sumber IPv4 klien.

Skenario ini memungkinkan penulisan data yang dikendalikan oleh penyerang melalui alamat sumber ke offset yang terkontrol dari alokasi paket di memori. Meskipun sangat terbatas dan mungkin tidak praktis, secara teoretis hal ini dapat digunakan untuk mengontrol secara presisi nilai yang dituliskan ke memori dengan membuat beberapa permintaan dari alamat sumber yang berbeda pada offset paket yang menurun.

Serangan alternatif

Karena banyaknya keterbatasan yang ditemui untuk mencapai eksekusi kode jarak jauh secara blind, skenario serangan alternatif seperti kebocoran informasi kemudian diteliti.

Salah satu serangan yang dipertimbangkan adalah merusak pointer ke bagian pesan tertentu agar menunjuk ke memori di luar batas, kemudian mengambil kembali pesan tersebut untuk membaca memori yang berdekatan.

Namun, pada awal proses parsing setiap section dilakukan pengecekan terhadap posisi section saat ini, sehingga kita tidak dapat mengecoh logika parsing untuk memproses bagian data yang berada di luar batas.

Skenario serangan lain yang mungkin adalah mengganti onDiskExtensionHeader dari pesan lain untuk mengelabui penerima pesan tentang asal pesan yang diterima. Demikian pula, dimungkinkan untuk mengganti isi pesan yang ditujukan untuk antrian yang tidak dapat diakses oleh penyerang. Untuk menimpa konten tertentu dari sebuah pesan, penyerang perlu memiliki informasi tentang pesan tersebut, seperti ukurannya.

Ada bagian opsional bernama SoapHeader yang rentan terhadap akses data di luar batas, dengan format berikut:

Tangkapan layar dari SoapHeader

Format paket SoapHeader

Terlihat bahwa saat buffer dibebaskan, memori yang menampung data paket MSMQ tidak dikosongkan dengan benar. Akibatnya, pengiriman paket MSMQ yang berukuran lebih kecil dibandingkan paket sebelumnya akan menghasilkan tata letak memori yang berisi data paket saat ini diikuti oleh data dari paket MSMQ yang telah diproses sebelumnya.

Ditemukan bahwa SoapHeader  dapat digunakan untuk menyalahgunakan karakteristik ini untuk mengungkapkan data dari paket yang diproses sebelumnya atau pesan yang disimpan berdekatan. Penyerang dapat secara sewenang-wenang mendefinisikan BodyDataLength  dan mengecualikan bagian Tubuh sepenuhnya. Ini akan menghasilkan pesan MSMQ yang menyertakan data yang berpotensi sensitif dari paket MSMQ yang diproses sebelumnya sebagai Body  dari SoapHeader  penyerang . Jalur kode yang ditambal mencegah kasus penyalahgunaan ini, karena memvalidasi bahwa Body  data berada dalam batas-batas data paket MSMQ.

Kontrol yang terbatas terhadap isi penulisan, ditambah dengan penulisan tambahan yang tidak terkontrol yang merusak memori di sekitarnya, serta minimnya pemahaman tentang tata letak pesan, menjadi hambatan besar dalam proses eksploitasi.

Menyerang melalui kernel

Pada saat analisis, hanya kerentanan ruang pengguna yang terlibat dalam pemrosesan awal paket pesan MSMQ yang dievaluasi untuk eksploitabilitas. Analisis terhadap varian kerentanan kernel dapat mengungkap jalur eksploitasi tambahan. Sebagai contoh, menyertakan header yang tidak valid berpotensi menghasilkan write primitive pada pemetaan memori kernel dari file .mq . Dalam beberapa kasus, pemeriksaan dalam pemrosesan ruang pengguna mencegah kernel melakukan beberapa operasi pascapemrosesan.

Selain itu, pada varian kernel, penyerang memiliki kontrol yang lebih terbatas terhadap isi pesan dan juga beroperasi pada pemetaan file yang sama dengan ruang pengguna, bukan pada kumpulan kernel (heap). Mitigasi, seperti KASLR, juga menghadirkan hambatan yang sulit diatasi untuk eksploitasi jarak jauh.

Mendeteksi server yang rentan

Berkat implementasi kode yang telah ditambal, klien jarak jauh dapat dengan aman mengetahui apakah suatu sistem sudah menerapkan pembaruan. Hal ini dapat dilakukan dengan mengirim pesan MSMQ yang memicu kerentanan tersebut, tetapi tidak sampai menyebabkan akses out-of-bound, sehingga proses layanan tidak mengalami crash. Jika flag HTTP disetel pada UserHeader pesan, SRMPEnvelopeHeader akan diharapkan. Di dalam patch, pemeriksaan untuk integer overflow dilakukan pada bidang DataLength dikalikan dengan 2. Panjang ini dapat diatur sehingga hasil perkalian melimpah ke angka kecil yang sama dengan ukuran data yang sebenarnya.

Cuplikan kode yang didekompilasi menunjukkan pemeriksaan luapan bilangan bulat pada SRMPEnvelopeHeader DataLength

Cuplikan kode yang didekompilasi menunjukkan pemeriksaan luapan bilangan bulat pada SRMPEnvelopeHeader DataLength

Jika target sudah ditambal, kerentanan tersebut akan memicu pengecualian dan server akan menghentikan pemrosesan pesan, sehingga tidak ada respons yang dikirim kembali ke klien. Jika tidak ditambal, server akan memproses pesan secara normal dan mengirim respons.

Kesimpulan

Karena memori dukungan lokasi dari buffer rentan, eksekusi kode jarak jauh tampaknya lebih layak bagi penyerang dengan kemampuan untuk mengirim pesan ke antrean apa pun pada target. Dalam situasi tersebut, proses grooming memungkinkan terbentuknya alokasi heap yang saling berdekatan. Kontrol yang sangat terbatas atas konten tulis menghadirkan tantangan untuk eksploitasi jarak jauh. Karena adanya mitigasi seperti ASLR, kebocoran informasi juga harus diperoleh. Ada kemungkinan bahwa satu penulisan konstanta (0xC, 0x0 — diperoleh dengan primitif) ke sebuah objek dapat mencapai hal ini, namun objek tersebut harus memiliki bidang yang berguna, di mana bidang yang bersebelahan mampu bertahan dari korupsi akibat penulisan lainnya. Selain itu, objek harus dialokasikan secara dapat diprediksi oleh penyerang, umur objek harus mencakup durasi eksploitasi, dan beberapa tindakan objek harus dipicu oleh penyerang. Dalam perjalanan riset ini, tidak ditemukan objek yang sesuai dengan kriteria tersebut.

Pada akhirnya, kami menyimpulkan bahwa sementara eksploitasi jarak jauh QueueJumper mungkin bukan tidak mungkin, persyaratan yang disebutkan di atas membuatnya sulit untuk dicapai. Posting blog ini hanya menggaruk permukaan dari spesifikasi pesan, layanan, dan protokol yang sangat kompleks. Riset kerentanan lebih lanjut pada ruang pengguna dan operasi komponen kernel diperlukan.

Mixture of Experts | 12 Desember, episode 85

Decoding AI: Rangkuman Berita Mingguan

Bergabunglah dengan panel insinyur, peneliti, pemimpin produk, dan sosok kelas dunia lainnya selagi mereka mengupas tuntas tentang AI untuk menghadirkan berita dan insight terbaru seputar AI.