Lowlevel

Lowlevel => Softwareentwicklung => Thema gestartet von: Dimension am 15. August 2012, 14:13

Titel: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Dimension am 15. August 2012, 14:13
Eine nicht vollständige Sammlung von Überlegungen, die Robustheit und Zuverlässigkeit von Software oder auch Hardware zu steigern:

Gruß
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Svenska am 15. August 2012, 17:09
Aha.
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: kevin am 15. August 2012, 17:28
Also der erste Punkt heißt im Klartext "manuelle Speicherverwaltung will man nicht". Das kann ich soweit noch nachvollziehen. Aber der Rest geht irgendwie stark in die Richtung "wenn man weniger tut, macht man weniger Fehler", oder? Es wäre natürlich toll, wenn mein E-Mail-Client weniger Bugs hätte, aber doch bitte nicht, wenn der Preis dafür ist, dass er keine Mails mehr lesen kann...
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Svenska am 15. August 2012, 18:17
Hallo,

um das "Aha." noch etwas zu konkretisieren:

Manuelle, dynamische Speicherverwaltung will man nicht. Stimmt. Rein statisch (oder vollständig extern überwacht) ist für OS-Development allerdings schwierig bis unmöglich.

Fast alle deine Punkte laufen auf drei Ansätze hinaus:
- Codeausführung ausschließlich unter Aufsicht eines Hypervisors als "managed code only" (vgl. Java, .net und Scriptsprachen)
- saubere Schnittstellen, an denen jeweils geprüft wird, ob Unsinn hinein- oder hinauskommen soll
- try/except um jeden Codeblock herum

Alle Ansätze führen allerdings nicht zu besserem Code. Sie ermöglichen im Gegenteil, dass die Codequalität nahezu beliebig schlecht werden kann, weil die Runtime alle Probleme für dich auffängt. Java kippt ja auch grundsätzlich einen Stacktrace auf die Straße, wenn mal irgendwas schief geht. Außerdem landet in den oberen Schichten nur ein allgemeiner Fehler, wenn irgendwas schief läuft (Extrembeispiel: "Webseite kann nicht angezeigt werden." - egal, ob das nun kaputter HTML-Code, ein OOM in der HTTP-Lib war, der DNS-Resolver nichts findet oder der Ethernet-Treiber hustet. Fehlersuche ist dann doof.)

Gegen Garbage Collection habe ich persönlich etwas (leider nichts effektives), weil es die Latenz der Anwendung in die Höhe treibt. Als Beispiel kann man sich da Minecraft anschauen, bei dem die meisten "Optimierungen" in geschickteren Einstellungen des GCs liegen.

Und ein Hypervisor kann auch nur begrenzt Dinge erkennen und abfangen, da er ja eine turing-vollständige Welt abbildet. Die ganze Virtualisierung von Servern geht in die gleiche Richtung. Aber ob ein Einbruch in den Server oder in eine (schlecht konfigurierte) VM geschieht, ist mir egal - der Angreifer hat die Daten und damit sein Ziel erreicht.

Nicht zuletzt müssen Runtime und Hypervisor bis zu einem gewissen Grad außerhalb dieser Ideen entwickelt werden, weil sie eben systemspezifisch und ziemlich komplex sein müssen, um gute Performance zu liefern.

Für mich klingen deine Vorschläge wie aus einem Uni-Script abgeschrieben. Sinnvoll, aber nicht (überall) sinnvoll umsetzbar. :-) Und sie verlagern das Problem auf andere.

Gruß,
Svenska
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Dimension am 15. August 2012, 21:21
Ich sehe das alles insgesamt recht locker. Weitere Details folgen...
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Dimension am 22. August 2012, 12:50
Die Ausführung würde in der Tat von einem Hypervisor verwaltet werden, welcher Speicherzugriffe pro Funktionsblock in einem privilegierten Modus und den eigentlichen Code im Usermode ausführt. Das betrifft dann allerdings nur den kritischen Teil des Kernels, etwa den Scheduler. Diese "Trusted Computing Base" kann bei Microkerneln vergleichsweise klein gehalten werden.

Ergänzung zur Liste aus dem 1. Posting:

Gruß
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Dimension am 18. March 2013, 21:09
Die Sandbox realisiere ich wie folgt:

Ebenen:
1: Speicherverwaltung
2: Datenzugriff & Berechtigungen
3: Sandbox
4: Prozesse (in Containern strukturiert)

Die Sandbox führt User-Code in Ring 3 aus. Der Code wurde zuvor in eine spezielle 4KB-Seite geladen. Ein spezieller Compiler erzeugt diese entsprechenden 4KB-Frames. Aus Ring 3 ist nur eine spezielle Seite adressierbar, die Daten enthält, die zuvor aus dem Speicher des Prozesses kopiert wurden. Nach Ablauf der Berechnung werden die Daten wieder zurück geschrieben.

Treiber würden sich auf Ebene 4 und der Scheduler zwischen Ebene 2 und 3 befinden. Interrupts werden in eine Warteschlange geschrieben und von einem Prozess verarbeitet.

