Kirjaudu sisään Microsoft-tilillä
Kirjaudu sisään tai luo tili.
Hei,
Käytä toista tiliä.
Sinulla on useita tilejä
Valitse tili, jolla haluat kirjautua sisään.

Windows Vista Service Pack 1:n (SP1) tuki päättyy 12. heinäkuuta 2011. Jos haluat edelleen saada Windowsin suojauspäivityksiä, varmista, että käytössäsi on Windows Vista ja Service Pack 2 (SP2). Lisätietoja on tällä Microsoftin verkkosivulla: joidenkin Windows-versioiden tuki on päättymässä.

Kun sovellus lataa dynaamisesti DLL-kirjaston määrittämättä täysin hyväksyttyä polkua, Windows yrittää etsiä DLL:n etsimällä hyvin määritetystä hakemistosarjasta. Jos hyökkäyksessä käytetään hakemiston hallintaa, se voi pakottaa sovelluksen lataamaan DLL:n vahingollisen kopion odottavan DLL-kirjaston sijaan. Näitä hyökkäyksiä kutsutaan DLL-esilataushyökkäyksiksi, ja ne ovat yleisiä kaikissa käyttöjärjestelmissä, jotka tukevat jaettujen DLL-kirjastojen dynaamisesti lataamista. Tällaisten hyökkäysten vaikutus voi olla se, että hyökkäykset voivat suorittaa koodia sovelluksen suorittavan käyttäjän kontekstissa. Kun sovellus suoritetaan järjestelmänvalvojana, tämä voi johtaa paikalliseen oikeuksien laajentamiseen. Tiedämme, että näitä hyökkäyksiä on uudistettu. Jos haluat rajoittaa tämän ongelman vaikutusta molemmille asiakkaillemme, julkaisemme tämän asiakirjan kehittäjäyhteisölle sen varmistamiseksi, että he tietävät tästä ongelmasta ja että heillä on tarvittavat työkalut ongelman ratkaisemiseksi sovelluksissaan.

Yhteenveto

KUVAUS DLL:n esilataushyökkäyksistä

LoadLibrary-pohjaiset hyökkäykset

Kun sovellus lataa DLL:n dynaamisesti määrittämättä täysin hyväksyttyä polkua, Windows yrittää etsiä tämän DLL:n lineaarisesti etsimällä hyvin määritetystä hakemistosarjasta, jota kutsutaan DLL-hakutilaksi. Jos Windows etsii DLL:n DLL-hakujärjestyksessä, se lataa tämän DLL:n. Jos Windows ei kuitenkaan löydä DLL:tä missään DLL-hakujärjestyksen hakemistosta, DLL-lataus epäonnistuu. Seuraavassa on DLL-hakujärjestys LoadLibrary-ja LoadLibraryEx-funktioille,joiden avulla DLL-kirjastoja ladataan dynaamisesti:

  1. Hakemisto, josta sovellus latasi

  2. Järjestelmähakemisto

  3. 16-bittinen järjestelmähakemisto

  4. Windows-hakemisto

  5. Nykyinen työhakemisto (CWD)

  6. HAKEMISTOT, jotka on lueteltu PATH-ympäristömuuttujassa



Ota huomioon seuraava skenaario:


  • Sovellus lataa DLL:n määrittämättä täysin hyväksyttyä polkua, jonka se odottaa löytävän sovelluksen CWD-tiedostosta.

  • Sovellus on valmis käsittelemään tapauksen, kun se ei löydä DLL:tä.

  • Hyökkäykset tietävät nämä tiedot sovelluksesta ja ohjaa CWD:tä.

  • Hyökkäyksessä hyökkäykset kopioivat oman erityisesti muodostelun DLL-version CWD:ssä. Tämä edellyttää, että hyökkäyksellä on oikeus tehdä tämä.

  • Windows etsii hakemistoista DLL-hakujärjestyksen ja löytää DLL:n sovelluksen CWD-tiedostosta.

