Discussion:
Heartbloed
(zu alt für eine Antwort)
Carsten Thumulla
2014-04-12 07:13:21 UTC
Permalink
Mit Pascal wär' das nich' passiert.


Carsten
--
Terroristen schaffen Arbeitsplätze
Michael Landenberger
2014-04-12 19:50:04 UTC
Permalink
Post by Carsten Thumulla
Mit Pascal wär' das nich' passiert.
Warum?

Gruß

Michael
Carsten Thumulla
2014-04-13 04:20:24 UTC
Permalink
Post by Michael Landenberger
Post by Carsten Thumulla
Mit Pascal wär' das nich' passiert.
Warum?
Warum nicht, wäre Deine Frage?

Weil Variablengrenzen besser kontrolliert werden, Typen sicherer
festgelegt sind...
Weil Quelltext leichter lesbar ist, sich Fehler somit leichter erkennen
lassen, leichter lesbarer Quelltext hoffentlich öfter kontrolliert wird...

Sollte man die Forderung nach offenem Quelltext nicht mit der nach
leichter Lesbarkeit und durchsichtiger Programmierung verbinden? Ist das
Parteiabzeichen "Open Source" nicht sinnlos, wenn Quellen nicht leicht
durchzusehen sind?

Mal sehen, wann der übliche Troll, "man kann auch in solchen Sprachen
schlecht schreiben" hier aufschlägt.


ct
Stefan Reuther
2014-04-13 08:18:12 UTC
Permalink
Post by Carsten Thumulla
Post by Michael Landenberger
Post by Carsten Thumulla
Mit Pascal wär' das nich' passiert.
Warum?
Warum nicht, wäre Deine Frage?
Weil Variablengrenzen besser kontrolliert werden, Typen sicherer
festgelegt sind...
Gerade weil Variablengrenzen besser kontrolliert werden, fängt der
Programmierer in solchen Sprachen viel eher an, eigene Allokatoren
drumherum zu bauen, weil ihm das im Weg steht. Standard-Pascal hat kein
Äquivalent zu "malloc", das mir ein ARRAY[1..N] OF BYTE für variables N
gibt. Also lässt man sich ein ARRAY[1..65536] OF BYTE geben und
suballokiert seine I/O-Buffer von da --> bang. Gleiche Situation wie in
OpenSSL jetzt.

Alternativ kann man natürlich einen Pascal-Dialekt nutzen, der diese
Limits nicht hat. Zum Beispiel Turbo Pascal. Und dann ist man in der
gleichen Situation wie mit C. Pointer-Addition? Kein Problem:
p := Addr(p^[99]);
Memcpy? Kein Problem:
Move(src, dst, 1234);
Post by Carsten Thumulla
Sollte man die Forderung nach offenem Quelltext nicht mit der nach
leichter Lesbarkeit und durchsichtiger Programmierung verbinden? Ist das
Parteiabzeichen "Open Source" nicht sinnlos, wenn Quellen nicht leicht
durchzusehen sind?
Man kann C-Code unlesbar schreiben. Zumindest die größeren Open-Source-
Projekte fallen typischerweise nicht darunter.


Stefan
Carsten Thumulla
2014-04-13 08:55:24 UTC
Permalink
Post by Stefan Reuther
Post by Carsten Thumulla
Weil Variablengrenzen besser kontrolliert werden, Typen sicherer
festgelegt sind...
Gerade weil Variablengrenzen besser kontrolliert werden, fängt der
Programmierer in solchen Sprachen viel eher an, eigene Allokatoren
drumherum zu bauen, weil ihm das im Weg steht.
sowas kommt von sowas -- das eben nicht
Post by Stefan Reuther
Standard-Pascal hat kein
Äquivalent zu "malloc", das mir ein ARRAY[1..N] OF BYTE für variables N
gibt. Also lässt man sich ein ARRAY[1..65536] OF BYTE geben und
suballokiert seine I/O-Buffer von da --> bang. Gleiche Situation wie in
OpenSSL jetzt.
Ok, Standardpascal nicht unbedingt, das geht heute besser. Man sollte
schon so programmieren, wie es die Sprache erstmal vorsieht, dann hat
man Bereichskontrollen. Wer das umgeht, muß selbst für den Rahmen sorgen.

Nein, da bekommt man keine Daten aus anderen Bereichen, da ist am Ende
des Arrays Schluß, oder Warnung, je nach Einstellung. Da wäre das nicht
möglich oder es wäre aufgefallen. Da bekommt der Abfrager nur seinen
Altkrempel. Wer die Puffer lustig mischt, der liefert natürlich auch
Gemisch. Das wäre Pfusch, der sofort beim Blick in den Quelltext
unangenehm auffällt.
Post by Stefan Reuther
Alternativ kann man natürlich einen Pascal-Dialekt nutzen, der diese
Limits nicht hat. Zum Beispiel Turbo Pascal. Und dann ist man in der
p := Addr(p^[99]);
Move(src, dst, 1234);
In dem Fall muß man auch selbst für die Kontrolle sorgen. Die Zeigerei
ist gefährlich, das ist klar.


ct
Stefan Reuther
2014-04-13 14:58:11 UTC
Permalink
Post by Carsten Thumulla
Post by Stefan Reuther
Standard-Pascal hat kein
Äquivalent zu "malloc", das mir ein ARRAY[1..N] OF BYTE für variables N
gibt. Also lässt man sich ein ARRAY[1..65536] OF BYTE geben und
suballokiert seine I/O-Buffer von da --> bang. Gleiche Situation wie in
OpenSSL jetzt.
Ok, Standardpascal nicht unbedingt, das geht heute besser. Man sollte
schon so programmieren, wie es die Sprache erstmal vorsieht, dann hat
man Bereichskontrollen. Wer das umgeht, muß selbst für den Rahmen sorgen.
Nein, da bekommt man keine Daten aus anderen Bereichen, da ist am Ende
des Arrays Schluß, oder Warnung, je nach Einstellung.
Zeig mir bitte den (Pascal-)Compiler, in dem ich ein Array variabler
Größe allokieren kann (als Eingangspuffer für das zu verarbeitende
Paket), und wo ich eine Fehlermeldung oder Warnung bekomme, wenn ich
über das Array-Ende hinaus zuzugreifen versuche (beim Kopieren der Daten
aus dem Eingangs- in den Ausgangspuffer).
Post by Carsten Thumulla
Post by Stefan Reuther
Alternativ kann man natürlich einen Pascal-Dialekt nutzen, der diese
Limits nicht hat. Zum Beispiel Turbo Pascal. Und dann ist man in der
p := Addr(p^[99]);
Move(src, dst, 1234);
In dem Fall muß man auch selbst für die Kontrolle sorgen. Die Zeigerei
ist gefährlich, das ist klar.
Man muss immer selber für die Kontrolle sorgen. Schon, um definiert auf
die Fehler reagieren zu können.

Sich hinzustellen und zu sagen "das macht meine Programmiersprache für
mich" und dann auf die Schnauze zu fliegen, weil sie's doch nicht macht,
ist erst recht gefährlich.


Stefan
Carsten Thumulla
2014-04-13 15:48:07 UTC
Permalink
Post by Stefan Reuther
Zeig mir bitte den (Pascal-)Compiler, in dem ich ein Array variabler
Größe allokieren kann (als Eingangspuffer für das zu verarbeitende
Paket), und wo ich eine Fehlermeldung oder Warnung bekomme, wenn ich
über das Array-Ende hinaus zuzugreifen versuche (beim Kopieren der Daten
aus dem Eingangs- in den Ausgangspuffer).
Macht doch Delphi. Auf eine Pufferlänge muß man sich schon festlegen.
Man kann nicht sagen, da kommen Daten und ich sage danach, wieviele es
waren.
Post by Stefan Reuther
Sich hinzustellen und zu sagen "das macht meine Programmiersprache für
mich" und dann auf die Schnauze zu fliegen, weil sie's doch nicht macht,
ist erst recht gefährlich.
Hier wurde weder das eine noch das andere gemacht. Es wurde im besten
Falle vergessen.