Die Berechtigungen eines Prozesses geben an, welcher Speicher zugreifbar ist und ob spezielle Befehle erlaubt sind. Befehle, die in Ring 3 verboten sind werden von der Sandbox emuliert, etwa Portzugriff und DMA (nur für System-Prozesse). Der Code von Ebene 1 bis 3 und System-Prozesse mit speziellen Berechtigungen sind kritisch für die Sicherheit des Systems.

Sicherheitskritischen Code schreibe ich wie folgt:
Überprüfen aller Parameter auf Wertebereich und erlaubte Kombinationen
Überprüfen der Grenzen für die Index- und Adressberechnung
Keine Arrays/Puffer auf dem Stack
Checks gegen alle möglichen Integer-Overflows, Division nur mit Immediate
Einfache Codestruktur: einfache deterministische Schleifen, keine Rekursion, keine Pointer-Magie, kaum verschachtelte Calls
Keine speziellen Spracherweiterungen oder Befehle

Der Code kommt in ein Segment ohne Schreibrechte. BIOS, IDT und GDT werden nicht gemappt. Weitere Segmente sind Daten+Stack für den Kernel, Code- sowie Daten-Frames für die Sandbox, MMIO, und das große Segment für den dynamische allozierbaren Speicher.

Ein Angriff würde sich auf die Segmente des Kernels konzentrieren, insbesondere auf das Code-Segment, auf den Stack (ROP), die Tabellen der Speicherverwaltung und die Bereiche der Festplatte, von der das System gebootet wird. Außerdem könnte versucht werden auf Speicher anderer Prozesse unerlaubt zuzugreifen und erweiterte Berechtigungen zu erhalten oder Das System durch viele Prozesse oder Einträge in den Verwaltungsdaten zu überlasten. Des weiteren könnte ein Angreifer versuchen die Rücksprungadresse auf dem Stack zu verändern, so dass die Instruktionen anders interpretiert werden.

Durch die Segmentierung werden Buffer-Overflows in die Kernel-Segmente oder die ungemappten Bereiche hardwareseitig verhindert, somit können nach dem Starten des Systems das Kernel-Codesegment, die IDT, die ISR und die GDT nicht mehr verändert werden. Ein Problem stellt hier allerdings noch DMA dar, weil auf 32-Bit Systemen jedes PCI-Gerät uneingeschränkt auf den gesamten Speicher zugreifen kann. Hier muss man der Hardware und ihren Treibern vertrauen und/oder die Treiber absichern.

Da der sicherheitskritische Teil des Kernels (ohne Treiber) nur einige 1000 Zeilen Code umfasst, kann er leicht geprüft werden.
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Manello am 19. March 2013, 13:36
Zitat
bestimmte Algorithmen und Datenstrukturen sind anfälliger für fehlerhafte oder unstimmige Eingabewerte. Die Auswirkungen eines Fehlers sollten sich möglichst lokal auswirken und nicht die gesamte Struktur betreffen.
Willst du jetzt den Software Entwicklern solche Datenstrukturen verbieten?

Zitat
Sicherheiskritischen Code schreibe ich wie folgt:
Überprüfen aller Parameter auf Wertebereich und erlaubte Kombinationen
Überprüfen der Grenzen für die Index- und Adressberechnung
Dass würde den PC erstmal einiges an Leistung fordern.
Außerdem würden evt. einige Programme nicht mehr funktionieren.
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Dimension am 19. March 2013, 14:32
Windows Programme brauchen eine Win-API
Linux-Programme brauchen eine Linux-API
Java-Programme brauchen eine JVM
.NET-Programme brauchen eine CLR
Javascript braucht einen JIT-Compiler

Das System läuft direkt auf x86-Hardware, somit weiss ich nicht, was du jetzt genau meinst.

Gruß
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Svenska am 19. March 2013, 16:05
Hallo,

ich fasse zusammen, was ich da rauslese (bei Fehlern bitte korrigieren):
- du programmierst den Kernel extrem defensiv, auf Kosten der Performance
- du implementierst einen Hypervisor im Kernel
- der Hypervisor erlaubt nur Programme mit maximal 4 KB Code und 4 KB Daten
- es gibt keine Hardwaretreiber

Da du die Trusted Computing Base auf einige 1000 Zeilen Code beschränkst, sind Hardware-Treiber nicht Teil dieser Basis. Die müssen demnach zwangsweise im Ring 3 laufen. Da du Segmentierung erwähnst, läuft dein OS im 32-Bit-Modus und ich vermute, du wirst dann keine 64-Bit-CPU voraussetzen. Das wiederum heißt, dass du keine IOMMU zur Verfügung haben wirst und deine Ring-3-Hardwaretreiber beliebige DMA-Zugriffe machen dürfen, was natürlich sicherheitstechnisch nicht geht. Also keine Hardwaretreiber. :-)

Javascript braucht einen JIT-Compiler
Nö. Bis Google kam, wurde Javascript interpretiert.

