Dela via


Säkerhetsproblem för avsnittsobjekt och vyer

Drivrutiner som skapar avsnitt och vyer som inte ska delas med användarläget måste använda följande protokoll när de arbetar med avsnitt och vyer:

  • Drivrutinen måste använda ett kernelhandtag när den öppnar ett handtag till avsnittsobjektet. Drivrutiner kan se till att ett handtag är ett kernelhandtag genom att antingen skapa det i systemprocessen eller ange attributet OBJ_KERNEL_HANDLE för handtaget. Mer information finns i Objekthanterare.

  • Vyn får endast mappas från en systemtråd. (Annars är vyn tillgänglig från den process vars kontext den skapas i.) En drivrutin kan se till att vyn mappas från systemprocessen med hjälp av en systemarbetartråd för att utföra mappningsåtgärden. Mer information finns i System Worker-trådar och drivrutinstrådskontext.

Drivrutiner som delar en vy med en användarlägesprocess måste använda följande protokoll när de arbetar med avsnitt och vyer:

  • Drivrutinen, inte användarlägesprocessen, måste skapa avsnittsobjektet och mappa vyerna.

  • Som tidigare nämnts måste drivrutinen använda ett kärnhandtag när den öppnar ett handtag till avsnittsobjektet. Drivrutiner kan se till att ett handtag är ett kernelhandtag genom att antingen skapa det i systemprocessen eller ange attributet OBJ_KERNEL_HANDLE för handtaget. Mer information finns i Objekthanterare.

  • Vyn mappas i trådkontexten för den process som delar vyn. En drivrutin på högsta nivå kan garantera att vyn mappas i den aktuella processkontexten genom att utföra mappningsåtgärden i en dispatch-rutin, till exempel DispatchDeviceControl. Dispatch-rutiner för drivrutiner på lägre nivå körs i en godtycklig trådkontext och kan därför inte på ett säkert sätt mappa en vy i en dispatch-rutin. Mer information finns i Drivrutinstrådskontext.

  • Alla minnesåtkomster till vyn i drivrutinen måste skyddas av försök-utom block. Ett skadligt användarlägesprogram kan ta bort vyn eller ändra skyddstillståndet för vyn. Något skulle orsaka en systemkrasch om de inte skyddas av ett try-except block. Mer information finns i Hantera undantag.

Drivrutinen måste också verifiera innehållet i vyn efter behov. Drivrutinsförfattaren kan inte anta att endast en betrodd komponent inom användarläge har åtkomst till vyn.

En drivrutin som måste dela ett avsnittsobjekt med ett användarlägesprogram (som måste kunna skapa egna vyer) måste använda följande protokoll:

  • Drivrutinen, inte användarlägesprocessen, måste skapa avsnittsobjektet. Drivrutiner får aldrig använda ett handtag som skickades från användarläget.

  • Innan handtaget skickas till användarläge måste drivrutinen anropa ObReferenceObjectByHandle för att hämta en referens till avsnittsobjektet. Detta förhindrar att ett skadligt program tar bort avsnittsobjektet genom att stänga handtaget. Objektreferensen ska lagras i drivrutins enhetstillägget.

  • När drivrutinen inte längre använder avsnittsobjektet måste den anropa ObDereferenceObject för att frigöra objektreferensen.

På system som kör Microsoft Windows Server 2003 med Service Pack 1 (SP1) och senare versioner kan endast drivrutiner i kernelläge öppna \Device\PhysicalMemory. Drivrutiner kan dock bestämma sig för att ge ett handtag till ett användarprogram. För att förhindra säkerhetsproblem ska endast användarprogram som drivrutinen litar på ges åtkomst till \Device\PhysicalMemory.