Jak funguje mmap ' ing / dev / mem, přestože je v neprivilegovaném režimu?
On 9 února, 2021 by adminPokud rozumím, programy uživatelského prostoru běží v neprivilegovaném režimu, a proto nemají přímý přístup k paměti nebo I / O.
Jak přesně tedy můžeme přímo přistupovat k paměti nebo I / O umístěním, když mmap / dev / mem v programech uživatelského prostoru?
Například:
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);
Toto je hack, který se velmi často používá ve vestavěných zařízeních.
Nyní lze použít proměnnou leds
za běhu jakékoli zařízení, které by mohlo být přítomno na 0x80840000.
Již nebudeme používat žádné systémové volání pro přístup k této adrese.
Dokonce něco jako
leds[0x20] = val;
bude fungovat.
Ale privilegované operace, jako je čtení / zápis přímo na / z I / O adresy, by měly být možné pouze uvedením procesoru do privilegovaného režimu prostřednictvím systémového volání.
Zdroj .
Komentáře
Odpovědět
Povolit přístup k /dev/mem
u neprivilegovaných procesů by skutečně představoval bezpečnostní problém a neměl by být povolen.
V mém systému vypadá ls -l /dev/mem
takto:
crw-r----- 1 root kmem 1, 1 Sep 8 10:12 /dev/mem
Takže root
jej může číst a zapisovat, členové kmem
(z nichž náhodou neexistuje) ji může číst, ale ne psát, a všichni ostatní ji nemohou vůbec otevřít. To by tedy mělo být bezpečné.
Pokud je váš /dev/mem
něco jako můj, váš neprivilegovaný proces by ani neměl být schopen soubor vůbec otevřít, natož mmap
it.
Zkontrolujte oprávnění /dev/mem
ve vašem systému a ujistěte se, že jsou zabezpečená!
Komentáře
- Ale za předpokladu, že to dělám jako root … Znamená to, že proces spuštěný rootem získá jádro přístupová oprávnění na úrovni?
- Pokud to ' děláte jako root, máte přístup ke všemu. ' si nejsem jistý, co máte na mysli " přístupovými oprávněními na úrovni jádra ", ale root může určitě tak či onak dělat co chce (zejména například vytvořením a dynamickým načtením nového modulu jádra).
- Ano, to ' s správné: když mapujete soubor, můžete si poté přečíst & napsat soubor bez použití jakýchkoli volání kmene. To ' platí, ať jste ' namapovali běžný soubor na disku nebo speciální zařízení jako
/dev/mem
. Pokud chcete, můžete otevřít/dev/mem
a vydatread()
awrite()
systémová volání. Pak byste neposílali I / O bez použití jakýchkoli systémových volání. Konečný výsledek je stejný, ale pokud máte spoustu malých I / O,mmap()
a přímý přístup bude pravděpodobně lépe fungovat konkrétně, protože <
Nepotřebujete systémová volání! To platí i pro běžné soubory!
mmap
(a /dev/mem
) NE neposkytují přímý přístup k systémová paměť a v Ring 4 je nemožné to udělat. Místo toho pouze mapuje soubor (nebo prostředek) na konkrétní virtuální adresu v procesu volání, stejně jako to, co se stane, když je program načten / exec
ed (v tomto případě je obrázek programu mmap
ed do virtuální paměti).Odpověď
Viditelné adresy k uživatelskému procesu (ať už běží jako root nebo neochranný uživatel) jsou virtuální adresy, které jsou mapovány na fyzické adresy pomocí MMU prostřednictvím tabulek stránek. Nastavení tabulek stránek je privilegovanou operací a lze ji provést pouze pomocí kódu jádra; jakmile jsou však nastaveny tabulky stránek, je přístup do paměti povolen v uživatelském režimu.
Váš kód konkrétně pomocí mmap
požaduje, aby jádro nastavilo tabulky stránek umožňující přístup k danému rozsahu fyzické paměti. Jádro kontroluje privilegia procesu (má přístup ke čtení / zápisu /dev/mem
) a nastavuje tabulky stránek, aby mu umožňoval přístup k fyzické paměti.
Odpověď
Hodnota leds
je virtuální adresa. Pokud je v uživatelském prostoru aktuálního procesu k němu může proces přistupovat přímo pomocí pokynů, jako je leds[0] = val
, aniž by musel být v privilegovaném režimu, bez ohledu na to, kam v RAM je tato virtuální adresa namapována
*
v prohlášeníleds
, ale ten ' pouze kód, žádný důkaz toho, že by to skutečně fungovalo jako neprivilegovaný uživatel; podle mých (omezených) zkušeností vše běží jako root na vestavěná zařízení.root
má mnoho privilegií, mezi něž patří i to, že může přepsat tradiční oprávnění souborového systému. Některé " soubory " mají skutečný přístup k zařízením (jako je disk nebo paměť), což je pro běžné uživatele zakázáno. Neroot
. Aleroot
běží v uživatelském prostoru , takže ' nevyužívá plná oprávnění systémového režimu (většinou provádět privilegované pokyny).