Gruß,
Svenska
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Manello am 19. March 2013, 16:37
Uhm aber wenn es ohne Treiber ist, müsstest du doch alle selber machen?
Und dass für alle Hardwareteile zu machen, wäre eigentlich fast unmöglich weil es
da so viele gibt. Auserdem könntest du die Hardware ohne Treiber auch
nicht komplett ausnutzen.
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Svenska am 20. March 2013, 00:24
*hüstel* Wenn du es selber machst, dann schreibst du einen Treiber... was direkt bedeutet, dass es danach einen Treiber gibt. Ich schrieb "es gibt keine Hardwaretreiber". Das ist was anderes.
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Dimension am 20. March 2013, 07:34
Ich schrieb "es gibt keine Hardwaretreiber". Das ist was anderes.
Und nicht so gedacht. Bus-, Chipsatz- und Gerätetreiber laufen als Prozess. (Siehe aktualisierten Post.)

Ein user-Prozess kann mit der entsprechenden Berechtigung Funktionen im Kontext des Prozesses mit den Treibern aufrufen.
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: kevin am 20. March 2013, 09:21
Es geht darum, dass dein schön eingezäunter Ring-3-Treiber per DMA einfach den Zaun von außen aufmachen kann.
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Dimension am 20. March 2013, 09:43
Die Berechtigungen geben Ports und MMIO-Bereich vor und der DMA wird vom Kernel ausgeführt. Geräte sollten bestenfalls nicht Busmaster werden dürfen, da hast du natürlich recht.

Der Kernel implementiert grundlegende Protokolle wie PRDT (ATA über DMA). Falls die Hardware unbedingt Busmaster werden muss, bekommt sie halt einen reservierten Speicherbereich.

Spezielle Berechtigungen, die den Kernel und die Treiber betreffen sind auf Systemprozesse beschränkt.
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: kevin am 20. March 2013, 10:03
Und wie unterscheidet dein Kernel, ob hinter einem I/O-Port bzw. MMIO-Bereich ein Gerät steckt, das Busmaster werden könnte? Willst du etwa eine Whitelist anlegen, in der dann Tastatur*, serielle Schnittstelle und Floppy drin sind? Alle anderen interessantes Geräte müssen sowieso vom Kernel kontrolliert werden (PIC, PIT) oder können als Busmaster agieren (mehr oder weniger alle PCI-Geräte)

*) Den Tastaturcontroller kann man leider auch nicht erlauben, weil damit könnte man ja resetten, am A20 rumspielen oder was es da noch so alles gibt
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Svenska am 20. March 2013, 14:59
Oder die Berechtigungen den MMIO-Bereich vorgeben und der DMA vom Kernel ausgeführt wird. Geräte dürfen nicht Busmaster werden, da hast du natürlich recht.
Wie willst du denn DMA vom Kernel ausführen lassen? Die Anweisung an die Hardware, einen Datenblock per DMA zu übertragen, ist hardwarespezifisch...
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Dimension am 20. March 2013, 20:30
Sobald ein System-Prozess spezielle Berechtigungen anfordert, hat dieser eine gewisse Verantwortung.

Die Treiber sind weiterhin Teil des Betriebssystems und werden entsprechend robust sein. Solange der Treiber sich nur auf seine eigentliche Aufgabe konzentriert und keine optionalen Funktionen implementiert sehe ich da keine Gefahr.

Siehe auch bearbeiteten Post zu DMA.
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Svenska am 20. March 2013, 22:01
Sobald ein System-Prozess spezielle Berechtigungen anfordert, hat dieser eine gewisse Verantwortung.
Damit fallen also alle Treiber unter die Trusted Computing Base. Hätten wir das also geklärt. :-)
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Dimension am 20. March 2013, 23:22
Sobald ein System-Prozess spezielle Berechtigungen anfordert, hat dieser eine gewisse Verantwortung.
Damit fallen also alle Treiber unter die Trusted Computing Base. Hätten wir das also geklärt. :-)
Das tun sie. Und sie profitieren vom Buffer-Overflow-Schutz der Sandbox. Mittels sparsam vergebenen Berechtigungen weiss man, wo man genau hin schauen muss (in Container-Sandboxen werden diese für alle untergeordneten Prozesse abgefangen).
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Dimension am 21. March 2013, 23:46
ich fasse zusammen, was ich da rauslese (bei Fehlern bitte korrigieren):
- du programmierst den Kernel extrem defensiv, auf Kosten der Performance

Ich versuche den Kernel so übersichtlich zu machen, wie es geht. Wenn ein Codestück zu komplex wird, schmeisse ich es weg, verzichte auf ein unwesentliches Merkmal und schreibe es einfacher.

Die Sicherheit soll hardwareseitig, durch das Design und durch Runtime-Checks gewährleistet werden. Ich will dass User im Internet surfen können ohne ein schlechtes Gewissen zu bekommen und beliebige Software herunterladen und ausführen können ohne dass diese unbeabsichtigte Dinge tun oder Dienste im Hintergrund starten.