ct
Michael Landenberger
2014-04-13 21:35:56 UTC
Permalink
Post by Stefan Reuther
Zeig mir bitte den (Pascal-)Compiler, in dem ich ein Array variabler
Größe allokieren kann (als Eingangspuffer für das zu verarbeitende
Paket), und wo ich eine Fehlermeldung oder Warnung bekomme, wenn ich
über das Array-Ende hinaus zuzugreifen versuche (beim Kopieren der Daten
aus dem Eingangs- in den Ausgangspuffer).
Das war gar nicht das Problem. Im Gegenteil: das vorher definierte Array wurde
nur bis zu seinem Ende ausgelesen. Das beanstandet kein Compiler, es führt
auch nicht zu einem Laufzeitfehler.

Das Problem bestand vielmehr darin, dass das Array nicht initialisiert war und
zusätzlich der Angreifer wegen des Bugs mehr Bytes auslesen konnte, als er
vorher hineingeschrieben hatte. Dadurch gelangte der Angreifer in den Besitz
von Daten, die u. U. aus früheren Operationen im selben Speicherbereich
stammten. Diese Werte können für einen Angreifer nützlich sein, vor allem
dann, wenn sie Passwörter und andere Verschlüsselungsdaten enthalten.
Erschwerend kommt hinzu, dass OpenSSL getrennt von anderen Prozessen in einem
eigenen Speicherbereich agiert. Man kann also fast sicher sein, dass nicht
initialisierte Teile dieses Speicherbereichs verschlüsselungs-relevante Daten
enthalten. Ein Angreifer, der diese Daten auslesen kann, kann also erheblichen
Schaden anrichten.

Gruß

Michael
Carsten Thumulla
2014-04-14 05:31:58 UTC
Permalink
Post by Michael Landenberger
Post by Stefan Reuther
Zeig mir bitte den (Pascal-)Compiler, in dem ich ein Array variabler
Größe allokieren kann (als Eingangspuffer für das zu verarbeitende
Paket), und wo ich eine Fehlermeldung oder Warnung bekomme, wenn ich
über das Array-Ende hinaus zuzugreifen versuche (beim Kopieren der Daten
aus dem Eingangs- in den Ausgangspuffer).
Das war gar nicht das Problem. Im Gegenteil: das vorher definierte Array wurde
nur bis zu seinem Ende ausgelesen. Das beanstandet kein Compiler, es führt
auch nicht zu einem Laufzeitfehler.
Das sind aber Fehler, die bei Herumgezeigere gehäuft auftreten. Sehr
viele Softwareprobleme der letzten Jahrzehnte sind auf solche
Fehlerquellen zurückzuführen.
Die Zeigerfritzen lernen es einfach nicht. Sie akzeptieren nicht, daß
solche Konstruktionen besonders bei Programmänderungen Fehler erzeugen.
Wenn korrekt implementiert ist, getestet ist... kann man sich damit bei
Änderungen eben leichter Fehler einfangen.
Post by Michael Landenberger
Das Problem bestand vielmehr darin, dass das Array nicht initialisiert war und
zusätzlich der Angreifer wegen des Bugs mehr Bytes auslesen konnte, als er
vorher hineingeschrieben hatte.
Wenn die Aufgabe besteht, eine Sendung zurückzusenden, dann ist die
Ausführung als "gib mir 123 Byte" falsch. Die Ausführung verlangt, daß
ich SELBST das, was ich empfangen habe, zurückschicke, das, was ich
verstanden habe. Man sollte vielleicht nochmal über den Sinn des
Protokolls nachdenken.

Ist es wirklich nur ein Lebensbit, dann wäre der Rest Unsinn. Ist es
eine Bestätigung des Empfanges, dann wird der Befehl amerikanisch
militärisch wiederholt, IIIIIIST DAAAAS KLAAAAAR????!!!!

Wir könnten es mit Mehrebenenpfusch zu tun haben.

Wenn wirklich ein Zurückschicken des Verstandenen verlangt ist, dann
dürfte das auch erst nach der Dekodierung, dem Verstehen, erfolgen. Ja,
dann wird es langsam -- und Abkürzungen gehen schief.


ct
Michael Landenberger
2014-04-14 09:13:39 UTC
Permalink
Post by Carsten Thumulla
Post by Michael Landenberger
Das war gar nicht das Problem. Im Gegenteil: das vorher definierte Array
wurde nur bis zu seinem Ende ausgelesen. Das beanstandet kein Compiler, es
führt auch nicht zu einem Laufzeitfehler.
Das sind aber Fehler, die bei Herumgezeigere gehäuft auftreten.
Wieso Herumgezeigere? Folgende Deklaration ist zulässig:

var

ByteArray : array [0..$3FFF] of Byte;

Und folgender Code führt weder zu einem Compiler- noch zu einem
Laufzeitfehler:

var

I : Integer;

procedure MachWas (B : Byte);

begin
//Hier wird irgendwas mit B gemacht
end;

ByteArray [0] := 33; //nur das erste Byte wird initialisiert
for I := 0 to SizeOf (ByteArray) - 1 do begin
MachWas (ByteArray [I]);
end;

Nur im ersten Durchgang der Schleife arbeitet MachWas () mit definierten
Daten. Ab dem zweiten Schleifendurchgang wird MachWas mit nicht
initialisierten Werten gefüttert und baut den dementsprechenden Mist.

Natürlich kommen beim Heartbeat-Code ganz andere Funktionen zum Einsatz, aber
obiges Beispiel zeigt, dass man sich auch in Pascal ins Knie schießen kann,
wenn man Variablen nicht korrekt initialisiert. Und das ganz ohne Einsatz von
Zeigern.

Gruß

Michael
Carsten Thumulla
2014-04-14 10:38:52 UTC
Permalink
Post by Michael Landenberger
Post by Carsten Thumulla
Post by Michael Landenberger
Das war gar nicht das Problem. Im Gegenteil: das vorher definierte Array
wurde nur bis zu seinem Ende ausgelesen. Das beanstandet kein Compiler, es
führt auch nicht zu einem Laufzeitfehler.
Das sind aber Fehler, die bei Herumgezeigere gehäuft auftreten.
var
ByteArray : array [0..$3FFF] of Byte;
Und folgender Code führt weder zu einem Compiler- noch zu einem
var
I : Integer;
procedure MachWas (B : Byte);
begin
//Hier wird irgendwas mit B gemacht
end;
ByteArray [0] := 33; //nur das erste Byte wird initialisiert
for I := 0 to SizeOf (ByteArray) - 1 do begin
MachWas (ByteArray [I]);
end;
Nur im ersten Durchgang der Schleife arbeitet MachWas () mit definierten
Daten. Ab dem zweiten Schleifendurchgang wird MachWas mit nicht
initialisierten Werten gefüttert und baut den dementsprechenden Mist.
Natürlich kommen beim Heartbeat-Code ganz andere Funktionen zum Einsatz, aber
obiges Beispiel zeigt, dass man sich auch in Pascal ins Knie schießen kann,
wenn man Variablen nicht korrekt initialisiert. Und das ganz ohne Einsatz von
Zeigern.
Ein nach Einstein zu einfaches Beispiel. Wer nicht belegte Datenbereiche
frißt ist selbst schuld -- in jeder Sprache. Man legt in Pascal
üblicherweise Strings ab, und die haben eine Länge, und da gibt es
Kontrollen. Nimmt man etwas entgegen, dann hat das eine Länge und Man
greift nicht in die Wüste dahinter.

Beim großen Array muß man selbst kontrollieren und es umfaßt auch nicht
die Wüste dahinter. Vielleicht wäre es für sicherheitsrelevante Sachen
eine gute Angewohnheit, vorher und hinterher zu putzen.

Wenn das Programm selbst den Speicher füllt, dann hat es die Länge der
empfangenen Daten. Wenn ein anderer Prozeß den Speicher füllt, dann muß
es die Länge ermitteln. Hantiert man mit Strings, dann ist die Kontrolle
inklusive und kostenlos -- kostet Laufzeit. Wer die noch sparen will
riskiert einen Plauzenschnauz.


ct
René Helmert
2014-04-14 15:33:25 UTC
Permalink
Post by Carsten Thumulla
Ein nach Einstein zu einfaches Beispiel. Wer nicht belegte Datenbereiche
frißt ist selbst schuld -- in jeder Sprache. Man legt in Pascal
üblicherweise Strings ab, und die haben eine Länge, und da gibt es
Kontrollen. Nimmt man etwas entgegen, dann hat das eine Länge und Man
greift nicht in die Wüste dahinter.
ACK. Und selbiges gilt für Streams, in diesem Zusammenhang vielleicht
von noch grösserer Bedeutung.

Grüsse