Tässä skenaariossa erityisesti muodostettu DLL toimii sovelluksessa ja saa käyttöoikeutensa nykyiseltä käyttäjältä.

Suositus Estääkseen tämän hyökkäystä sovellukset voivat poistaa nykyisen työhakemiston (CWD) DLL-hakupolusta kutsumalla

SetDllDirectory API:a käyttämällä tyhjää merkkijonoa (""). Jos sovellus edellyttää DLL:n lataamista nykyisestä hakemistosta, hanki nykyinen työhakemisto ja käytä sitä LoadLibrary-kirjastontäydellinen polku.



Microsoft on myös tietoinen siitä, että jotkut kehittäjät tarkistavat LoadLibraryn avulla, onko tietty DLL käytössä, jotta voidaan määrittää, mikä Windows-versio käyttäjä suorittaa. Ota huomioon, että tämä saattaa tehdä sovelluksesta haavoittuvan. Jos windows-julkaisussa ei ole kirjastoa, jossa sovellus suoritetaan, kyseinen kirjasto voi lisätä CWD:hen kirjaston, jolla on sama nimi. On erittäin suositeltavaa, että käytät tätä tekniikkaa. Käytä sen sijaan msdn-artikkelissa "Järjestelmäversion saaminen" kuvattuja suositeltuja tekniikoita.

Sovelluksen, joka lataa kolmannen osapuolen laajennuksia ja joka ei voi pakottaa laajennuksia käyttämään LoadLibrary-puhelujensa hyväksyttyä polkua, pitäisi kutsua SetDllDirectory("") poistamaan CWD ja kutsumaan sitten SetDllDirectory("plugin install location") lisätäkseen laajennuksen asennushakemiston DLL-hakupolkuun.

SearchPath-pohjaiset hyökkäykset

Samanlainen hyökkäys on olemassa, kun sovellus käyttää SearchPath-ohjelmointirajapintaa DLL:n etsimiseen ja SearchPathin palauttama polun dynaamiseen lataamiseen. Seuraava on SearchPath-ohjelmointirajapinnan oletushakujärjestys:

  • Hakemisto, josta sovellus latasi

  • Nykyinen työhakemisto (CWD)

  • Järjestelmähakemisto

  • 16-bittinen järjestelmähakemisto

  • Windows-hakemisto

  • HAKEMISTOT, jotka on lueteltu PATH-ympäristömuuttujassa

Tätä kaavaa ei suositella, koska se ei ole turvallinen. SearchPath-funktiota ei suositella .dll-tiedoston etsimismenetelmäksi, jos tulosteen käyttötarkoitus on LoadLibrary-funktion kutsussa. Tämä voi johtaa väärän .dll-tiedoston etsimiseen, koska SearchPath-funktion hakujärjestys eroaa LoadLibrary-funktion käyttämästä hakujärjestyksessä. Jos sinun täytyy etsiä ja ladata .dll-tiedosto, käytä LoadLibrary-funktiota.

ShellExecute ja CreateProcess


Näiden ongelmien muunnelmia voi olla myös silloin, kun kehittäjät kutsuvat samankaltaisia funktioita, kuten ShellExecuteaja CreateProcessiaulkoisten suoritettavan tiedoston lataamista varten. Suosittelemme, että kehittäjät ovat huolellisia, kun he lataavat binaarit ja määrittävät täydellinen polku. Tämä aiheuttaa vähemmän monimutkaisuutta, kun lataat binaaritiedoston kirjaston sijaan.

Ohjelmistokehittäjille suositellut vaiheet

