CVE-2023-24941: Microsoft Ağ Dosya Sistem Açığı Nedir ?
CVE-2023-24941, Microsoft Ağ Dosya Sistemine yönelik bir Uzaktan Kod Yürütme (RCE) açığıdır
Bu açık, desteklenen Windows Server sürümlerini etkileyen kritik bir güvenlik açığıdır ve CVSSv3 skoru 9.8 olarak değerlendirilmiştir.
Bu açığın etkilenen bir sunucuda kötü niyetli bir saldırganın sistem düzeyinde ayrıcalıklar elde etmesine olanak tanıdığı belirtilmektedir.
Güvenlik Açığını İnceleyelim
Microsoft Windows, bazıları Windows olmayan dosya paylaşımlarıyla iletişim kurmak için kullanılabilen çeşitli ağ özellikleriyle birlikte gelir. Bu modüllerden biri de NFS'dir.
Ağ Dosya Sistemi (NFS), ilk olarak 1984 yılında Sun Microsystems tarafından geliştirilen bir ağ dosya sistemi protokolüdür. Sürüm 2, RFC 1094'te belgelenmiştir . Sürüm 3, RFC 1813'te belgelenmiştir . Sürüm 4, IETF tarafından geliştirilmiştir ve RFC 3010 (Aralık 2000'de yayımlanmıştır) ve RFC 3530'da belgelenmiştir.(Nisan 2003'te yayınlandı). NFS, kullanıcıların uzak dosya paylaşımlarına, yerel dosya sistemine erişildiği gibi erişmesine olanak tanır. Paylaşımda okuma-yazma ve salt okunur gibi farklı erişim düzeyleri ve izinler ayarlanabilir. Ayrıca IP/UID/GID/Kerberos güvenliği de kullanılabilir. NFS, kontrol mesajları alışverişinde bulunmak için Açık Ağ Bilgi İşlem (ONC) Uzaktan Prosedür Çağrısını (RPC) kullanır. ONC RPC orijinal olarak Sun Microsystems tarafından geliştirilmiştir, Sun RPC olarak da adlandırılabilir .
ONC RPC mesajları TCP üzerinden aktarıldığında, mesajların başına mesajın uzunluğunu belirten bir Parça başlık yapısı (aşağıdaki tabloda gösterildiği gibi) eklenir. Bu, alıcının tek bir TCP oturumu üzerinden gönderilen birden fazla mesajı ayırt etmesine olanak tanır. UDP gibi diğer protokoller bu alanı kullanmaz. Tüm çok baytlı değerlerin big-endian bayt sırasına göre kodlandığına dikkat edin.
NFS4 protokolünde bir utf8string aşağıdaki formatta aktarılır:
Kod:
Offset Size Description
--------- ----- ----------------------------------
0x0000 4 LEN
0x0004 LEN String data
Güvenlik açığı, sunucunun belleği yetersiz olduğunda utf8strings içeren gelen NFSv4.1 çağrıları işlenirken tetikleniyor. Bir sunucu alınan bir dizeyi ayrıştırırken, dize verilerini depolamak için bir arabellek ayrılır. Kod, ayırma başarısızlığını düzgün bir şekilde işlemez, bu da boş sonlandırma baytının hala geçersiz bir arabelleğin sonuna yazılmasına neden olur.
Kimliği doğrulanmamış uzak bir saldırgan, kurbanın Ağ Dosya Sistemi hizmetine hazırlanmış bir çağrı göndererek bu güvenlik açığından yararlanabilir. Bu güvenlik açığından başarıyla yararlanılması, uzaktan kod yürütülmesine neden olabilir.
Kaynak Kodu Çözümü
Aşağıdaki kod nfssvr.sys 10.0.17763.4252 sürümünden alınmıştır .
Kod:
**************************************************************
* FUNCTION *
**************************************************************
undefined __fastcall XdrDecodeString(longlong param_1, uint pa
undefined AL:1 <RETURN>
longlong RCX:8 param_1
uint EDX:4 param_2
void * R8:8 param_3
XdrDecodeString
1c001dfec MOV qword ptr [RSP + 0x8],RBX
1c001dff1 MOV qword ptr [RSP + 0x10],RSI
1c001dff6 PUSH RDI
1c001dff7 SUB RSP,0x20
1c001dffb CMP dword ptr [RCX + 0x108],0x0
1c001e002 MOV RSI,R8
1c001e005 MOV EDI,EDX
1c001e007 MOV RBX,RCX
1c001e00a JL LAB_1c001e091
1c001e010 MOV R9,qword ptr [RCX + 0x48]
1c001e014 TEST R9,R9
1c001e017 JNZ LAB_1c001e01d
1c001e019 XOR EAX,EAX
1c001e01b JMP LAB_1c001e040
LAB_1c001e01d
1c001e01d MOV EDX,dword ptr [R9 + 0x40]
1c001e021 SUB EDX,dword ptr [R9 + 0x38]
1c001e025 MOV R8D,dword ptr [R9 + 0x4c]
1c001e029 CMP R8D,EDX
1c001e02c JC LAB_1c001e035
1c001e02e MOV ECX,R8D
1c001e031 SUB ECX,EDX
1c001e033 JMP LAB_1c001e038
LAB_1c001e035
1c001e035 OR ECX,0xffffffff
LAB_1c001e038
1c001e038 XOR EAX,EAX
1c001e03a CMP R8D,EDX
1c001e03d CMOVNC EAX,ECX
LAB_1c001e040
1c001e040 CMP EAX,EDI
1c001e042 JC LAB_1c001e091
1c001e044 TEST R9,R9
1c001e047 JNZ LAB_1c001e04d
1c001e049 XOR EDX,EDX
1c001e04b JMP LAB_1c001e051
LAB_1c001e04d
1c001e04d MOV RDX,qword ptr [R9 + 0x40]
LAB_1c001e051
1c001e051 MOV R8,RDI
1c001e054 MOV RCX,RSI
1c001e057 CALL memcpy
1c001e05c MOV RAX,qword ptr [RBX + 0x48]
1c001e060 ADD qword ptr [RAX + 0x40],RDI
1c001e064 MOV RCX,qword ptr [RBX + 0x48]
1c001e068 TEST RCX,RCX
1c001e06b JNZ LAB_1c001e077
1c001e06d MOV R8,qword ptr [RCX + 0x40]
1c001e071 XOR EAX,EAX
1c001e073 XOR EDX,EDX
1c001e075 JMP LAB_1c001e082
LAB_1c001e077
1c001e077 MOV RDX,qword ptr [RCX + 0x40]
1c001e07b MOV RAX,qword ptr [RCX + 0x38]
1c001e07f MOV R8,RDX
LAB_1c001e082
1c001e082 SUB RAX,RDX
1c001e085 AND EAX,0x3
1c001e088 ADD RAX,R8
1c001e08b MOV qword ptr [RCX + 0x40],RAX
1c001e08f JMP LAB_1c001e09e
LAB_1c001e091
1c001e091 MOV R8,RSI
1c001e094 MOV EDX,EDI
1c001e096 MOV RCX,RBX
1c001e099 CALL XdrDecodeOpaqueSlow
LAB_1c001e09e
1c001e09e MOV byte ptr [RDI + RSI*0x1],0x0 ;Always writes null terminator
1c001e0a2 MOV RBX,qword ptr [RSP + 0x30]
1c001e0a7 MOV RSI,qword ptr [RSP + 0x38]
1c001e0ac ADD RSP,0x20
1c001e0b0 POP RDI
1c001e0b1 RET
Bu güvenlik açığından yararlanan bir saldırıyı tespit etmek için, tespit cihazının 2049/TCP ve 2049/UDP bağlantı noktalarındaki trafiği izlemesi ve ayrıştırması gerekir.
ONC RPC mesajları TCP üzerinden aktarıldığında, mesajların başına mesajın uzunluğunu belirten bir Parça başlık yapısı (yukarıdaki tabloda gösterildiği gibi) eklenir. Bu, alıcının tek bir TCP oturumu üzerinden gönderilen birden fazla mesajı ayırt etmesine olanak tanır. UDP gibi diğer protokoller bu alanı kullanmaz. Güvenlik açığı bulunan yöntem XdrDecodeString bu güvenlik açığını yalnızca adresinden çağrıldığında tetikleyebilir
güvenlik açığını yalnızca adresinden çağrıldığında tetikleyebilir Nfs4SvrXdrpDecode_STRING.
Aşağıdaki alanlar RFC 3530 kullanılarak ayrıştırılır ve RFC 3530'da Nfs4SvrXdrpDecode_STRING tanımlanır :
Kod:
OPEN4args.claim.file
OPEN4args.claim.delegate_cur_info.file
OPEN4args.claim.delegate_cur_info.file_delegate_prev
EXCHANGE_ID4args.eia_client_impl_id.nii_domain
EXCHANGE_ID4args.eia_client_impl_id.nii_name
RENAME4args.oldname
RENAME4args.newname
SECINFO4args.name
CREATE4args.objname
CREATE4args.linkdata
NFS4 mesajlarındaki yukarıdaki alanları izlemelidir. Herhangi bir geçerli alan değeri bu güvenlik açığını tetikleyebilir, ancak bir saldırgan, dize işleme sırasında başarısız tahsisin gerçekleşme olasılığını artırmak için büyük bir arabellek talep edebilir. Belirtilenden daha büyük dize uzunlukları 0x1000 şüpheli olarak değerlendirilmelidir. Bulunursa, bu güvenlik açığından yararlanan bir saldırının gerçekleştirilmesi muhtemeldir.
Bundan daha büyük dizelerin algılanmasının, 0x1000 dosya yolu dizelerinin izin verilen tipik sınırına dayandığını ve çeşitli sunucu yapılandırmalarını hesaba katacak şekilde daha yüksek veya daha düşük ayarlanabileceğini unutmayın.
CVE-2023-24941 Çözümü
Microsoft bu hatayı Mayıs ayında CVE-2023-24941 olarak düzeltti . Yazılarında, NFSv4.1'i devre dışı bırakmanın ve NFSv2 veya NFSv3'e düşürmenin bu güvenlik açığını geçici olarak azaltmak için kullanılabileceğini belirtiyorlar. Ancak, Mayıs 2022 Windows güvenlik güncelleştirmelerinden CVE-2022-26937'yi zaten yüklemediyseniz bu azaltıcı yöntemi kullanmamanız gerektiğini de belirtiyorlar . Daha iyi seçenek, bu güvenlik açığını tamamen ortadan kaldırmak için NFSv1'e yönelik en son yamayı test edip dağıtmaktır.
Konumu Okuduğun İçin Teşekkür Ederim.
Yararlandığım Kaynaklar:
1:zerodayınvıte Şirketi
2.trendmicro
3.ieft org
4.Microsoft