Ich will außerdem, dass ein Programm beliebig angehalten und sein Zustand gespeichert werden kann, um es mit ins Büro zu nehmen oder einem Bekannten zu schicken. Eine Präsentation im Internet bedeutet, ich kann die Show anhalten und das Programm selbst ausprobieren.

Ich will mein Betriebssystem und alle darauf laufenden Programme mit nur einem Klick im Editor bearbeiten können, etwa um eine Suchmaske zu ändern oder ein Programm zu scripten.

Einen mehrstündigen Kompiliervorgang oder einen aufwändigen Testlauf will ich auf einem schnellen Server parallelisiert ausführen, während ich ein Forum im Internet auch gerne mal offline lesen möchte.

Wenn ich Windows oder Linux benutze sehe ich immer nur was alles nicht geht.

Gruß
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Svenska am 22. March 2013, 00:42
Hallo,

also mal rein gefühlt empfinde ich deinen Ansatz als Lösung für das falsche Problem.

Wenn ein Codestück zu komplex wird, schmeisse ich es weg, verzichte auf ein unwesentliches Merkmal und schreibe es einfacher.
Wenn du genug unwesentliche Merkmale weglässt, ist dein System nutzlos.

Die Sicherheit soll hardwareseitig, durch das Design und durch Runtime-Checks gewährleistet werden.
Das heißt, du setzt moderne Hardware voraus (IOMMU, 64-Bit-Modus), verzichtest damit auf Segmentierung und arbeitest ausschließlich mit "managed Code" in einem Hypervisor.

Ich will dass User im Internet surfen können ohne ein schlechtes Gewissen zu bekommen und beliebige Software herunterladen und ausführen können ohne dass diese unbeabsichtigte Dinge tun oder Dienste im Hintergrund starten.
Das wiederum hat genau nichts mit dem Kernel zu tun. Weder Windows noch Linux erlauben einem Benutzer, Dienste im Hintergrund zu starten oder unbeabsichtigte, das System beeinflussende, Dinge zu tun.

Die Angriffe, die einstmals das Betriebssystem geknackt haben, sind nutzlos geworden. Das heißt nicht, dass es keine Rootkits gibt, aber auf PCs sind sie für den Normalnutzer kein Thema. Es ist ziemlich egal, ob du von einem Benutzer den Rechner oder das Profil knackst - wenn du die Daten hast, hast du gewonnen. Anwendungen leben heutzutage im Browser und den zu sichern ist schwierig, weil es Unmengen an Code und Standards sind, die du unterstützen musst. Dazu kommt, dass sich die Standards widersprechen (WSDL und SOAP anyone?) oder hinreichend mächtig sind (JIT-compiled Javascript).

"Das Internet" hat nicht mehr viel mit deinem Betriebssystemskernel zu tun und dessen Sicherheit ist nebensächlich. Googles ChromeOS zeigt den Weg. Wenn es nach den derzeit regierenden Firmen (Microsoft, Google, Facebook) geht, sind Betriebssysteme eine sterbende Ware.

Ich will außerdem, dass ein Programm beliebig angehalten und sein Zustand gespeichert werden kann, um es mit ins Büro zu nehmen oder einem Bekannten zu schicken. Eine Präsentation im Internet bedeutet, ich kann die Show anhalten und das Programm selbst ausprobieren.
Wie bringst du das dem anderen System im Internet bei, wenn es Session-IDs basierend auf IP-Adressen benutzt? Es ist ja schön und gut, wenn dein Webbrowser das alles unterstützt, aber die anderen müssen genauso denken.

Man hat auf dem letzten Chaos-Congress gesehen, wie sehr Dienste z.B. heutzutage auf Geolocation angewiesen sind und was passiert, wenn es schiefgeht. Ich empfehle den NOC-Bericht. Extrapoliere das von "Geolocation-Daten" auf die Summe der Informationen, die so ein Browser rausgibt und du siehst das Problem vielleicht. Facebook sammelt eine Menge Informationen über die Nutzer durch die Like-Buttons und korreliert die mit den Profilen, auch wenn derjenige nicht angemeldet ist. Außerdem werden Profile über Nutzer ohne Account angelegt und ausgewertet. Die Leute haben rausgefunden, dass ein User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.12) Gecko/20100101 Firefox/10.0.12 Iceweasel/10.0.12 zwar nah dran, aber doch nicht so ganz eindeutig ist, wohl aber das Tupel aus User-Agent, Betriebssystem, Geolocation-Daten, Provider, IP-Paketroute, Verbindungsqualität (Ping+Bandbreite), Sprache des Nutzers, Bildschirmauflösung und vielem mehr.

Ich will mein Betriebssystem und alle darauf laufenden Programme mit nur einem Klick im Editor bearbeiten können, etwa um eine Suchmaske zu ändern oder ein Programm zu scripten.
Also möchtest du alle Anwendungen für dein Betriebssystem im Source-Code in einer Scriptsprache schreiben und das Betriebssystem selbst, bis auf die Trusted Code Base in dieser Sprache schreiben? Bringt das was?

