Java vs. .NET

Ja, weil es Heerscharen billiger Uni-Abgaenger gibt, die oft waehrend des Studiums nichts anderes als Java oder C# gesehen haben.

Welcher Studiengang soll das sein? Die meisten (Wirtschafts-)Informatik-Absolventen haben doch unabhängig der jeweils gelehrten Programmiersprachen von Softwareentwicklung keine Ahnung, speziell an der Uni.

Erstaunlicherweise gehört besagte Industrie mit ihren Java/.NET-Projekten doch zu den mit am besten zahlenden Branchen. :o

Was wiederum moeglicherweise eine Folge der Java- und C#/.Net-Hypes waren, waehrend dem sich (vermutlich) jede Menge Hochschulpersonal davon hat ueberzeugen lassen, dass Java und/oder C#/.Net die Zukunft sind und alles andere Scheisse ist.

Nachdem nur ein Bruchteil der Studenten in die universitäre Forschung geht, wäre es doch unverantwortlich, ihnen das grundlegendste Handwerkszeug für die Welt da draußen vorzuenthalten.

Der Blick über den Tellerrand ist schön und gut, aber was passiert, wenn sich eine Wissenschaft nur mit ihren Gedankengebilden und nicht mit der Realität auseinandersetzt, hat man doch bei der Finanzkrise sehr schön gesehen.

Nunja, das mag *mit* an dem Java und .Net liegen, aber es liegt oft auch daran, dass viele Entwickler sich halt gar keine Gedanken ueber Effizienz und Speichersparsamkeit machen sondern schnell mal was zusammenpfuschen. Habe ich schon -zig mal gesehen, in -zig verschiedenen Programmiersprachen.

Warum teure Entwicklerzeit mit Optimierungen verschwenden, wenn man das Problem mit Hardware zu einem Bruchteil der Kosten lösen kann? Nicht umsonst heisst es premature optimization is the root of all evil!
 
Papperlapapp. OpenBSD-Current: $ pkg_add Pugs

Ich habe aber keine Ahnung, was man damit anstellen kann, ich habe nur den Port gemacht ;-)
Tztz... ;)

Im Pugs-Repo werden vor allem Perl6-Code und die Testsuite gepflegt. Die Major-Implementation ist Rakudo. Darauf bezog sich meine Aussage. Rakudo ist eine Implementierung, die Parrot nutzt.

Parrot ist eine geniale (fertige) portable (OS, CPU und C-Compiler!) VM für dynamische Sprachen. Gibt auch schon jede Menge Ports von anderen Sprachen. Perl 1, Python, Ruby, Tcl, Lua, Brainfuck, ... Allerdings nicht alle gleich weit/fertig, weil es unabhängige Projekte sind. Perl6 selbst ist ein Standard.

Ich verfolge das Projekt schon einige Jahre und hatte die Angst, dass nie etwas daraus wird. Man wollte zu viel machen, wie Hurd - dachte ich eine Weile. Vor allem, weil es immer hieß "nächstes Weihnachten". Zehn Jahre wurde entwickelt und ich musste immer mehr an Hurd denken, aber das coole dabei war, dass Perl 6 in viele Projekte aufgeteilt war. Es gab und gibt Forschungsimplementierungen und jede Menge andere Projekte rund um das Projekt. Dadurch sind Tonnen von Ideen eingeflossen. Es gab immer Leute, die an der Spezifikation arbeiten, andere die an der VM arbeiten, einige Implementierungen und Leute, die Sachen in Perl 6 programmierten. Jede Menge Feedback und die Sprache wurde perfekt. Nein wirklich, so viele Ideen von anderen Programmiersprachen wurden aufgegriffen und eingebaut. Auch einige komplett neue Dinge. Durch Pugs zum Beispiel wurde vieles aus Haskell aufgenommen, aber damit kenne ich mich nicht wirklich aus.

Naja, genug OT-Zeug gehyped. Jedenfalls ist das Projekt relativ "fertig" und die Sachen über die derzeit gestritten wird sind Dinge, wie das Logo. Auf perl6.org kann man das Wichtigste finden. Sollte auf allen BSDs laufen. Hab's sogar auf OpenBSD/hppa probiert.

Perl5 lebt trotzdem weiter (wobei die, wie die BSDler ja auch schon lange "Perl is dead" sagen). Man will jetzt deshalb zu Perl6 lieber Rakudo sagen, auch wenn es eigentlich nur eine Implementierung ist.