René
Michael Landenberger
2014-04-14 17:04:05 UTC
Permalink
Post by Carsten Thumulla
Man legt in Pascal
üblicherweise Strings ab,
Nö. Bytearrays werden auch benutzt und sie haben in bestimmten Situationen
sogar Vorteile, z. B. dann, wenn ihr Inhalt eben kein String ist.
Post by Carsten Thumulla
und die haben eine Länge, und da gibt es
Kontrollen.
Man kann in Pascal durchaus einen nicht initialisierten String erzeugen. Der
hat zwar die angeforderte Länge, enthält aber zunächst nur Kauderwelsch.
Post by Carsten Thumulla
Nimmt man etwas entgegen, dann hat das eine Länge und Man greift
nicht in die Wüste dahinter.
Du hast offenbar immer noch nicht verstanden: in meinem Beispiel wird nicht
"in die Wüste gegriffen", sondern nur auf den reservierten Speicherbereich
einer ordnungsgemäß deklarierten Variablen. Nur ist die halt nicht
initialisiert und enthält daher nur undefinierte Werte.

Der Zugriff auf den Speicherbereich einer Variablen ist übrigens in allen
Programmiersprachen völlig alltäglich. Schließlich werden die Variablen ja
deswegen deklariert, damit man etwas damit machen kann. Man darf halt nur die
Initialisierung nicht vergessen.
Post by Carsten Thumulla
Wenn das Programm selbst den Speicher füllt, dann hat es die Länge der
empfangenen Daten.
Das tut der Heartbeat-Code ja. Er empfängt Daten (eine Payload) und schreibt
die in den dafür vorgesehenen Puffer.

Zusätzlich zur Payload wird auch eine Größeninformation übertragen. Diese
Größeninformation wird aber offenbar beim *Beschreiben* des Puffers nicht
genutzt. Begründung: der Exploit basiert darauf, eine sehr kleine Payload in
Verbindung mit der maximalen Puffergröße als Größeninformation zu übermitteln.
Damit soll der Server veranlasst werden, nicht nur die Payload, sondern den
gesamten Pufferinhalt als Antwort zurückzuschicken. Damit das funktioniert,
ist der Exploit darauf angewiesen, dass der nicht von der Payload belegte
Speicher unangetastet bleibt. Das scheint auch tatsächlich der Fall gewesen zu
sein. Der Heartbeat-Code hat also beim Beschreiben des Puffers nicht die
(absichtlich falsche) Größeninformation genutzt (andernfalls hätte er den
Puffer komplett mit unbrauchbaren Daten gefüllt), sondern die tatsächliche
Größe der Payload auf andere Art ermittelt. Man kann also davon ausgehen, dass
dem Code die Größe der Payload bekannt gewesen sein muss.

Dummerweise hat der Code die ihm bekannte Payload-Größe beim Generieren der
Antwort nicht mehr berücksichtigt, sondern stattdessen die mitübertragene
Größeninformation, die im Falle des Exploits gleichbedeutend mit der
Puffergröße war. Es fand offenbar auch kein Vergleich zwischen
Größeninformation und tatsächlicher Payload-Größe statt, bei der der Fehler
sofort aufgefallen wäre. Stattdessen wurde ungeprüft der gesamte Puffer incl.
der uninitialisierten Daten ausgelesen und aus diesen die Antwort erzeugt.

Danach musste der Angreifer nur noch den uninitialisierten Teil der Antwort
nach für ihn nützlichen Informationen durchsuchen. Da OpenSSL einen eigenen
Speicherbereich für die Verschlüsselung verwendet, der sonst von keinem
anderen Prozess genutzt wird, ist die Wahrscheinlichkeit, dort
verschlüsselungs-relevante Daten zu finden, relativ hoch.

Gruß

Michael
Carsten Thumulla
2014-04-15 04:45:54 UTC
Permalink
Post by Michael Landenberger
Post by Carsten Thumulla
Man legt in Pascal
üblicherweise Strings ab,
Nö. Bytearrays werden auch benutzt und sie haben in bestimmten Situationen
sogar Vorteile, z. B. dann, wenn ihr Inhalt eben kein String ist.
Noch falscher. man kann in Form eines Arrays zugreifen oder in Form
eines Strings -- es ist in Pascal legal, beides zu mischen. Strings kann
man als Arrays ansprechen.
Post by Michael Landenberger
Post by Carsten Thumulla
Nimmt man etwas entgegen, dann hat das eine Länge und Man greift
nicht in die Wüste dahinter.
Du hast offenbar immer noch nicht verstanden: in meinem Beispiel wird nicht
"in die Wüste gegriffen", sondern nur auf den reservierten Speicherbereich
einer ordnungsgemäß deklarierten Variablen. Nur ist die halt nicht
initialisiert und enthält daher nur undefinierte Werte.
Dein Beispiel zeigt ja auch nicht das Problem. Es versucht, den Fehler
in Pascal nachzumachen. Würde man ihn denn da so machen? memcopy greift
über das Ende hinaus, weil die Länge falsch ist. Dein Beispiel zeigt nur
uninitialisierte Daten, die in einem zufällig zugewiesenen Bereich liegen.

Das Kopieren in den Sendepuffer könnte er sich sparen, wenn er gleich
von dort sendet, dann aber mit richtigem Anfang und Ende.
Post by Michael Landenberger
Post by Carsten Thumulla
Wenn das Programm selbst den Speicher füllt, dann hat es die Länge der
empfangenen Daten.
Das tut der Heartbeat-Code ja. Er empfängt Daten (eine Payload) und schreibt
die in den dafür vorgesehenen Puffer.
Wer den Puffer beschreibt ist nicht klar. Wenn es dieser Programmteil
selbst ist, dann hat er die korrekte Länge. Wenn es ein anderer
Programmteil ist, dann müßte dieser Teil sie ermitteln, denn ein
Rücksenden ohne Verstehen, also Dekodieren, ist sinnlos.
Post by Michael Landenberger
Zusätzlich zur Payload wird auch eine Größeninformation übertragen. Diese
Größeninformation wird aber offenbar beim *Beschreiben* des Puffers nicht
genutzt. Begründung: der Exploit basiert darauf, eine sehr kleine Payload in
Verbindung mit der maximalen Puffergröße als Größeninformation zu übermitteln.
Damit soll der Server veranlasst werden, nicht nur die Payload, sondern den
gesamten Pufferinhalt als Antwort zurückzuschicken. Damit das funktioniert,
ist der Exploit darauf angewiesen, dass der nicht von der Payload belegte
Speicher unangetastet bleibt. Das scheint auch tatsächlich der Fall gewesen zu
sein. Der Heartbeat-Code hat also beim Beschreiben des Puffers nicht die
(absichtlich falsche) Größeninformation genutzt (andernfalls hätte er den
Puffer komplett mit unbrauchbaren Daten gefüllt), sondern die tatsächliche
Größe der Payload auf andere Art ermittelt. Man kann also davon ausgehen, dass
dem Code die Größe der Payload bekannt gewesen sein muss.
Ich schrieb ja schon mehrmals, daß auch ein anderer Prozeß den Puffer
gefüllt haben kann. Dann muß er aber den Inhalt dekodieren. Warum wird
zurückgeschickt? Das müßte uns das Protokoll verraten.
Post by Michael Landenberger
Dummerweise hat der Code die ihm bekannte Payload-Größe beim Generieren der
Antwort nicht mehr berücksichtigt, sondern stattdessen die mitübertragene
Größeninformation, die im Falle des Exploits gleichbedeutend mit der
Puffergröße war. Es fand offenbar auch kein Vergleich zwischen
Größeninformation und tatsächlicher Payload-Größe statt, bei der der Fehler
sofort aufgefallen wäre. Stattdessen wurde ungeprüft der gesamte Puffer incl.
der uninitialisierten Daten ausgelesen und aus diesen die Antwort erzeugt.
Warum wird zurückgeschickt?
Post by Michael Landenberger
Danach musste der Angreifer nur noch den uninitialisierten Teil der Antwort
nach für ihn nützlichen Informationen durchsuchen. Da OpenSSL einen eigenen
Speicherbereich für die Verschlüsselung verwendet, der sonst von keinem
anderen Prozess genutzt wird, ist die Wahrscheinlichkeit, dort
verschlüsselungs-relevante Daten zu finden, relativ hoch.
Wenn in dem Bereich kein anderer Prozeß arbeitet, dann hat das Programm
den Puffer selbst gefüllt, hatte also die korrekte Länge.


