Windows Notification Facility: permukaan serangan paling tidak berdokumen

Di bawah cut adalah terjemahan dari presentasi "Fasilitas Notifikasi Windows: Permukaan Serangan Kernel yang Paling Tidak Terdokumentasi" disajikan oleh Alex Ionescu dan Gabrielle Viala pada konferensi BlackHat 2018 .




Apa itu Fasilitas Pemberitahuan Windows (WNF)


Windows Notification Facility adalah mekanisme pemberitahuan (tersedia baik dalam kernel dan dalam mode pengguna), yang dibangun di atas model penerbit-pelanggan ( pubsub , Penerbit / Pelanggan). Mekanisme ini ditambahkan di Windows 8: sebagian untuk mengatasi beberapa keterbatasan desain lama di OS, tetapi juga seharusnya berfungsi sebagai dasar untuk penerapan pemberitahuan push mirip dengan iOS / Android.


Fitur utamanya adalah model blind (kebanyakan tanpa registrasi) yang memungkinkan untuk berlangganan dan publikasi yang tidak teratur. Ini menyiratkan bahwa konsumen dapat berlangganan notifikasi bahkan sebelum notifikasi diterbitkan oleh sumbernya. Dan orang yang membuat acara tidak diharuskan untuk "mendaftarkan" pemberitahuan sebelumnya.


Selain itu, mekanisme ini mendukung:


  • pemberitahuan permanen dan sementara
  • pengidentifikasi unik yang meningkat secara monoton
  • buffer muatan (hingga 4 kilobyte) untuk setiap acara
  • model pemberitahuan thread-pool dengan serialisasi berbasis grup
  • model keamanan berbasis lingkup yang mengimplementasikan deskriptor keamanan melalui mekanisme DACL / SACL standar


Mengapa WNF muncul


Pertimbangkan contoh kanonik: ada driver yang ingin tahu bahwa volume dengan akses baca dan tulis telah terhubung. Untuk memberi tahu Anda tentang hal ini, Autochk (analog dari fsck pada Windows) melaporkan peristiwa yang disebut VolumesSafeForWriteAccess. Tetapi untuk melaporkan suatu peristiwa, Anda harus terlebih dahulu membuat objek acara itu sendiri.


Kita juga perlu tahu bahwa Autochk sudah bekerja pada volume, tetapi belum memberi sinyal acara yang kita tunggu. Solusi buruk: duduk dalam lingkaran dengan sleep (), memeriksa keberadaan acara, dan ketika acara dibuat - tunggu.


Tetapi setelah keluar dari aplikasi Windows, semua deskriptornya ditutup. Dan ketika objek tidak memiliki deskriptor, itu dihancurkan. Jadi siapa yang akan mengadakan acara ini?


Tanpa WNF, solusinya adalah kernel OS untuk membuat suatu peristiwa sebelum driver memuat, dan bagi Autochk untuk membukanya seperti yang dilakukan konsumen, tetapi alih-alih menunggu, itu harus memberi sinyal peristiwa ini.



Nama Negara WNF


Di dunia WNF, nama negara adalah angka 64-bit. Tetapi ada trik - sebenarnya itu adalah struktur kode. Nama negara memiliki versi , seumur hidup , ruang lingkup , bendera kegigihan data, dan nomor seri unik .


typedef struct _WNF_STATE_NAME_INTERNAL { ULONG64 Version:4; ULONG64 NameLifetime:2; ULONG64 DataScope:4; ULONG64 PermanentData:1; ULONG64 Unique:53; } WNF_STATE_NAME_INTERNAL, *PWNF_STATE_NAME_INTERNAL; 

Tetapi data ini hanya akan tersedia jika kita memberikan nomor 64-bit dengan konstanta ajaib:


 #define WNF_STATE_KEY 0x41C64E6DA3BC0074 


Seumur hidup dari nama negara


Nama negara WNF dapat berupa (WNF_STATE_NAME_LIFETIME):


  • terkenal
  • permanen
  • gigih
  • sementara

