Autor Thema: Verschiedene Fragen zu System Calls und der Systemsicherheit  (Gelesen 3436 mal)

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
Hallo,
ich bin mittlerweile so weit, dass mein Projekt Betriebssystem einfache Programme ausführen kann, die über System Calls Text ausgeben, Ports und Speicherbereiche anfordern können.
Die Anforderung von Speicherbereichen mappt den gewünschten Speicher, z.B. 0xa0000 einfach in den Usermode, ohne überhaupt zu prüfen, man könnte also den Kernel komplett in den Usermode mappen und dann überschreiben, was ja nicht sonderlich sicher ist. *g*
 
Wie macht ihr das?
Welche Ports werden einfach so dem Task zur verfügung gestellt und welche nicht?
Wie sieht das aus, wenn jetzt z.B. ein Grafiktreiber den Bereich 0xa0000 anfordert, werden da noch spezielle Prüfungen durchgeführt, damit nicht aus Versehen Bereiche des Kernels in den Usermode gemappt werden?

Gruß Christian

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 03. August 2009, 15:40 »
Man könnte versuchen, Speicherbereiche, die zu Hardware gehören, gesondert zu verwalten und nur diese Speicherbereiche zulassen, wenn ein Prozess physischen Speicher mappen will. Das hätte aber eher mit Fehlerbehandlung als mit einer Sicherheitsmaßnahme zu tun. Das beste, was du tun kannst, ist, dass Treiber spezielle Privilegien brauchen (unter *nix wäre das typischerweise, es geht nur mit root).

Sich gegen einen bösartigen Treiber wehren, der Zugriff auf Hardware hat, ist aussichtslos. Im Zweifelsfall erledigt er deinen Kernel per DMA.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« Antwort #2 am: 03. August 2009, 18:39 »
Das würde dann heißen, wenn ich einen "Init"-Task habe, der alle Treiber (Floppy, Ext2, ...) aus einem bestimmten Verzeichnis, z.B. "system/drivers", lädt und ausführt, könnte ich nichts machen, wenn dort Schadsoftware hinein kopiert wurde.
Also müsste  ich das Kernelextern lösen, in dem ich sage, auf dieses Verzeichnis darf nur der Superuser/Administrator zugreifen.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 03. August 2009, 19:14 »
Du könntest auch deine Treiber signieren, und im Kernel die Signatur überprüfen. Die neueren Windows-Versionen machen das glaub ich so.

Dazu müsstest du natürlich in deinem Kernel vermutlich einen Haufen Crypto-Bibliotheken einbinden. (Selbstimplementieren ist da wohl eher nicht angebracht.)
Dieser Text wird unter jedem Beitrag angezeigt.

ehenkes

  • Gast
Gespeichert
« Antwort #4 am: 03. August 2009, 21:27 »
Ich finde diesen Sicherheitsaufwand bei einem Hobby-OS ziemlich lustig.  :-D

DerHartmut

  • Beiträge: 236
    • Profil anzeigen
    • Mein Blog
Gespeichert
« Antwort #5 am: 06. August 2009, 12:27 »
Naja, wenn man schon mal was als Hobby macht, dann auch richtig ;)
$_="krJhruaesrltre c a cnp,ohet";$_.=$1,print$2while s/(..)(.)//;
Nutze die Macht, nutze Perl ;-)

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« Antwort #6 am: 10. August 2009, 10:48 »
Die Frage war ja nur Aufgrund des extrem unsicheren System Calls, der demnächst ersetzt wird.  :roll:
 
Ich mache mir momentan Gedanken darüber, wie ich den Mikrokernel erweitern kann, um das Ausführen von Treibern zu ermöglichen. Der erste Schritt, also das Ausführen von Programmen im ELF-Format ist dahingehend getan, da dies mittlerweile funktioniert.
 
Nun müssen die Treiber ja, zumindest Teilweise, auf verschiedene Ports zugreifen (Grafiktreiber, Netzwerktreiber, Soundtreiber, ...). Aus diesem Grund habe ich einen System Call eingebaut, der den gewünschten Port aktiviert, damit dieser in Ring 3 funktioniert.
 
Als nächstes müsste noch ein System Call eingebaut werden, der eine Speicherseite reserviert und irgendwohin auf irgendeine beliebige Speicherseite legt, was denke ich mal vom Heapmanager des Tasks genutzt wird. Des weiteren den Gegenpart dazu, das Freigeben einer bestimmten Speicherseite, falls diese in den Usermode gemappt wurde. Natürlich muss geprüft werden, ob es diese Adresse, diesen Adressbereich, wirklich gibt.
 
Als weiteres benötigen bestimmte Treiber bestimmte Hardwareadressen. Mir fällt da momentan nur der Grafiktreiber mit der Speicherseite 0xb8000 ein. Diese Anforderung würde ich entgegennehmen, an eine beliebige Stelle mappen und dann diese virtuelle Adresse an den Task zurückgeben. Natürlich muss auch hier geprüft werden, ob es diese Adresse, diesen Adressbereich, wirklich gibt.
 
Auch müsste ich irgendwie mein System umbauen, damit bei einem IRQ für die Netzwerkkarte auch dessen Handler aufgerufen wird. Wie ich das umsetze, muss ich noch herausfinden. ;)
 
[edit]
Was mir nun noch eingefallen ist, ist dass der Treiber bestimmte Funktionalitäten bereitstellen muss, auf die von anderen Treibern zugegriffen werden kann, also IPC und im Falle des Grafiktreibers würde erst einmal der RPC ausreichen...
[/edit]
 
Das ist erst einmal alles, was mir so eingefallen ist. Gibt es noch Dinge, die ich vergessen habe, oder die man besser anders löst?
 
 
Gruß Christian
« Letzte Änderung: 10. August 2009, 14:44 von ChristianF »

 

Einloggen