Suosittelemme, että kehittäjät toimivat seuraavasti:

  • Vahvista sovellukset esimerkiksi epävarmoissa kirjastolatauksissa (esimerkkejä kustakin on jäljempänä tässä artikkelissa). Näitä ovat esimerkiksi seuraavat:

    • SearchPathin käyttäminen kirjaston tai osan sijainnin tunnistamiseen.

    • LoadLibrary-kuormituksen käyttöjärjestelmän version tunnistaminen.

  • Käytä täysin hyväksyttyjä polkuja kaikissa LoadLibrary-, CreateProcess- ja ShellExecute-puheluissa, missä voit.

  • Ota käyttöön kutsut SetDllDirectoryen, jossa on tyhjä merkkijono (""), jos haluat poistaa nykyisen työhakemiston DLL:n oletushakutilasta, jossa se on tarpeen. Huomaa, että SetDllDirectory vaikuttaa koko prosessiin. Tämä kannattaa tehdä vain kerran alkuvaiheessa prosessin alustamisen yhteydessä, ei ennen LoadLibrary-puheluja ja sen jälkeen. Koska SetDllDirectory vaikuttaa koko prosessiin, useat säikeet, jotka kutsuvat SetDllDirectorya eri arvoilla, voivat aiheuttaa määrittämätön toiminta. Lisäksi jos prosessi on suunniteltu lataamaan kolmannen osapuolen DLL-kirjastoja, on tarpeen testata, aiheuttaako prosessin laajuinen asetus yhteensopimattomuuksia. Tunnettu ongelma on se, että kun sovellus määräytyy Visual Basic for Applicationsin mukaan, koko prosessiasetus voi aiheuttaa yhteensopimattomuuksia.

  • Käytä SetSearchPathMode-funktiota,kun haluat ottaa prosessin turvallisen prosessin hakutilan käyttöön. Tämä siirtää nykyisen työhakemiston SearchPath-hakuluettelon viimeiseen paikkaan prosessin elinkaaren ajan.

  • Vältä SearchPathin käyttöä DLL-kirjaston olemassaolon tarkistamiseen ilman, että määrität täysin pätevän polun, vaikka vikasietoinen hakutila on käytössä, koska tämä voi silti johtaa DLL-kirjaston esilataushyökkäyksiin.

Ohjeita suojaamattoman kirjaston latausten tunnistamiseen

Lähdekoodissa on esimerkkejä suojaamattoman kirjaston latauksista:

  • Seuraavassa koodiesimerkkinä sovellus hakee hakusanalla "schannel.dll" käyttämällä vähiten suojattua hakupolkua. Jos hyökkäykseen schannel.dll CWD:ssä, se latautuu jopa ennen kuin sovellus hakee sopivaa kirjastoa Windows-hakemistoista.

    DWORD retval = SearchPath(NULL, "schannel", ".dll", err, result, NULL); 
    HMODULE handle = LoadLibrary(result);
  • Seuraavassa koodiesimerkkinä sovellus yrittää ladata kirjaston eri sovellus- ja käyttöjärjestelmäsijainnista, jotka on kuvattu tämän asiakirjan alussa LoadLibrary() -puhelua varten. Jos tiedosto ei ehkä ole olemassa, sovellus saattaa yrittää ladata tiedoston nykyisestä työhakemistosta. Tämä skenaario on hieman vähemmän vaarallisia kuin edellisessä esimerkissä. Sovelluskäyttäjä voi kuitenkin altistua riskille, jos ympäristö ei ole täysin ennakoitavissa.

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




