Absturz verursachende Skripte

  • Hallo, an alle Skriptbenutzer,

    folgende drei Skripte führen bei mir seit heute mit dem Nightly zum Absturz:

    openBookModoki40.uc.js (funktioniert sowieso nicht mehr richtig):

    Weiterhin das Datum-Zeit-Skript für die Titelleiste - das für die Menüleiste funktioniert ohne Probleme:

    Und schließlich folgendes Skript, das den Ordner Lesezeichen-Menü statt den Ordner Weitere Lesezeichen als Standardordner für die Abspeicherung von Lesezeichen einstellt:

    JavaScript
    (function() {
      if (location != 'chrome://browser/content/browser.xhtml')
        return;
      eval('PlacesCommandHook.bookmarkPage = ' + PlacesCommandHook.bookmarkPage.toString()
        .replace(/^async/, 'async function')
        .replace(/unfiledGuid/g, 'menuGuid')
      );
    })();

    Übersetzer für Obersorbisch und Niedersorbisch auf pontoon.mozilla.org u.a. für Firefox, Firefox für Android, Firefox für iOS, Firefox Klar/Focus für iOS und Android, Thunderbird, Pootle, Django, LibreOffice, LibreOffice Onlinehilfe, WordPress

  • Hallo,

    ich habe jetzt erstmal nur das letzte Script getestet. Der Absturz ist beabsichtigt, eine sogenannte Assertion, wie man in der Programmierung sagt. Das liegt am eval(). Du musst über about:config security.allow_eval_with_system_principal auf true setzen, damit Firefox mit diesem Script nicht mehr abstürzt.

    https://bugzilla.mozilla.org/show_bug.cgi?id=1564527

    https://bugzilla.mozilla.org/show_bug.cgi?id=1473549

    PS: "eval is evil", wie man sagt. Das sollte man sowieso möglichst nie verwenden:

    https://developer.mozilla.org/de/docs/Web/Ja…val_needlessly!

  • Ich habe keins von deinen Scripten, konnte aber ermitteln, das mir dieses schuld war...

    Auch hier ist eval beteiligt....

    Ich habe das Script erst mal deaktiviert.... überlege, wofür dies überhaupt genutzt wird/wurde... da ich grad keine Auswirkung feststelle

  • Hallo,

    ich habe jetzt erstmal nur das letzte Script getestet. Der Absturz ist beabsichtigt, eine sogenannte Assertion, wie man in der Programmierung sagt. Das liegt am eval(). Du musst über about:config security.allow_eval_with_system_principal auf true setzen, damit Firefox mit diesem Script nicht mehr abstürzt.

    PS: "eval is evil", wie man sagt. Das sollte man sowieso möglichst nie verwenden:

    Hallo Sören, danke für den Hinweis. In den Absturzdateien im Ordner crashes des Profilverzeichnisses steht auch als Absturzursache:

    Do not use eval with system privileges, gefolgt vom Pfad zum entsprechenden Skript. Daher weiß ich überhaupt, dass Skripte die Ursache waren. Meistens stand dort das Datum-Zeit-Skript, wahrscheinlich, weil es als erstes geladen wurde. Seltsamerweise ist die eval-Funktion dort gar nicht enthalten, übrigens auch im Skript openBookModoki40.uc.js nicht. Dafür im Skript UndoListInTabmenuToo.uc.js, das aber nicht zum Absturz führt.

    Nun ja, ich bin ja nicht der Skript-Autor, habe also diese Funktion nicht eingebaut. Bisher gab es ja auch keine Probleme damit.

    Übersetzer für Obersorbisch und Niedersorbisch auf pontoon.mozilla.org u.a. für Firefox, Firefox für Android, Firefox für iOS, Firefox Klar/Focus für iOS und Android, Thunderbird, Pootle, Django, LibreOffice, LibreOffice Onlinehilfe, WordPress

  • Habe die von Sören erwähnte Einstellung security.allow_eval_with_system_principal mal auf true gesetzt und das Lesezeichen-Skript wieder im Ordner chrome abgespeichert, das Nightly stürzt wirklich nicht mehr ab. Es wäre aber besser, wenn Firefox gar nicht abstürzen würde, sondern eine Warnung o. ä. erschiene, damit man als Nutzer handlungsfähig bleibt. An about:crashes kommt man ja in einem solchen Moment nicht heran.

    Übersetzer für Obersorbisch und Niedersorbisch auf pontoon.mozilla.org u.a. für Firefox, Firefox für Android, Firefox für iOS, Firefox Klar/Focus für iOS und Android, Thunderbird, Pootle, Django, LibreOffice, LibreOffice Onlinehilfe, WordPress

  • Es wäre aber besser, wenn Firefox gar nicht abstürzen würde, sondern eine Warnung o. ä. erschiene, damit man als Nutzer handlungsfähig bleibt.

    Nein. Erstens sollte es bei Firefox im Auslieferungszustand keinen solchen Absturz geben, es ist also immer ein hausgemachtes Problem, zweitens gibt es die Assertions sowieso nur in Nightly-Versionen. Und die Abstürze haben zwei wesentliche Vorteile:

    1. Assertions sind ein wichtiges Werkzeug, wenn Mozilla mitbekommen möchte, dass eine bestimmte Situation eintritt, die nicht eintreten darf. Stürzt Firefox ab, wird ein Absturzbericht gesendet, der alle Details beinhaltet, an welcher Stelle das Problem auftritt. Das wäre anders nicht realistisch lösbar.

    2. Sicherheit. Es kann aus Sicherheitsgründen die bessere Wahl sein, die Anwendung abstürzen zu lassen, bevor die Anwendung mit kompromittierter Sicherheit weiterläuft. In diesem Fall geht es um Sicherheit. Und aus Punkt 2 ergibt sich auch wieder Punkt 1.

    Es ist in der Software-Entwicklung aus diesen zwei Gründen daher gar nicht so unüblich, eine Anwendung unter bestimmten Voraussetzungen absichtlich abstürzen zu lassen. Im Idealfall sollte es beim Nutzer nie zum Absturz kommen, aber es kann im Ernstfall eben wie gesagt die bessere Option sein als das Programm weiterlaufen zu lassen.

  • Nur mal zur Info:

    Diese beiden Skripte lassen Nightly auch abstürzen, nicht beim Start aber wenn man versucht

    das durch das Skript generierte Popup zu öffnen, in beiden ist eval vorhanden.

    Wenn ich dann den erwähnten Eintrag in about:config umstelle geht es.

    Ich habe beide entfernt, da ich den Eintrag in about:config aus Sicherhitsgründen nicht ändern will.
    Mal sehen ob der Autor selber oder sonst jemand die Skripte entsprechend ändert.

    Mfg.
    Endor

    Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:132.0) Gecko/20100101 Firefox/132.0
    OS: Windows 10 pro 64 bit und Windows 10 Home 64 bit
    Meine Scripte Sammlung: https://github.com/Endor8/userChrome.js
    Kein Support per PN. Fragen bitte im Forum stellen!

  • Hallo Sören, danke für den Hinweis. In den Absturzdateien im Ordner crashes des Profilverzeichnisses steht auch als Absturzursache:

    Bitte auch eine kurze Notiz in den Hinweisthread zu Änderungen für Fx 68 und 69 einfügen, damit man das leichter wiederfindet. Ich weiß jetzt schon, dass ich deswegen aborix wegen einer Skriptänderung fragen muss. Hat sich erledigt nach Aborix' Ausführungen unten.

  • Bitte auch eine kurze Notiz in den Hinweisthread zu Änderungen für Fx 68 und 69 einfügen, damit man das leichter wiederfindet.

    Erledigt, siehe:

    Anpassungen der CSS- und JS-Codes ab Firefox 68 bzw. 69

    Übersetzer für Obersorbisch und Niedersorbisch auf pontoon.mozilla.org u.a. für Firefox, Firefox für Android, Firefox für iOS, Firefox Klar/Focus für iOS und Android, Thunderbird, Pootle, Django, LibreOffice, LibreOffice Onlinehilfe, WordPress

  • Mit eval werden in Skripten Kleinigkeiten von JS-Funktionen verändert, indem ein kleiner Teil des Quellcodes durch einen anderen Code ersetzt wird. Eine Alternative zu eval ist der Function constructor, der allerdings auch nur mit geänderter about:config-Einstellung funktioniert.

    Eine andere Möglichkeit ist, den gesamten geänderten Code ins Skript zu schreiben. Die Skripte können dadurch beträchtlich länger werden.

    Als Beispiel:

    Das letzte Skript aus #1 legt das Lesezeichen-Menü als vorgegebenen Speicherort für neue Lesezeichen fest:

    JavaScript
    (function() {
      if (location != 'chrome://browser/content/browser.xhtml')
        return;
      eval('PlacesCommandHook.bookmarkPage = ' + PlacesCommandHook.bookmarkPage.toString()
        .replace(/^async/, 'async function')
        .replace(/unfiledGuid/g, 'menuGuid')
      );
    })();   

    Das Skript mit dem gesamten Code der Funktion PlacesCommandHook.bookmarkPage:

  • Eine andere Möglichkeit ist, den gesamten geänderten Code ins Skript zu schreiben. Die Skripte können dadurch beträchtlich länger werden.

    Als Beispiel:

    Das letzte Skript aus #1 legt das Lesezeichen-Menü als vorgegebenen Speicherort für neue Lesezeichen fest:

    Das Skript mit dem gesamten Code der Funktion PlacesCommandHook.bookmarkPage:

    Hallo aborix,

    danke für die Information. Da kann man nur sagen "ach du grüne Neune!", wenn man den sechsfach längeren Code sieht. Man ist versucht zu sagen, dass es schade wäre, wenn man auf die Funktion eval() verzichten müsste.

    Früher gab es doch (oder gibt es sie noch?) eine Methode eval, also so etwas wie objekt.eval. Soviel ich weiß, wurde sie schon vor Jahren als deprecated erklärt. Was wäre da der Unterschied?

    Ach ja, woher kennt die Funktion eval() den Code für PlacesCommandHook.bookmarkPage?

    Übersetzer für Obersorbisch und Niedersorbisch auf pontoon.mozilla.org u.a. für Firefox, Firefox für Android, Firefox für iOS, Firefox Klar/Focus für iOS und Android, Thunderbird, Pootle, Django, LibreOffice, LibreOffice Onlinehilfe, WordPress

    Einmal editiert, zuletzt von milupo (28. Juli 2019 um 13:07)

  • Man ist versucht zu sagen, das es schade wäre, wenn man auf die Funktion eval() verzichten müsste.

    Also ich bin da überhaupt nicht versucht, das zu sagen, und hatte dazu weiter oben bereits einen Link eingefügt. eval() zu verwenden ist ein absolutes No-Go für JavaScript-Entwickler, wenn es anders auch geht.

    Es kommt nicht auf die Länge an. ;)

  • Von der Funktion toString:

    PlacesCommandHook.bookmarkPage.toString()

    Danke aborix.

    Übersetzer für Obersorbisch und Niedersorbisch auf pontoon.mozilla.org u.a. für Firefox, Firefox für Android, Firefox für iOS, Firefox Klar/Focus für iOS und Android, Thunderbird, Pootle, Django, LibreOffice, LibreOffice Onlinehilfe, WordPress