Sorry, hab mir in letzter Zeit wohl zu viele Perl-Vorträge im Netz angesehen. :D

Ich weiss gar nicht, wieso hier einige Leute einen Flamewar erahnen. Ich hier nichts flamewariges sehen.
Wie ich schon schrieb. Programmiersprachen haben für gewöhnlich ein ähnliches Potential, wie Betriebssysteme und Politik. Geht schnell, dass sich jemand persönlich angegriffen fühlt. Auch, wenn es nicht so gemeint war. Wäre es schon so weit, wäre der Thread ja auch schon zu. Derzeit ist wohl eher Beruhigung angesagt. Es ein Eis, wenn es so heiß ist und wenn man unsicher ist am Besten noch eine Nacht drüber schlafen und dann den Post machen. ;)

Gruß,
Athaba - OT-König :ugly:
 
Zuletzt bearbeitet:
Du brauchst bloß die Security-Update-Doku bei Linux/Windows/OS X/Flash/whatever lesen. Dort ist es in so ziemlich allen Fällen ein Pufferüberlauf.

Was haben denn Sicherheitslücken mit Popularität zu tun? Man gucke sich alleine mal die Bugfixes von Apple an. ~50 Sicherheitlücken in WebKit gestopft. Alle die Code-Ausführung erlauben war ein Buffer-Overflow. Oder Adobe. ~29 Sicherheitslücken in Flash. Alles Buffer-Overflows.

Die Liste kannst du endlos fortsetzen.


Wenn eine Lücke von 1000 anderen mal etwas anderes ist, muss man die 1000 nicht gleich abschreiben ;)
Nehmen wir doch als Beispiel die SAs von FreeBSD. Hier sind die letzten 10: (Ich hatte keine Lust noch mehr anzuschauen.)
2010-07-13 FreeBSD-SA-10:07.mbuf
2010-05-27 FreeBSD-SA-10:06.nfsclient
2010-05-27 FreeBSD-SA-10:05.opie
2010-05-27 FreeBSD-SA-10:04.jail
2010-01-06 FreeBSD-SA-10:03.zfs
2010-01-06 FreeBSD-SA-10:02.ntpd
2010-01-06 FreeBSD-SA-10:01.bind
2009-12-03 FreeBSD-SA-09:17.freebsd-update
2009-12-03 FreeBSD-SA-09:16.rtld
2009-12-03 FreeBSD-SA-09:15.ssl
Nur FreeBSD-SA-10:05.opie ist ein off-by-one-Fehler, der zu einem stack overflow führt. Das ist deutlich entfernt von den frei erfundenen 95%. Bei den meisten in der Liste handelt es sich um unzureichende Prüfung von Eingaben. Aber das passt zu meinem Argument der Popularität: Pufferüberläufe sind durch die Presse als besonders böse gebrandmarkt und erhalten deswegen noch einmal deutlich mehr Presseecho. Ich halte daher die leider recht typische "ich habe eine sichere Sprache, mir kann nichts pasieren"-Haltung für sehr gefährlich. Die meisten dieser Probleme da oben werden in keiner Weise durch diese "sicheren" Sprachen gelöst. Übrigens ist durch erzwungenge Reihungsgrenzenprüfung der Fehler nicht magisch verschwunden, sondern es wird nur ein Fehlersymptom auf ein anderes abgebildet. Üblicherweise läuft es dann zumindest auf eine denial-of-service-Attacke hinaus, da niemand erwartet, dass eben solch ein Fehler auftritt und er somit nicht behandelt wird.
 
Auch meiner Meinung nach ist es in jeder Programmiersprache möglich, unsicheren Code zu schreiben. Zu den hier vorgebrachten Argumenten möchte ich aber doch ein paar Einwände bringen:

Dieses Problem tritt auch in Bezug auf Immutable Objekte bzw. "Copy-by-Value" Objekte auf. Wenn man mit Objekten arbeitet, deren Informationen veralten können, muss man deren Aktualität prüfen. Das Argument könnte man also bei nahezu jeder Programmiersprache bringen.
Inwiefern ist das ein Einwand gegenüber meiner Aussage? Ich habe an keiner Stelle behauptet, dies sei ein Java/C#/sonstwas-spezifisches Problem. Nur bieten diese "sicheren" Sprachen auch keinerlei Abhilfe dagegen. Ich habe lediglich angeführt, dass es noch weitaus mehr Angriffsvektoren gibt, nur diese werden nicht annähernd so stark ins Scheinwerferlicht gerückt wie Pufferüberläufe. Daher ist das prädikat "sicher" meiner Meinung nach schlicht irreführende Werbung, da nur eine spezielle Art von Angriff abgemildert wird.
 