Willst du wirklich den Source-Code von Firefox, Chrome, Internet Explorer einsehen und zur Laufzeit ändern können? Glaubst du, es gibt Programmierer auf dieser Welt, der in der Lage ist, sich auf die Schnelle in solch ein Mammutprojekt einzulesen und seiteneffektfreie Änderungen vorzunehmen? Der Sinn liegt ja nicht darin, dass jemand auf seiner Festplatte drei Zeilen Code ändert, sondern dass jeder sein persönliches System anpassen können soll. Das ist schlichtweg nicht möglich.

Übrigens hat sich auch gezeigt, dass Open-Source-Code teilweise schlechter auditiert ist als proprietäres Zeug - was daran liegt, dass es offen ist und mit "irgendjemand wird das schon gemacht haben" betitelt ist, was insbesondere bei kleinen (weil nicht genug Leute) und sehr großen Projekten (weil Codebasis zu groß) nicht passiert.

Einen mehrstündigen Kompiliervorgang oder einen aufwändigen Testlauf will ich auf einem schnellen Server parallelisiert ausführen, während ich ein Forum im Internet auch gerne mal offline lesen möchte.
Ich dachte, du möchtest auf Scriptsprachen umsteigen? Aber parallel kompilieren auf einem Drittserver gibt es heutzutage schon, z.B. mit distcc. Ein Forum offline lesen geht heutzutage auch, solange es sich nicht gerade um das neuste, möglichst stark im Browser implementierte Forum handelt. wget ist dein Freund.

Wenn ich Windows oder Linux benutze sehe ich immer nur was alles nicht geht.
Repariere lieber Linux.

Du hast eine nette Vision. Ich hätte auch gern so eine Welt, wie du sie beschreibst.

Aber ich sehe, dass die Welt gerade in eine völlig andere Richtung marschiert, auf allen Fronten gleichzeitig. Und ich sehe, dass deine Ansätze dieser Vision nicht helfen. :-) Wie oben geschrieben, "das Internet" lebt inzwischen im Browser, nicht im Betriebssystem. Und ein sauberer Mikrokernel mit maximaler Sicherheit hilft nicht dagegen, dass 3D-Grafiktreiber (notwendig, weil 3D- und Videobeschleunigung im Browser) aufgrund der komplexen Hardware so unglaublich schwierig zu programmieren und zu sichern sind. Bugs kannst du nicht vermeiden - und Bugs in Hardwaretreibern können zu DMA führen, und damit zu Rootkits.

Aus dem Browser.

Welcome to the future,
Svenska

PS: Ich wüsste gerne, was ihr so denkt und/oder ob ich mit meiner Meinung ganz alleine dastehe und Dimension hier ganz unnötig Contra gebe und ihr das ganz anders seht.
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Dimension am 22. March 2013, 08:49
Weder Windows noch Linux erlauben einem Benutzer, Dienste im Hintergrund zu starten oder unbeabsichtigte, das System beeinflussende, Dinge zu tun.
Wirklich? Also ich habe da schon ganz andere Geschichten gehört.

