Logg på med Microsoft
Logg på, eller opprett en konto.
Hei,
Velg en annen konto.
Du har flere kontoer
Velg kontoen du vil logge på med.

Støtte for Windows Vista Service Pack 1 (SP1) avsluttes 12. juli 2011. Hvis du vil fortsette å motta sikkerhetsoppdateringer for Windows, må du kontrollere at du kjører Windows Vista med Service Pack 2 (SP2). Hvis du vil ha mer informasjon, kan du se denne Microsoft-nettsiden: Brukerstøtte avsluttes for noen versjoner av Windows.

Når et program dynamisk laster inn et dynamisk koblingsbibliotek (DLL) uten å angi en fullstendig bane, prøver Windows å finne DLL-en ved å søke i et veldefinert sett med kataloger. Hvis en angriper får kontroll over en av katalogene, kan de tvinge programmet til å laste inn en ondsinnet kopi av DLL-en i stedet for DLL-en som den forventet. Disse angrepene kalles «DLL-forhåndslastingsangrep» og er vanlige for alle operativsystemer som støtter dynamisk innlasting av delte DLL-biblioteker. Effekten av slike angrep kan være at en angriper kan utføre kode i konteksten til brukeren som kjører programmet. Når programmet kjøres som administrator, kan dette føre til en lokal rettighetsutvidelse. Vi vet om fornyet interesse for disse angrepene. For å begrense virkningen dette problemet har på våre felles kunder, utgir vi dette dokumentet til utviklerfellesskapet for å sikre at de vet om dette problemet og har de nødvendige verktøyene for å løse problemet i programmene sine.

Sammendrag

Beskrivelse av DLLer som forhåndslaster angrep

LoadLibrary-baserte angrep

Når et program laster en DLL-fil dynamisk uten å angi en fullstendig bane, prøver Windows å finne denne DLLen lineært ved å søke gjennom et veldefinert sett med kataloger, kalt DLL Search Order. Hvis Windows finner DLL-en i søkerekkefølgen for DLL-en, lastes denne DLL-en inn. Hvis Windows imidlertid ikke finner DLL-en i noen av katalogene i søkerekkefølgen for DLL-en, returneres en feil i innlastingsoperasjonen av DLL-en. Følgende er DLL-søkerekkefølgen for LoadLibrary-og LoadLibraryEx-funksjonene,som brukes til å laste inn dynamiske dynamiske koblingslinjer:

  1. Katalogen som programmet lastet inn fra

  2. Systemkatalogen

  3. 16-biters systemkatalog

  4. Windows-katalogen

  5. Gjeldende arbeidskatalog (CWD)

  6. Katalogene som er oppført i path-miljøvariabelen



Tenk deg følgende:


  • Et program laster inn en DLL-fil uten å angi en fullstendig bane som programmet forventer å finne i CWD-en for programmet.

  • Programmet er klargjort til å håndtere saken når dll-en ikke blir funnet.

  • Angriperen kjenner til denne informasjonen om programmet og styrer CWD-en.

  • Angriperen kopierer sin egen spesialopprettede versjon av DLL-en i CWD. Dette forutsetter at angriperen har tillatelse til å gjøre dette.

  • Windows søker gjennom katalogene i søkerekkefølgen for DLL-en og finner DLL-en i CWD-en for programmet.

I dette scenarioet kjører den spesialopprettede DLL-en i programmet og får rettighetene til den gjeldende brukeren.

Anbefaling For å forhindre dette angrepet kan programmer fjerne den gjeldende arbeidskatalogen (CWD) fra dll-søkebanen ved å kalle
opp SetDllDirectory-API-en ved hjelp av en tom streng
(""). Hvis et program er avhengig av innlasting av en DLL-fil fra den gjeldende katalogen, kan du hente den gjeldende arbeidskatalogen og bruke den til å sende i en fullstendig bane til LoadLibrary.



Vi er også oppmerksomme på at enkelte utviklere bruker LoadLibrary til å validere om en bestemt DLL-fil er til stede for å fastslå hvilken versjon av Windows som kjøres av brukeren. Vær oppmerksom på at dette kan gjøre programmet sårbart. Hvis det berørte biblioteket faktisk ikke finnes på Windows-versjonen som programmet er utført på, kan en angriper introdusere et bibliotek med samme navn i CWD. Vi anbefaler på det sterkeste at du ikke bruker denne teknikken. Bruk i stedet de anbefalte metodene som er beskrevet i MSDN-artikkelen «Henter systemversjonen».

Et program som laster inn tredjeparts plugin-moduler, og som ikke kan tvinge plugin-modulene til å bruke en kvalifisert bane for LoadLibrary-samtaler, skal kalle SetDllDirectory("") for å fjerne CWD og deretter kalle SetDllDirectory("plassering for plugin-installasjon") for å legge til installasjonskatalogen for plugin-modulen i dll-søkebanen.