ct
Michael Landenberger
2014-04-15 12:07:09 UTC
Permalink
Post by Carsten Thumulla
Warum wird zurückgeschickt?
Das ist so im Protokoll festgelegt. Der Client sendet eine Payload, und der
Server antwortet mit exakt dieser Payload. Dann weiß der Client, dass die
Verbindung noch steht. Genau das ist der Sinn einer "Heartbeat"-Funktion.

Gruß

Michael
Carsten Thumulla
2014-04-15 12:24:46 UTC
Permalink
Post by Michael Landenberger
Post by Carsten Thumulla
Warum wird zurückgeschickt?
Das ist so im Protokoll festgelegt. Der Client sendet eine Payload, und der
Server antwortet mit exakt dieser Payload. Dann weiß der Client, dass die
Verbindung noch steht. Genau das ist der Sinn einer "Heartbeat"-Funktion.
NEIN!

Daß es im Protokoll so steht habe ich mitbekommen. Warum steht es so im
Protokoll.

Daß mir jetzt keiner schreibt, weil es einer reingeschrieben hat.

Will man die Leitung kontrollieren? Will man den Partner kontrollieren?
Will man kontrollieren, ob de noch mitzählt?

Daß eine Verbindung noch steht merkt man am Lebensbit -- zum Beispiel.

Oder schicke ich ein Paket zurück, damit der Absender merkt, daß ich es
erhalten habe?


ct
Michael Baeuerle
2014-04-15 14:13:00 UTC
Permalink
Post by Carsten Thumulla
Post by Michael Landenberger
Post by Carsten Thumulla
Warum wird zurückgeschickt?
Das ist so im Protokoll festgelegt. Der Client sendet eine Payload, und der
Server antwortet mit exakt dieser Payload. Dann weiß der Client, dass die
Verbindung noch steht. Genau das ist der Sinn einer "Heartbeat"-Funktion.
NEIN!
Daß es im Protokoll so steht habe ich mitbekommen. Warum steht es so
im Protokoll.
Daß mir jetzt keiner schreibt, weil es einer reingeschrieben hat.
Will man die Leitung kontrollieren? Will man den Partner kontrollieren?
Will man kontrollieren, ob de noch mitzählt?
Daß eine Verbindung noch steht merkt man am Lebensbit -- zum Beispiel.
Die Payload variabler Länge ist für PMTU discovery vorgesehen worden,
in [1] ist es jedenfalls so beschrieben.


Micha

[1] http://tools.ietf.org/html/rfc6520
Carsten Thumulla
2014-04-15 15:10:34 UTC
Permalink
Post by Michael Baeuerle
Post by Carsten Thumulla
Daß eine Verbindung noch steht merkt man am Lebensbit -- zum Beispiel.
Die Payload variabler Länge ist für PMTU discovery vorgesehen worden,
in [1] ist es jedenfalls so beschrieben.
Micha
[1] http://tools.ietf.org/html/rfc6520
Der schickt doch tatsächlich das Paket zurück, um zu kontrollieren, ob
es angekommen ist?! Und ich wollte nur einen Witz machen. Da könnte er
es ja gleich nochmal schicken, damit der Empfänger es auch hat.

Es würde doch eine Signatur reichen, eine Quersumme zum Beispiel. Das
ist weniger Kapazität und vermeidet den Angriff auf eine Doppelsendung,
wie sie mit elliptischen Funktionen zur Verschlüsselung wieder in Mode
gekommen ist.

Was steht eigentlich im Puffer? Klartext oder verschlüsselt?
Wahrscheinlich verschlüsselt, Empfangspuffer.

Für die Feststellung, daß der Empfänger da ist, muß man keinen Inhalt
schicken. Da reicht ein Lebensmerker. Die Frage, was er zuletzt empfing,
kann man auch anders klären. Man muß sie anders klären, wenn eine
Verschlüsselung davor ist, sonst erlaubt man einen Angriff auf eine
Doppelsendung.


ct
Michael Baeuerle
2014-04-15 15:55:46 UTC
Permalink
Post by Carsten Thumulla
Post by Michael Baeuerle
[...]
[1] http://tools.ietf.org/html/rfc6520
[...]
Für die Feststellung, daß der Empfänger da ist, muß man keinen
Inhalt schicken. Da reicht ein Lebensmerker. Die Frage, was er zuletzt
empfing, kann man auch anders klären. Man muß sie anders klären,
wenn eine Verschlüsselung davor ist, sonst erlaubt man einen Angriff
auf eine Doppelsendung.
Für PMTU discovery würde jedenfalls eine Antwort gleicher Größe aus-
reichen.


Micha
Carsten Thumulla
2014-04-15 14:45:16 UTC
Permalink
Post by Carsten Thumulla
Daß es im Protokoll so steht habe ich mitbekommen. Warum steht es so im
Protokoll.
s/./?/
Weil der Author einen Weg finden wollte, dass Sessions erhalten bleiben
trotzdem z.B. ein Handy von UMTS ins WLAN wechselt.
Aaahh ja

Ist das wirklich notwendig? Wirklich?!

Ist der Nutzer wirklich überfordert, wenn beim Wechsel von UMTS und WLAN
eine Unterbrechung erfolgt? Soll er nicht merken, wenn der Tarif wechselt?

Was ist, wenn elliptische Funktionen verwendet werden? Dann wäre das
Hin- und Herschicken des gleichen Inhalts wieder mal ein Volltreffer.


ct
Hans-Peter Diettrich
2014-04-14 12:28:16 UTC
Permalink
Post by Michael Landenberger
Natürlich kommen beim Heartbeat-Code ganz andere Funktionen zum Einsatz, aber
obiges Beispiel zeigt, dass man sich auch in Pascal ins Knie schießen kann,
wenn man Variablen nicht korrekt initialisiert. Und das ganz ohne Einsatz von
Zeigern.
Völlig richtig. Bei Puffern kommt man ohne eine zusätzliche Angabe, wie
weit der Puffer gefüllt ist, nicht aus. In OPL ist das schon in die
Stringtypen eingebaut (Length <> SizeOf), so daß sich diese für Puffer
besser eignen als Bytearrays. In C hat man keine solchen komfortablen
Datentypen, da hilft nur Disziplin beim Programmieren - und auf die ist
weniger Verlaß als auf einen Compiler und eingebaute Prüfungen zur Laufzeit.

DoDi
Carsten Thumulla
2014-04-14 12:38:41 UTC
Permalink
Post by Hans-Peter Diettrich
Post by Michael Landenberger
Natürlich kommen beim Heartbeat-Code ganz andere Funktionen zum Einsatz, aber
obiges Beispiel zeigt, dass man sich auch in Pascal ins Knie schießen kann,
wenn man Variablen nicht korrekt initialisiert. Und das ganz ohne Einsatz von
Zeigern.
Völlig richtig. Bei Puffern kommt man ohne eine zusätzliche Angabe, wie
weit der Puffer gefüllt ist, nicht aus. In OPL ist das schon in die
Stringtypen eingebaut (Length <> SizeOf), so daß sich diese für Puffer
besser eignen als Bytearrays. In C hat man keine solchen komfortablen
Datentypen, da hilft nur Disziplin beim Programmieren - und auf die ist
weniger Verlaß als auf einen Compiler und eingebaute Prüfungen zur Laufzeit.
jupp!
Michael Landenberger
2014-04-14 17:08:05 UTC
Permalink
Bei Puffern kommt man ohne eine zusätzliche Angabe, wie weit
der Puffer gefüllt ist, nicht aus. In OPL ist das schon in die Stringtypen
eingebaut (Length <> SizeOf), so daß sich diese für Puffer besser eignen als
Bytearrays.
Irgendwie widerstrebt es mir, für alles und jedes (also auch für binäre Daten)
Strings zu verwenden. Für rein binäre Daten verwende ich lieber Bytearrays in
Verbindung mit einer zusätzlichen Längeninformation. Das funktioniert bei mir
schon seit Turbo Pascal 3.0 für CP/M recht gut ;-)

Gruß

