2 Punkte von GN⁺ 2024-10-27 | 1 Kommentare | Auf WhatsApp teilen

Tiefgehende Analyse des neuen mseal-Systemaufrufs in Linux

  • mseal ist ein neuer Systemaufruf, der in Linux-Kernel Version 6.10 eingeführt wurde und die Funktion des „Memory Sealing“ zum Speicherschutz bereitstellt.
  • Dieser Systemaufruf macht Speicherbereiche während der Programmausführung unveränderlich gegenüber unzulässigen Modifikationen, sodass Angreifer weder Speicherberechtigungen ändern noch das Speicherlayout manipulieren können.
  • mseal dient dazu, Codeausführung durch Remote-Angreifer zu verhindern, und unterscheidet sich damit von den bestehenden memfd_create und memfd_secret, die lokale Angreifer abwehren sollen, wenn sensible Daten im Speicher abgelegt werden.

Funktionsweise von mseal

  • Die Funktionssignatur von mseal ist einfach: Sie nimmt eine Startadresse und eine Länge entgegen und versiegelt damit den entsprechenden Speicherbereich.
  • Die Funktion do_mseal sperrt den Speicherbereich und prüft sowie versiegelt ihn über check_mm_seal und apply_mm_seal.
  • Versiegelte Speicherbereiche können über Systemaufrufe wie mprotect, munmap und mremap weder in ihren Berechtigungen geändert noch entmappt oder in der Größe verändert werden.

Angriffstechniken, gegen die mseal schützt

  • NX-Härtung: mseal verhindert Änderungen an den Ausführungsrechten einer VMA und schützt so vor shellcodebasierten Angriffen.
  • Abschwächung von unmap-basierten Data-Only-Angriffen: mseal verhindert das willkürliche Freigeben und erneute Mappen von Speicherbereichen und blockiert so Data-Only-Angriffe.

Software-Härtung mit mseal

  • mseal kann die Sicherheit erhöhen, indem bestimmte Speicherbereiche einer Software versiegelt werden.
  • Entwickler können mit mseal gezielt Speicherbereiche versiegeln, in denen sich möglicherweise nicht vertrauenswürdige Daten befinden.
  • Mit der fortschreitenden Integration in glibc besteht die Möglichkeit, dass künftig eine automatische Versiegelungsfunktion hinzukommt.

Zusammenfassung von GN⁺

  • mseal ist eine neu in den Linux-Kernel eingeführte Sicherheitsfunktion, die Speicherbereiche versiegelt und damit Codeausführung durch Remote-Angreifer verhindert.
  • Anders als bestehende Speicherschutzmethoden verhindert dieser Systemaufruf Änderungen an Speicherberechtigungen und das Entmappen von Speicherbereichen und blockiert damit Data-Only-Angriffe.
  • Die Einführung von mseal spielt eine wichtige Rolle bei der Verbesserung der Software-Sicherheit, und durch die Integration in glibc werden weitere Anwendungsfälle erwartet.
  • Ähnliche Projekte mit vergleichbarer Funktionalität sind memfd_create und memfd_secret zum Speicherschutz.

1 Kommentare

 
GN⁺ 2024-10-27
Hacker-News-Kommentare
  • In der Kernel-Mailingliste wurde eine "hitzige Diskussion" erwähnt. Es gibt den Kommentar, ob jemand mit Insiderwissen die Einwände und Bedenken zusammenfassen könnte. Mailinglisten würden wegen ihrer Intensität eher gemieden.

    • Der Mechanismus selbst wirkt vernünftig, aber es überrascht, dass er nicht bereits im Kernel vorhanden ist.
  • Chrome möchte diesen Aufruf, kann aber versiegelte Seiten nicht entsiegeln, da ein Angreifer sie mit anderen Flags erneut mappen könnte.

    • Das bedeutet, dass er nicht für zur Laufzeit allokierte Seiten verwendet werden kann und somit unbrauchbar ist, sofern nicht beabsichtigt ist, sie über die gesamte Lebensdauer des Prozesses zu behalten.
    • Es wird gefragt, ob das bedeutet, dass er nicht für Speicher wie eine JS-Sandbox verwendet werden kann.
    • Ohne mit Chromes Speicher-/Prozessverwaltung vertraut zu sein, lässt sich nicht sicher sagen, warum das kein Problem wäre.
  • Es werden Links zu mseal() und zu darauf folgenden Artikeln bereitgestellt.

  • Es wird Bedauern darüber geäußert, dass das Betriebssystem solche Aufrufe implementieren muss, obwohl moderne Architekturen (x86_64) viele Funktionen zur Förderung sicheren Programmierens besitzen.

    • Versuche, veraltete Systeme zu patchen, behindern den Fortschritt im Computing und bringen Milliarden Menschen in Gefahr.
    • Es gibt Architekturfehler, aber Software nutzt die vorhandenen Funktionen derzeit nicht richtig.
  • Es gibt die Frage, ob sich der mseal-Systemaufruf mit einem LD_PRELOAD-Trick unwirksam machen lässt.

  • Der im Artikel enthaltene mseal()-Prototyp ist syntaktisch nicht korrekt. Das erste Argument sollte nicht unsigned start addr, sondern unsigned long start_addr sein.

  • OpenBSD verfügt schon seit Langem über diese Funktion. Es wird gefragt, warum sie erst jetzt in Linux eingeführt wird.