Sicherheit von C/C++
-
/deleted
-
Bashar schrieb:
DEvent schrieb:
Du willst zum einen die Sicherheit einer Speicherverwaltung (GC), aber dann umgehst du diese mit Zeigerarithmetik? Natuerklich darfst du keine eigene Speicherverwaltung neben dem GC haben.
Zeigerarithmetik != Speicherverwaltung *gebetsmühle*
Natuerlich ist Zeigerarithmetik keine Speicherverwaltung, aber wenn du Zeigerarithmetik verwendest, dann umgehst du die Speicherverwaltung des GC. Also in C++ zumindest. Weil durch die Zeigerarithmetik greifst du direkt auf Speicherbereiche zu, die normalerweise von dem GC verwaltet werden. (natuerlich koennte man eine VM/GC bauen, die auch Zeigerarithmetik ueberprueft).
Bashar schrieb:
DEvent schrieb:
Im schlimmsten Fall stuertzt also das Programm ab. Das ist um Dimensionen weniger Schaden als was mit injeziertem Code machen kann. Das Ziel eines Hackers ist es nicht deine Programme zum Absturz zu bringen, sondern die Kontrolle ueber deinen Computer zu erlangen.
man DOS-Attacke
Angriff etwa nach dem Schema: Ein für die Sicherheit einer Website notwendiges System wird zum Absturz gebracht. Anstatt dann aber das ganze Angebot einzustellen, wird (aufgrund Manager-Entscheidung) das System mit verringerter Sicherheit weitergefahren, bis die IT-ler das wieder zum Laufen gebracht haben.
Das ist aber sehr weit hergeholt. Gibt es dazu Beispiele? Also nicht die DOS-Atacke, sondern das andere.
-
DEvent schrieb:
Meinst du eigentlich sowas:
[...]Nein.
Oder meinst du:
SomeObject o = new SomeObject(); o.machwas(); delete o; // o ist jetzt freigegeben // ... mehr Code o.machwas()
Dann gibt es eine NullPointerException (oder was aehnliches), und das Programm stuertzt ab oder die Exception wird gefangen.
Eine NullPointerException gibt es, wenn o = null, was hier nicht der Fall ist. Eine andere Exception gibt es möglicherweise, wenn o auf irgendwas zeigt, was nicht mit SomeObject kompatibel ist.
Das war jetzt die dritte Erklärung, ich hoffe es reicht langsam.
-
@Bashar sorry habe dich nicht ganz verstanden.
-
Bashar schrieb:
Und was wenn das Objekt an der Stelle zufällig von einem passenden Typ ist?
Dann wird dieses Objekt genommen. Jedenfalls wäre man eine solche Sprache ziemlich kaputt -- schlimmer als C++.
-
DEvent schrieb:
Natuerlich ist Zeigerarithmetik keine Speicherverwaltung, aber wenn du Zeigerarithmetik verwendest, dann umgehst du die Speicherverwaltung des GC.
Wieso, wer hindert mich denn daran, in meinen Arrays mit Zeigern umherzuwandern? Wenn ich in C++ einen konservativen GC benutze, kann ich doch weiterhin Zeigerarithmetik betreiben.
Bashar schrieb:
Angriff etwa nach dem Schema: Ein für die Sicherheit einer Website notwendiges System wird zum Absturz gebracht. Anstatt dann aber das ganze Angebot einzustellen, wird (aufgrund Manager-Entscheidung) das System mit verringerter Sicherheit weitergefahren, bis die IT-ler das wieder zum Laufen gebracht haben.
Das ist aber sehr weit hergeholt. Gibt es dazu Beispiele? Also nicht die DOS-Atacke, sondern das andere.
Konkrete Beispiele? Nein, aber ich kann mir da einiges vorstellen, z.b. du schießt einen Authentifizierungsserver ab, für den es eine lokale Fallback-Lösung gibt, die du aber anderweitig gehackt hast. Der Witz an Sicherheitslücken ist, dass die Exploits meistens sehr weit hergeholt sind. Wären sie offensichtlich, hätte man das Problem ja gar nicht erst.
-
Hey,
danke für eure zahlreichen Antworten!
Lg
-
Ein Garbage Collector ist auch kein besonders gutes Indiz für die "Sicherheit" einer Sprache. Immerhin ist in Sachen Sicherheit Ada wohl die Vorzeigesprache und Ada-Compiler besitzen (meistens) keinen GC.
Hier werden ein paar Sprachen mit den Anforderungen des Steelman-Dokuments verglichen. Dass Ada da so besonders gut abschneidet liegt aber auch daran, dass Ada nach den Anforderungen entwickelt wurde, über die Aussagekraft des Dokuments lässt sich natürlich streiten. Die Beschreibung und Begründung der einzelnen Punkte könnten aber für dich interessant sein.
http://www.dwheeler.com/steelman/steeltab.htm
-
buzz_lightzyear schrieb:
Hallo,
ich habe bis mittwoch einen Text über die Sicherheit von der Programmiersprache C/C++ zu schreiben. Mit Sicherheit ist denk ich mal "Hack-Sicherheit" gemeint.
Sicher?
Es könnte auch Speichersicherheit bedeuten, z.B. Speicher selber freigeben müssen im Vergleich zu Java mit dem Garbage Collector.
-
Man könnte die Sicherheit auch in Richtung Echtzeitfähigkeit auslegen.
(Von wegen Deadlines einhalten usw.) hier ist c/c++ Java und Konsorten überlegen weil die Gefahr das der Garbage Collector zuschlägt (wann er gerade will) nicht gegeben ist.Thema Speicherverbrauch:Sicherheit auf Hardware mit begrenztem Speicher (keine Auslagerungsdatei möglich) mit diesem auszukommen. Dies wird möglich durch die DLLs, da diese ja dynamisch bei Bedarf geladen werden können. (Glaube sowas dynamisches hat java nicht.)
-
HardwareGuru schrieb:
Man könnte die Sicherheit auch in Richtung Echtzeitfähigkeit auslegen.
(Von wegen Deadlines einhalten usw.) hier ist c/c++ Java und Konsorten überlegen weil die Gefahr das der Garbage Collector zuschlägt (wann er gerade will) nicht gegeben ist.Thema Speicherverbrauch:Sicherheit auf Hardware mit begrenztem Speicher (keine Auslagerungsdatei möglich) mit diesem auszukommen. Dies wird möglich durch die DLLs, da diese ja dynamisch bei Bedarf geladen werden können. (Glaube sowas dynamisches hat java nicht.)
O mein Gott. Du hast nicht ansatzweise Ahnung davon, was Java alles kann. Gerade was dynamische Programmierung angeht ist Java C++ haushoch überlegen.
Außerdem gibt es ein RT-Java für Echtzeitanwendungen.
-
@Nagila Hawa:
Ich habe genau garkeine Ahnung von ADA. Gibt es in ADA Zeiger und manuelle Speicherverwaltung? Wenn ja, dann ist ADA in zumindest dem Punkt weniger sicher als Java (oder andere Sprachen die einen GC verwenden, und keine Zeiger unterstützen).
Wieso wurde in diesem Thread ja schon recht ausführlich beschrieben.
-
@hustbaer
Schau einfach mal hier: http://en.wikipedia.org/wiki/Ada_(programming_language)