Cum funcționează mmap ' ing / dev / mem în ciuda faptului că provine din modul fără privilegii?
On februarie 9, 2021 by adminDin câte înțeleg, programele de spațiu utilizator rulează în modul neprivilegiat și, prin urmare, nu au acces direct la memorie sau I / O.
Atunci cum putem accesa direct memoria sau locațiile I / O atunci când mmap / dev / mem în programele spațiu utilizator?
De exemplu:
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);
Acesta este un hack foarte frecvent utilizat pe dispozitivele încorporate.
Acum variabila leds
poate fi utilizată din mers pentru a accesa orice dispozitiv care ar putea fi prezent la 0x80840000.
Nu vom mai folosi niciun apel de sistem pentru a accesa adresa respectivă.
Chiar și ceva de genul
leds[0x20] = val;
ar funcționa.
Dar operațiunile privilegiate, cum ar fi citirea / scrierea directă la / de la o adresă I / O ar trebui să fie posibile numai prin punerea procesorului în modul privilegiat printr-un apel de sistem. p> Sursă .
Comentarii
Răspuns
Permiterea accesului la prin procese neprivilegiate ar fi într-adevăr o problemă de securitate și nu ar trebui permisă.
Pe sistemul meu, ls -l /dev/mem
arată astfel:
crw-r----- 1 root kmem 1, 1 Sep 8 10:12 /dev/mem
Deci root
îl poate citi și scrie, membri ai kmem
(din care nu există niciunul) îl poate citi, dar nu îl poate scrie, iar toți ceilalți nu îl pot deschide deloc. Deci, acest lucru ar trebui să fie sigur.
Dacă /dev/mem
este ceva asemănător cu al meu, procesul dvs. neprivilegiat nu ar fi trebuit să deschidă fișierul deloc, să nu mai vorbim mmap
it.
Verificați permisiunile /dev/mem
de pe sistemul dvs. pentru a vă asigura că sunt sigure!
Comentarii
- Dar presupunând că fac acest lucru ca root … Înseamnă că un proces rulat de root devine kernel privilegii de acces la nivel?
- Ei bine, dacă ' faceți acest lucru ca root, atunci aveți acces la toate. Nu ' nu știu ce vrei să spui prin " privilegii de acces la nivel de nucleu ", dar root poate face cu siguranță orice dorește, într-un fel sau altul (în special, de exemplu, realizând și încărcând dinamic un nou modul de nucleu).
- Da, acel ' s corect: atunci când mapați un fișier, apoi veți citi & scrieți fișierul fără a utiliza apeluri ststem. ' este adevărat, indiferent dacă ați mapat un fișier de disc obișnuit sau un dispozitiv special, cum ar fi
/dev/mem
div>. Dacă preferați, puteți deschide apeluri de sistem/dev/mem
și emiteread()
șiwrite()
. Atunci nu ați trimite I / O fără a utiliza apeluri de sistem. Rezultatul final este același, dar dacă aveți o mulțime de I / O mici de făcut,mmap()
și accesul direct vor funcționa probabil mai bine în mod special, deoarece nu aveți ' nu aveți nevoie de apeluri de sistem! Acest lucru este valabil și pentru fișierele obișnuite! - @ Stark07 Cred că ' ați pierdut ideea.
mmap
(și/dev/mem
) în sine NU oferă acces direct la memorie de sistem și este imposibil să faceți acest lucru în Ring 4. Ceea ce face în schimb este doar maparea unui fișier (sau a unei resurse) la o anumită adresă virtuală în procesul de apelare, la fel cum se întâmplă când un program este încărcat = „5f22008deb”>
ed (în acest caz, imaginea programului este mmap
ed în memoria virtuală).
Răspuns
Adresele vizibile la un proces de utilizator (fie că rulează ca root sau ca utilizator neprivilizat) sunt adrese virtuale, care sunt mapate la adrese fizice de MMU prin tabelele de pagini. Configurarea tabelelor de pagini este o operațiune privilegiată și poate fi efectuată doar prin codul nucleului; totuși, odată ce tabelele de pagini sunt setate, accesul la memorie este permis în modul utilizator.
Concret, codul dvs. folosește mmap
pentru a solicita nucleului să configureze tabele de pagini pentru a permite accesul la o anumită gamă de memorie fizică. Nucleul verifică privilegiile procesului (are acces de citire / scriere la /dev/mem
) și configurează tabelele de pagini pentru a-i permite accesul la memoria fizică.
Răspuns
Valoarea leds
este o adresă virtuală. Atâta timp cât este în spațiul utilizatorului a procesului curent, procesul îl poate accesa direct prin instrucțiuni precum leds[0] = val
fără a fi nevoie să fie în modul privilegiat, indiferent unde în RAM este mapată această adresă virtuală
*
în declarația , dar ' este doar codul, nu există dovezi că acest lucru funcționează efectiv ca utilizator neprivilegiat; în experiența mea (limitată), totul rulează ca root pe dispozitive încorporate.root
are multe privilegii, care includ permisiunea de a suprascrie tradiționalele permisiunile sistemului de fișiere. Unele " fișiere " sunt într-adevăr acces la dispozitive (cum ar fi discul sau memoria), care sunt interzise pentru utilizatorii obișnuiți. Nuroot
. Darroot
rulează în userpace , deci nu se bucură de ' de toate privilegiile modului de sistem (executați instrucțiuni privilegiate, mai ales).