Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makalede, sürücülerin tehlikeye atılması riskini azaltmaya yardımcı olmak için sürücü geliştiricileri için bir sürücü güvenlik denetim listesi sağlanır. Sürücü güvenliği kritiktir ve güvenilirliği doğrudan etkiler. Windows yanlış bellek erişimi gerçekleştiğini algıladığında işletim sistemini kapatır ve mavi bir hata ekranı görüntüler. Windows iş ortağı olarak, başarısız bir sürücünün müşterilerimizin hayatı üzerindeki önemli etkisini azaltmak için çalışmanız gerekir.
Güvenli ve güvenilir bir sürücü sağlamanın avantajları hakkında daha fazla bilgi için bkz. Sürücü güvenlik kılavuzu.
Sürücü güvenliğine genel bakış
Güvenlik açığı, bir saldırganın yetkisiz erişim kazanmasını, sistemi işlemesini veya verilerin güvenliğini tehlikeye atmasını sağlayarak sistemin kilitlenmesine veya kullanılamaz duruma gelmesine neden olacak şekilde bir sürücünün arıza yapmasına neden olan herhangi bir kusurdur. Buna ek olarak, sürücü kodundaki güvenlik açıkları bir saldırganın çekirdek erişimi elde etmesine olanak tanıyarak işletim sisteminin tamamını tehlikeye atabilir.
Geliştiricilerin çoğu sürücüsü üzerinde çalışırken, kötü amaçlı bir saldırganın kodundaki güvenlik açıklarından yararlanmaya çalışıp çalışmayacağı yerine sürücünün düzgün çalışmasını sağlamaktır. Ancak bir sürücü serbest bırakıldıktan sonra saldırganlar güvenlik açıklarını araştırmayı ve belirlemeyi dener. Geliştiricilerin bu tür güvenlik açıklarının olasılığını en aza indirmek için tasarım ve uygulama aşamasında bu sorunları dikkate alması gerekir. Amaç, sürücü serbest bırakılmadan önce bilinen tüm güvenlik açıklarını ortadan kaldırmaktır.
Daha güvenli sürücüler oluşturmak için sistem mimarının (sürücüye yönelik olası tehditleri bilinçli olarak düşünme), kodu uygulayan geliştiricinin (açıklardan yararlanmaların kaynağı olabilecek ortak işlemleri savunmaya dayalı kodlama) ve test ekibinin (proaktif olarak zayıflık ve güvenlik açıklarını bulmaya çalışma) işbirliğine ihtiyacı vardır. Bu etkinliklerin tümünü düzgün bir şekilde koordine ederek sürücünün güvenliğini önemli ölçüde artırabilirsiniz.
Bir sürücünün saldırıya uğramasıyla ilgili sorunlardan kaçınmanın yanı sıra, çekirdek belleğinin daha hassas kullanımı gibi açıklanan adımların çoğu sürücünüzün güvenilirliğini artırır. Bu, destek maliyetlerini azaltır ve ürününüzle ilgili müşteri memnuniyetini artırır. Aşağıdaki denetim listesindeki görevleri tamamlamak, bu hedeflerin tümüne ulaşmaya yardımcı olacaktır.
Güvenlik denetim listesi:Bu konuların her birinde açıklanan güvenlik görevini tamamlayın.
Listede işaretlenmemiş bir onay kutusunu temsil eden güvenlik denetim öğesi. Bir çekirdek sürücüsünün gerekli olduğunu doğrulayın. 
Sürücü erişim denetimini yönetme
Güvenlik denetim listesindeki bir öğeyi temsil eden işaretsiz onay kutusu
. Yalnızca yazılım tabanlı sürücülere erişimi denetle.
İşaretsiz onay kutusu, güvenlik kontrol listesindeki bir öğeyi temsil eder. Sürücü güvenli kodlama yönergelerini izleyin.
İşaretsiz onay kutusu, güvenlik denetim listesindeki bir öğeyi temsil eder
HVCI uyumlu kodu uygulayın.
güvenlik kontrol listesindeki bir öğeyi temsil eden işaretsiz onay kutusu
teknolojiye özgü kod en iyi uygulamalarını takip et
güvenlik denetim listesindeki bir öğeyi temsil eden işaretsiz onay kutusu,
Sürücü kodunuza SAL ek açıklamaları ekleyin
işaretsiz onay kutusunu güvenlik denetim listesindeki bir öğeyi temsil eden
eş kod gözden geçirme yapma
güvenlik kontrol listesinde bir öğeyi temsil eden işaretsiz onay kutusu. Tehdit analizi gerçekleştir.
Güvenlik denetim listesindeki bir öğeyi temsil eden işaretlenmemiş onay kutusu. Sürücü kodunuzu kontrol etmek için CodeQL kullanın.
Güvenlik açıklarını denetlemek için Sürücü Doğrulayıcı kullanın.
Güvenlik denetim listesindeki işaretsiz bir onay kutusunu temsil eden bir öğe.
Donanım uyumluluk programı testleriyle kodu denetleyin
BinSkim ve SignTool gibi araçları kullanarak sürücülerin gönderilmeye hazır olduğunu kontrol edin
İşaretsiz onay kutusu, güvenlik denetim listesindeki bir öğeyi temsil eder
Sürücü kodunu üretim için imzalamayın.
Doğru sürüm sürücüsü imzalamayı yürüt ve sürücü paketinizi Windows Update kullanarak dağıt
güvenlik denetim listesindeki bir öğeyi temsil eden İşaretsiz onay kutusunu
Microsoft Savunmasız ve Kötü Amaçlı Sürücü Raporlama Merkezi kullanarak sürücülerin nasıl bildirildiği hakkında bilgi edinme
güvenlik denetim listesindeki bir öğeyi temsil eden İşaretsiz onay kutusunu
Güvenli kodlama kaynaklarını gözden geçirme
Güvenlik denetim listesindeki bir öğeyi temsil eden işaretsiz onay kutusu
Temel çıkarımların özetini gözden geçirin .
Çekirdek sürücüsünün gerekli olduğunu onaylayın
Güvenlik denetim listesi öğesi #1:Çekirdek sürücüsünün gerekli olduğunu ve Windows hizmeti veya uygulaması gibi daha düşük riskli bir yaklaşımın daha iyi bir seçenek olmadığını onaylayın.
Çekirdek sürücüleri, Windows çekirdeğinde yer alır ve çekirdekte yürütülürken bir sorun oluştuğunda, tüm işletim sistemini risk altına atar. Başka bir seçenek varsa, büyük olasılıkla daha düşük maliyetlidir ve yeni bir çekirdek sürücüsü oluşturmaktan daha az ilişkili riske sahiptir.
Yerleşik Windows sürücülerini kullanma hakkında daha fazla bilgi için bkz. Sürücü yazmanız gerekiyor mu?.
Arka plan görevlerini kullanma hakkında bilgi için bkz. Uygulamanızı arka plan görevleriyle destekleme.
Windows Hizmetleri'nin kullanımı hakkında bilgi için bkz. Services.
Sürücü çerçevelerini kullanma
Güvenlik denetim listesi öğesi #2:Kodunuzun boyutunu azaltmak ve güvenilirliğini ve güvenliğini artırmak için sürücü çerçevelerini kullanın.
Kodunuzun boyutunu küçültmek ve güvenilirliğini ve güvenliğini artırmak için Windows Sürücü Çerçeveleri'ni kullanın. Başlamak için WDF Kullanarak Sürücü Geliştirme konusunugözden geçirin. Düşük riskli Kullanıcı Modu Sürücü Çerçevesi 'ni (UMDF) kullanma hakkında bilgi için bkz. Sürücü modeli seçme.
Eski tarz Windows Sürücü Modeli (WDM) sürücüsü yazmak, daha fazla zaman alır, maliyetlidir ve sürücü çerçevelerindeki kullanılabilir kodu yeniden oluşturmayı gerektirir.
Windows Driver Framework (WDF) kaynak kodu açık kaynaktır ve GitHub'da kullanılabilir. Bu, Windows'ta gelen aynı WDF kaynak kodudur. Sürücü ile WDF arasındaki etkileşimleri takip ettiğinizde sürücünüzde daha etkili bir şekilde hata ayıklayabilirsiniz. https://github.com/Microsoft/Windows-Driver-Frameworksadresinden indirin.
DMF - Sürücü Modülü Çerçevesi
Sürücü projenizde Driver Module Framework(DMF) kullanmayı göz önünde bulundurun. Microsoft Surface ekibi tarafından geliştirilen DMF, DMF modülleri olarak adlandırılan WDF nesnelerinin oluşturulmasına olanak tanıyan bir çerçevedir. Bu DMF modüllerinin kodu farklı sürücüler arasında paylaşılabilir. Ayrıca DMF, sürücüler için geliştirilmiş bir DMF modülleri kitaplığı sağlar ve iş parçacığı ve G/Ç yönetimi gibi görevler için kod yeniden kullanımı sunar. DMF modülü, sürücü görevlerini daha küçük birimler halinde kapsüller. Her modül kendi içindedir ve kendi kodu, bağlamı ve geri çağırmaları vardır ve bu da yeniden kullanımı kolaylaştırır. Daha fazla bilgi için
Sürücü erişim denetimini yönetme
Güvenlik denetim listesi öğesi #3:Erişimi düzgün denetlediğinizden emin olmak için sürücünüzü gözden geçirin.
Sürücü erişim denetimini yönetme - WDF
Sürücülerin, kullanıcıların bilgisayarın cihazlarına ve dosyalarına uygunsuz şekilde erişmesini önlemek için çalışması gerekir. Cihazlara ve dosyalara yetkisiz erişimi önlemek için:
Cihaz nesnelerini yalnızca gerektiğinde adlandırabilirsiniz. Adlandırılmış cihaz nesneleri genellikle yalnızca eski nedenlerle gereklidir. Örneğin, cihazı belirli bir adla açmayı bekleyen bir uygulamanız varsa veya PNP olmayan bir cihaz/denetim cihazı kullanıyorsanız. WDF sürücülerinin WdfDeviceCreateSymbolicLink kullanarak sembolik bağlantı oluşturmak için PnP cihazına FDO adı vermeleri gerekmez.
Cihaz nesnelerine ve arabirimlerine güvenli erişim.
Uygulamaların veya diğer WDF sürücülerinin PnP cihaz PDO'nuza erişmesine izin vermek için cihaz arabirimlerini kullanmanız gerekir. Daha fazla bilgi için bkz. Cihaz Arabirimlerini Kullanma. Cihaz arabirimi, cihaz yığınınızın PDO'sunuza sembolik bir bağlantı görevi görür.
PDO'ya erişimi denetlemenin en iyi yollarından biri, INF'nizde bir SDDL dizesi belirtmektir. SDDL dizesi INF dosyasında değilse, Windows varsayılan bir güvenlik tanımlayıcısı uygular. Daha fazla bilgi için bkz. Cihaz Nesnelerinin Güvenliğini Sağlama ve SDDL for Device Objects.
Erişimi denetleme hakkında daha fazla bilgi için bkz:
KMDF Sürücülerinde Cihaz Erişimini Denetleme
Adlar, Güvenlik Tanımlayıcıları ve Cihaz Sınıfları - Cihaz Nesnelerini Erişilebilir Hale Getirme... ve GÜVENLİ Ocak Şubat 2017 tarihli OSRtarafından yayımlanan NT Insider Bülteni.
Sürücü erişim denetimini yönetme - WDM
WDM Sürücüsü ile çalışıyorsanız ve adlandırılmış bir cihaz nesnesi kullandıysanız , IoCreateDeviceSecure kullanabilir ve güvenliğini sağlamak için bir SDDL belirtebilirsiniz. IoCreateDeviceSecure uyguladığınızda her zaman DeviceClassGuid için özel bir sınıf GUID'i belirtin. Burada var olan bir sınıf GUID'sini belirtmeyin. Bunu yapmak, bu sınıfa ait diğer cihazlar için güvenlik ayarlarını veya uyumluluğu bozma potansiyeline sahiptir. Daha fazla bilgi için bkz. WdmlibIoCreateDeviceSecure
Daha fazla bilgi için bkz:
Cihaz Ad Alanı Erişimini Denetleme
sürücü geliştiricileri için
Güvenlik Tanımlayıcıları (SID) risk hiyerarşisi
Aşağıdaki bölümde, sürücü kodunda kullanılan ortak SID'lerin risk hiyerarşisi açıklanmaktadır. SDDL hakkında genel bilgi için bkz. SDDL for Device Objects, SID Stringsve SDDL String Syntax.
Daha düşük ayrıcalık arayanların çekirdeğe erişmesine izin verilirse kod riskinin artırıldığını anlamak önemlidir. Bu özet diyagramda, sürücü işlevselliğinize daha düşük ayrıcalıklı SID erişimine izin verdikçe risk artar.
SY (System)
\/
BA (Built-in Administrators)
\/
LS (Local Service)
\/
BU (Built-in User)
\/
AC (Application Container)
Genel en düşük ayrıcalık güvenlik ilkesini izleyerek, yalnızca sürücünüzün çalışması için gereken en düşük erişim düzeyini yapılandırın.
WDM Granüler IOCTL güvenlik denetimi
Windows'da IOCTL (Giriş/Çıkış Denetimi), cihaza özgü giriş/çıkış işlemleri için bir sistem çağrısıdır. IOCTL'ler, uygulamalar tarafından cihaz sürücüleriyle iletişim kurmak için kullanılır ve donanımdan komut göndermelerine veya bilgi istemelerine olanak tanır. Daha fazla bilgi için bkz. G/Ç Denetim Kodlarına Giriş ve Örnek G/Ç İsteği - Genel Bakış.
Kullanıcı modu arayanları IOCTL'leri gönderdiğinde güvenliği daha fazla yönetmek için sürücü kodu IoValidateDeviceIoControlAccess işlevini içerebilir. Bu işlev, bir sürücünün erişim haklarını denetlemesine olanak tanır. IOCTL aldıktan sonra, sürücü FILE_READ_ACCESS, FILE_WRITE_ACCESS veya her ikisini de belirterek IoValidateDeviceIoControlAccessçağırabilir.
Ayrıntılı IOCTL güvenlik denetimi uygulamak, daha önce açıklanan teknikleri kullanarak sürücü erişimini yönetme gereksiniminin yerini almaz.
Daha fazla bilgi için bkz. G/Ç Denetim Kodlarını Tanımlama ve G/Ç Denetim Kodları için Güvenlik Sorunları.
Yalnızca yazılım sürücülerine erişimi denetleme
Güvenlik denetim listesi öğesi #4:Yalnızca yazılım sürücüsü oluşturulacaksa ek erişim denetimi uygulanmalıdır.
Sadece yazılım tabanlı çekirdek sürücüleri, belirli donanım kimlikleriyle ilişkilendirilmek için tak çalıştır (PnP) kullanmaz ve herhangi bir bilgisayarda çalışabilir. Böyle bir sürücü, başlangıçta amaçlanandan farklı amaçlarla kullanılabilir ve bir saldırı vektörünün oluşturulmasını sağlayabilir.
Yalnızca yazılım çekirdek sürücüleri ek risk içerdiğinden, bunlar belirli donanımlarda çalıştırılacak şekilde sınırlandırılmalıdır; örneğin, bir PnP sürücüsünün oluşturulmasını etkinleştirmek için benzersiz bir PnP kimliği kullanmak veya belirli bir donanımın varlığı için SMBIOS tablosunu denetlemek.
Örneğin OEM Fabrikam'ın sistemleri için hız aşırtma yardımcı programı sağlayan bir sürücü dağıtmak istediğini düşünün. Eğer bu yalnızca yazılım sürücüsü, farklı bir OEM'den gelen bir sistemde çalıştırılırsa, sistemde dengesizlikler veya hasar ortaya çıkabilir. Fabrikam'ın sistemleri, Windows Update aracılığıyla da güncelleştirilebilir bir PnP sürücüsü oluşturulmasını sağlamak için benzersiz bir PnP kimliği içermelidir. Eğer bu mümkün değilse ve Fabrikam bir legacy sürücü yazarsa, bu sürücü, SMBIOS tablosunu inceleyerek hangi sistem üzerinde çalıştığını doğrulamak için alternatif bir yöntem bulmalıdır, özellikle herhangi bir özelliği etkinleştirmeden önce.
Sürücü güvenli kodlama yönergelerini izleyin
Güvenlik denetim listesi öğesi #5:Kodunuzu gözden geçirin ve bilinen kod güvenlik açıklarını kaldırın.
Güvenli sürücüler oluşturmanın temel etkinliği, kodda bilinen yazılım güvenlik açıklarını önlemek için değiştirilmesi gereken alanları belirlemektir. Bu bilinen yazılım güvenlik açıklarının çoğu, sürücünüzün kullandığı bellek konumlarının üzerine yazan veya başka bir şekilde tehlikeye atan diğer kişilerle ilgili sorunları önlemek için bellek kullanımını sıkı bir şekilde izlemekle ilgilenir.
CodeQL ve sürücüye özgü testler gibi kod tarama araçları, bu güvenlik açıklarının tümünü değil bazılarını bulmaya yardımcı olmak için kullanılabilir. Bu araçlar ve testler bu konunun ilerleyen bölümlerinde açıklanmıştır.
Bellek tamponları
Arabelleklerin istenen tüm verileri tutadığından emin olmak için her zaman giriş ve çıkış arabelleklerinin boyutlarını denetleyin. Daha fazla bilgi için, Arabellek Boyutunu Kontrol Etmeme Hatası'e bakın.
Çağırana geri döndürmeden önce tüm çıkış arabelleklerini uygun şekilde sıfırlarla başlatın. Daha fazla bilgi için bkz. Çıktı Arabelleklerini Başlatma Hatası.
Değişken uzunluklu tamponları doğrulayın. Daha fazla bilgi için bkz. Variable-Length Arabellekleri Doğrulama Hatası. Arabelleklerle çalışma ve arabelleğin adresini doğrulamak için ProbeForRead kullanma hakkında daha fazla bilgi için bkz. Arabellek İşleme.
IOCTL'lerle veri arabelleklerine erişmek için uygun yöntemi kullanın
Windows sürücüsünün birincil sorumluluklarından biri, kullanıcı modu uygulamalarıyla sistemin cihazları arasında veri aktarmaktır. Veri arabelleklerine erişmek için üç yöntem aşağıdaki tabloda gösterilmiştir.
| IOCTL (Giriş/Çıkış Kontrolü) Arabellek Türü | Özet | Daha fazla bilgi için |
|---|---|---|
| BUFFERED_YÖNTEM | Çoğu durumda önerilir | Tamponlu G/Ç Kullanma |
| METHOD_IN_DIRECT veya METHOD_OUT_DIRECT | Bazı yüksek hızlı donanım G/Ç'lerinde kullanılır | Doğrudan G/Ç Kullanarak |
| YÖNTEM_HİÇBİRİ | Mümkünse kaçının | Ne Arabelleğe Alınan Ne de Doğrudan G/Ç Kullanımı |
Genel olarak, en güvenli arabelleğe alma yöntemlerini sağladığı için arabelleğe alınan G/Ç önerilir. Ancak arabelleğe alınan G/Ç kullanırken bile azaltmanız gereken ekli işaretçiler gibi riskler vardır.
GÇTL'lerdeki arabelleklerle çalışma hakkında daha fazla bilgi için bkz. Veri Arabelleklerine Erişme Yöntemleri.
IOCTL tamponlu G/Ç kullanımında hatalar
IOCTL ile ilgili arabelleklerin boyutunu kontrol edin. Daha fazla bilgi için, Arabellek Boyutunu Kontrol Etmeme Hatası'e bakın.
Çıkış arabelleklerini düzgün bir şekilde başlatın. Daha fazla bilgi için bkz. Çıktı Arabelleğini Başlatma Hatası.
Değişken uzunluklu arabellekleri düzgün doğrulayın. Daha fazla bilgi için bkz. Variable-Length Arabellekleri Doğrulama Hatası.
Arabelleğe alınan G/Ç kullanırken, IO_STATUS_BLOCK yapısının Bilgileri alanında OutputBuffer için kesinlikle uygun uzunluğu döndürün. Uzunluğu bir OKUMA isteğinden doğrudan döndürmeyin. Örneğin, kullanıcı alanından döndürülen verilerin bir 4K tampon bellek olduğunu gösterdiği bir durumu düşünün. Sürücünün aslında yalnızca 200 bayt döndürmesi gerekiyorsa ama bunun yerine Bilgi alanında yalnızca 4K değerini döndürüyorsa, bilgilerin açığa çıkmasıyla ilgili bir güvenlik açığı oluştu. Bu sorun, Windows'un önceki sürümlerinde, G/Ç Yöneticisi tarafından Arabelleğe Alınan G/Ç için kullanılan arabelleğin sıfırlanmaması nedeniyle oluşmaktadır. Bu nedenle, kullanıcı uygulaması, ilk 200 bayt veriyi ve arabellekte bulunanlardan 4K-200 bayt kadarını geri alır (sayfa dışı havuz içeriği). Bu senaryo yalnızca IOCTL'ler ile değil, Arabelleğe Alınmış G/Ç'nin tüm kullanımlarıyla gerçekleşebilir.
IOCTL doğrudan G/Ç'de hatalar
Sıfır uzunluklu arabellekleri doğru şekilde işleyin. Daha fazla bilgi için bkz. Doğrudan G/Ç Hataları.
Kullanıcı alanı adreslerine başvuruda hatalar
Arabelleğe alınan G/Ç isteklerinde yer alan işaretçileri doğrulayın. Daha fazla bilgi için bkz. Kullanıcı Alanı Adreslerine Başvurma Hataları.
ProbeForRead gibi API'leri kullanarak, kullanıcı alanında herhangi bir adresi kullanmaya çalışmadan önce doğrulayın.
Sürücü kodu belleği doğru şekilde kullanmalıdır
Tüm sürücü havuzu ayırmaları yürütülebilir olmayan (NX) havuzda olmalıdır. NX bellek havuzlarının kullanılması, sayfasız yürütülebilir (NP) havuzlardan daha güvenlidir ve taşma saldırılarına karşı daha iyi koruma sağlar.
Sürücülerin HVCI sanallaştırmasını desteklemesine izin vermek için ek bellek gereksinimleri vardır. Daha fazla bilgi için bu makalenin devamında yer alan HVCI uyumlu kodu uygulama bölümüne bakın.
TOCTOU güvenlik açıkları
Doğrudan G/Ç (IOCTL'ler veya Okuma/Yazma için) kullanılırken kontrol zamanından kullanma zamanına (TOCTOU) yönelik olası bir güvenlik açığı vardır. Sürücü kullanıcı veri arabelleğine erişirken kullanıcı uygulamasının aynı veri arabelleğine aynı anda erişebileceğini unutmayın.
Bu riski yönetmek için, kullanıcı veri arabelleğinden doğrulanması gereken parametreleri yığın veya havuz gibi yalnızca çekirdek modundan erişilebilen belleğe kopyalayın. Ardından, verilere kullanıcı uygulaması tarafından erişilemedikten sonra, geçirilen verileri doğrulayın ve üzerinde çalışın.
MSR modele özgü yazmaç okuma ve yazma işlemleri
Modele özgü yazmaçlara erişmek için __readmsr ve __writemsr gibi derleyici intrinsikleri kullanılabilir. Bu erişim gerekiyorsa, sürücü her zaman okunacak veya yazılacak kaydın beklenen dizin veya aralıkla kısıtlandığını denetlemelidir.
Daha fazla bilgi ve kod örnekleri için bkz. MSR okuma/yazma yeteneği sağlamaçekirdek modu sürücülerinde yüksek ayrıcalıklı davranışı kısıtlamaya yönelik en iyi yöntemler.
Kollar
- Kullanıcı modu ile çekirdek modu belleği arasında aktarılmış tanıtıcıları doğrulayın. Daha fazla bilgi için bkz. Handle Management ve Failure to Validate Object Handles.
Cihaz nesneleri
Cihaz nesnelerinin güvenliğini sağlama. Daha fazla bilgi için bkz. Cihaz Nesnelerinin Güvenliğini Sağlama.
Cihaz nesnelerini doğrulayın. Daha fazla bilgi için bkz. Cihaz Nesnelerini Doğrulama Hatası.
Entegre Kaynak Planları
Windows G/Ç İstek Paketleri (IRP' ler), işletim sistemi ve çekirdek modu sürücüleri arasında G/Ç isteklerini iletmek için kullanılır ve paketteki tüm gerekli bilgileri kapsüller. IRP'ler zaman uyumsuz veri aktarımını, eşitlemeyi ve hata işlemeyi kolaylaştırarak donanım cihazlarıyla verimli ve güvenilir iletişim sağlar. Daha fazla bilgi için bkz. G/Ç İstek Paketleri ve Windows G/Ç ModeliGenel Bakış.
WDF ve IRP'ler
WDF kullanmanın avantajlarından biri, WDF sürücülerinin genellikle IRP'lere doğrudan erişmez olmasıdır. Örneğin, çerçeve okuma, yazma ve cihaz G/Ç denetim işlemlerini temsil eden WDM IRP'lerini, KMDF/UMDF'nin G/Ç kuyruklarında aldığı çerçeve isteği nesnelerine dönüştürür. Mümkün olduğunda WDF kullanılması kesinlikle önerilir.
WDM sürücüsü yazmanız gerekiyorsa aşağıdaki kılavuzu gözden geçirin.
IRP G/Ç arabelleklerini düzgün yönetme
IRP giriş değerlerini doğrulamayı kapsayan şu konuları gözden geçirin:
DispatchReadWrite Kullanarak Arabelleğe Alınan G/Ç
Arabelleğe Alınan G/Ç Hataları
Doğrudan G/Ç Kullanarak DispatchReadWrite
IRP ile ilişkili, arabellek adresleri ve uzunlukları gibi değerleri doğrulayın.
Hiçbiri G/Ç kullanmayı seçtiyseniz, Okuma ve Yazma, Arabelleğe Alınan G/Ç ve Doğrudan G/Ç'den farklı olarak, Hiçbiri G/Ç IOCTL kullanırken arabellek işaretçilerinin ve uzunluklarının G/Ç Yöneticisi tarafından doğrulanmadığını unutmayın.
IRP tamamlama işlemlerini düzgün işleme
Bir sürücü, IRP'yi gerçekten desteklemediği ve işlemediği sürece durum değeri STATUS_SUCCESS olan bir IRP'yi asla tamamlamamalıdır. IRP tamamlama işlemlerini işlemenin doğru yolları hakkında bilgi için bkz. IRP'leri tamamlama.
Sürücü IRP bekleme durumunu yönet.
Sürücü, IRP'yi kaydetmeden önce bekleyen IRP'yi işaretlemeli ve IoMarkIrpPending çağrısını ve atamayı birbirine bağlı bir diziye eklemeyi düşünmelidir. Daha fazla bilgi için, bkz. Sürücünün Durumunu Kontrol Etme Hatası ve Bir Cihaz Duraklatıldığında Gelen IRP'leri Tutma.
IRP iptal işlemlerini düzgün şekilde işleme
genellikle zaman uyumsuz olarak yürütürler çünkü iptal işlemlerinin düzgün kodlanması zor olabilir. Bu kod genellikle çalışan bir sistemde sık sık yürütülmediğinden iptal işlemlerini işleyen koddaki sorunlar uzun bir süre boyunca gözden kaçabilir. IRP'leri İptal Etmealtında sağlanan tüm bilgileri okuduğunuzdan ve anladığınızdan emin olun. IRP İptal Eşitlemesi ve IRP'leri İptal Ederken Dikkate Alınacak Noktalar üzerine özellikle dikkat edin.
İptal işlemleriyle ilişkili eşitleme sorunlarını en aza indirmenin önerilen yollarından biri,
IRP temizleme ve kapatma işlemlerini düzgün şekilde yapın.
IRP_MJ_CLEANUP ve IRP_MJ_CLOSE istekleri arasındaki farkı anladığınızdan emin olun. Temizleme istekleri, bir uygulama bir dosya nesnesi üzerindeki tüm tanıtıcıları kapattıktan sonra, ancak bazen tüm Girdi/Çıktı istekleri tamamlanmadan gelir. Dosya nesnesi için tüm G/Ç istekleri tamamlandıktan veya iptal edildikten sonra kapanış istekleri gelir. Daha fazla bilgi için aşağıdakilere bakın:
DispatchCreate, DispatchClose ve DispatchCreateClose Yordamları
Temizleme ve Kapatma İşlemlerini Yönetirken Hataları
IRP'leri doğru işlemek hakkında ayrıntılı bilgi için bkz. IRP'leri İşlemede Ek Hatalar.
Güvenli işlevleri kullanma
Güvenli dize işlevlerini kullanın. Daha fazla bilgi için bkz. Güvenli Dize İşlevlerini Kullanma.
Güvenli aritmetik işlevleri kullanın. Daha fazla bilgi için bkz. Güvenli Tamsayı Kitaplığı Rutinleri.
Güvenli dönüştürme işlevlerini kullanın. Daha fazla bilgi için bkz. Kernel-Mode Güvenli Tamsayı İşlevlerinin özeti.
Diğer güvenlik sorunları
Yarış durumlarını önlemek için bir kilit veya birbiri ardına kilitlenmiş bir dizi kullanın. Daha fazla bilgi için bkz. Çok İşlemcili Ortamda hatalar.
Yükleme veya kullanım sırasında sürücü veya ilişkili yazılım paketleri tarafından hiçbir ağ Aktarım Sürücüsü Arabirimi (TDI) filtresinin veya Katmanlı Hizmet Sağlayıcısının (LSP) yüklenmediğinden emin olun. Bunun yerine Windows Filtreleme Platformu (WFP) gibi modern API'leri kullanın.
Ek kod güvenlik açıkları
Burada ele alınan olası güvenlik açıklarına ek olarak, bu makale çekirdek mod sürücü kodunun güvenliğini artırmaya yönelik ek bilgiler sağlamaktadır: Güvenilir Kernel-Mode Sürücüleroluşturma.
C ve C++ güvenli kodlaması hakkında ek bilgi için bu makalenin sonundaki Güvenli kodlama kaynakları
HVCI uyumlu kod uygulama
Güvenlik denetim listesi öğesi #6:Sürücünüzün HVCI uyumlu olması için bellek kullandığını doğrulayın.
Bellek bütünlüğü ve HVCI uyumluluğu
Hiper yönetici korumalı Kod Bütünlüğü (HVCI) olarak da bilinen bellek bütünlüğü, kod bütünlüğü (CI) karar alma işlevini işletim sisteminin geri kalanından yalıtmak için donanım teknolojisini ve sanallaştırmayı kullanır. CI'yi yalıtmak için sanallaştırma tabanlı güvenlik kullanılırken çekirdek belleğinin yürütülebilir hale gelmesinin tek yolu CI doğrulamasıdır. Bu, çekirdek bellek sayfalarının hiçbir zaman Yazılabilir ve Yürütülebilir (W+X) olamayacağı ve yürütülebilir kodun doğrudan değiştirilemeyeceği anlamına gelir.
HVCI uyumlu kod uygulamak için sürücü kodunuzun aşağıdakileri yaptığınızdan emin olun:
- Varsayılan olarak NX'e katılır.
- Bellek ayırma için NX API'lerini/bayraklarını kullanır (NonPagedPoolNx).
- Hem yazılabilir hem de yürütülebilir bölümleri kullanmaz.
- Yürütülebilir sistem belleğini doğrudan değiştirmeye çalışmaz.
- Çekirdekte dinamik kod kullanmaz.
- Veri dosyalarını yürütülebilir olarak yüklemez.
- Bölüm hizalaması, 0x1000 (PAGE_SIZE) katlarıdır. Örneğin, DRIVER_ALIGNMENT=0x1000.
Aracı kullanma ve uyumsuz bellek çağrılarının listesi hakkında daha fazla bilgi için bkz. HVCI uyumlu kod uygulama.
İlgili sistem temelleri güvenlik testi hakkında daha fazla bilgi için Hiper Yönetici Kod Bütünlüğü Hazırlık Testi ve Hypervisor-Protected Kod Bütünlüğü (HVCI)bölümüne bakın.
Cihaz yükleme güvenliğini geliştirme
Güvenlik denetim listesi öğesi #7:En iyi yöntemleri izlediğinize emin olmak için Sürücü bilgileri oluşturma ve yükleme kılavuzlarını gözden geçirin.
Sürücü paketinizi yükleyen kodu oluşturduğunuzda, cihazınızın yüklenmesinin her zaman güvenli bir şekilde gerçekleştirildiğinden emin olmanız gerekir. Güvenli bir cihaz yüklemesi, aşağıdakileri yapar:
- Cihaza ve cihaz arabirimi sınıflarına erişimi sınırlar
- Cihaz için oluşturulan sürücü hizmetlerine erişimi sınırlar
- Sürücü dosyalarını değişiklik veya silmeye karşı korur
- Cihazın kayıt defteri girişlerine erişimi sınırlar
- Cihazın WMI sınıflarına erişimi sınırlar
- SetupAPI işlevlerini doğru kullanır
Daha fazla bilgi için aşağıdakilere bakın:
Güvenli Cihaz Yüklemeleri Oluşturma
SetupAPI Kullanımı İçin Yönergeler
Cihaz Yükleme İşlevlerini Kullanma
Cihaz ve Sürücü Yükleme gelişmiş konuları
Teknolojiye özgü kod en iyi yöntemlerini izleyin
Güvenlik denetim listesi öğesi #8:Sürücünüz için aşağıdaki teknolojiye özgü kılavuzu gözden geçirin.
Dosya Sistemleri
Dosya sistemi sürücü güvenliği hakkında daha fazla bilgi için aşağıdakilere bakın:
Dosya Sistemleri Güvenliğine Giriş
Dosya Sistemi Güvenlik Sorunları
Dosya Sistemleri için
Diğer Dosya Sistemi Filtre Sürücüleriyle Birlikte Bulunma
Microsoft Virüs Girişimi
Microsoft Virüs Girişimi (MVI), kuruluşların müşterilerimizin güvende kalmaları için güvenen güvenlik çözümlerini geliştirmelerine yardımcı olur. Microsoft, mükemmel performans, güvenilirlik ve uyumlulukla daha iyi bir şekilde bir araya gelen deneyimleri desteklemek için araçlar, kaynaklar ve bilgiler sağlar. Microsoft, ortak müşterilerimizin güvenliğini ve dayanıklılığını desteklemek üzere Güvenli Dağıtım Uygulamaları'nı (SDP) tanımlamak ve izlemek için MVI iş ortaklarıyla birlikte çalışır.
Virüsten koruma satıcısıysanız, yazılım dağıtımı hakkında daha fazla yardım için MVI'ye katılmayı öğrenmek için bkz. Microsoft Virus Initiative
NDIS - Ağ İletişimi
NDIS sürücü güvenliği hakkında bilgi için bkz. Ağ Sürücüleri için Güvenlik Sorunları.
Yazıcı
Yazıcı sürücüsü güvenliğiyle ilgili bilgi için bkz. V4 Yazıcı Sürücüsü Güvenlik Konuları.
Windows Görüntü Alma (WIA) Sürücüleri için Güvenlik Sorunları
WIA güvenliği hakkında bilgi için bkz. Windows Görüntü Alma (WIA) Sürücüleri için Güvenlik Sorunları.
Sürücü kodunuza SAL ek açıklamaları ekleyin
Güvenlik denetim listesi öğesi #9:Sürücü kodunuza SAL ek açıklamaları ekleyin.
Kaynak kodu ek açıklama dili (SAL), bir işlevin parametrelerini nasıl kullandığını, bunlar hakkında yaptığı varsayımları ve tamamlandığında yaptığı garantileri açıklamak için kullanabileceğiniz bir dizi ek açıklama sağlar. Ek açıklamalar sal.hüst bilgi dosyasında tanımlanır. C++ için Visual Studio kod analizi, işlevlerin analizini değiştirmek için SAL ek açıklamalarını kullanır. Windows sürücü geliştirmesi için SAL 2.0 hakkında daha fazla bilgi için bkz. SAL 2.0 Windows Sürücüleri için Ek Açıklamalar ve C/C++ Kod Hatalarını Azaltmak için SAL Ek Açıklamalarını Kullanma .
SAL hakkında genel bilgi için OSR'den edinilebilen bu makaleye bakın. SAL Ek Açıklamaları: Benden Nefret Etmeyin Çünkü Ben Güzelim
Kod üzerinde eş incelemesi yapmak
Güvenlik denetim listesi öğesi #10:Diğer araçlar ve işlemler tarafından ortaya çıkarılmayan sorunları aramak için eş kod incelemesi gerçekleştirin
Atlamış olabileceğiniz sorunları aramak için bilgili kod gözden geçirenleri arayın. İkinci bir göz kümesi genellikle gözden kaçırmış olabileceğiniz sorunları görür.
Kodunuzu dahili olarak gözden geçirmek için uygun personeliniz yoksa, bu amaçla dışarıdan yardım almayı göz önünde bulundurun.
Tehdit analizi gerçekleştirme
Güvenlik denetim listesi öğesi #11:Var olan bir sürücü tehdit modelini değiştirin veya sürücünüz için özel bir tehdit modeli oluşturun.
Güvenliği göz önünde bulundurarak yaygın bir yöntem, mümkün olan saldırı türlerini açıklamaya çalışan belirli tehdit modelleri oluşturmaktır. Bu teknik, bir sürücü tasarlarken kullanışlıdır çünkü geliştiriciyi önceden bir sürücüye karşı olası saldırı vektörlerini göz önünde bulundurmaya zorlar. Bir sürücü geliştirici, olası tehditleri belirledikten sonra, sürücü bileşeninin genel güvenliğini güçlendirmek için bu tehditlere karşı savunma araçlarını göz önünde bulundurabilir.
Sürücüler için basit bir tehdit modeli oluşturma yönergeleri için bkz. Sürücüler için tehdit modelleme. Makale, sürücünüz için başlangıç noktası olarak kullanabileceğiniz örnek bir sürücü tehdit modeli diyagramı sağlar.
Güvenlik Geliştirme Yaşam Döngüsü (SDL) en iyi yöntemleri ve ilişkili araçlar, ürünlerinin güvenliğini artırmak için IHD'ler ve OEM'ler tarafından kullanılabilir. Daha fazla bilgi için bkz.OEM'ler için SDL önerileri
Sürücü kodunuzu denetlemek için CodeQL kullanma
Güvenlik denetim listesi öğesi #12:Sürücü kodunuzdaki güvenlik açıklarını denetlemek için CodeQL kullanın.
GitHub tarafından kullanılan CodeQL, anlamsal bir kod analiz altyapısıdır ve güçlü bir platformla birlikte kapsamlı bir güvenlik sorguları paketinin birleşimi, sürücü kodunun güvenliğini sağlamak için onu değerli bir araç haline getirir. Daha fazla bilgi için bkz. CodeQL ve Statik Araçlar Logo Testi.
Güvenlik açıklarını denetlemek için Sürücü Doğrulayıcı'sını kullanma
Güvenlik denetim listesi öğesi #13:Sürücü kodunuzdaki güvenlik açıklarını denetlemek için Sürücü Doğrulayıcı'ya tıklayın.
Sürücü Doğrulayıcı, sürücünün Windows işletim sistemiyle doğru etkileşim kurup kurmadığını belirlemek için bir dizi arabirim kuralı ve işletim sistemi modeli kullanır. Sürücü Doğrulayıcı, sürücü kodunda sürücülerdeki olası hataları işaret edebilecek hataları bulur.
Sürücü Doğrulayıcı, sürücünün canlı test edilmesini sağlar. Sürücü Doğrulayıcı, sistemi bozabilecek geçersiz işlev çağrılarını veya eylemleri algılamak için Windows çekirdek modu sürücülerini ve grafik sürücülerini izler. Ekli hata ayıklayıcı, işletim sistemi ve sürücü kodu yürütmenin gerçek zamanlı olarak görüntülenmesine olanak tanır. Sürücü Doğrulayıcı, yanlış davranışlar bulmak için Windows sürücülerini çeşitli streslere ve testlere tabi tutulabilir. Daha fazla bilgi için bkz. sürücü doğrulayıcı
Sürücü Doğrulayıcı hem WDM hem de KMDF sürücüleriyle çalışır. Denetleyebileceği özelliklerin ayrıntıları için aşağıdaki konulara bakın.
Sürücü Doğrulayıcı'nın çalışabileceği sürücüler hakkında daha fazla bilgi için bkz.
- NDIS Sürücüleri için
Kuralları - Storport Sürücüleri için Kurallar
- Ses Sürücüleri İçin Kurallar
- AVStream Sürücüleri için Kurallar
Sürücü Doğrulayıcı'yı tanımak için örnek sürücülerden birini kullanabilirsiniz (örneğin, öne çıkan tost makinesi örneği: https://github.com/Microsoft/Windows-driver-samples/tree/main/general/toaster/toastDrv/kmdf/func/featured).
Donanım uyumluluk programı testleriyle kodu denetleme
Güvenlik denetim listesi öğesi #14:Güvenlik sorunlarını denetlemek için güvenlikle ilgili donanım uyumluluk programı testlerini kullanın.
Donanım uyumluluk programı, kod güvenlik açıklarını aramak için kullanabileceğiniz güvenlikle ilgili testleri içerir. Windows Donanım Uyumluluk Programı, Windows Donanım Laboratuvar Seti'ndeki (HLK) testlerden yararlanır. HLK Cihaz Temelleri testleri, komut satırında sürücü kodunu çalıştırmak ve zayıf noktaları belirlemek için kullanılabilir. Cihaz temel testleri ve donanım uyumluluk programı hakkında genel bilgi için bkz. Windows Hardware Lab Kit.
Aşağıdaki testler, kod güvenlik açıklarıyla ilişkili bazı davranışlar için sürücü kodunu denetlemek için yararlı olabilecek test örnekleridir:
DF - Fuzz rastgele IOCTL testi (Güvenilirlik)
DF - Fuzz alt açılım testi (Güvenilirlik)
DF - Fuzz sıfır uzunluklu arabellek FSCTL testi (Güvenilirlik)
DF - Rasgele FSCTL Fuzz testi (Güvenilirlik)
DF - Fuzz Misc API testi (Güvenilirlik)
Ayrıca, Sürücü Doğrulayıcı ile birlikte gelen Çekirdek senkronizasyon gecikmesi fuzzing de kullanabilirsiniz.
CHAOS (Eşzamanlı Donanım ve İşletim Sistemi) testleri çeşitli PnP sürücü testleri, cihaz sürücüsü fuzz testleri ve güç sistemi testlerini eşzamanlı olarak çalıştırır. Daha fazla bilgi için bkz. CHAOS Testleri (Cihaz TemelLeri).
Cihaz Temelleri Sızma testleri, güvenlik testinin kritik bir bileşeni olan çeşitli giriş saldırıları biçimleri gerçekleştirir. Saldırı ve Sızma testi, yazılım arabirimlerindeki güvenlik açıklarını belirlemeye yardımcı olabilir. Daha fazla bilgi için bkz. Sızma Testleri (Cihaz TemelLeri).
Sürücünüzün HVCI uyumlu olduğunu doğrulamak için, bu makalede açıklanan diğer araçlarla birlikte Device Guard - Uyumluluk Testikullanın.
Özel ve etki alanına özgü test araçları
Özel etki alanına özgü güvenlik testlerinin geliştirilmesini göz önünde bulundurun. Ek testler geliştirmek için, yazılımın özgün tasarımcılarının yanı sıra geliştirilmekte olan belirli sürücü türüyle ilgili olmayan geliştirme kaynaklarının yanı sıra güvenlik izinsiz giriş analizi ve önleme konusunda bilgi sahibi olan bir veya daha fazla kişiden bilgi alın.
BinSkim ve SignTool gibi araçlarla sürücüleri göndermeye hazır olup olmadığını denetleyin
Güvenlik denetim listesi öğesi #15:İş ortağı merkezine yüklenmeden önce Derlenmiş kodu BinSkim ve SignTool gibi araçlarla denetleyin.
Windows Update kullanılarak dağıtılacak iş ortağı merkezine yüklenmeden önce derlenmiş kodu denetlemek üzere ikili dosyaları incelemek için BinSkim ve SignTool gibi araçları kullanın. Derlenmiş ikili dosyaları dağıtım için gönderilmeden önce denetlemek için araçlara sahip olmak, başka bir koruma katmanı ekler.
BinSkim
BinSkim, ikiliyi savunmasız hale getirebilecek kodlama ve oluşturma uygulamalarını tanımlayabilir. BinSkim şu değerleri denetler:
- Eski derleyici araç kümelerinin kullanımı - mevcut derleyici seviyesini ve işletim sistemi tarafından sağlanan güvenlik azaltmalarını en iyi şekilde kullanmak için binariler, mümkün olan her yerde en son derleyici araç kümeleri ile derlenmelidir.
- Güvenli olmayan derleme ayarları - İkili dosyalar, işletim sistemi tarafından sağlanan güvenlik azaltmalarını etkinleştirmek, derleyici hatalarını ve eyleme dönüştürülebilir uyarıları raporlamayı en üst düzeye çıkarmak için mümkün olan en güvenli ayarlarla derlenmelidir.
- İmzalama sorunları - İmzalı ikili dosyalar şifreleme açısından güçlü algoritmalarla imzalanmalıdır.
BinSkim açık kaynak bir araçtır ve Statik Çözümleme Sonuçları Değişim Biçimi (SARIF) biçimini kullanan çıkış dosyaları oluşturur. BinSkim, eski BinScope aracının yerini alır.
BinSkim hakkında daha fazla bilgi için bkz. Binarileri denetlemek için BinSkim kullanma ve BinSkim Kullanıcı Kılavuzu.
SignTool
Sürüm imzalı sürücü dosyalarını denetlemek için SignTool'u kullanın. Daha fazla bilgi için, bkz. Release-Signed Sürücü Dosyasının İmzasını Doğrulama ve Ticari Sürüm Sertifikasıile imzalanan Katalog Dosyasının İmzasını Doğrulama.
Üretim ortamında imzalama testi kodu üretmeyin
Güvenlik denetim listesi öğesi #16:Geliştirme, test ve üretim aşamalarında çekirdek sürücü kodlarını üretim kodu olarak imzalamayın.
Geliştirme, test veya üretim için kullanılan çekirdek sürücü kodu, güvenlik riski oluşturan tehlikeli özellikler içerebilir. Bu tehlikeli kod hiçbir zaman Windows tarafından güvenilen bir sertifikayla imzalanmamalıdır. Tehlikeli sürücü kodunu yürütmek için doğru mekanizma UEFI Güvenli Önyüklemesini devre dışı bırakmak, BCD "TESTSIGNING" özelliğini etkinleştirmek ve güvenilmeyen bir sertifika (örneğin, makecert.exetarafından oluşturulan) kullanarak geliştirme, test ve üretim kodunu imzalamaktır.
Güvenilir bir Yazılım Yayımcıları Sertifikası (SPC) veya Windows Donanım Kalite Laboratuvarları (WHQL) imzası tarafından imzalanan kod, Windows kod bütünlüğünün ve güvenlik teknolojilerinin atılmasını kolaylaştırmamalıdır. Güvenilir bir SPC veya WHQL imzası tarafından kodun imzalanmasından önce, öncelikle Güvenilir Kernel-Mode Sürücüleri Oluşturmayönergeleriyle uyumlu olduğundan emin olun. Ayrıca kod, aşağıda açıklanan tehlikeli davranışlar içermemelidir.
Tehlikeli davranış örnekleri şunlardır:
- Rastgele çekirdek, fiziksel veya cihaz belleğini kullanıcı moduna eşleme olanağı sağlama.
- Bağlantı noktası girişi/çıkışı (G/Ç) dahil olmak üzere rastgele çekirdek, fiziksel veya cihaz belleği okuma veya yazma olanağı sağlar.
- Windows erişim denetimini atlayan depolamaya erişim sağlama.
- Sürücünün yönetmek üzere tasarlanmadığı donanım veya üretici yazılımını değiştirme olanağı sağlama.
Windows Update'i kullanarak uygun sürüm sürücüsü imzalamayı yürüt ve sürücü paketinizi dağıt
Güvenlik denetim listesi öğesi #17:Windows Update aracılığıyla imzalanacak ve dağıtılacak sürücü paketinizi göndermek için Windows iş ortağı portalını kullanın.
Bir sürücü paketini genel kullanıma sunmadan önce, paketi sertifikasyon için gönderirsiniz. Daha fazla bilgi için bkz. Performans ve uyumluluk testi ve Donanım programını kullanmaya başlama.
Sürücü paketlerinin dağıtımı için Windows Update'in kullanılması kesinlikle önerilir. Windows Update, sürücü güncelleştirmeleri sunmak için kullanılması gereken sağlam, güvenli, küresel olarak ölçeklendirilmiş ve mevzuata uygun bir dağıtım sistemi sağlar. Daha fazla bilgi için bkz. Sürücü paketini dağıtma.
Windows Donanımı için
Güvenli yazılım dağıtım uygulamalarının açıklaması için CISA Güvenli Yazılım Dağıtımı: Yazılım Üreticileri Müşteriler için Güvenilirliği Nasıl Sağlayabilirkonusuna bakın.
Microsoft Savunmasız ve Kötü Amaçlı Sürücü Raporlama Merkezi kullanarak sürücülerin nasıl bildirildiği hakkında bilgi edinme
Herkes Microsoft Savunmasız ve Kötü Amaçlı Sürücü Raporlama Merkezikullanarak sorgulanabilir bir sürücü gönderebilir. Sürücülerin analiz için nasıl gönderildiği hakkında bilgi için bu blog girdisine bakın - Yeni Microsoft Savunmasız ve Kötü Amaçlı Sürücü Raporlama Merkezi ile çekirdek güvenliğini geliştirme
Raporlama Merkezi, x86 ve x64 mimarileri için oluşturulmuş Windows sürücülerini tarar ve analiz edebilir. Güvenlik açığı bulunan ve kötü amaçlı taranan sürücüler, Microsoft'un Savunmasız Sürücü ekibi tarafından analiz ve araştırma için işaretlenir. Güvenlik açığı olan sürücüler onaylandıktan sonra uygun bir bildirim oluşur ve bunlar güvenlik açığı olan sürücü engelleme listesine eklenir. Daha fazla bilgi için bkz. Microsoft tarafından önerilen sürücü engelleme kuralları. Bu kurallar varsayılan olarak Hypervisor korumalı kod bütünlüğü (HVCI) özellikli cihazlara ve S modunda Windows 10'a uygulanır.
Güvenli kodlama kaynaklarını gözden geçirme
Güvenlik denetim listesi öğesi #19:Sürücü geliştiricileri için geçerli olan güvenli kodlama en iyi yöntemlerini daha iyi anlamak için bu kaynakları gözden geçirin.
Microsoft NISTIR 8397 kılavuzu
AMERIKA Birleşik Devletleri kamu yayın NISTIR 8397: Ulusal Standartlar ve Teknoloji Enstitüsü (NIST) tarafından Yazılım Geliştirici Doğrulaması için En Düşük Standartlar Yönergeleri, herhangi bir programlama dilinde güvenilir ve güvenli yazılım oluşturma yönergelerini içerir.
Güvenilir ve güvenli C++ programları oluşturun NISTIR 8397 yönergelerini izlemek üzere C++ ve diğer diller için Microsoft geliştirici ürünlerinin nasıl kullanılacağını özetler.
NIST bilinen yazılım güvenlik açığı veritabanı
Ulusal Güvenlik Açığı Veritabanı (NVD), Windows sürücüleri de dahil olmak üzere güvenlikle ilgili yazılım açıklarının aranabilir bir deposudur.
Arama NIST Güvenlik Açığı Veritabanı
Ulusal Güvenlik Açığı Veritabanına Genel Bakış
Güvenli kodlama standartları
Carnegie Mellon University SEI CERT - C Kodlama Standardı: Güvenli, Güvenilir ve Güvenli Sistemler Geliştirme Kuralları (PDF).
MITRE - CERT C Güvenli Kodlama Standartı tarafından giderilen
Microsoft Visual Studio - C++ Çekirdek Yönergeleri denetleyicisini kullanma
Kodlama kuruluşlarının güvenliğini sağlama
Siber Güvenlik ve Altyapı Güvenlik Ajansı (CISA)
Carnegie Mellon Üniversitesi SEI CERT
OSR
OSR, sürücü geliştirme eğitimi ve danışmanlık hizmetleri sağlar. OSR bültenindeki bu makalelerde sürücü güvenlik sorunları vurgulanır.
Koruma Kullanın -- Sürücü İçi & Cihaz Güvenliği
Sürücülerin Kilitlenmesi - Tekniklerin İncelenmesi
Meltdown ve Spectre : Sürücülerle ilgili durum nedir?
Sürücü güvenlik açığı örnek olay incelemesi
Yazılım tedarik zinciri güvenliği ve Yazılım Malzeme Listesi (SBOM'lar)
SBOM'lar açık kaynak yazılım, bileşenler ve potansiyel olarak derleme araçları gibi bir yazılım parçasının oluşturulmasında kullanılan bileşenlerin listesini sağlar. Bu, üreticilerin ve tüketicilerin lisans ve güvenlik açığı riskini daha iyi envantere alıp değerlendirmesine olanak tanır. Microsoft, SBOM belge biçimi olarak SPDX (Yazılım Paketi Veri Değişimi) kullanıyor. Daha fazla bilgi için bkz. Microsoft'da SPDX ile Yazılım Ürün Reçeteleri (SBOM) Oluşturma ve Microsoft'un yazılım bileşen listesi (SBOM) oluşturma aracını açık kaynaklı hale getirmesi.
Tedarik Zinciri Bütünlüğü, Saydamlık ve Güven (SCITT) girişimi, uçtan uca tedarik zincirleri arasında mal ve hizmetlerin uyumluluğunu yönetmeye yönelik bir dizi IETF internet standardıdır. SCITT varlıkların, kanıtların, ilkenin ve yapıtların orijinalliğinin değerlendirildiği mal ve hizmetlerin sürekli doğrulanmasını destekler. Amaç, varlıkların eylemlerinin yetkilendirilmiş, reddedilemez, değiştirilemez ve denetlenebilir olmasının garanti edilmesidir.
Kitaplar
Yazılım Güvenliğinin 24 Ölümcül Günahı: Programlama Kusurları ve Nasıl Düzeltilir Michael Howard, David LeBlanc ve John Viega tarafından
Writing Secure Software Second Edition, Michael Howard ve David LeBlanc
The Art of Software Security Assessment:Yazılım Güvenlik Açıklarını Tanımlama ve Önleme, Mark Dowd, John McDonald ve Justin Schuh
C ve C++'da Güvenli Kodlama (SEI Yazılım Mühendisliği Serisi) 2. Baskı, Robert C. Seacord
Microsoft Windows Sürücü Modelini Programlama (2. Sürüm), Walter Oney
Windows Sürücüleri Geliştirme: Windows Driver Foundation (Geliştirici Referansı), Penny Orwick ve Guy Smith
Eğitim
Windows sürücü sınıfı eğitimi aşağıdaki gibi satıcılar tarafından kullanılabilir:
Güvenli kodlama çevrimiçi eğitimi çeşitli kaynaklardan sağlanır. Örneğin, bu kurs Coursera'dan edinilebilir.
C/C++ ProgramlamaGüvenlik Açıklarını Tanımlama.
SAFECode ücretsiz eğitim de sunar:
Profesyonel Sertifika
CERT, Güvenli Kodlama Profesyonel Sertifikasısunar.
Önemli ele almaların özeti
Sürücü güvenliği, birçok öğe içeren karmaşık bir girişimdir, ancak dikkate alınması gereken birkaç önemli nokta şunlardır:
Sürücüler Windows çekirdeğinde yaşar ve çekirdekte yürütülürken bir sorun olması, tüm işletim sistemini risk altında bırakır. Bu nedenle sürücü güvenliğine ve tasarımına dikkat edin ve güvenliği göz önünde bulundurun.
En az ayrıcalık ilkesini uygulayın:
a. Sürücüye erişimi kısıtlamak için katı bir SDDL dizesi kullanın.
b. Tek tek IOCTL'leri daha fazla kısıtlayın.
Saldırı vektörlerini tanımlamak ve herhangi bir şeyin daha fazla kısıtlanıp kısıtlanmayacağını göz önünde bulundurmak için bir tehdit modeli oluşturun.
Kullanıcı modundan geçirilen ekli işaretçilere dikkat edin. Deneme-yanılma bloğu içinde yahut dışında erişilmesi gerektiği için, arabelleğin değeri yakalanıp karşılaştırılmadığı sürece, kullanım kontrolü (ToCToU) sorunlarına eğilimli olurlar.
Emin değilseniz IOCTL arabelleğe alma yöntemi olarak METHOD_BUFFERED kullanın.
Bilinen kod güvenlik açıklarını aramak ve tanımlanan sorunları düzeltmek için CodeQL gibi kod tarama yardımcı programlarını kullanın.
Atlamış olabileceğiniz sorunları aramak için bilgili kod gözden geçirenleri arayın.
Sürücü doğrulayıcıları kullanın ve sürücünüzü uç durumlar dahil olmak üzere birden çok girişle test edin.