2010-04-23 10 views
6

Ich bin Teil eines Test-Teams und wurde beauftragt, "Verhalten schlecht" mit JavaScript in einem Firefox-Browser. Ich habe these methods ausprobiert, um den Browser herunterzufahren, aber keiner von ihnen tut etwas Schlimmeres, als ein Popup zu verursachen, das bittet, das Skript herunterzufahren.Absturz firefox mit JavaScript

Irgendwelche anderen Ideen?

+18

Klingt wie: Finde mich segfaults für leet zero-dayz! –

Antwort

9

Etwas ähnlich einer „fork bomb“

<html> 
<body> 
<a href="#" onclick="die()">click me!</a> 
<script> 
function die() { 
    setTimeout(function() {die(); die()}, 0) 
} 
</script> 
</body> 
</html> 

Es ist nicht arretierbar von FF 3.6 und unten (es sei denn, der Benutzer die Verletzung Tab bald genug schließen passiert). Je länger du es laufen lässt, desto bösartiger wird es. Schließlich wird es die gesamte für den Prozess verfügbare Erinnerung auffressen. Die Belastung der CPU sollte ebenfalls zunehmen. Einige Betriebssysteme werden mit einem fehlerhaften FF besser zurechtkommen als andere. Sie können dies degenerieren, wenn Sie in jedem Zyklus eine angemessene Last auf das DOM anwenden.

Edit: "Verwenden Sie dieses Wissen nur für das Wohl der Welt." :-)

+1

Ich benutze Firefox 13 und trotzdem ist es nicht immun dagegen. Einige Minuten später gibt Firefox mir die Box "Es tut uns leid". – bwDraco

+2

Ugh, was für eine Schwachstelle.Bei 32-Bit-Versionen von Firefox ist dies eine einfache DoS-Attacke, die Firefox nach einigen Minuten zum Erliegen bringt. Dies ist sogar noch schlimmer bei 64-Bit-Firefox (wie bei x86-64 Linux): Der Browser könnte praktisch unbegrenzte Speicherkapazität zuweisen, wodurch die Maschine möglicherweise durch Swapping blockiert wird, bis der OOM-Killer dies erkennt, oder auf Systemen, die dies nicht tun Wenn Sie keine ähnliche Funktionalität haben, stürzen Sie den Computer vollständig ab. Das muss wirklich gepatcht werden. – bwDraco

+0

@DragonLord Was für eine Schande, wirklich. Ich würde einige interne Sanitätsgrenzen für die Anzahl der Handler erwarten. Ich frage mich, wie andere Browser fair sind. Jedoch, wenn ich * jemals * zu einer Seite ging, die das tat, würde ich nie zurückkehren;) –

6

Der Skript-Ausführungszeit-Watchdog ist nett und alles, aber es löst nicht das Modal-Loop-Problem. Going zu einer alert, confirm oder prompt Box stoppt den Timer, so dass dies:

<script>while(true) alert('alert bomb');</script> 

schwer zu entkommen, und diese:

<body onbeforeunload="while(true) alert('alert bomb');"> 

effektiv unmöglich. (Halten Sie Ihren Task-Manager bereit.)

Die Verwendung von schwer zu entkommenen modalen Schleifen war eine beliebte Taktik aggressiver Spyware-Installationsseiten. ("Klicken Sie auf Ja, um VomitBar jetzt zu installieren oder sich endlosen Alarmfeldern zu stellen ...")

+3

Chrome> Firefox auf diesem :); http://tinypic.com/r/54smer/5 – Matt

+1

Eines der nervigsten Dinge ... überhaupt! –

+2

Chrome bietet die Option, das Skript nach der ersten Box zu beenden. –

2

Ich konnte meinen Firefox wiederholt abstürzen, indem ich eine massive DOM-Einfügung von ungefähr 10.000 Elementen ausführte.

Grundsätzlich klickt der Benutzer auf eine Schaltfläche, um einen jQuery AJAX-Aufruf auszulösen. Der Aufruf würde eine vollständige HTML-Datei zurückgeben, die mit jQuery an ein bestimmtes div angehängt würde.

<script> 
    $("div.content").empty(); 
    $("div.content").html(data); 
</script> 

Dann, wenn die Daten hinzugefügt würde es versuchen, diesen ganzen Dreck von Daten zu analysieren und fügt onClick und onHover Ereignisse grundsätzlich jedes Element im Baum.

Seien Sie versichert, jedes Mal, wenn ich diese Funktion ausgeführt habe, stürzte mein Browser ab. Es würde das übliche "ein Skript läuft langsam, willst du es abbrechen" hervorbringen, aber ich konnte es nie abbrechen und musste immer STRG + ALT + ENTF drücken.

Nur FYI, ich habe nie geplant, eine 10.000 Element Insertion zu tun, es war ein Fehler meinerseits. Ich habe eine Datenbank mit einem JOIN abgefragt und wollte SELECT DISTINCT machen, und stattdessen SELECT, anstatt 100 Elemente zurückzugeben, gab ich 10.000 wegen der Joins zurück. Hoppla.