Michael
Carsten Thumulla
2014-04-15 04:49:15 UTC
Permalink
Post by Michael Landenberger
Bei Puffern kommt man ohne eine zusätzliche Angabe, wie weit
der Puffer gefüllt ist, nicht aus. In OPL ist das schon in die Stringtypen
eingebaut (Length <> SizeOf), so daß sich diese für Puffer besser eignen als
Bytearrays.
Irgendwie widerstrebt es mir, für alles und jedes (also auch für binäre Daten)
Strings zu verwenden. Für rein binäre Daten verwende ich lieber Bytearrays in
Verbindung mit einer zusätzlichen Längeninformation. Das funktioniert bei mir
schon seit Turbo Pascal 3.0 für CP/M recht gut ;-)
Strings sind Bytearrays

(hoffentlich irre ich mich jetzt nicht, nunja, Char)


ct
Michael Landenberger
2014-04-15 12:11:50 UTC
Permalink
Post by Carsten Thumulla
Post by Michael Landenberger
Irgendwie widerstrebt es mir, für alles und jedes (also auch für binäre
Daten) Strings zu verwenden. Für rein binäre Daten verwende ich lieber
Bytearrays in Verbindung mit einer zusätzlichen Längeninformation. Das
funktioniert bei mir schon seit Turbo Pascal 3.0 für CP/M recht gut ;-)
Strings sind Bytearrays
Natürlich. *Jede* Variable ist ein Bytearray ;-)