Das ist eigentlich allgemein bekannt. Ein X x = new X() ist in Java keine teure Angelegenheit. Dort wird zur Not auch einfach ein bereits als gelöscht markiertes Objekt genommen und einfach neu initialisiert.

Bei C++ ist ein X *x = new X() und dessen Löschung eine recht teure Angelegenheit, weil jedes mal Speicher angefordert wird und anschließend auch (je nach Implementierung von free) wieder genullt wird. Man ungeht das u.U. mit händischen realloc usw. In Managed-Sprachen ist auch das "for-free".

Von Speicherfragmentierung bei länger laufenden Systemen gar nicht zu reden. Dort wird's dann teilweise auch eng bei 1GB freiem Speicher noch 100MB am Stück zu kriegen. Garbage-Collectoren räumen selbst auf. Speichermanager für C++ gibt's ja, aber das grenzt dann auch schon bald an einem Garbage-Collector.

Das ist so mit Fehlinformation und Halbwissen gespickt, da weiß ich fast nicht, wo ich anfangen soll. Nur soviel: Objektallokation ist mitnichten billig. Den besten Hinweis darauf geben die HotSpot JVM etc. selbst darauf: Der JIT versucht möglichst viele Objekte auf dem Stack anzulegen, da ständig Unmengen winzige, kurz lebenden Objekte erstellt werden - Stichwort "Escape Analysis". Dies liegt begründet darin, dass automatische Speicherbereinigung sehr zeitintensiv ist. Weiter können nur einige Speicherbereinugngsmechanismen die Speicherfragmentierung reduzieren und diese sind noch aufwendiger. Weiter hängt die Laufzeit von Speicherbereinung übrigens an der Menge der lebendigen Objekte, nicht der toten, was dann unangenehm wird, wenn man große, langlebige Datenstrukturen hat (z.B. vorher genanntes Beispiel der Datenbank).

Zudem kann ich als Übersetzerbauer über die Aussage "Das optimiert der Übersetzer/JIT schon." nur noch müde lächeln - das gilt für beide Lager. Die meisten Leute, die diesen Satz benutzen, haben leider keinerlei Ahnung von Übersetzerbau, somit können sie dies nicht einschätzen.
Auch zur Laufzeit messen und dann optimieren klingt immer ganz toll, aber es stecken weitaus mehr Probleme dahinter als dieser nette Binsenweisheit suggeriert: Erstmal ist messen nicht umsonst, sondern verursacht Verwaltungsaufwand und dann muss man mit den Ergebnissen auch etwas anfangen können. Man kann nicht magisch auf einmal etwas "schnell machen", nur weil man gemessen hat, dass es viel Zeit braucht. Eher ist es so, dass erstmal interpretiert wird und nur wenn festgestellt wird, dass es viel Zeit in Anspruch nimmt, dann wird Zeit investiert um das betreffende Programmstück überhaupt direkt zu übersetzen. Dies dient demnach der Verringerunh der Startzeit und nicht dem Ziel etwas global schneller zu machen.
 
Das ist so mit Fehlinformation und Halbwissen gespickt, da weiß ich fast nicht, wo ich anfangen soll.

Dann versuch's bitte, kann jeder nur lernen. Dein Beispiel ist leider noch kein Gegenbeispiel dazu, dass new in Java nicht deutlich billiger ist, als ein new in C++.
 
New ist doch irrelevant. Das delete ist in C++ aber wirklich teuer. Bei Java auch, aber wenn man Glück hat wird es halt ausgeführt, wenn eh gerade Zeit hat.

Bei großen Datenstrukturen betreibe ich deshalb in C++ massives Objektrecycling. Ich wollte auch immer mal ausprobieren new und delete zu überladen, so dass new unter hoher Last gleich Platz für mehrere Objekte vom System holt und delete sich nur merkt da ist etwas freigegeben und bei niedriger Last das in einem separaten Thread erledigt.
 
Nehmen wir doch als Beispiel die SAs von FreeBSD. Hier sind die letzten 10: (Ich hatte keine Lust noch mehr anzuschauen.)