SearchPath-baserte angrep

Et lignende angrep finnes når et program bruker SearchPath API til å finne en DLL-fil og laste inn banen som returneres av SearchPath. Følgende er standard søkerekkefølge for SearchPath API:

  • Katalogen som programmet lastet inn fra

  • Gjeldende arbeidskatalog (CWD)

  • Systemkatalogen

  • 16-biters systemkatalog

  • Windows-katalogen

  • Katalogene som er oppført i path-miljøvariabelen

Vi anbefaler ikke dette mønsteret fordi det ikke er sikkert. Vi anbefaler ikke SearchPath-funksjonen som en metode for å finne en .dll-fil hvis den tiltenkte bruken av utdataene er i et kall til LoadLibrary-funksjonen. Dette kan føre til at du finner feil .dll-fil fordi søkerekkefølgen til SearchPath-funksjonen er forskjellig fra søkerekkefølgen som brukes av LoadLibrary-funksjonen. Hvis du må finne og laste inn en DLL-fil, bruker du LoadLibrary-funksjonen.

ShellExecute og CreateProcess


Variasjoner av disse problemene kan også finnes når utviklere kaller lignende funksjoner, for eksempel ShellExecuteog CreateProcess,for å laste inn eksterne kjørbare filer. Vi anbefaler at utviklere er forsiktige når de laster inn binære filer, og angir den fullstendige banen. Dette bør utgjøre mindre kompleksitet når du laster inn en binærfil i stedet for et bibliotek.

Anbefalte trinn for programvareutviklere

Vi anbefaler at utviklere gjør følgende:

  • Valider programmene slik at de ikke er sikre på at biblioteket lastes inn (eksempler på hvert bibliotek vises senere i denne artikkelen). Disse omfatter følgende:

    • Bruk av SearchPath til å identifisere plasseringen av et bibliotek eller en komponent.

    • Bruken av LoadLibrary til å identifisere versjonen av operativsystemet.

  • Bruk fullstendige baner for alle anrop til LoadLibrary, CreateProcess og ShellExecute der du kan.

  • Implementer kall til SetDllDirectory med en tom streng ("") for å fjerne den gjeldende arbeidskatalogen fra standard DLL-søkerekkefølge der det er nødvendig. Vær oppmerksom på at SetDllDirectory påvirker hele prosessen. Derfor bør du gjøre dette én gang tidlig i prosessens initialisering, ikke før og etter anrop til LoadLibrary. Fordi SetDllDirectory påvirker hele prosessen, kan flere tråder som kaller SetDllDirectory med ulike verdier, forårsake udefinert virkemåte. I tillegg, hvis prosessen er utformet for å laste inn tredjeparts dynamiske dynamiske filer, kreves testing for å avgjøre om en prosessdefinering vil føre til inkompatibiliteter. Et kjent problem er at når et program er avhengig av Visual Basic for Applications, kan en innstilling for hele prosessen føre til inkompatibilitet.

  • Bruk SetSearchPathMode-funksjonentil å aktivere sikker prosesssøkmodus for prosessen. Dette flytter gjeldende arbeidskatalog til siste sted i søkelisten i SearchPath i løpet av prosessens levetid.

  • Unngå å bruke SearchPath til å kontrollere om det finnes en DLL-fil uten å angi en fullstendig bane, selv om sikker søkemodus er aktivert, fordi dette fortsatt kan føre til at DLL-forhåndslastingsangrep oppstår.

Veiledning om identifisering av belastninger for usikkert bibliotek

I kildekode er følgende eksempler på at usikkert bibliotek lastes inn:

  • I følgende kodeeksempel søker programmet etter "schannel.dll" ved hjelp av den minst sikre søkebanen. Hvis en angriper kan plassere schannel.dll i CWD, lastes den inn selv før programmet søker i Windows-katalogene etter det riktige biblioteket.

    DWORD retval = SearchPath(NULL, "schannel", ".dll", err, result, NULL); 
    HMODULE handle = LoadLibrary(result);
  • I følgende kodeeksempel prøver programmet å laste inn biblioteket fra de ulike plasseringene for programmet og operativsystemet som er beskrevet i begynnelsen av dette dokumentet for LoadLibrary()-kallet. Hvis det er risiko for at filen ikke er til stede, kan programmet prøve å laste inn filen fra gjeldende arbeidskatalog. Dette scenarioet er litt mindre farlig enn i forrige eksempel. Programmet er imidlertid fortsatt utsatt for risiko hvis miljøet ikke er fullstendig forutsigbart.

    HMODULE handle = LoadLibrary("schannel.dll");