Aber das Handling unterscheidet sich. Insbesondere werden lange (!) Strings in
Pascal neu alloziiert, wenn sich ihre Länge ändert. Das will man schon aus
Performance-Gründen nicht immer haben. Kurze Strings haben zwar eine feste
Länge, diese kann aber maximal 255 Bytes betragen (+1 Byte für die
Längeninformation. Für Fälle, in denen man ein längeres Bytearray braucht,
eignen die sich schon mal nicht.

Gruß

Michael
Carsten Thumulla
2014-04-15 12:28:09 UTC
Permalink
Post by Michael Landenberger
Post by Carsten Thumulla
Post by Michael Landenberger
Irgendwie widerstrebt es mir, für alles und jedes (also auch für binäre
Daten) Strings zu verwenden. Für rein binäre Daten verwende ich lieber
Bytearrays in Verbindung mit einer zusätzlichen Längeninformation. Das
funktioniert bei mir schon seit Turbo Pascal 3.0 für CP/M recht gut ;-)
Strings sind Bytearrays
Natürlich. *Jede* Variable ist ein Bytearray ;-)
Na soooo genau...
Post by Michael Landenberger
Aber das Handling unterscheidet sich. Insbesondere werden lange (!) Strings in
Pascal neu alloziiert, wenn sich ihre Länge ändert. Das will man schon aus
Performance-Gründen nicht immer haben. Kurze Strings haben zwar eine feste
Länge, diese kann aber maximal 255 Bytes betragen (+1 Byte für die
Längeninformation. Für Fälle, in denen man ein längeres Bytearray braucht,
eignen die sich schon mal nicht.
isch weiß, geht ja nich anders

Die Art des Zugriffs macht es. Strings greife ich immer als String. Nur
wenn da was nicht geht quatsche ich sie als Arrays an.


ct
Michael Landenberger
2014-04-13 21:26:57 UTC
Permalink
Post by Carsten Thumulla
Post by Michael Landenberger
Post by Carsten Thumulla
Mit Pascal wär' das nich' passiert.
Warum?
Warum nicht, wäre Deine Frage?
Genau.
Post by Carsten Thumulla
Weil Variablengrenzen besser kontrolliert werden, Typen sicherer festgelegt
sind...
Auch in Pascal können reservierte Puffer (z. B. Bytearrays) problemlos
entweder teilweise oder auch als Ganzes ausgelesen werden. Letzteres war
vermutlich auch das Problem beim Heartbleed-Bug. Die Heartbeat-Funktion
basiert darauf, dass der Client eine Bytefolge variabler Länge und dazu eine
Information über die Länge der Bytefolge an den Server schickt. Der Server
muss darauf mit exakt der gleichen Bytefolge antworten. Zweckmäßigerweise
schreibt er dazu die empfangene Bytefolge in einen Puffer (dessen Größe der
maximalen Länge der Bytefolge entsprechen sollte) und liest den Puffer
anschließend wieder aus, um dieselbe Bytefolge als Antwort an den Client
zurückzuschicken. Der Fehler bestand nun darin, dass nicht geprüft wurde, ob
die Längeninformation mit der tatsächlichen Länge der Bytefolge übereinstimmt.
Dadurch wurden auch Byte"folgen" von nur einem Byte Länge in Verbindung mit
der maximalen Bytefolgen-Länge akzeptiert. Genau diese Kombination konnte sich
ein Angreifer zunutze machen, denn dabei empfängt der Server nur ein einziges
Byte, schickt aber den gesamten Pufferinhalt zurück. Da nur das erste Byte des
Puffers beschrieben wurde, wurden die restlichen Bytes des Puffers nicht
initialisiert und können daher durchaus noch Werte enthalten, die noch als
Relikt aus früheren Operationen im Speicher stehen und die nichts mit der
Heartbeat-Funktion zu tun haben, z. B. irgendwelche Passwörter und andere
Verschlüsselungsdaten. Diese Informationen bekommt der Client dann frei Haus
geschickt. Und genau dieser Fehler kann auch unter Pascal passieren. Auch
korrekt reservierte Speicherbereiche sind unter Pascal nicht notwendigerweise
initialisiert und können daher noch Daten von anderen Operationen enthalten.

Lange Rede, kurzer Sinn: auch mit Pascal hätte dieser Fehler auftreten können.

Gruß

Michael
Carsten Thumulla
2014-04-13 04:30:06 UTC
Permalink
Post by Michael Landenberger
Post by Carsten Thumulla
Mit Pascal wär' das nich' passiert.
Warum?
Warum nicht, wäre Deine Frage?

Weil Variablengrenzen besser kontrolliert werden, Typen sicherer
festgelegt sind...
Weil Quelltext leichter lesbar ist, sich Fehler somit leichter erkennen
lassen, leichter lesbarer Quelltext hoffentlich öfter kontrolliert wird...

Sollte man die Forderung nach offenem Quelltext nicht mit der nach
leichter Lesbarkeit und durchsichtiger Programmierung verbinden? Ist das
Parteiabzeichen "Open Source" nicht sinnlos, wenn Quellen nicht leicht
durchzusehen sind?

Bietet eine Sprache wie Pascal nicht weniger Möglichkeiten, Backdoors zu
verstecken?

Mal sehen, wann der übliche Troll, "man kann auch in solchen Sprachen
schlecht schreiben" hier aufschlägt.


ct
Hergen Lehmann
2014-04-13 08:32:33 UTC
Permalink
Post by Carsten Thumulla
Post by Michael Landenberger
Post by Carsten Thumulla
Mit Pascal wär' das nich' passiert.
Warum?
Warum nicht, wäre Deine Frage?
Weil Variablengrenzen besser kontrolliert werden, Typen sicherer
festgelegt sind...
Pascal kennt Zeigertypen, welche als Fremdkörper im Sprachkonzept sogar
stärker zu Fehlern einladen, wie in einem modernen C-Dialekt.

Pascal kann externe Bibliotheksfunktionen mit expliziten Längenangaben
(read, write, memcpy,...) aufrufen, welche eine Prüfung von
Variablengrenzen effektiv aushebeln.

Pascal kennt Varianten-Datentypen, womit auch die Typsicherheit dahin ist.
Post by Carsten Thumulla
Weil Quelltext leichter lesbar ist, sich Fehler somit leichter erkennen
lassen, leichter lesbarer Quelltext hoffentlich öfter kontrolliert wird...
Quelltext-Lesbarkeit ist *ausschließlich* ist eine Frage der Disziplin,
nicht der Programmiersprache.
Post by Carsten Thumulla
Sollte man die Forderung nach offenem Quelltext nicht mit der nach
leichter Lesbarkeit und durchsichtiger Programmierung verbinden?
Fordern kann man viel. Sobald die Einstiegshürden für den Contributor
lästig werden, wird die Bibliothek dann halt als closed source oder
unter NDA veröffentlicht, der Code dadurch aber nicht besser.
Post by Carsten Thumulla
Ist das
Parteiabzeichen "Open Source" nicht sinnlos, wenn Quellen nicht leicht
durchzusehen sind?
Wie kommst du darauf?
Auch schlecht leserliche Quellen sind immer noch offener als ein Binary.
Sie lassen sich im Zweifelsfall leichter debuggen, leichter an eigene
Bedürfnisse anpassen und leichter in das eigene Lizenzkonstrukt
einbinden. Vor allem aber kann (im Gegensatz zu closed source) jeder
selbst bewerten, wie vertrauenswürdig ihm der Code erscheint.
Post by Carsten Thumulla
Bietet eine Sprache wie Pascal nicht weniger Möglichkeiten, Backdoors zu
verstecken?
Nein, nicht die Spur.
Post by Carsten Thumulla
Mal sehen, wann der übliche Troll, "man kann auch in solchen Sprachen
schlecht schreiben" hier aufschlägt.
Meine Lieblingsprogrammiersprache ist perfekt, mein Code damit auch. Wer
das ist Zweifel zieht, ist der "übliche Troll".

Das ist natürlich die ideale Auffassung, um zu fehlerfreiem Code zu
gelangen...

Hergen
Carsten Thumulla
2014-04-13 09:11:36 UTC
Permalink
Post by Hergen Lehmann
Post by Carsten Thumulla
Post by Michael Landenberger
Post by Carsten Thumulla
Mit Pascal wär' das nich' passiert.
Warum?
Warum nicht, wäre Deine Frage?
Weil Variablengrenzen besser kontrolliert werden, Typen sicherer
festgelegt sind...
Pascal kennt Zeigertypen, welche als Fremdkörper im Sprachkonzept sogar
stärker zu Fehlern einladen, wie in einem modernen C-Dialekt.
Die benutzt man mit der entsprechenden Vorsicht nur dort, wo es
notwendig ist.
Post by Hergen Lehmann
Pascal kann externe Bibliotheksfunktionen mit expliziten Längenangaben
(read, write, memcpy,...) aufrufen, welche eine Prüfung von
Variablengrenzen effektiv aushebeln.
Man kann auch über ein Geländer in die Tiefe springen.
Post by Hergen Lehmann
Pascal kennt Varianten-Datentypen, womit auch die Typsicherheit dahin ist.
Auch die benutzt man nur da, wo es sein muß.
Post by Hergen Lehmann
Post by Carsten Thumulla
Weil Quelltext leichter lesbar ist, sich Fehler somit leichter erkennen
lassen, leichter lesbarer Quelltext hoffentlich öfter kontrolliert wird...
Quelltext-Lesbarkeit ist *ausschließlich* ist eine Frage der Disziplin,
nicht der Programmiersprache.
Disziplin ist eine leichte Ausrede. Die ist eben nicht da, oder nur selten.

Ich meine, daß Lesbarkeit schon an der Sprache hängt, sehr. Gut, es ist
auch Gewöhnungssache.
Post by Hergen Lehmann
Post by Carsten Thumulla
Ist das
Parteiabzeichen "Open Source" nicht sinnlos, wenn Quellen nicht leicht
durchzusehen sind?
Wie kommst du darauf?
Auch schlecht leserliche Quellen sind immer noch offener als ein Binary.
Sie lassen sich im Zweifelsfall leichter debuggen, leichter an eigene
Bedürfnisse anpassen und leichter in das eigene Lizenzkonstrukt
einbinden. Vor allem aber kann (im Gegensatz zu closed source) jeder
selbst bewerten, wie vertrauenswürdig ihm der Code erscheint.
Von mal eben reingucken wird das nichts. Vom unters Kopfkissen legen
auch nicht.
Post by Hergen Lehmann
Post by Carsten Thumulla
Bietet eine Sprache wie Pascal nicht weniger Möglichkeiten, Backdoors zu
verstecken?
Nein, nicht die Spur.
Lesbarkeit, Übersichtlichkeit, Klarheit -- stehen gegen
Versteckmöglichkeiten.


ct
Hergen Lehmann
2014-04-13 10:30:59 UTC
Permalink
Post by Carsten Thumulla
Post by Hergen Lehmann
Pascal kennt Zeigertypen, welche als Fremdkörper im Sprachkonzept sogar
stärker zu Fehlern einladen, wie in einem modernen C-Dialekt.
Die benutzt man mit der entsprechenden Vorsicht nur dort, wo es
notwendig ist.
Also in einem realen Programm ständig, denn mit statischer
Speicherallozierung kommt man nicht weit bzw. schafft in einer
multiuser/multithreading-Umgebung erst recht fehleranfälligen Code.
Post by Carsten Thumulla
Post by Hergen Lehmann
Pascal kann externe Bibliotheksfunktionen mit expliziten Längenangaben
(read, write, memcpy,...) aufrufen, welche eine Prüfung von
Variablengrenzen effektiv aushebeln.
Man kann auch über ein Geländer in die Tiefe springen.
Bleib sachlich!
Jenseits des akademischen Horizonts soll es vorkommen, das Programme
einen realen Zweck erfüllen müssen. Und da kommt man mit ISO-Pascal
nicht weit. Insbesondere die Bereiche Disk-IO und Netzwerk fehlen im
Sprachstandard komplett, so dass man auf proprietäre Erweiterungen und
externe Bibliotheken *zwingend* angewiesen ist.
Post by Carsten Thumulla
Post by Hergen Lehmann
Pascal kennt Varianten-Datentypen, womit auch die Typsicherheit dahin ist.
Auch die benutzt man nur da, wo es sein muß.
... ebenso wie in C/C++.
Post by Carsten Thumulla
Ich meine, daß Lesbarkeit schon an der Sprache hängt, sehr. Gut, es ist
auch Gewöhnungssache.
Das ist eine Illusion. Unter Zeitdruck verleiten *gerade* aufgezwungene
Formalismen zu noch mehr Druck und in Folge zu übler Trickserei.
Post by Carsten Thumulla
Post by Hergen Lehmann
Auch schlecht leserliche Quellen sind immer noch offener als ein Binary.
Sie lassen sich im Zweifelsfall leichter debuggen, leichter an eigene
Bedürfnisse anpassen und leichter in das eigene Lizenzkonstrukt
einbinden. Vor allem aber kann (im Gegensatz zu closed source) jeder
selbst bewerten, wie vertrauenswürdig ihm der Code erscheint.
Von mal eben reingucken wird das nichts. Vom unters Kopfkissen legen
auch nicht.
Natürlich nicht. Wer sicheren und lesbaren Code produzieren will, kommt
um Code-Reviews nicht herum. Auch und gerade für die extern
eingebundenen Bibliotheken.

Eine "bessere" Programmiersprache ändert daran rein gar nichts. Im
Gegenteil, immer mehr Dinge verschwinden in Laufzeitumgebungen, die
entweder closed-source sind, oder so komplex, dass man sie beim besten
Willen nicht mehr überschauen kann.

Hergen
Hans-Peter Diettrich
2014-04-13 13:00:01 UTC
Permalink
Post by Hergen Lehmann
Jenseits des akademischen Horizonts soll es vorkommen, das Programme
einen realen Zweck erfüllen müssen. Und da kommt man mit ISO-Pascal
nicht weit. Insbesondere die Bereiche Disk-IO und Netzwerk fehlen im
Sprachstandard komplett, so dass man auf proprietäre Erweiterungen und
externe Bibliotheken *zwingend* angewiesen ist.
Da stellt sich mir die Frage, wie weit Standard-Bibliotheken an ein
konkretes Betriebssystem heranreichen müssen. In C fällt das nur deshalb
nicht auf, weil viele der heutigen Systeme in C geschrieben sind, und
deshalb zumindest ähnliche Bibliotheken benutzen. Zwischen Windows und
dem Rest der Welt fallen diese Unterschiede schon stärker auf, und wie
sähe es heute mit der Kompatibilität aus, *ohne* Linux und die dazu
gehörenden Standards? Für mich am auffälligsten wird es, wenn man
Multi-Plattform Entwicklungssysteme wie Free Pascal näher betrachtet -
da sind heftige Klimmzüge notwendig, um die verschiedenen Plattformen
unter einen Hut zu bekommen.

Wenn dann eine Schicht zwischen den Anwendungsprogrammen und den
verschiedenen Plattformen bereits im Sprachstandard festgeschrieben
wird, führt das fast zwangsläufig zu einer Beschränkung dieser Sprache
auf die tatsächlich dazu kompatiblen Plattformen, die jede Änderung an
diesen Bibliotheken gleichartig mitmachen und auf eigene Ansätze für
Neuerungen und neue Anforderungen völlig verzichten. Das wollen aber nur
die Verfechter von Sprachstandards, die ihre Lieblingssprache als die
allein selig machende ansehen, und deshalb immer wieder Sprachkriege
anzetteln. Oder diejenigen, die Uralt-Projekte auf Teufel komm raus am
Laufen halten müssen, weil eine Runderneuerung zu teuer ist. Solche
Kompatibilitätsforderungen haben z.B. bis heute eine Modernisierung von
C an sich verhindert (Syntax, Header Dateien...). Neben binär
inkompatiblen C++ Implementierungen konnten sich Java, C# usw. nicht so
recht durchsetzen, für mich sieht das irgendwie so aus, als ob sich C in
einer Sackgasse befindet.
Post by Hergen Lehmann
Post by Carsten Thumulla
Post by Hergen Lehmann
Pascal kennt Varianten-Datentypen, womit auch die Typsicherheit dahin ist.
Wo so falsche Behauptungen auftauchen, kann man keine ernsthafte
Diskussion mehr führen. Delphi (OPL) hat doch gezeigt, wie man typsicher
mit varianten Datentypen und Parametern in Pascal umgehen kann.
Kenne Deinen Feind, bevor du anfängst, ihn zu verteufeln :-]
Post by Hergen Lehmann
Post by Carsten Thumulla
Auch die benutzt man nur da, wo es sein muß.
Z.B. in der Schnittstelle zu Datenbanken, wo Flexibilität und Sicherheit
wichtiger ist als Effizienz.