Nur FreeBSD-SA-10:05.opie ist ein off-by-one-Fehler, der zu einem stack overflow führt. Das ist deutlich entfernt von den frei erfundenen 95%. Bei den meisten in der Liste handelt es sich um unzureichende Prüfung von Eingaben. Aber das passt zu meinem Argument der Popularität: Pufferüberläufe sind durch die Presse als besonders böse gebrandmarkt und erhalten deswegen noch einmal deutlich mehr Presseecho. Ich halte daher die leider recht typische "ich habe eine sichere Sprache, mir kann nichts pasieren"-Haltung für sehr gefährlich. Die meisten dieser Probleme da oben werden in keiner Weise durch diese "sicheren" Sprachen gelöst. Übrigens ist durch erzwungenge Reihungsgrenzenprüfung der Fehler nicht magisch verschwunden, sondern es wird nur ein Fehlersymptom auf ein anderes abgebildet. Üblicherweise läuft es dann zumindest auf eine denial-of-service-Attacke hinaus, da niemand erwartet, dass eben solch ein Fehler auftritt und er somit nicht behandelt wird.

Die 10 letzten Bugs einer beliebigen Liste zu nehmen, um damit eine Statistik aufzustellen, halte ich ja für aüsserst fragwürdig. Vielleicht ein bisschen objektiver: http://cwe.mitre.org/top25/archive/2010/2010_cwe_sans_top25.pdf

Anmerkung dazu: Das ist eine Liste der als "gefährlichsten" eingestuften Bugs, nicht der mit dem häufigsten Auftreten. Hier ist Buffer-Overflow an Platz 3.
 
Bei Java auch, aber wenn man Glück hat wird es halt ausgeführt, wenn eh gerade Zeit hat.

Außer die VM nimmt sich bei new einfach ein Objekt was noch nicht genullt ist. Also im Prinzip das, was du bei C++ per Hand machen musst ;) Das erspart ein delete und ein komplettes new.
 
Außer die VM nimmt sich bei new einfach ein Objekt was noch nicht genullt ist. Also im Prinzip das, was du bei C++ per Hand machen musst ;) Das erspart ein delete und ein komplettes new.
Bitte informiere dich, wie Speicherbereinigung funktioniert. Festzustellen, ob ein Objekt entsorgt werden kann, ist eine sehr teure Operation, denn dazu müssen alle Objekte betrachtet werden, denn keines darf einen Zeiger darauf haben. Also einfach "mal so" ein Objekt wiederverwenden geht nicht.
 
Die 10 letzten Bugs einer beliebigen Liste zu nehmen, um damit eine Statistik aufzustellen, halte ich ja für aüsserst fragwürdig. Vielleicht ein bisschen objektiver: http://cwe.mitre.org/top25/archive/2010/2010_cwe_sans_top25.pdf

Anmerkung dazu: Das ist eine Liste der als "gefährlichsten" eingestuften Bugs, nicht der mit dem häufigsten Auftreten. Hier ist Buffer-Overflow an Platz 3.
Das "vielleicht" lasse ich mal so stehen. Auf jeden Fall unterstreicht es doch nur meine Aussage, dass die angeführten 95% frei erfunden waren.
 
denn dazu müssen alle Objekte betrachtet werden

Müssen sie nicht. Durch die Einteilung in Generationen kann man recht schnell kurzlebige Objekte erkennen bzw. durchsuchen.

Aber wie auch immer, ich bleibe beim Ursprungs"problem", dass eine Managed-Sprache (ob mit oder ohne Garbage-Collector) die Sicherheit von Anwendungen enorm erhöhen würde. Wie gesagt, die meisten Sicherheitslücken, die Code-Ausführung erlauben, sind Buffer-Overflows. Diese Probleme würde es nicht geben. Man bräuchte keine Angst vor manipulierten Webseiten, Bildern oder sonstigen Dokumenten haben. Es kommt einfach nicht zur Code-Ausführung.

Sicherheitlücken, die per Code weitere Zugriffsrechte erlauben sind ja nun eine Stufe weiter, da man dort ja erst mal Code zum laufen kriegen muss...

Und da sind 10 Bugs in FreeBSD hinfällig, wenn dagegen im letzten Monat über 200-300 Buffer-Overflows bei anderen Projekten stehen ;) Sei es nun Webkit, Flash, QuickTime oder ein PDF-Reader. Das sind die Tore zu den Massen.
 