Tiga yang pertama dikaitkan dengan kunci yang sesuai dalam registri, tempat informasi status akan disimpan:


  • nama-nama terkenal tinggal di HKLM \ SYSTEM \ CurrentControlSet \ Control \ Notifications
  • nama persisten hidup di HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Pemberitahuan
  • nama persisten hidup di HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ VolatileNotifications

Nama-nama terkenal memiliki kekhasan sendiri: mereka tidak dapat didaftarkan. Nama seperti itu harus sudah disajikan dalam registri pada saat boot sistem. Nama gigih dan persisten membutuhkan hak istimewa SeCreatePermanentPrivilege yang disertakan (seperti objek global lainnya) untuk membuatnya. Nama gigih hidup di luar proses registrar, sementara nama gigih bertahan sistem reboot.



Lingkup data


Cakupan data menentukan batas keamanan pertama di sekitar nama status WNF, menentukan siapa yang melihatnya dan memiliki akses ke sana. Lingkup nama negara dapat:


  • sistem
  • mobil
  • sesi pengguna
  • pengguna
  • prosesnya

Selain memberikan batasan keamanan, cakupan WNF dapat digunakan untuk memberikan contoh data yang berbeda untuk nama yang sama. Kernel (seperti halnya mekanisme keamanan lainnya) melewati pemeriksaan akses negara. Hak istimewa TCB memungkinkan akses lintas-lingkup ke nama negara WNF.


Lingkup "sistem" dan lingkup "mesin" adalah cakupan global. Mereka tidak memiliki pengidentifikasi sendiri (mereka menggunakan wadah global yang berbeda). Ruang lingkup sesi pengguna menggunakan pengidentifikasi sesi (ID sesi) sebagai ID. Ruang lingkup pengguna tertentu menggunakan SID pengguna ini sebagai pengidentifikasi. Alamat objek EPROCESS adalah pengidentifikasi ruang lingkup proses.



Nomor Urutan


Untuk memastikan keunikan, setiap nama negara memiliki nomor urut 51-bit yang unik. Nama-nama terkenal termasuk tag keluarga 4-karakter dalam nomor seri mereka, dan 21 bit sisanya digunakan sebagai pengidentifikasi unik. Nama permanen menyimpan nomor mereka yang bertambah dengan nilai registri "SequenceNumber". Nama persisten dan sementara menggunakan penghitung kenaikan umum, yang terletak di variabel global. Data ini disimpan dan diproses secara terpisah untuk setiap wadah (per-silo) dan tersedia di PspHostSiloGlobals-> WnfSiloState.


Di dalam Microsoft, setiap nama WNF memiliki pengenal "ramah" yang digunakan dalam kode, kadang-kadang disimpan dalam ruang nama global dengan nama yang sama. Misalnya, simbol nt! WNF_BOOT_DIRTY_SHUTDOWN, yang memiliki nilai 0x1589012fa3bc0875. Setelah XOR dengan konstanta ajaib WNF_STATE_KEY kita mendapatkan nilai 0x544f4f4200000801, yang dapat ditafsirkan sebagai:


 BOOT1, Well-Known Lifetime, System Scope, Version 1 


Panggilan Sistem untuk Bekerja dengan WNF


Panggilan sistem kernel memungkinkan Anda untuk mendaftar dan menghapus nama negara WNF, menerbitkan dan menerima data nama negara WNF, dan juga menerima berbagai pemberitahuan dari WNF.



Daftarkan Nama Status WNF


