Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Een belangrijke bron van beveiligingsproblemen binnen stuurprogramma's is het gebruik van ingangen die worden doorgegeven tussen onderdelen van de gebruikersmodus en kernelmodus. Er zijn een aantal bekende problemen met het gebruik van handles binnen de kernelomgeving, waaronder het volgende:
Een toepassing die het verkeerde type ingang doorgeeft aan een kernelstuurprogramma. Het kernelstuurprogramma kan vastlopen bij het gebruik van een gebeurtenisobject waar een bestandsobject nodig is.
Een toepassing die een ingang doorgeeft aan een object waarvoor het niet de benodigde toegang heeft. Het kernelstuurprogramma kan een bewerking uitvoeren die werkt omdat de aanroep afkomstig is van de kernelmodus, ook al beschikt de gebruiker niet over voldoende machtigingen om dit te doen.
Een toepassing die een waarde doorgeeft die geen geldige handle in zijn adresruimte is, maar wordt gemarkeerd als een systeemhandle om een schadelijke bewerking tegen het systeem uit te voeren.
Een toepassing die een waarde doorgeeft die geen geschikte ingang is voor het apparaatobject (een ingang die dit stuurprogramma niet heeft gemaakt).
Om deze problemen te voorkomen, moet een kernelstuurprogramma bijzonder voorzichtig zijn om ervoor te zorgen dat de bijgevoegde handles geldig zijn. Het veiligste beleid is het maken van eventuele benodigde ingangen binnen de context van het stuurprogramma. Deze ingangen, gemaakt door kernelstuurprogramma's, moeten de OBJ_KERNEL_HANDLE optie opgeven, waarmee een ingang wordt gemaakt die geldig is in willekeurige procescontext en een ingang die alleen toegankelijk is vanuit een beller in de kernelmodus.
Voor drivers die handles gebruiken die zijn gemaakt door een toepassingsprogramma, moet het gebruik van deze handles uiterst zorgvuldig worden uitgevoerd.
De best practice is om de handle te converteren naar een objectaanwijzer door ObReferenceObjectByHandle aan te roepen, waarbij de juiste AccessMode (meestal van Irp-RequestorMode>), DesiredAccess en ObjectType parameters, zoals IoFileObjectType of ExEventObjectType, wordt opgegeven.
Wanneer een handle direct moet worden gebruikt in een functie-aanroep, kunt u het beste de Nt-varianten van functies gebruiken in plaats van de Zw-varianten van functies. Hiermee zal parametercontrole worden afgedwongen en zal validatie door het besturingssysteem worden afgehandeld, omdat de vorige modus UserMode is en daarom onbetrouwbaar is. Parameters die worden doorgegeven aan Nt-functies en die aanwijzers zijn, kunnen bij de validatie mislukken als de vorige modus UserMode is. De Nt- en Zw-routines retourneren een IoStatusBlock-parameter met foutinformatie die u moet controleren op fouten.
Fouten moeten op de juiste wijze worden gevangen, waarbij zo nodig gebruik wordt gemaakt van __try en __except. Veel routines van de cachebeheerder (Cc), geheugenbeheerder (Mm) en bestandssysteem runtimebibliotheek (FsRtl) werpen een uitzondering op wanneer er een fout optreedt.
Er mag nooit een stuurprogramma vertrouwen op ingangen of parameters die zijn doorgegeven vanuit een toepassing in de gebruikersmodus zonder dat er passende voorzorgsmaatregelen worden genomen.
Als de Nt-variant wordt gebruikt om een bestand te openen, moet de Nt-variant ook worden gebruikt om het bestand te sluiten.