Zuletzt bearbeitet:
Das hast Du aber mal wieder fein gecopied&pasted.

Die Quelle haettest Du aber auch ruhig mal angeben sollen:

http://www.bernd-leitenberger.de/echte-programmierer-neu.shtml

(Den Text dort finde ich uebrigens eher peinlich)

Moin kili :) Moin Forum :)

nunja Du kennst mich, bin ich manchmal ne faule Sau, also Schande über mein Haupt ;-)

Aber trotz meines Alters bin ich ja lernfähig und liefere mal Quellen fangen wir mal mit Heise Online

29.07.2003 15:44 Kürzlich auf heise Security:

http://www.heise.de/security/artikel/Schwachstelle-C-C-270254.html

So da steht unter anderen das die Erfinder der Programmiersprache C raten auf andere Sprachen umzusteigen namentlich Pascal , Java und oh welch ein Zufall ADA so wie ich es schrieb und deshallb zurecht zusammengebügelt wurde...

Denn laut Wikipedia und einem Foristen wird diese Sprache ja Ada geschrieben:

http://de.wikipedia.org/wiki/Ada_(Programmiersprache)

Na da bin ich ja beruhigt das ich kleines Licht .........

So dann noch ein Linkverzeichniss zu C und C++ das sich mit sicheren Programmieren auseinandersetzt:

https://www.securecoding.cert.org/confluence/display/seccode/AA.+Bibliography

Ja und noch eine Sicht der Dinge:

http://www.wackerart.de/c.html

So das wäre es erstmal von meiner Seite

MFG
 
Außer die VM nimmt sich bei new einfach ein Objekt was noch nicht genullt ist. Also im Prinzip das, was du bei C++ per Hand machen musst ;) Das erspart ein delete und ein komplettes new.

Code:
public class Foo {
	public static final boolean fastfoo = true;
	public long a, b;
	public Foo(long a, long b) {
		this.a = a;
		this.b = b;
	}
	public static void main(String[] args) {
		Foo foo = new Foo(0, 1);
		for (long n = 0; n < 10000000; n++) {
			long a = foo.a;
			long b = foo.b;
			if (fastfoo) {
				foo.a = b;
				foo.b = a + b;
			} else
				foo = new Foo(b, a + b);
		}
		System.out.println("" + foo.a + ", " + foo.b);
	}
}

Compilieren, und einmal mit java -verbose:gc Foo anwerfen. Dann fastfoo auf false aendern, nochmal compilieren, und noch mal mit java-verbose:gc Foo anwerfen. Da wird bei mir im Fall fastfoo = false rein gar nichts recycled oder optimiert, die GC schlaegt etliche male zu.
 
Wenn man geflissentlich ignoriert, dass dann jede Zuweisung eines Zeigers protokolliert werden muss.
Huch![tm]

Wri reden doch hier nicht von Reference Counting oder so. Selbst einer simplen Mark/Sweep GC ist es relativ wurscht, wenn irgendwo Pointer verbogen werden, die muessen nur in die Lage gesetzt werden, Pointer zu *erkennen*. Meine Kenntnisse sind zwar ein wenig eingerostet, aber IIRC wird so etwas gerne dadurch erschlagen, dass man z.B. Heap-allozierte Objekte in zwe Bereiche aufteilt (hier die Pointer, dort der Rest).