Seuraavassa on esimerkkejä kirjaston kuormituksen paremmaksi ja turvallisemmaksi lisäämisen tavoista:

  • Seuraavassa koodiesimerkkinä kirjasto ladataan suoraan käyttämällä täysin hyväksyttyä polkua. Haittaohjelma voi ottaa käyttöön haittaohjelman, ellei hänellä ole jo kirjoitusoikeuksia sovelluksen kohdehakemistoon.

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



    Huomautus: Lisätietoja järjestelmähakemiston määrittämisestä on seuraavissa resursseissa:

    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

  • Seuraavassa koodiesimerkkinä nykyinen työhakemisto poistetaan hakupolusta ennen LoadLibrary-kutsumista. Tämä vähentää merkittävästi riskiä, sillä hyökkäyksellä on oltava joko sovellushakemiston, Windows-hakemiston tai käyttäjän polussa määritettyjen hakemistojen hallinta, jotta DLL-esilataushyökkäystä voi käyttää.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • Kaikissa järjestelmissä, joissa on asennettu suojauspäivitys 963027 (kuvattu ms09-014),seuraava koodi siirtää CWD:n pysyvästi hakujärjestyksen viimeiseen kohtaan. Jos hakutilaa yritetään muuttaa, myöhemmät kutsut SetSearchPathMode-funktioon epäonnistuvat.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • Seuraavassa koodiesimerkkinä nykyinen työhakemisto poistetaan hakupolusta ennen LoadLibrary-kutsumista. Tämä vähentää merkittävästi riskiä, sillä hyökkäyksellä on oltava joko sovellushakemiston, Windows-hakemiston tai käyttäjän polussa määritettyjen hakemistojen hallinta, jotta DLL-esilataushyökkäystä voi käyttää.

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

Suojaamattoman kuormituksen dynaaminen tunnistaminen prosessinäytön avulla

Microsoft julkaisee prosessin valvonta -nimisen työkalun. Tämän työkalun avulla kehittäjät ja järjestelmänvalvojat voivat seurata tarkasti käynnissä prosessin toimintaa. Prosessien valvonta -sovelluksella voidaan tunnistaa dynaamisesti, onko jokin sovelluksistasi alttiita tämänkaltaisia ongelmia varten.

  • Voit ladata prosessinäytön seuraavalla Microsoftin verkkosivulla:

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

  • Yritä käynnistää sovellus CWD-joukon avulla tiettyyn hakemistoon. Kaksoisnapsauta esimerkiksi tiedostoa, jonka tiedostotunniste on määritetty sovellukselle.

  • Määritä prosessinvalvonta seuraavilla suodattimilla:



    vaihtoehtoinen teksti

  • Jos haavoittuvassa polussa ilmenee jokin muu kuin seuraava: vaihtoehtoinen tekstiDLL:n lataaminen etätiedostojen jakamisen kutsusta osoittaa, että tämä on haavoittuva

    ohjelma.

Lisätietoja

Lisätietoja on seuraavissa Microsoft-verkkosivuissa:

Dynamic Link Library Search Order

http://msdn.microsoft.com/en-us/library/ms682586(VS.85).aspxSearchPath-funktion MSDN-ohjeet

http://msdn.microsoft.com/en-us/library/aa365527(VS.85).aspxLoadLibrary-funktion MSDN-ohjeet

http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspxSetDllDirectory-funktion MSDN-ohjeet

http://msdn.microsoft.com/en-us/library/ms686203(VS.85).aspxSetSearchPathMode-funktion MSDN-ohjeet

http://msdn.microsoft.com/en-us/library/dd266735(VS.85).aspxMicrosoft Officen pääturvallisuusinsinöörin David Leobjektin blogikirjoitus

http://blogs.msdn.com/b/david_leblanc/archive/2008/02/20/dll-preloading-attacks.aspxBlogikirjoituksen tekijä Andrew Andreass, MSRC Engineering -tiimi DLL:n esilataamisen hyökkäyksissä

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

Lisäresurssit

Tarvitsetko lisäohjeita?

Haluatko lisää vaihtoehtoja?

Tutustu tilausetuihin, selaa harjoituskursseja, opi suojaamaan laitteesi ja paljon muuta.

Osallistumalla yhteisöihin voit kysyä kysymyksiä ja vastata niihin, antaa palautetta sekä kuulla lisää asiantuntijoilta, joilla on runsaasti tietoa.

Oliko näistä tiedoista hyötyä?

Kuinka tyytyväinen olet käännöksen laatuun?
Mikä vaikutti kokemukseesi?
Kun valitset Lähetä, palautettasi käytetään Microsoftin tuotteiden ja palveluiden parantamiseen. IT-järjestelmänvalvojasi voi kerätä nämä tiedot. Tietosuojatiedot.

Kiitos palautteesta!

×