Kuinka mmap ' ing / dev / mem toimii huolimatta etuoikeutetusta tilasta?
On helmikuu 9, 2021 by adminYmmärrykseni mukaan käyttäjäavaruusohjelmat toimivat etuoikeutetussa tilassa, joten niillä ei ole suoraa pääsyä muistiin tai I / O: een.
Kuinka sitten voimme suoraan käyttää muistia tai I / O-sijainteja, kun käytämme mmap / dev / mem-tiedostoja käyttäjäavaruusohjelmissa?
Esimerkiksi:
int fd = 0; u8 leds = 0; fd = open("/dev/mem", O_RDWR|O_SYNC); leds = (u8 *)mmap(0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x80840000);
Tämä on hakkerointi, jota käytetään hyvin usein upotetuissa laitteissa.
Nyt muuttujaa leds
voidaan käyttää lennossa pääsyyn mikä tahansa laite, joka voi olla paikassa 0x80840000.
Emme enää käytä mitään järjestelmän kutsuja käyttääksesi osoitetta.
Jopa jotain sellaista kuin
leds[0x20] = val;
toimisi.
Etuoikeutettujen toimintojen, kuten lukeminen / kirjoittaminen suoraan I / O-osoitteeseen / siitä, pitäisi olla mahdollista vain asettamalla prosessori etuoikeutettuun tilaan järjestelmäkutsun avulla.
Lähde .
Kommentit
vastaus
Pääsyn salliminen /dev/mem
olisi todellakin turvallisuusongelma, eikä sitä pitäisi sallia.
Järjestelmässäni ls -l /dev/mem
näyttää tältä:
crw-r----- 1 root kmem 1, 1 Sep 8 10:12 /dev/mem
Joten root
voi lukea ja kirjoittaa sen, jäsenet kmem
-ryhmä (jota satunnaisesti ei ole) voi lukea sitä, mutta ei kirjoittaa, eivätkä kaikki muut voi avata sitä ollenkaan. Joten tämän pitäisi olla turvallista.
Jos /dev/mem
on jotain minun kaltaista, etuoikeutetulla prosessillasi ei olisi edes pitänyt pystyä avaamaan tiedostoa ollenkaan, saati sitten mmap
se.
Tarkista järjestelmän /dev/mem
käyttöoikeudet varmistaaksesi, että ne ovat turvallisia!
Kommentit
- Mutta olettaen, että teen olen tekemässä tämän pääkäyttäjänä … Tarkoittaako se, että juuren suorittama prosessi saa ytimen tason käyttöoikeudet?
- No, jos ' teet tämän uudelleen pääkäyttäjänä, sinulla on pääsy kaikkeen. En ' ole varma, mitä tarkoitat " ytimen tason käyttöoikeuksilla ", mutta root voi varmasti tehdä mitä tahansa haluamaansa tavalla tai toisella (erityisesti esimerkiksi luomalla ja lataamalla dynaamisesti uuden ytimen moduulin).
- Kyllä, että ' s oikein: kun kartoitat tiedostoa, saat sen jälkeen lukea & kirjoittamalla tiedoston käyttämättä mitään varsipuheluja. Se ' on totta riippumatta siitä, oletko ' kartoittanut tavallisen levytiedoston tai erikoislaitteen, kuten
/dev/mem
. Halutessasi voit avata/dev/mem
ja antaaread()
jawrite()
järjestelmäkutsut. Silloin et lähettäisi I / O: ta ilman järjestelmäkutsuja. Lopputulos on sama, mutta jos sinulla on paljon pieniä I / O-tehtäviä,mmap()
ja suora pääsy toimii todennäköisesti paremmin erityisesti siksi, että et ' ei tarvitse järjestelmäkutsuja! Tämä pätee myös tavallisiin tiedostoihin! - @ Stark07 Luulen, että ' et ole huomannut asiaa.
mmap
(ja/dev/mem
) itse EI anna suoraa pääsyä järjestelmämuistissa, ja sitä on mahdotonta tehdä Ring 4: ssä. Sen sijaan se on vain tiedoston (tai resurssin) kartoittaminen tiettyyn virtuaaliseen osoitteeseen kutsuprosessissa, aivan kuten mitä tapahtuu, kun ohjelmaa ladataan /exec
ed (tässä tapauksessa ohjelmakuvammap
muokataan virtuaalimuistiin). - TL; DR Etuoikeuksettomalla prosessilla ei ole suoraa pääsyä järjestelmäresurssiin, mutta se voi tehdä niin, kun kyseinen resurssi on yhdistetty virtuaaliseen osoiteavaruuteensa . ' ei ole eroa sen pinon / kasan / rodata / minkä tahansa käyttämisen ja ytimen muistin välillä – molemmat pääsevät lopulta todelliseen fyysiseen muistiin, kun taas jälkimmäinen tapaus on vain ohjelman ' hallinta.
Vastaa
Näkyvät osoitteet Käyttäjäprosessille (suoritetaanko pääkäyttäjänä tai käyttöoikeuksettomana käyttäjänä) ovat virtuaalisia osoitteita, jotka MMU kartoittaa fyysisiin osoitteisiin sivutaulukoiden kautta. Sivutaulukoiden asettaminen on etuoikeutettu toimenpide, ja se voidaan suorittaa vain ydinkoodilla; Kuitenkin, kun sivutaulukot on asetettu, muistin käyttö on sallittua käyttäjätilassa.
Konkreettisesti koodisi käyttää mmap
pyytääkseen ydintä määrittämään sivutaulukot sallia pääsyn tietylle fyysisen muistin alueelle. Ydin tarkistaa prosessin etuoikeudet (sillä on luku- / kirjoitusoikeudet /dev/mem
) ja asettaa sivutaulukot, jotta se voi käyttää fyysistä muistia.
vastaus
leds
-arvo on virtuaalinen osoite, kunhan se on käyttäjäalueella nykyisestä prosessista prosessi voi käyttää sitä suoraan ohjeiden, kuten leds[0] = val
, kautta ilman, että hänen tarvitsee olla etuoikeutetussa tilassa riippumatta siitä, missä RAM-muistissa tämä virtuaalinen osoite on kartoitettu
*
leds
, mutta se ' vain koodi, ei ole todisteita siitä, että tämä tosiasiallisesti toimisi etuoikeutettuna käyttäjänä; (rajoitetun) kokemukseni mukaan kaikki toimii juurena upotetut laitteet.root
-käyttäjällä on monia etuoikeuksia, joihin kuuluu sallia perinteisten ohittaa tiedostojärjestelmän oikeudet. Jotkut " -tiedostot " ovat todella pääsy laitteisiin (kuten levy tai muisti), jotka eivät ole tavallisten käyttäjien rajoituksia. Eiroot
. Muttaroot
toimii käyttäjätilassa , joten se ei ' nauti järjestelmätilan kaikista oikeuksista (suorita enimmäkseen etuoikeutetut ohjeet).