Følgende er eksempler på bedre og sikrere bibliotekbelastninger:

  • I følgende kodeeksempel lastes biblioteket direkte inn ved hjelp av en fullstendig bane. Det er ingen risiko for at angriperen introduserer skadelig kode med mindre han allerede har skrivetillatelser til programmets målkatalog.

    HMODULE handle = LoadLibrary("c:\\windows\\system32\\schannel.dll");



    Obs! Hvis du vil ha informasjon om hvordan du fastslår systemkatalogen, kan du se følgende ressurser:

    GetSystemDirectory

    http://msdn.microsoft.com/en-us/library/ms724373%28VS.85%29.aspxSHGetKnownFolderPath

    http://msdn.microsoft.com/en-us/library/bb762188%28v=VS.85%29.aspx

  • I følgende kodeeksempel fjernes den gjeldende arbeidskatalogen fra søkebanen før LoadLibrary kalles. Dette reduserer risikoen betydelig siden angriperen må kontrollere enten programkatalogen, Windows-katalogen eller eventuelle kataloger som er angitt i brukerens bane for å kunne bruke et DLL-forhåndslastingsangrep.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • I alle systemer som har installert sikkerhetsoppdatering 963027 (beskrevet i MS09-014),vil følgende kode permanent flytte CWD til siste punkt i søkerekkefølgen. Eventuelle senere anrop til SetSearchPathMode-funksjonen i denne prosessen som prøver å endre søkemodus, vil mislykkes.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • I følgende kodeeksempel fjernes den gjeldende arbeidskatalogen fra søkebanen før LoadLibrary kalles. Dette reduserer risikoen betydelig siden angriperen må kontrollere enten programkatalogen, Windows-katalogen eller eventuelle kataloger som er angitt i brukerens bane for å kunne bruke et DLL-forhåndslastingsangrep.

    SetSearchPathMode (BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE | BASE_SEARCH_PATH_PERMANENT );
    HMODULE handle = LoadLibrary("schannel.dll");

Bruke prosessovervåking til dynamisk å oppdage usikker belastning

Microsoft publiserer et verktøy som heter Prosessovervåking. Dette verktøyet gjør at utviklere og administratorer kan følge opp virkemåten til en kjørende prosess. Prosessovervåking kan brukes til å dynamisk oppdage om et av programmene kan være sårbare for denne typen problemer.

  • Hvis du vil laste ned prosessovervåking, kan du gå til følgende Microsoft-nettside:

    http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

  • Prøv å starte programmet ved å bruke CWD satt til en bestemt katalog. Dobbeltklikk for eksempel en fil som har en filtype som er tilordnet til programmet.

  • Konfigurer prosessovervåking med følgende filtre:



    alternativ tekst

  • Hvis en sårbar bane treffer, vil du se noe som ligner på følgende: alternativ tekstAnropet til den eksterne delte filressursen for å laste inn en DLL-fil, indikerer at dette er et

    sårbart program.

Mer informasjon

Hvis du vil ha mer informasjon, kan du gå til følgende Microsoft-nettsider:

Søkerekkefølge for dynamisk koblingsbibliotek

http://msdn.microsoft.com/nb-no/library/ms682586(VS.85).aspxMSDN-dokumentasjon om SearchPath-funksjonen

http://msdn.microsoft.com/nb-no/library/aa365527(VS.85).aspxMSDN-dokumentasjon om LoadLibrary-funksjonen

http://msdn.microsoft.com/nb-no/library/ms684175(VS.85).aspxMSDN-dokumentasjon om SetDllDirectory-funksjonen

http://msdn.microsoft.com/nb-no/library/ms686203(VS.85).aspxMSDN-dokumentasjon om SetSearchPathMode-funksjonen

http://msdn.microsoft.com/nb-no/library/dd266735(VS.85).aspxBlogginnlegg av David Leblanc, sikkerhetstekniker med Microsoft Office

http://blogs.msdn.com/b/david_leblanc/archive/2008/02/20/dll-preloading-attacks.aspxBlogginnlegg av Andrew Roths, MSRC Engineering team on DLL preloading attacks

http://blogs.technet.com/b/srd/archive/2009/04/14/ms09-014-addressing-the-safari-carpet-bomb-vulnerability.aspx

Tilleggsressurser

Trenger du mer hjelp?

Vil du ha flere alternativer?

Utforsk abonnementsfordeler, bla gjennom opplæringskurs, finn ut hvordan du sikrer enheten og mer.

Fellesskap hjelper deg med å stille og svare på spørsmål, gi tilbakemelding og høre fra eksperter med stor kunnskap.

Var denne informasjonen nyttig?

Hvor fornøyd er du med språkkvaliteten?
Hva påvirket opplevelsen din?
Når du trykker på Send inn, blir tilbakemeldingen brukt til å forbedre Microsoft-produkter og -tjenester. IT-administratoren kan samle inn disse dataene. Personvernerklæring.

Takk for tilbakemeldingen!

×