DoDi
Carsten Thumulla
2014-04-13 15:41:40 UTC
Permalink
Hans-Peter Diettrich schrieb:
[Variant]
Post by Hans-Peter Diettrich
Z.B. in der Schnittstelle zu Datenbanken, wo Flexibilität und Sicherheit
wichtiger ist als Effizienz.
Das ist immer ein Gegensatz. In verschlüsselten Protokollen wüßte man
aber, wo die Priorität liegen sollte.


ct
René Helmert
2014-04-13 16:33:24 UTC
Permalink
Post by Hergen Lehmann
Post by Carsten Thumulla
Post by Michael Landenberger
Post by Carsten Thumulla
Mit Pascal wär' das nich' passiert.
Warum?
Warum nicht, wäre Deine Frage?
Weil Variablengrenzen besser kontrolliert werden, Typen sicherer
festgelegt sind...
Pascal kennt Zeigertypen, welche als Fremdkörper im Sprachkonzept sogar
stärker zu Fehlern einladen, wie in einem modernen C-Dialekt.
Selbstverständlich kann man sich auch mit Object-Pascal ins Bein
schiessen. Nicht umsonst sieht man Pointer im Umgang mit Delphi als
'Fremdkörper' an. Sie werden nämlich innerhalb von Delphi-Projekten
schlichtweg nicht benötigt.

Sieht man sich beispielsweise die Indy Netzwerk Library an, so wird in
der Hochsprache mit dynamischen Byte-Array-Objekten gearbeitet, die
grundsätzlich initialisiert werden und Range-Checking mitbringen.

Und mit der Speicher-Bereinigung scheint es bei OpenSSL ja schon
loszugehen.

http://thread.gmane.org/gmane.os.openbsd.misc/211952/focus=211963
Post by Hergen Lehmann
Pascal kann externe Bibliotheksfunktionen mit expliziten Längenangaben
(read, write, memcpy,...) aufrufen, welche eine Prüfung von
Variablengrenzen effektiv aushebeln.
Eben nicht. Wenn ein programminterner Speicher mit Daten von der
Netzwerkschnittstelle gefüllt wird, so ist eben Schluss, wenn dieser
voll ist.
Post by Hergen Lehmann
Pascal kennt Varianten-Datentypen, womit auch die Typsicherheit dahin ist.
Auch bei Varianten und varianten Arrays besteht Typsicherheit, nur
knallt es bei unerlaubten Operationen erst zur Laufzeit und nicht
bereits beim Compilieren. Zudem werden auch bei varianten Arrays
Boundary-Checks durchgeführt.
Post by Hergen Lehmann
Post by Carsten Thumulla
Weil Quelltext leichter lesbar ist, sich Fehler somit leichter erkennen
lassen, leichter lesbarer Quelltext hoffentlich öfter kontrolliert wird...
Quelltext-Lesbarkeit ist *ausschließlich* ist eine Frage der Disziplin,
nicht der Programmiersprache.
Korrekt. Allerdings verleitet C schon sehr zu verschachtelten,
aufgrund dieser Verdichtung wenig transparenten Anweisungskonstrukten,
welche in einschlägigen Kreisen dann nicht selten präferiert werden.
Mir kommt das oft so vor, als dass schon auch gezeigt werden soll, zu
welch virtuosem Code man im Stande ist.
Post by Hergen Lehmann
Post by Carsten Thumulla
Bietet eine Sprache wie Pascal nicht weniger Möglichkeiten, Backdoors zu
verstecken?
Nein, nicht die Spur.
Doch, sehr wohl.

Grüsse

René
Andreas Niggemann
2014-04-13 16:55:28 UTC
Permalink
In article <2mup1b-***@hergen.dyndns.org>, hlehmann.expires.5-11
@snafu.de says...
Post by Hergen Lehmann
Quelltext-Lesbarkeit ist *ausschließlich* ist eine Frage der
Disziplin,
Post by Hergen Lehmann
nicht der Programmiersprache.
Sehe ich deutlich anders. "begin-end"-Paare lassen sich beispielweise
viel besser optisch unterscheiden und zuordnen als "ist-das-jetzt-ne-
öffnende-oder-ne-schließende-geschweifte-Klammer"-Paare.

Als jemand der berufsmäßig seit Jahr und Tag mit Delphi und C# zu tun
hat weiß ich die bessere Lesbarkeit von Delphi-Programmen sehr zu
schätzen.
--
Andreas (http://www.lichtbildner.net)
Die FAQ zu d.r.f: http://faq.d-r-f.de
Porty für Arme: http://faq.d-r-f.de/wiki/Porty_f%C3%BCr_Arme
Toshiba Flashair: http://faq.d-r-f.de/wiki/FlashAir_Autodownloader
Gerrit Heitsch
2014-04-13 17:07:09 UTC
Permalink
Post by Andreas Niggemann
@snafu.de says...
Post by Hergen Lehmann
Quelltext-Lesbarkeit ist *ausschließlich* ist eine Frage der
Disziplin,
Post by Hergen Lehmann
nicht der Programmiersprache.
Sehe ich deutlich anders. "begin-end"-Paare lassen sich beispielweise
viel besser optisch unterscheiden und zuordnen als "ist-das-jetzt-ne-
öffnende-oder-ne-schließende-geschweifte-Klammer"-Paare.
Abgesehen davon, das man { und } problemlos auseinanderhalten können
sollte hindert einen keiner daran es so zu schreiben:

{ // begin

} // end

Kommentare sind nicht nur bei Assembler wichtig.

Gerrit
Carsten Thumulla
2014-04-13 18:07:18 UTC
Permalink
Post by Gerrit Heitsch
Post by Andreas Niggemann
Post by Hergen Lehmann
Quelltext-Lesbarkeit ist *ausschließlich* ist eine Frage der
Disziplin, nicht der Programmiersprache.
Sehe ich deutlich anders. "begin-end"-Paare lassen sich beispielweise
viel besser optisch unterscheiden und zuordnen als "ist-das-jetzt-ne-
öffnende-oder-ne-schließende-geschweifte-Klammer"-Paare.
Abgesehen davon, das man { und } problemlos auseinanderhalten können
{ // begin
} // end
Kommentare sind nicht nur bei Assembler wichtig.
Gutes Argument! Und jetzt noch alle Zulieferer von Quellcode überzeugen,
das auch so zu machen!


ct
Gerrit Heitsch
2014-04-13 18:20:24 UTC
Permalink
Post by Carsten Thumulla
Post by Gerrit Heitsch
Post by Andreas Niggemann
Post by Hergen Lehmann
Quelltext-Lesbarkeit ist *ausschließlich* ist eine Frage der
Disziplin, nicht der Programmiersprache.
Sehe ich deutlich anders. "begin-end"-Paare lassen sich beispielweise
viel besser optisch unterscheiden und zuordnen als "ist-das-jetzt-ne-
öffnende-oder-ne-schließende-geschweifte-Klammer"-Paare.
Abgesehen davon, das man { und } problemlos auseinanderhalten können
{ // begin
} // end
Kommentare sind nicht nur bei Assembler wichtig.
Gutes Argument! Und jetzt noch alle Zulieferer von Quellcode überzeugen,
das auch so zu machen!
Habt ihr keine Policy zum Thema?

Gerrit
Marc Santhoff
2014-04-13 20:23:41 UTC
Permalink
Post by Gerrit Heitsch
Post by Carsten Thumulla
Post by Gerrit Heitsch
Abgesehen davon, das man { und } problemlos auseinanderhalten
{ // begin
} // end
Kommentare sind nicht nur bei Assembler wichtig.
Gutes Argument! Und jetzt noch alle Zulieferer von Quellcode
überzeugen, das auch so zu machen!
Habt ihr keine Policy zum Thema?
Wo schon davon die Rede ist: Viel irrer finde ich die Tatsache, daß
eine _Sicherheit_software offenbar ohne gründliche Tests oder Review
mit so einem fatalen Fehler ihren Weg nach draußen findet.

Marc
--
Top 10 things likely to be overheard if you had a
Klingon Programmer:
10) Specifications are for the weak and timid!
7) What is this talk of 'release'? Klingons do not
make software 'releases'. Our software 'escapes' leaving a bloody
trail of designers and quality assurance people in its wake.
1) Our users will know fear and cower before our software! Ship it!
Ship it and let them flee like the dogs they are!
Stefan Reuther
2014-04-14 17:29:48 UTC
Permalink
Post by Carsten Thumulla
Post by Gerrit Heitsch
Post by Andreas Niggemann
Sehe ich deutlich anders. "begin-end"-Paare lassen sich beispielweise
viel besser optisch unterscheiden und zuordnen als "ist-das-jetzt-ne-
öffnende-oder-ne-schließende-geschweifte-Klammer"-Paare.
Abgesehen davon, das man { und } problemlos auseinanderhalten können
{ // begin
} // end
Kommentare sind nicht nur bei Assembler wichtig.
Gutes Argument! Und jetzt noch alle Zulieferer von Quellcode überzeugen,
das auch so zu machen!
Wer es nicht schafft, soweit zu abstrahieren, dass "{" und "}" im
Wesentlichen das gleiche bedeuten wie "BEGIN" und "END", ohne dazu
Kommentare zu benötigen, dem würde ich auch nicht zutrauen, Code von
ernsthafter Komplexität zu verarbeiten.