Dengan pengecualian nama-nama terkenal (seperti disebutkan sebelumnya), nama status WNF dapat didaftarkan saat OS sedang berjalan:


 NTSTATUS ZwCreateWnfStateName ( _Out_ PWNF_STATE_NAME StateName, _In_ WNF_STATE_NAME_LIFETIME NameLifetime, _In_ WNF_DATA_SCOPE DataScope, _In_ BOOLEAN PersistData, _In_opt_ PCWNF_TYPE_ID TypeId, //      _In_ ULONG MaximumStateSize, //   4-  _In_ PSECURITY_DESCRIPTOR SecurityDescriptor // **  ); 

Ada panggilan sistem simetris ZwDeleteWnfStateName yang dengannya Anda dapat menghapus nama negara terdaftar (sekali lagi, kecuali yang terkenal).



Publikasikan Data Status WNF


Untuk mengatur atau mengubah data nama status WNF, Anda dapat menggunakan panggilan sistem ZwUpdateWnfStateData:


 NTSTATUS ZwUpdateWnfStateData ( _In_ PCWNF_STATE_NAME StateName, _In_reads_bytes_opt_(Length) const VOID* Buffer, _In_opt_ ULONG Length, //   ,   MaximumSize,    _In_opt_ PCWNF_TYPE_ID TypeId, //      _In_opt_ const PVOID ExplicitScope, //  , SID ,  (ID)  _In_ WNF_CHANGE_STAMP MatchingChangeStamp, //     _In_ LOGICAL CheckStamp //         ); 

Ada sistem panggilan simetris ZwDeleteWnfStateData untuk menghapus (membersihkan) data nama negara WNF.



Mendapatkan Data Status WNF


Untuk meminta data nama status WNF, panggilan sistem berikut dapat digunakan (sebagian besar parameter mirip dengan fungsi Pembaruan):


 NTSTATUS ZwQueryWnfStateData ( _In_ PCWNF_STATE_NAME StateName, _In_opt_ PCWNF_TYPE_ID TypeId, _In_opt_ const VOID* ExplicitScope, _Out_ PWNF_CHANGE_STAMP ChangeStamp, _Out_writes_bytes_to_opt_(*BufferSize, *BufferSize) PVOID Buffer, _Inout_ PULONG BufferSize //   0,      ); 

Kekuatan sebenarnya terletak pada kenyataan bahwa fungsi API Pembaruan dan Permintaan sebenarnya tidak memerlukan nama negara WNF terdaftar . Dan jika nama itu tidak sementara (dan kode panggilan memiliki hak istimewa yang cukup), sebuah instance dari nama tersebut dapat didaftarkan secara real time!



Pemberitahuan WNF


Sejauh ini, kami mengasumsikan bahwa konsumen tahu kapan harus memanggil fungsi akuisisi data. Tetapi ada juga pemblokiran pembacaan , yang berfungsi menggunakan sistem notifikasi (yang lebih dekat dengan model penerbit-pelanggan sejati).


Pertama, proses harus mendaftarkan acara dengan memanggil fungsi ZwSetWnfProcessNotificationEvent. Maka Anda perlu memanggil fungsi ZwSubscribeWnfStateChange, menentukan topeng acara untuk mendapatkan pengidentifikasi berlangganan pada output. Acara dapat terdiri dari dua jenis:


  • Pemberitahuan data:
    • 0x01 - tampilan data
    • 0x10 - penghancuran nama
  • Metanotifikasi Meta
    • 0x02 - tampilan pelanggan yang menerima pemberitahuan data (Pelanggan Data)
    • 0x04 - penampilan pelanggan yang menerima notifikasi meta (Pelanggan Meta)
    • 0x08 - penampilan pelanggan yang menerima pemberitahuan data dan meta-notifikasi (Pelanggan Umum)

Maka Anda harus menunggu acara yang direkam. Dan setiap kali acara menjadi sinyal, Anda perlu memanggil fungsi ZwGetCompleteWnfStateSubscription, yang mengembalikan WNF_DELIVERY_DESCRIPTOR.


Tetapi fungsi-fungsi API tingkat rendah ini memiliki masalah (terima kasih kepada Gabi untuk menyelidikinya): setiap proses hanya dapat memiliki satu peristiwa yang terdaftar.



API Mode Pengguna Tingkat Tinggi (ntdll)


Ketika datang ke notifikasi, hal menjadi rumit, sehingga lapisan rtl dari ntdll.dll menyediakan antarmuka yang lebih sederhana:


 NTSTATUS RtlSubscribeWnfStateChangeNotification ( _Outptr_ PWNF_USER_SUBSCRIPTION* Subscription, _In_ WNF_STATE_NAME StateName, _In_ WNF_CHANGE_STAMP ChangeStamp, _In_ PWNF_USER_CALLBACK Callback, _In_opt_ PVOID CallbackContext, _In_opt_ PCWNF_TYPE_ID TypeId, _In_opt_ ULONG SerializationGroup, _In_opt_ ULONG Unknown ); 

Bahkan, tidak perlu memanggil layanan sistem secara langsung: cukup gunakan satu antrian kejadian yang didorong ntdll.dll.


Di belakang layar, konten WNF_DELIVERY_DESCRIPTOR dikonversi menjadi parameter panggilan balik:


 typedef NTSTATUS (*PWNF_USER_CALLBACK) ( _In_ WNF_STATE_NAME StateName, _In_ WNF_CHANGE_STAMP ChangeStamp, _In_opt_ PWNF_TYPE_ID TypeId, _In_opt_ PVOID CallbackContext, _In_ PVOID Buffer, _In_ ULONG BufferSize); 

Untuk setiap langganan baru, sebuah entri dibuat, yang ditempatkan dalam daftar yang ditunjukkan oleh variabel global RtlpWnfProcessSubscription. Daftar ini dibangun di salah satu bidang WNF_NAME_SUBSCRIPTION, yang bertipe LIST_ENTRY. Setiap WNF_NAME_SUBSCRIPTION, pada gilirannya, memiliki bidang LIST_ENTRY lain untuk mengatur daftar WNF_USER_SUBSCRIPTION dengan panggilan balik dan konteks.



API Level Kernel Tingkat Tinggi (Ex)


WNF juga menyediakan fungsi yang hampir identik untuk kode mode kernel (yang dapat digunakan dari driver): baik melalui panggilan sistem yang diekspor dan melalui fungsi API tingkat tinggi di runtime (Ex layer).


Fungsi ExSubscribeWnfStateChange menerima nama negara, mengetikkan topeng dan alamat fungsi panggil balik + konteks sebagai input, dan mengembalikan deskriptor berlangganan. Fungsi panggilan balik menerima nama target, mask acara, ganti label, tetapi bukan buffer atau ukurannya.


Fungsi ExQueryWnfStateData, berdasarkan keterangan langganan yang diteruskan, membaca data status saat ini. Bahkan, setiap panggilan balik akhirnya memanggil fungsi ExQueryWnfStateData untuk mendapatkan data yang terkait dengan pemberitahuan.


Untuk langganan mode kernel dan langganan mode pengguna, WNF (untuk melacak langganan) membuat instance dari struktur WNF_SUBSCRIPTION. Tetapi untuk mode pengguna, beberapa bidang tidak akan diisi, misalnya Callback dan Konteks, karena untuk mode pengguna, alamat penangan disimpan dan diproses oleh ntdll.dll.



Struktur Data WNF



Dari penerjemah : lihat bagian selanjutnya.



Utilitas Analisis WNF


Dari seorang penerjemah : di sini perlu diingat kembali bahwa presentasi dilakukan tidak hanya oleh Alex, tetapi juga oleh Gabrielle Viala . Secara khusus, kepengarangannya termasuk dalam modul WnfCom yang dijelaskan di bawah ini. Selain itu, Gabrielle menggambarkan struktur internal WNF dalam detail yang cukup (lihat ilustrasi di bagian sebelumnya). Sebagian besar slide-nya, sayangnya, tidak ada dalam pdf presentasi (ditunjukkan sebagai aslinya) atau diindikasikan secara eksklusif oleh judul. Tapi:



Dan dari penerjemah : Jika seseorang ingin melengkapi terjemahan saat ini dengan isi slide Gabrielle atau memperluas terjemahan steno dari bagian mana pun dari video pidato - selamat datang. Untuk kenyamanan menambahkan / mengubah potongan besar, saya dapat menerbitkan sumber terjemahan di github (atau server kontrol versi lain).



Wnfcom


WnfCom adalah modul python ( kode sumber github ) yang menunjukkan interoperabilitas melalui WNF. Fitur utama:


  • memungkinkan Anda membaca / menulis data dari instance instance yang ada
  • memungkinkan Anda membuat nama negara sementara (sebagai server )
  • memungkinkan Anda mendapatkan instance objek sisi klien yang akan memproses notifikasi tentang mengubah instance spesifik nama

Contoh penggunaan:


 >>> from wnfcomimport Wnfcom >>> wnfserver = Wnfcom() >>> wnfserver.CreateServer() [SERVER] StateNamecreated: 41c64e6da5559945 >>> wnfserver.Write(b"potatosoup") Encoded Name: 41c64e6da5559945, Clear Name: 6e99931 Version: 1, Permanent: No, Scope: Machine, Lifetime: Temporary, Unique: 56627 State update: 11 bytes written 

 >>> from wnfcomimport Wnfcom >>> wnfclient = Wnfcom() >>> wnfclient.SetStateName("41c64e6da5559945") >>> wnfclient.Listen() [CLIENT] Event registered: 440 [CLIENT] Timestamp: 0x1 Size: 0xb Data:00000000: 70 6F 74 61 74 6F 20 73 6F 75 70 potato soup 


Wnfdump


WnfDump adalah utilitas baris perintah yang ditulis dalam C. File yang dapat dieksekusi dapat ditemukan di https://github.com/ionescu007/wnfun dengan memilih subdirektori dari kedalaman bit yang diperlukan. Utilitas dapat digunakan untuk mencari informasi tentang nama negara WNF:


  • -d ( D ump) Dump semua nama negara WNF menggunakan enumerasi berbasis registri. Itu dapat dilengkapi dengan opsi:
    • -v ( V erbose) Output verbose yang mencakup dump heksadesimal data status WNF;
    • -s ( S ecurity) Deskriptor keamanan - string izin SDDL untuk nama status WNF.
  • -b ( B rute-force) Penghitungan langsung nama negara WNF sementara (lebih lanjut tentang ini di bawah ini)
  • -i ( I nformation) Menampilkan informasi tentang satu nama negara WNF yang ditentukan
  • -r ( R ead) Membaca data dari nama status WNF yang ditentukan
  • -w (Ritus) Tulis data ke nama status WNF yang ditentukan
  • -n ( N otifikasi) Daftarkan pelanggan pemberitahuan untuk nama status WNF yang ditentukan (selanjutnya kami akan memberikan kasus penggunaan yang lebih spesifik dengan Edge)


Permukaan serangan WNF


Bagian ini (lebih tepatnya, subbagiannya) akan membahas kemungkinan serangan dan data WNF sensitif yang menarik.



Pengungkapan Data Privileged


Membaca ribuan nama negara WNF yang ada dalam sistem, beberapa dapat dicatat, data yang terlihat sangat menarik. Di antara mereka ada beberapa yang datanya mencurigakan mirip dengan pointer atau data istimewa lainnya.


Setelah bermain di beberapa mesin, dalam beberapa kasus dimungkinkan untuk menemukan banyak, tumpukan, dan informasi istimewa lainnya yang diungkapkan melintasi batas-batas hak istimewa. Laporan bug / kerentanan dikirim ke MSRC pada bulan Juli, tetapi diperbaiki pada bulan November (setelah presentasi). Misalnya: 4 kilobyte tumpukan bocor melalui acara WNF_AUDC *!


Masalah utama adalah sama seperti yang kita lihat dalam penelitian sebelumnya dari j00ro, taviso, dan lainnya. Nama negara WNF tertentu berisi struktur data yang disandikan dengan berbagai masalah bantalan dan / atau perataan. Dalam beberapa kasus, kebocoran memori yang tidak diinisialisasi.
Dari penerjemah : terjemahan bagian pendahuluan dari dokumen Mendeteksi Pengungkapan Memori Kernel dengan x86 Emulation dan Taint Tracking dari Mateusz Jurczyk alias j00ro .



Penemuan nama negara dan izin


Pendekatan pertama adalah menemukan semua nama negara yang mungkin dapat dimanipulasi secara jahat. Untuk nama-nama terkenal, permanen, dan persisten, enumerasi layak dilakukan dengan menyebutkan kunci registri. Kemudian nilai yang ditemukan dapat dibandingkan dengan pengidentifikasi ramah (ada beberapa tempat di mana Anda dapat menemukannya :))


Kemudian kita juga dapat melihat deskriptor keamanan dalam registri (ini adalah hal pertama dalam buffer data). Deskriptor keamanan bukan kanonik: itu tidak memiliki pemilik dan grup, sehingga secara teknis tidak valid. Tetapi tidak ada masalah mengganti pemilik dan grup palsu untuk memperbaiki deskriptor keamanan.



Deteksi nama negara sementara dan izin mereka


Tetapi dengan nama sementara, trik yang dijelaskan di atas tidak akan berfungsi: mereka tidak ada dalam registri. Dan hanya kernel yang menyimpan struktur data untuk mereka (! Wnf) dalam memori. Tapi nama sementara sebenarnya tidak terlalu sulit untuk di paksa:


  • Versi selalu penting 1
  • Seumur hidup selalu berarti WnfT TemporaryStateName
  • Bendera permanen selalu dihapus (nama negara sementara tidak dapat memiliki data permanen)
  • Lingkup (lingkup) dapat mengambil salah satu dari 4 nilai

Ya, tetapi nomor urut yang tersisa adalah 51 bit! Memang ... tapi jangan lupa bahwa nomor seri tumbuh secara monoton. Dan untuk nama sementara, urutan diatur ulang ke 0 pada setiap boot. Secara konvensional, Anda dapat mengambil jendela sejuta nomor seri: dalam satu lingkaran, periksa keberadaan setiap nama (mulai dari 0) dengan menghubungi ZwQueryWnfStateNameInformation dengan kelas informasi yang diminta WnfInfoStateNameExist (mengingat bahwa kesalahan akses juga menunjukkan keberadaan nama). Jika satu juta nama lain tidak ada, maka Anda dapat menghentikan pencarian.


Deskriptor keamanan nama sementara (seperti data nama sementara lainnya) disimpan di kernel. Oleh karena itu, satu-satunya cara untuk meminta mereka adalah ekstensi! Wnf ketika men-debug mode kernel. Tapi kita bisa:


  • Buat kesimpulan tentang izin baca saat mencoba membaca data.
  • Untuk menyimpulkan bahwa perekaman diperbolehkan dengan mencoba menulis data. Tetapi perlu dipertimbangkan bahwa penulisan yang berhasil bahkan 0 byte menghancurkan data yang belum berhasil diperoleh konsumen nyata. Dan lagi, ada trik: kita bisa menerapkan stempel perubahan yang sesuai. Kami mencoba menulis dengan label 0xFFFFFFFF: label diperiksa setelah pemeriksaan akses, oleh karena itu, nilai kesalahan menghasilkan kebocoran izin menulis.

Ini tidak memberi kami deskriptor keamanan yang lengkap, tetapi dengan menjalankan kode dengan hak istimewa yang berbeda, kami bisa mendapatkan beberapa gagasan tentang pembatasan untuk akun sistem yang berbeda (Low IL / User / Admin / SYSTEM).



Daftar Pelanggan


Dalam struktur WNF_PROCESS_CONTEXT, salah satu bidang adalah kepala daftar (LIST_ENTRY) dari semua langganan proses ini. Setiap langganan adalah turunan terpisah dari WNF_SUBSCRIPTION.


Pelanggan mode-kernel terutama dimiliki oleh proses Sistem. Kita dapat menggunakan perintah! Daftar debugger untuk membuang penangan dan parameternya terdaftar dalam proses Sistem WNF_SUBSCRIPTION. Perlu dicatat bahwa dalam beberapa kasus, event aggregator (CEA.SYS) digunakan, yang menyembunyikan alamat panggilan balik yang sebenarnya dalam struktur konteksnya.


Kami dapat mengulangi pendekatan ini untuk proses mode pengguna, tetapi alamat Callback akan menjadi NULL, karena ini adalah pelanggan mode pengguna. Oleh karena itu, kita harus bergabung dengan ruang pengguna proses, mendapatkan tabel RtlpWnfProcessSubscription, dan kemudian membuang daftar instance WNF_USER_SUBSCRIPTION, yang masing-masing sudah berisi alamat Callback. Sayangnya, karakter ini statis, yang berarti tidak ada dalam karakter terbuka, tetapi dapat ditemukan dengan membongkar. Dan sekali lagi perlu diperhatikan (dengan analogi dengan mode kernel CEA.SYS) bahwa banyak penangan mode pengguna menggunakan agregator acara (EventAggregation.dll), yang menyimpan panggilan balik dalam konteksnya.



Nama negara WNF yang menarik dan sensitif


Bagian ini akan memberikan beberapa contoh menarik tentang bagaimana beberapa nama negara WNF mengungkapkan informasi sistem.



Menentukan status sistem dan perilaku pengguna menggunakan WNF


Beberapa pengidentifikasi WNF dapat digunakan untuk mendapatkan informasi tentang keadaan mesin yang menarik minat Anda:


  • WNF_WIFI_CONNECTION_STATUS - Status Nirkabel
  • WNF_BLTH_BLUETOOTH_STATUS - sama, tetapi untuk Bluetooth (juga WNF_TETH_TETHERING_STATE)
  • WNF_UBPM_POWER_SOURCE - menunjukkan sumber daya (baterai atau adaptor daya)
  • WNF_SEB_BATTERY_LEVEL - berisi level baterai
  • WNF_CELL_ * - pada Windows Phone berisi informasi tentang: jaringan, jumlah, kekuatan sinyal, EDGE atau 3G, ...

WNF :


  • WNF_AUDC_CAPTURE/RENDER β€” ( PID), /
  • WNF_TKBN_TOUCH_EVENT β€” ,
  • WNF_SEB_USER_PRESENT/WNF_SEB_USER_PRESENCE_CHANGED β€” Windows


API


, API , API , , /. WNF . , , WNF .


: WNF_SHEL_(DESKTOP)_APPLICATION_(STARTED/TERMINATED) modern- ( , ) DCOM, Win32. β€” ShellExecute: Explorer, cmd.exe, ...


, WNF API , :


  • WNF_SHEL_LOCKSCREEN_ACTIVE β€”
  • WNF_EDGE_LAST_NAVIGATED_HOST β€” URL, ( ) Edge

: Edge



WNF


WNF, . : WNF_FSRL_OPLOCK_BREAK β€” , (/), PID' !


WNF , . : WNF_SHEL_DDC_(WNS/SMS)_COMMAND – 4 , .


, WNF, . : WNF_CERT_FLUSH_CACHE_TRIGGER ( ), WNF_BOOT_MEMORY_PARTITIONS_RESTORE, WNF_RTDS_RPC_INTERFACE_TRIGGER_CHANGED, ...



WNF


:


  • WriteProcessMemory β€”
  • ( ) β€”
  • (Atom) β€”
  • β€” , WM_COPYDATA DDE,
  • GUI β€” ( ) ,

WNF :


  • WNF, (, )
  • Rtl/ZwQueryWnfStateData WNF

, :


  • APC s
  • (Remote Threads)
  • (Changing Thread Context)
  • " window long " β€” , ,

WNF_USER_SUBSCRIPTION ( WNF_NAME_SUBSCRIPTION, RtlpWnfProcessSubscriptions). ( CFG ), ( 5 6 ).


, : , , , -.




WNF SEB_, ( S ystem E vents B roker). SystemEventsBrokerServer.dll SystemEventsBrokerClient.dll API . , SEB SEB, .


CEA.SYS EventAggregation.dll. " " (Event Aggregation Library), , : , , WNF , . WNF, . .




: .






, Windows Notification Facility Alex' Gabrielle. ( ) redp .



WNF ( ) wincheck . , Gabrielle Viala , redp, : http://redplait.blogspot.com/search/label/wnf .




PoC ( github ) explorer ( β€” notepad). modexp : Callback WNF_USER_SUBSCRIPTION. :


  • explorer.exe
  • WNF_USER_SUBSCRIPTION
  • RWX- , WriteProcessMemory (, VirtualAllocEx + WriteProcessMemory)
  • WNF_USER_SUBSCRIPTION ( WriteProcessMemory)
  • ntdll!NtUpdateWnfStateData(...) ,
  • WNF_USER_SUBSCRIPTION

Source: https://habr.com/ru/post/id459626/


All Articles