Die Sicherheit soll hardwareseitig, durch das Design und durch Runtime-Checks gewährleistet werden.
Das heißt, du setzt moderne Hardware voraus (IOMMU, 64-Bit-Modus), verzichtest damit auf Segmentierung und arbeitest ausschließlich mit "managed Code" in einem Hypervisor.
Siehe aktualisierte Posts vom 18. März 2013, 21:09 (http://forum.lowlevel.eu/index.php?topic=3080.msg37304#msg37304) und 20. März 2013, 23:22 (http://forum.lowlevel.eu/index.php?topic=3080.msg37322#msg37322).

Willst du wirklich den Source-Code von Firefox, Chrome, Internet Explorer einsehen und zur Laufzeit ändern können? Glaubst du, es gibt Programmierer auf dieser Welt, der in der Lage ist, sich auf die Schnelle in solch ein Mammutprojekt einzulesen und seiteneffektfreie Änderungen vorzunehmen?
Nehmen wir einmal an, du hast ein Programm und willst diesem eine Funktion hinzufügen, die dir das Arbeiten erleichtert. Wenn dieses Programm überhaupt Scripting bereitstellt, wie willst du damit die Benutzeroberfläche erweitern und vorhandenen Code des Programms anpassen? Geht das auch bei Anwendungen, die auf dem Server laufen? Bei meinem System reicht ein Klick mit gehaltener F-Taste auf das Fenster und das zu bearbeitende Formular und alle verknüpften Ereignisse werden im Editor geöffnet. Da die Symbole im Editor sofort aufgelöst werden, sind die Effekte direkt sichtbar.
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Svenska am 22. March 2013, 14:40
Weder Windows noch Linux erlauben einem Benutzer, Dienste im Hintergrund zu starten oder unbeabsichtigte, das System beeinflussende, Dinge zu tun.
Wirklich? Also ich habe da schon ganz andere Geschichten gehört.
Ja. Die Dinge nennt man Bugs/Sicherheitslücken. Kannst du nicht verhindern.

Was du nicht verhindern kannst sind Dienste mit den Berechtigungen des angemeldeten Nutzers.

Nehmen wir einmal an, du hast ein Programm und willst diesem eine Funktion hinzufügen, die dir das Arbeiten erleichtert. Wenn dieses Programm überhaupt Scripting bereitstellt, wie willst du damit die Benutzeroberfläche erweitern und vorhandenen Code des Programms anpassen?
Gib mal Beispiele, die man heute nicht erreichen kann.

MS-Office konnte früher Makros ins Menü und in die Symbolleiste einbinden und Firefox bindet mit Greasemonkey Scripte in die Oberfläche ein.

Geht das auch bei Anwendungen, die auf dem Server laufen?
Du kannst also jederzeit Anwendungen, die auf einem anderen Rechner laufen, verändern? Respektabel. Mir fallen gerade ein paar schöne Möglichkeiten ein, wie man den Benutzer mit einem bösen Programm, welches nur das Homeverzeichnis verändert, verunsichern kann... besonders, wenn dieser Benutzer kein Programmierer ist. Zum Beispiel "Datei-Speichern" mit einer Funktion zu ersetzen, die "Datei-Upload" und dann "Datei-Speichern" ausführt.

Gruß,
Svenska
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Dimension am 09. April 2013, 22:11
Gib mal Beispiele, die man heute nicht erreichen kann.

Wie wärs damit:

Ein User postet auf lowlevel und hat ein Problem mit einem Stück Code. Er postet seine Entwicklungsumgebung und jeder kann es im Browser testen. Die funktionierende Lösung holt der User sich dann zurück auf seinen Rechner.

Ein Developer-Tutorial oder ein Referenzhandbuch im Internet ist mit Beispielen. Die Beispiele lassen sich im Browser ausführen.

Es wurde ein Update für den Browser veröffentlicht. Ich habe gerade einen 80GB-Download bei 50%. Ohne das Update browse ich gefährlich. Der Browser macht einen Snapshot seines Speichers und macht das Update unter Berücksichtigung der aktuell ausgeführten Programmteile.

Ich arbeite zuhause an einem Projekt und will im Geschäft daran weiter arbeiten. Ich transferiere meine komplette Arbeitsumgebung auf ein Tablet und gehe unterwegs noch mal alle Punkte durch. Im Geschäft angekommen öffne ich das Projekt an meinem Arbeitsplatz und setze meine Arbeit fort.

Nur so als Inspiration.

Gruß
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Dimension am 09. April 2013, 22:27
Ich benutze ein Programm und entdecke einen schwer zu reproduzierenden Bug. Ich sende ein Speicherabbild des Programms und eine Aufzeichnung der letzten 10 sek. an den Entwickler. Eventuell schaue ich mir den Code an und schreibe mir selbst einen Fix. Diesen kann ich direkt an den Entwickler weiterleiten und jedem, der ebenfalls einen Fix schreiben will über einen Kommentar im Code zum Download anbieten. Dieser Fix hat natürlich nur eingeschränkte Auswirkung auf die gesamte Anwendung. Dass dem so ist wird vom Editor per Datenflussanalyse geprüft.
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Jidder am 09. April 2013, 22:52
Ein User postet auf lowlevel und hat ein Problem mit einem Stück Code. Er postet seine Entwicklungsumgebung und jeder kann es im Browser testen. Die funktionierende Lösung holt der User sich dann zurück auf seinen Rechner.

Geht das denn auch, wenn auf dem lowlevel-Server Linux läuft?
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Svenska am 09. April 2013, 23:35
Hallo,

Ein User postet auf lowlevel und hat ein Problem mit einem Stück Code. Er postet seine Entwicklungsumgebung und jeder kann es im Browser testen. Die funktionierende Lösung holt der User sich dann zurück auf seinen Rechner.
Contraproduktiv. Wir sind hier zum Lernen, Spielen und Basteln. :-P Die Tutorials sind sehr gut und wer mit seinem eigenen Code nicht umgehen kann, muss noch mehr lernen. Ansonsten ist eine Entwicklungsumgebung (aus welchen Gründen) ziemlich stark an den PC gebunden, auf dem sie läuft; da hilft deine Lösung nix, sondern dazu müsste man die Entwicklungsumgebung fixen, was aus mir nicht bekannten Gründen (Manpower? Desinteresse?) nicht geschieht.

Ein Developer-Tutorial oder ein Referenzhandbuch im Internet ist mit Beispielen. Die Beispiele lassen sich im Browser ausführen.
Es gibt einen Javascript-basierten x86-Emulator von Fabrice Bellard. Ansonsten sollte man seinen Code selbst schreiben können. Du predigst Copypaste, aber (a) lernt man dann nix (b) produziert man braunes, weiches Zeug und (c) steht man irgendwann sowieso an der Wand, an der das Tutorial mit den Beispielen aufhört.

Es wurde ein Update für den Browser veröffentlicht. Ich habe gerade einen 80GB-Download bei 50%. Ohne das Update browse ich gefährlich. Der Browser macht einen Snapshot seines Speichers und macht das Update unter Berücksichtigung der aktuell ausgeführten Programmteile.
Und wer programmiert den Updater in seiner ganzen Komplexität fehlerfrei? Wie händelt der Updater verschiedene Browserversionen? In die Zukunft schauen kann der Programmierer nicht, also muss der Updater im Update mit drin sein und alle(!) vergangenen Versionen kennen. Wer testet alle Kombinationsmöglichkeiten?

Während des Updates wird nicht weitergeladen, bis der Server mit einem Timeout abbricht - alternativ zerhaut dir die 24h-DSL-Zwangstrennung zwischendurch die Verbindung. Danach rufst du mit "wget -c" den Download erneut auf und erfreust dich daran, dass dein Browser die Dinge tut, für die er da ist (Browsen) und der Downloader die Dinge tut, für die er da ist (Downloaden).

Ich arbeite zuhause an einem Projekt und will im Geschäft daran weiter arbeiten. Ich transferiere meine komplette Arbeitsumgebung auf ein Tablet und gehe unterwegs noch mal alle Punkte durch.
Denjenigen, der vernünftig produktiv auf einem Tablet arbeiten kann, möchte ich mal sehen... besonders mit Software, die für den PC gemacht ist. Und nein, eine Software, die du "mal eben schnell im Betrieb" zwischen zwei verschiedenen Architekturen hin- und herschieben kannst, ist in den nächsten Jahren nicht realistisch. Ohne Tastatur macht Produktivität auf dem Tablet eh keinen Spaß. Dokumente anschauen, Todo-Listen überarbeiten geht aber auch so schon ganz gut, Präsentationen bauen eher nicht - aber der Trend geht in die Richtung.

Im Geschäft angekommen öffne ich das Projekt an meinem Arbeitsplatz und setze meine Arbeit fort.
Wie wäre es mit "seamless sessions", wie sie VNC oder RDP ermöglichen? Wenn du deine Arbeitsumgebung durchs Internet verschicken möchtest, kannst du auch gleich übers Internet damit arbeiten. Für alles andere nimmt man eine richtige Cloud, z.B. Google Docs und ähnliche Dinge und wenn du hardcore antigoogle bist, baust du dir das auf deinem eigenen Server auf...

Ich benutze ein Programm und entdecke einen schwer zu reproduzierenden Bug. Ich sende ein Speicherabbild des Programms und eine Aufzeichnung der letzten 10 sek. an den Entwickler. Eventuell schaue ich mir den Code an und schreibe mir selbst einen Fix. Diesen kann ich direkt an den Entwickler weiterleiten und jedem, der ebenfalls einen Fix schreiben will über einen Kommentar im Code zum Download anbieten.
Das ist ne gute Idee. Wo ist aber die zentrale Instanz, die solche Codeschnipsel verbreitet? An wen wendet sich der Random System Administrator, um seine Anwendung von einem Unbekannten fixen zu lassen? Viele Quick Fixes sind nicht korrekt.

Dieser Fix hat natürlich nur eingeschränkte Auswirkung auf die gesamte Anwendung. Dass dem so ist wird vom Editor per Datenflussanalyse geprüft.
Von so Dingen wie "Turing-Vollständigkeit" und "Halteproblem" hast du gehört und weißt, dass damit jede Datenflussanalyse deutliche Grenzen hat?

Geht das denn auch, wenn auf dem lowlevel-Server Linux läuft?
Wenn man Dimensions Betriebssystem benutzt, geht das. Sonst natürlich nicht (es sei denn, der Hypervisor wird auf Linux portiert).

Fakt ist, deine Beispiele sind eher Visionen als Ideen und sie zeigen in eine Richtung, die ich definitiv nicht teilen kann. Davon abgesehen sind sie nicht umsetzbar, weil:
- du extrem viel Aufwand für total nebensächliche Funktionalität treiben willst (siehe Browserupdate)
- du so dermaßen sicher, sauber und defensiv programmieren musst, dass entweder keine Performance oder keine Funktionalität übrig bleibt (wenn du alle Anwendungen durchbeweisbar machen musst, um eine 100%ig korrekte statische Analyse machen zu können, sind deine Anwendungen nunmal nicht wirklich komplex)
- der organisatorische Aufwand (v.a. Infrastruktur) so hoch ist, dass davon nur Firmen oder Bastler mit extrem viel Zeit profitieren könnten, aber nicht der Normalsterbliche - es sei denn, du möchtest sowas wie Google Docs mit Sessions und semi-lokal machen

Gruß,
Svenska
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Dimension am 10. April 2013, 08:40
Dieser Fix hat natürlich nur eingeschränkte Auswirkung auf die gesamte Anwendung. Dass dem so ist wird vom Editor per Datenflussanalyse geprüft.
Von so Dingen wie "Turing-Vollständigkeit" und "Halteproblem" hast du gehört und weißt, dass damit jede Datenflussanalyse deutliche Grenzen hat?

Das bedeutet nur, dass das Verhalten nicht für jeden Code vorhersagbar ist. Zumindest kann man aber mit Bestimmtheit sagen, ob der (Teil-)Code deterministisch ist oder nicht.

Und wer programmiert den Updater in seiner ganzen Komplexität fehlerfrei?

Das gesamte System ist in erster Linie dazu gedacht so eine Komplexität kontrollieren zu können. Anwendungs-Software wird meiner Meinung nach auch so immer komplexer werden, sei es um verschiedene Zielgruppen anzusprechen, individuellen Kundenanforderungen gerecht zu werden oder einfach nur ein Entwicklerteam von mehreren hundert Leuten zu koordinieren.

Die vorgstellten Szenarien lassen sich auch auf beliebige andere Anwendungsfälle übertragen.
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: Svenska am 10. April 2013, 09:55
Hallo,

Dieser Fix hat natürlich nur eingeschränkte Auswirkung auf die gesamte Anwendung. Dass dem so ist wird vom Editor per Datenflussanalyse geprüft.
Von so Dingen wie "Turing-Vollständigkeit" und "Halteproblem" hast du gehört und weißt, dass damit jede Datenflussanalyse deutliche Grenzen hat?
Das bedeutet nur, dass das Verhalten nicht für jeden Code vorhersagbar ist.
Genau das wolltest du doch: Statisch (vom Editor?!) vorhersagen lassen, dass der Code keine ungewollten Seiteneffekte auf andere Teile der Anwendung hat. Das kannst du im allgemeinen Fall nicht vorhersagen, nur in eingeschränkten Spezialfällen. Also musst du dich in der Programmierung auf das beschränken, was statisch vorhersagbar ist.

Zumindest kann man aber mit Bestimmtheit sagen, ob der (Teil-)Code deterministisch ist oder nicht.
Das ist eher irrelevant. Wenn der Code deterministisch ungewollte Dinge tut, ist er halt deterministisch kaputt.

Und wer programmiert den Updater in seiner ganzen Komplexität fehlerfrei?
Das gesamte System ist in erster Linie dazu gedacht so eine Komplexität kontrollieren zu können.
Ich bevorzuge ja, unnötige Komplexität zu vermeiden, statt sie zu verwalten. Ein Updater, der im laufenden Programmcode rumpfuschen kann, ist für mich unnütze Komplexität (und macht Dinge wie Code lese-/schreibschützen oder das NX-Bit nutzlos).

Eine Anwendung problemlos von Rechner A nach Rechner B schieben zu können heißt auch, einen Virus problemlos von Rechner A nach Rechner B schieben zu können.
Eine Anwendung jederzeit verändern zu können, heißt auch, eine Anwendung jederzeit zu einem Virus umfunktionieren zu können. (Wie oben das Beispiel: "Speichern" tut jetzt "Upload zu <böse Firma> und Speichern".)
Eine Anwendung jederzeit mit Bugfixes von Dritten versorgen zu können heißt auch, unbekannten Code von Dritten jederzeit in die eigene Anwendung reinlassen zu können - zur Laufzeit.

Man kann z.B. sehr kleine Bugfixes in den Linux-Kernel splicen, während er läuft - aber aus gutem Grund keine vollständigen Kernelupdates durchführen. Und das auch nur für ganz bestimmte Kernel-Versionen von sehr wenigen Enterprise-Herstellern.

All diese Szenarien unterlaufen jede Sicherheitsarchitektur, die du haben kannst. Speziell, wenn du nicht von dir als Programmierer/Kenner des Systems ausgehst, sondern vom Standardnutzer, der schon die Windows-"Sie brauchen Adminrechte"-Dialoge einfach wegklickt.

Langsam wird es auch. Schon ein nativ compiliertes Libreoffice (oder Firefox) ist auf einem kleineren ARM langsam. Um einen Speicherdump ausführen zu können, darf das nur roher, interpretierter Bytecode sein, selbst ein JIT-Compiler kann nicht verwendet werden.

Gruß,
Svenska
Titel: Re: Wie kann man die Zuverlässigkeit von Software und Computern steigern?
Beitrag von: kevin am 10. April 2013, 11:39
Es wurde ein Update für den Browser veröffentlicht. Ich habe gerade einen 80GB-Download bei 50%. Ohne das Update browse ich gefährlich. Der Browser macht einen Snapshot seines Speichers und macht das Update unter Berücksichtigung der aktuell ausgeführten Programmteile.
Bist du dir bewusst, was du hier verlangst? Du gehst hier nämlich stillschweigend davon aus, dass der Speichersnapshot auch für die upgedatete Version der Software noch passt. Das tut nicht automatisch, sondern ist mit extrem viel Aufwand verbunden. Und zwar in jeder einzelnen Software, du kannst das nicht in der Laufzeitumgebung verstecken.

Das ist qualitativ ungefähr dasselbe Problem wie eins, mit dem ich einigermaßen vertraut bin: Live-Migration von VMs auf eine neuere qemu-Version. Glaub mir: Es macht keinen Spaß. (Die andere Richtung, also Downgrade, ist natürlich noch "interessanter"...) Quantitativ ist es einen ganzen Berg von Größenordnungen komplexer.