Ich hab ja, als gelernter Pascal-Programmierer, meine ersten Gehversuche
in C mit der Portierung eines C-Programms gemacht, und fand das Ding
außerordentlich gut lesbar. Das "->" eine Zeiger-Dereferenzierung und
"<<" ein Linksshift ist, fand ich sehr intuitiv. Dass man unlesbare
C-Programme schreiben kann, heißt ja noch lange nicht, dass man das tun
muss.


Stefan
Rudy Velthuis
2014-04-22 21:34:29 UTC
Permalink
Post by Hergen Lehmann
Post by Carsten Thumulla
Post by Michael Landenberger
Post by Carsten Thumulla
Mit Pascal wär' das nich' passiert.
Warum?
Warum nicht, wäre Deine Frage?
Weil Variablengrenzen besser kontrolliert werden, Typen sicherer
festgelegt sind...
Pascal kennt Zeigertypen, welche als Fremdkörper im Sprachkonzept
sogar stärker zu Fehlern einladen, wie in einem modernen C-Dialekt.
Es ist nichts fremkörperartiges an Zeigern in Pascal. Damals waren
Sprachen kaum zu gebrauchen ohne Zeigern. Und new und dispose gehören
genauso zu Pascal wie writeln oder readln.
--
Rudy Velthuis http://www.rvelthuis.de

"We, on our side, are praying to Him to give us victory,
because we believe we are right; but those on the other side
pray to Him, too, for victory, believing they are right. What
must He think of us?"
-- Abraham Lincoln
Carsten Thumulla
2014-04-23 04:53:24 UTC
Permalink
Post by Hergen Lehmann
Post by Carsten Thumulla
Post by Michael Landenberger
Post by Carsten Thumulla
Mit Pascal wär' das nich' passiert.
Warum?
Warum nicht, wäre Deine Frage?
Weil Variablengrenzen besser kontrolliert werden, Typen sicherer
festgelegt sind...
Pascal kennt Zeigertypen, welche als Fremdkörper im Sprachkonzept sogar
stärker zu Fehlern einladen, wie in einem modernen C-Dialekt.
Nein, es werden hauptsächlich typisierte Zeiger benutzt. Wer davon
abweicht muß aufpassen.


ct

Herwig Huener AQSR 5
2014-04-14 22:01:47 UTC
Permalink
2014-04-15 00:02:00 +0200
Post by Carsten Thumulla
Mit Pascal wär' das nich' passiert.
s/Pascal/Ada/

Aber auch dann stimmt es nicht. Zwengs Performance
kann man die BereichsÜberprüfungen der Sprache
für die EndProduktion ausschalten. Wie man es
ja bei der Ariane 5 getan hat - und was da
rausgekommen ist, ist ja allgemein bekannt.

Herwig
Karsten Düsterloh
2014-04-14 22:33:15 UTC
Permalink
Post by Herwig Huener AQSR 5
s/Pascal/Ada/
Aber auch dann stimmt es nicht. Zwengs Performance
kann man die BereichsÜberprüfungen der Sprache
für die EndProduktion ausschalten. Wie man es
ja bei der Ariane 5 getan hat - und was da
rausgekommen ist, ist ja allgemein bekannt.
Die Bereichsüberprüfung hätte die Ausführung auf der falschen Hardware
verhindert?! Eher wohl nicht.


Karsten
--
Freiheit stirbt | Fsayannes SF&F-Bibliothek:
Mit Sicherheit | http://fsayanne.tprac.de/
Marc Santhoff
2014-04-14 23:03:34 UTC
Permalink
Post by Karsten Düsterloh
Post by Herwig Huener AQSR 5
s/Pascal/Ada/
Aber auch dann stimmt es nicht. Zwengs Performance
kann man die BereichsÜberprüfungen der Sprache
für die EndProduktion ausschalten. Wie man es
ja bei der Ariane 5 getan hat - und was da
rausgekommen ist, ist ja allgemein bekannt.
Die Bereichsüberprüfung hätte die Ausführung auf der falschen Hardware
verhindert?! Eher wohl nicht.
War das nicht ein Umrechnungsfehler zwischen metrisch und imperial?

Marc
michael bode
2014-04-15 05:22:39 UTC
Permalink
Post by Herwig Huener AQSR 5
Aber auch dann stimmt es nicht. Zwengs Performance
kann man die BereichsÜberprüfungen der Sprache
für die EndProduktion ausschalten. Wie man es
ja bei der Ariane 5 getan hat - und was da
rausgekommen ist, ist ja allgemein bekannt.
Da ging es um einen Range Check auf einem 64 Floating Point Wert. Und
der wurde unterlassen, nachdem bewiesen war, dass der Wertebereich nicht
überschritten werden *kann*. Bei der Ariane 4. Und auch dann hätte es
noch einen Exception Handler gebraucht, der einfach nichts tut.

Der Unterschied ist ja gerade, dass bei OpenSSL *kein* Runtime Error
ausgelöst wird sondern die Routine still und leise macht, was verlangt
wird, auch wenn es Unsinn ist. Bei der Ariane 5 *wurde* ein Runtime
Error ausgelöst, was zum Ausfall der Trägheitsnavigation führte. Hier
wäre genau das Verhalten von OpenSSL gefragt gewesen.
--
Guckt mich nicht so an, ich hab sie nicht gewählt.
PGP Fingerprint: A391 4109 F8D0 F67B C504 1EF6 0158 E3BB 3687 53CF
Carsten Thumulla
2014-04-15 08:46:51 UTC
Permalink
Post by michael bode
Der Unterschied ist ja gerade, dass bei OpenSSL *kein* Runtime Error
ausgelöst wird sondern die Routine still und leise macht, was verlangt
wird, auch wenn es Unsinn ist. Bei der Ariane 5 *wurde* ein Runtime
Error ausgelöst, was zum Ausfall der Trägheitsnavigation führte. Hier
wäre genau das Verhalten von OpenSSL gefragt gewesen.
Das ist eben einer der Unterschiede zwischen einem PC und einer
Prozeßsteuerung. Aber das werden die IT-Fritzen...
Loading...