Aracılığıyla paylaş


Yönetimi İşleme

Sürücülerdeki güvenlik sorunlarının önemli bir kaynağı, kullanıcı modu ve çekirdek modu bileşenleri arasında aktarılan tanıtıcıların kullanılmasıdır. Bilinen bazı sorunlar arasında çekirdek ortamında handle kullanımıyla ilgili olanlar bulunmaktadır.

  • Bir çekirdek sürücüsüne yanlış türde tanıtıcı geçiren bir uygulama. Çekirdek sürücüsü, bir dosya nesnesinin gerekli olduğu durumda bir olay nesnesini kullanmaya çalışırken çökebilir.

  • Gerekli erişime sahip olmadığı bir nesneye işaretçi geçiren bir uygulama. Kullanıcı yeterli izinlere sahip olmasa bile, çağrı çekirdek modundan geldiği için çekirdek sürücüsü çalışan bir işlem gerçekleştirebilir.

  • Kendi adres alanında geçerli bir tanıtıcı olarak işaretlenmeyen, ancak sistem tanıtıcısı olarak işaretlenmiş bir değeri aktaran ve sisteme karşı kötü amaçlı bir operasyon gerçekleştiren bir uygulama.

  • Cihaz nesnesi için uygun tanıtıcı olmayan bir değer geçiren bir uygulama (bu sürücünün oluşturmadığı bir tanıtıcı).

Bu sorunlara karşı koruma sağlamak için, bir çekirdek sürücüsünün kendisine iletilen tanıtıcıların geçerli olduğundan emin olmak için özellikle dikkatli olması gerekir. En güvenli yöntem, sürücü bağlamında gerekli tanıtıcıları oluşturmaktır. Çekirdek sürücüleri tarafından oluşturulan bu tanıtıcılar, rastgele işlem bağlamında geçerli bir tanıtıcı ve yalnızca çekirdek modu çağıranı tarafından erişilebilen bir tanıtıcı oluşturacak olan OBJ_KERNEL_HANDLE seçeneğini belirtmelidir.

Bir uygulama programı tarafından oluşturulan tanıtıcıları kullanan sürücüler için bu tanıtıcıların kullanımı aşırı özen gösterilerek yapılmalıdır:

  • En iyi yöntem , ObReferenceObjectByHandle çağrısı yaparak, doğru AccessMode (genellikle Irp-RequestorMode'dan>), DesiredAccess ve IoFileObjectType veya ExEventObjectType gibi ObjectType parametrelerini belirterek tanıtıcıyı nesne işaretçisine dönüştürmektir.

  • Bir tanıtıcının doğrudan bir çağrı içinde kullanılması gerekiyorsa, işlevlerin Zw varyantları yerine işlevlerin Nt değişkenlerini kullanmak en iyisidir. Önceki mod UserMode olacağından ve dolayısıyla güvensiz bulunduğundan, bu işlem parametre denetimini zorlar ve doğrulama işletim sistemi tarafından yürütülür. Önceki mod UserMode ise, işaretçi olan Nt işlevlerine geçirilen parametrelerin doğrulamada başarısız olabileceğini unutmayın. Nt ve Zw işlevleri, hata kontrolü yapmanız gereken hata bilgilerini içeren bir IoStatusBlock parametresi döndürür.

  • Hatalar gerektiği gibi __try ve __except kullanılarak uygun şekilde kapana kısılmalıdır. Önbellek yöneticisi (Cc), bellek yöneticisi (Mm) ve dosya sistemi çalışma zamanı kitaplığı yordamlarının (FsRtl) çoğu hata oluştuğunda bir özel durum oluşturur.

Hiçbir cihaz sürücüsü, uygun önlemleri almadan kullanıcı modlu bir uygulamadan geçirilen tanıtıcılara veya parametrelere asla güvenmemelidir.

Bir dosyayı açmak için Nt değişkeni kullanılıyorsa, dosyayı kapatmak için Nt değişkeninin de kullanılması gerektiğini unutmayın.