(Ja, und man muss natuerlich auch alle Stackframes nach Referenzen auf Heap-allozierte Objekte durchsuchen, oder man markiert einfach Heap-allozierte Objekte, auf die aus Stackframes verwiesen wird als nicht collectable und entfernt die Markierung wieder, wenn der Stackframe verlassen wird, was natuerlich auch wieder kostet. Aber Zuweisungen tracen habe ich im Zusammenhang mit GC noch nie gehoert. Kann aber auch sein, dass ich doof bin (bei den Temperaturen waere das auch kein Wunder).
 
Müssen sie nicht. Durch die Einteilung in Generationen kann man recht schnell kurzlebige Objekte erkennen bzw. durchsuchen.

Ja, aber wieviele Generationen sind sinnvoll, nach wievielen GCs wandert ein Objekt in den naechsten Oldspace, ...? Da kann man kaum sinnvolle Defaults auswuerfeln, also muss man das fuer Notfaelle pro Anwendungsfall einstellbar machen und ansonsten mit Erfahrungswerten als Default arbeiten. Das ist irgendwie unbefriedigend.

Aber wie auch immer, ich bleibe beim Ursprungs"problem", dass eine Managed-Sprache (ob mit oder ohne Garbage-Collector) die Sicherheit von Anwendungen enorm erhöhen würde. Wie gesagt, die meisten Sicherheitslücken, die Code-Ausführung erlauben, sind Buffer-Overflows.

Ist das so? Und wenn ja: welche Art von Buffer Overflows (stackbasiert, heapbasiert, statische Buffer)? Und wenn es so ist, bedeutet das dann, dass die entsprechenden Programmiersprachen Mist sind, oder dass die Programmierer geschlampt haben? Und was ist mit diversen Massnahmen, die die potentiellen Folgen eines Bufferoverflows einzudaemmen versuchen? Wie greifen Massnahmen wie W^X fuer eine Sprache wie C, wie greifen sie fuer eine Sprache wie Java (genauer: fuer eine Implementierung wie die aktuellen JVMs, die ja zur Laufzeit Code erzeugen)?

> Diese Probleme würde es nicht geben. Man bräuchte keine Angst vor manipulierten Webseiten, Bildern oder sonstigen Dokumenten haben. Es kommt einfach nicht zur Code-Ausführung.

Wenn ich in einer JVM SIGSEGV, SIGBUS und SIGILL sehe (und ich *habe* das gesehen), dann wage ich diese Aussage auch mal zu bezweifeln.
 
Wie greifen Massnahmen wie W^X fuer eine Sprache wie C, wie greifen sie fuer eine Sprache wie Java (genauer: fuer eine Implementierung wie die aktuellen JVMs, die ja zur Laufzeit Code erzeugen)?

W^X greift schon mal nicht (komplett) bei Java, weil da Leseseiten interpretiert werden. Quelle CRE 155.
 
Ja, aber wieviele Generationen sind sinnvoll, nach wievielen GCs wandert ein Objekt in den naechsten Oldspace, ...? Da kann man kaum sinnvolle Defaults auswuerfeln, also muss man das fuer Notfaelle pro Anwendungsfall einstellbar machen und ansonsten mit Erfahrungswerten als Default arbeiten. Das ist irgendwie unbefriedigend.

Noch unbefriedigender ist es, alles per Hand zu machen und ggf. was zu vergessen. Und ja, man kann die Gargabe-Collectoren konfigurieren. Aber der Garbage-Collector an sich hat jetzt auch nicht viel mit meinem Wunsch nach mehr Sicherheit zu tun.

Und wenn es so ist, bedeutet das dann, dass die entsprechenden Programmiersprachen Mist sind, oder dass die Programmierer geschlampt haben?

Beides. Aber Fehler sind nunmal menschlich. Aber diese Fehler müssen nicht sein, wenn man einfach von C/C++ abkommt.

Und was ist mit diversen Massnahmen, die die potentiellen Folgen eines Bufferoverflows einzudaemmen versuchen?

Wirkt ja anscheinend bisher nicht allzu toll, oder? 29 Sicherheitslücken in Flash, 90 Sicherheitslücken in OS X, 50 Sicherheitslücken in Webkit... davon der größte Teil Bufferoverflows. Und das waren nur die letzten Patches...

Wie greifen Massnahmen wie W^X fuer eine Sprache wie C, wie greifen sie fuer eine Sprache wie Java (genauer: fuer eine Implementierung wie die aktuellen JVMs, die ja zur Laufzeit Code erzeugen)?

Was bringen Maßnahmen, wenn es sie nur auf Randsystemen gibt? Oder beim Beispiel OS X nur, wenn die Anwendung im 64bit-Modus vorliegt und läuft, etc. pp.

Wenn ich in einer JVM SIGSEGV, SIGBUS und SIGILL sehe (und ich *habe* das gesehen), dann wage ich diese Aussage auch mal zu bezweifeln.

Wie ich schon sagte, die JVM ist auch nur in C++ geschrieben und hat dementsprechend seine Nachteile. Aber ein Java-Programm, was auf der VM läuft und z.B. ein PDF mit reinem Java-Code öffnet, nicht so etwas wie einen Bufferoverflow erzeugen können. Die JVM würde den Speicherüberlauf bemerken und eine Exception schmeißen und wenn diese nicht gefangen wird, nur das Programm beenden. Da kann noch so viel Java-Bytecode im PDF sein wie es will. Ein FileInputStream-Reader wird nicht plötzlich anfangen Java-Code auszuführen, noch sonst irgendwelchen Code.

Manipulierter ByteCode ist was anderes, aber dazu müsste man erst mal die Java-VM dazu bewegen den ByteCode auszuführen. Aber das wird, wie gesagt, ein FileInputStreamReader nicht machen ;)

Und mal davon ab. Warum heißt es denn überall "Secure Coding in C/C++". Warum findet man überall Richtlinien für sichere Programme im Bezug auf das Speichermanagement so ziemlich ausschließlich für C und C++? Scheint ja wohl schon ein Problem bezogen auf diese Sprachen zu sein.

Und 3x darf man Raten warum Microsoft (nach all der "Microsoft ist so unsicher" Geschichte) plötzlich verstärkt auf Managed-Systeme aufsetzt. Gemeint ist .NET. Selbst auf Windows Phone 7 wird man nur mit .NET arbeiten dürfen.
 
Jetzt wird es aber sehr spezifisch

Ja, aber wieviele Generationen sind sinnvoll, nach wievielen GCs wandert ein Objekt in den naechsten Oldspace, ...? Da kann man kaum sinnvolle Defaults auswuerfeln, also muss man das fuer Notfaelle pro Anwendungsfall einstellbar machen und ansonsten mit Erfahrungswerten als Default arbeiten. Das ist irgendwie unbefriedigend.



Ist das so? Und wenn ja: welche Art von Buffer Overflows (stackbasiert, heapbasiert, statische Buffer)? Und wenn es so ist, bedeutet das dann, dass die entsprechenden Programmiersprachen Mist sind, oder dass die Programmierer geschlampt haben? Und was ist mit diversen Massnahmen, die die potentiellen Folgen eines Bufferoverflows einzudaemmen versuchen? Wie greifen Massnahmen wie W^X fuer eine Sprache wie C, wie greifen sie fuer eine Sprache wie Java (genauer: fuer eine Implementierung wie die aktuellen JVMs, die ja zur Laufzeit Code erzeugen)?



Wenn ich in einer JVM SIGSEGV, SIGBUS und SIGILL sehe (und ich *habe* das gesehen), dann wage ich diese Aussage auch mal zu bezweifeln.

Also ich hätte da eine Bitte an Dich köntest Du Dich mal etwas detailierter ausdrücken denn sonst wird es sehr schwierig Dir in Deiner Argumentation und Fragestellung noch folgen zu können.

So mal exenplarisch W^X das ist ein OpenBSD Sicherheitsfeature nicht jeder/e kennt OpenBSD ich versuche es mal grob zu umreissen.

Das OpenBSD Basissystem wurde dahingehend gändert das Pufferüberlauf-Attacken gelindert wurden,darunter die häufigsten Stack-basierten Angriff: dadurch, dass der Stapel nicht ausführbar, beliebigen Code in die es injiziert wird nicht ausgeführt, sondern führen dazu das Programm zu beenden....

weitergehende Infos und Quellenbelege

http://en.wikipedia.org/wiki/W^X
http://www.openbsd.org/33.html

Dann ergänzend Signals

http://en.wikipedia.org/wiki/Signal_(computing)

@ darktrym

ich hoffe Du erlaubst mir deinein Hinweis auf CRE 155 zu verlinken, ansonsten ne PM an mich und ich editiere das weg...

http://chaosradio.ccc.de/cre155.html

MFG

ps.:

So dann nochmal zum Nachdenken welche Überlegungen haben dazu geführt das Konzept der automatischen Speicherbereinigung oder das Konzept einer virtuelle Maschinen zu entwickeln...

Virtuelle Maschinen>
http://de.wikipedia.org/wiki/Virtuelle_Maschine
http://www.devmatic-it.com/devmatic-it/de/home/process_vm

ergänzend
http://www.threedee.com/jcm/psystem/

Automatische Speicherbereinigung>
http://de.wikipedia.org/wiki/Garbag...ve_und_nicht-konservative_Speicherbereinigung
http://de.wikipedia.org/wiki/Boehm-Speicherbereinigung
http://developers.sun.com/solaris/articles/libgc.html

So denke das ist mal mehr als genug Stoff zum Lesen schönes Wochende
 
Zurück
Oben