Raketenwilli: Soweit zu: „Erstellen und vergessen“ (Schadcode-in-weit-verbreiteter-JavaScript-Bibliothek-UAParser-js)

Zum Anlass: https://heise.de/-6226975

Das ist ja „nicht ganz“ das erste Vorkommnis dieser Art („Verseuchung breit genutzer und von der Community gut unterstützer Libarys mit Schadsoftware“) und sowas muss wohl auch bei der Vertragsgestaltung berücksichtigt werden. Denn entweder man hat den Vertrag mit „wird schadcodefrei und lauffähig auf $Browsern und mit Webserver x, PHP y und Datenbank z übergeben“ gemacht - macht dann die Website, kassiert sein Geld und vergisst diese oder man überwacht womöglich sehr viele Jahre lang das Netz auf solche Meldungen und warnt dann den Kunde, repariert ggf. den ganzen Server.

Stellt sich die Frage, wie man die Kosten hierfür abschätzt.

Was meint Ihr?

  1. Lieber Raketenwilli,

    Zum Anlass: https://heise.de/-6226975

    da steht "NPM-Paket". Das alleine sollte schon die Alarmglocken schrillen lassen.

    Wer externe Libraries (insbesondere NPM-Pakete!) in sein Projekt lutscht, muss meiner Meinung nach bereit sein dafür auch die Haftung zu tragen. Warum sonst sollte man sie sonst verwenden wollen? Es ist eben eine Abschätzungsfrage: Will ich das alles selbst programmieren, oder nehme ich gratis die Leistung anderer in Anspruch, eventuell gar ohne sie genauer zu prüfen?

    Liebe Grüße

    Felix Riesterer

    1. da steht "NPM-Paket". Das alleine sollte schon die Alarmglocken schrillen lassen.

      Auf NPM gibt es viele unbrauchbare, aber auch viele brauchbare Tools. Ich kann im Allgemeinen nichts alarminierendes am Gebrauch von NPM finden. Natürlich muss der verantwortungsbewusste Umgang damit erlernt werden.

      Ironischerweise zeigt dieses aktuelle Beispiel doch auch, dass ein bestimmter Aspekt das NPM-Ökosystem im Ernstfall funktioniert: Die Bedrohung ist scheinbar einer US-Behörde aufgefallen, Medien haben die Meldung verbreitet, etwa 6 Stunden später hat NPM den Schadcode von seiner Plattform eliminiert. Bleibt zu hoffen, dass die bisherigen Opfer nun auch davon Wind bekommen und das technische Verständnis haben um ihre Rechner zu desinfizieren bevor der Schaden anwächst.

      Wer externe Libraries (insbesondere NPM-Pakete!) in sein Projekt lutscht, muss meiner Meinung nach bereit sein dafür auch die Haftung zu tragen. Warum sonst sollte man sie sonst verwenden wollen? Es ist eben eine Abschätzungsfrage: Will ich das alles selbst programmieren, oder nehme ich gratis die Leistung anderer in Anspruch, eventuell gar ohne sie genauer zu prüfen?

      "Wollen" spielt nur eine untergeordnete Rolle. Für Leute, die mit Webentwicklung Geld verdienen, geht ist in erster Linie oft um ökonomische Machbarkeit. Mit kompletten Eigenentwicklungen ist es schwierig bis unmöglich unter den vorherrschenden Marktbedingungen wettbewerbsfähig zu agieren. Eine Eigenentwicklung hat im Vergleich zu einer Lösung basierend auf etablierten Marktstandards höhere Kosten, längere Entwicklungsphasen und engere Kundenbindung. Hinzu kommt, dass ab einer gewissen Komplexität auch die Qualität notgedrungen leidet, weil ein einzelner Freelancer oder ein mittelständiges Unternehmen nicht genügend Kompetenz in allen relevanten technischen Bereichen aufbringen kann. Insbesondere beim Thema Sicherheit gibt es beängstigende Defizite. Das sind für Auftraggeber:innen erstmal alles negative Faktoren. Es gibt nicht viele Entwickler:innen, die unter diesen Umständen ihren Lebensunterhalt erfolgreich bestreiten können. Noch schwieriger wird es, wenn nicht nur der eigene wirtschaftliche Erfolg davon abhängt, sondern zusätzliche Verantwortung für Mitarbeiter:innen ins Spiel kommt.

      1. Hinzu kommt, dass ab einer gewissen Komplexität auch die Qualität notgedrungen leidet, weil ein einzelner Freelancer oder ein mittelständiges Unternehmen nicht genügend Kompetenz in allen relevanten technischen Bereichen aufbringen kann.

        Na? Ich hatte mal den Fall, da waren die Schlipsträger schon zahlreich durch: Kunde: „Haben erst zu allem Ja und Amen gesagt, sind dann 6 Mann hoch in drei fetten Audis gekommen und haben nach zwei Stunden gesagt: Das können wir nicht.“

        Ich: „Wie? Das ist doch alles nur Text.“

        Hab es gemacht. Läuft heute noch. Hätte es mir allerdings angemessener bezahlen lassen sollen.

        1. Die da „6 Mann hoch in drei fetten Audis gekommen“ und den Auftrag unter Angabe(!), das nicht zu „können“, nicht angenommen haben, waren übrigens die Hersteller des Warenwirtschaftssystems des Kunden, zu dem auch ein Webshop gehören sollte.

          Der sollte an Wünsche des Kunden angepasst werden:

          • Mandantenfähig (Die Geschäfte werden im Name und auf Rechnung der Vertreter abgeschlossen
          • mehrsprachig (Für die Betrachter)
          • Für Mandanten (Vertreter) einstellbare Steuersätze, Währungen, Gewinnspannen.
          • Staffelpreise
          • offline-import der Daten aus dem Wawi. Der Kunde wollte sein Wawi nicht via Internet erreichbar haben, also die Daten als CSV ex- und importieren.
          • Druckkosten für n-farbige Drucke mit verschiedenen Druckverfahren.

          Allerdings glaube ich, die wollten nicht. Und zwar aus wirtschaftlichen Gründen.

          Ich habe mit dem Gegenbeispiel auf die Aussage reagiert, dass

          ein einzelner Freelancer oder ein mittelständiges Unternehmen nicht genügend Kompetenz in allen relevanten technischen Bereichen aufbringen kann.

          Kompetenz bedeutet: Sachverstand, Fähigkeiten, Zuständigkeit

          Wenn also ein Unternehmen von gewisser Größe einen Auftrag ablehnt, den ein mehr oder weniger als schlechteste Lösung beschriebene Einzelkämpfer dann erfüllt, dann hat der Einzelkämpfer die Kompetenz - dem Unternehmen fehlt aus wirtschaftlichen Gründen der Wille und in der Konsequenz die Fähigkeit, den Auftrag anzunehmen.

          Das also - und mit dem Beispiel wollte ich das zeigen - mitunter doch die Freelancer oder Einzelkämpfer zu Unrecht belächelt werden und entgegen dem Mantra der Verkaufs- und PR-Abteilungen der Großen durchaus kompetent sein können mag zwar nicht jedem gefallen – aber das Beispiel belegt, dass neben Fachkompetenz auch das (Nicht-)Wollen und also selbst auferlegte Grenzen eine Rolle spielen können. Es gibt ja auch Fälle, wo der Kunde ein unzutreffendes „sowas geht gar nicht“ zu hören bekommt, damit der Aufwand für den Auftraggeber überschaubar bleibt. Mein Auftrag „ging eigentlich auch nicht“ - aber weder ich noch noch der Kunde hat den Aufwand gescheut. Der Kunde musste z.B. erst ein brauchbares System zu Kodierung von Eigenschaften bei der Vergabe von Artikel-IDs haben. Hab ich mit ihm zusammen definiert und gemacht.

          Meine Aussage „Unterschätzt die Freelancer nicht!” gilt auch dann, wenn ich selbst in dem konkreten Fallbeispiel einen anderen „Einzelkämpfer“ abgelöst hatte. Der hatte dann zwar - gottlob - das Design „verbrochen“ (worin ich als selbst definierter „Nicht-Künstler“ wirklich nicht gut bin) - aber bei der Programmierung hat es gehapert. Denn er hatte sich von Anfang an mit der „Drehrichtung“ einiger Arrays grob vertan (seine Spalten hätten Zeilen und visa versa sein sollen)und scheiterte dann daran, dass durch mutiges Wegwerfen des als falsch erkannten Mists zu korrigieren. Aber sein Design „stand“ - das bekam er laut meinem Kunde auch bezahlt.

          Nochmal zu der Aussage, dass

          ein einzelner Freelancer oder ein mittelständiges Unternehmen nicht genügend Kompetenz in allen relevanten technischen Bereichen aufbringen kann.

          Im Hinblick darauf, dass sich durch die geschickte Kombination passender Spezialisten (hier: Designer + Programmierer) durchaus die „Kompetenz in allen relevanten technischen Bereichen“ zu temporären, äußerst schlagkräftigen Teams zusammenfassen lässt, kann man so auch Aufträge realisieren, welche die oben durchaus auch ungerechtfertigt beworbenen großen Unternehmen nicht haben wollen und insoweit selbst die eigene Kompetenz verneinen. Obwohl manche von denen durchaus das fähige Personal haben, welches auch nicht gern „immer nur das selbe 0815-Zeug“ machen würde.

          Ganz anderes Beispiel:

          Ich hatte - als ich „anno Honnecker“ als Schlosser im Chemieanlagenbau (echt große Firma) arbeitete - als Lehrling im zweiten Lehrjahr mal eine Zeichnung. Das war irgendeine 100-Kilo-Vorrichtung, die halt benötigt wurde um die richtig tonnenschweren Klopper zu bauen. Im Chemieanlagenbau hat man es regelmäßig mit Einzelanfertigungen und Kleinserien zu tun. Oft war eine spezielle Vorrichtung für genau einen Reaktor nötig.

          Die Fußplatten waren laut Zeichnung gehobelt. Kapazität dafür laut zuständigem Zerspaner „so in 4 Wochen“. Also hab die Platten gleich aus Zentimeterblech gemacht (mit der Schlagschere) und einfach mal gut plangekloppt, angeschweißt, mit Hammer und Hitze (Schweißbrenner) gerichtet.

          Dialog bei Abnahme durch den Ingenieur:

          Öhm! Die Platten sind aber nicht gehobelt.

          Ja. Sonst wäre das Ding in vier Wochen noch nicht fertig.

          Laut Zeichnung müssen die aber gehobelt werden, damit die sauber aufstehen!

          1. Am Aufstellort ist ein Betonboden, so eben wie ein Mondkrater und es müssen eh Bleche unter die Platten gelegt werden damit das eben steht und nicht wackelt. Was soll also das Hobeln?
          2. Nehmen wir an, ich schweiße also gehobelte Platten an. Wie „plan“ sind die danach noch? (Ein Schlosser weiß: Stahl verzieht sich beim Erkalten recht heftig, wenn er z.B. durch Schweißen einseitig bis zur Rotglut erwärmt wird. Ingenieure wissen sowas nicht so unbedingt oder haben es im „Detailrausch“ vergessen.)

          Ehrlich?

          Geh hin, kuck.

          O.K. Ändere die Zeichnung und reiche das als Verbesserungsvorschlag ein, hat ja teure Arbeit gespart. Bringt Dir mindestens 30 Mark.

          Von da an hab ich bevorzugt Vorrichtungen gebaut, für die es noch gar keine Zeichnungen gab. Die wurden - weil es eine geben musste - gemacht nachdem ich fertig war. Und auf große Unternehmen, die aus theoretischen Grundsätzen heraus Fußplatten vor dem Anschweißen sorgfältigst hobeln lassen - aber nicht mal wissen oder vergessen wie Stahl reagiert und wo das Zeug dann hingestellt wird, hab ich einfach keinen Bock.

          Deshalb bin ich Freelancer.

      2. Moin,

        alles, was man zu NodeJS und NPM wissen muss: Vor fünf Jahren hat die Entfernung eines Pakets aus NPM etliche andere unbrauchbar gemacht. Und dieses Paket hieß left-pad, das lediglich einen String von links mit Spaces auffüllt.

        Viele Grüße
        Robert

        1. alles, was man zu NodeJS und NPM wissen muss: Vor fünf Jahren hat die Entfernung eines Pakets aus NPM etliche andere unbrauchbar gemacht. Und dieses Paket hieß left-pad, das lediglich einen String von links mit Spaces auffüllt.

          Ich erinnere mich. Das hat damals zu immensen Problemen geführt, weil viele NPM-Pakete direkt oder transitiv von left-pad abhängig waren. NPM hat damals das Paket kurzfristig wieder publiziert, und eine Unpublish Policy implementiert, damit sich solche Vorfälle nicht wiederholen. Seitdem hat es soweit ich weiß auch keinen ähnlichen Vorfall mehr gegeben.

    2. Tach!

      Wer externe Libraries (insbesondere NPM-Pakete!) in sein Projekt lutscht, muss meiner Meinung nach bereit sein dafür auch die Haftung zu tragen.

      Ganz heikles Thema, solange die gesetzliche Grundlage fehlt, dass jeder Hersteller von Sicherheitslücken dafür gradezustehen hat. Das würde aber auch die Software vermutlich deutlich teurer machen.

      Warum sonst sollte man sie sonst verwenden wollen? Es ist eben eine Abschätzungsfrage: Will ich das alles selbst programmieren, oder nehme ich gratis die Leistung anderer in Anspruch, eventuell gar ohne sie genauer zu prüfen?

      Es muss ja nicht mal gratis sein. Es gibt auch genügend Hersteller von Librarys, die Geld für ihre Arbeit nehmen.

      Alles selber zu machen ist nicht schaffbar. Dann müsste man konsequenterweise auch alle Tools bis hin zum Betriebssystem selbst schreiben. Oder zumindest selbst kontrollieren. Soviel Aufwand kann man sich weder zeitlich noch finanziell leisten.

      dedlfix.

  2. Hallo Raketenwilli,

    wenn Du eine Lib von irgendwo her einspielst, ist es deine Verantwortung, diese Lib auf Schadfreiheit zu prüfen. Keiner sagt, dass das einfach ist. Bei uns im Unternehmen ist der Prozess für eine FLOSS-Integration komplex und setzt immer eine Code-Inspektion voraus.

    Aber wenn sie dann in der Wilden Weiten Welt im Einsatz ist, kann natürlich immer noch was auffallen. Und ja, entweder schreibst Du in den Vertrag einen ausdrücklichen Disclaimer hinein, dass Du nach bestem Wissen und Gewissen die Korrektheit und Schadfreiheit der genutzten Libraries zusicherst, aber nicht garantierst, und zukünftig auffallende Fehler oder Schadcode dieser Version zu Lasten des Kunden gehen.

    Oder Du vereinbarst eine Überwachung als Kosten für Wartung und Pflege. Da kannst Du nur überlegen, wieviel Zeit Du pro Tag/Woche/Monat mit der Lektüre einschlägiger Quellen verbringst und auf deine Kunden umrechnen. Dann bist Du aber auch in der Verantwortung, entsprechende Meldungen zeitnah aufzugreifen. Machst Du 4 Wochen Urlaub und 2 Tage nach Abreise kommt ein Zero-Day Exploit für eine deiner Libs hoch, kannst Du angeschmiert sein. Für eine Einpersonenfirma ist das kaum zu stemmen.

    Aber wenn Du das vereinbarst, solltest Du die Reaktion auf solche Meldungen nicht pauschal vereinbaren. Der Aufwand für eine Reaktion kann sehr unterschiedlich sein. Frage ist nur, ob die Kunden da mitspielen… Aber ein Gefühl, wieviel Arbeit der Update einer Lib ist, solltest Du doch haben, oder? Wenn breaking changes drin sind, ist es unkalkulierbar, aber im Normalfall ist es ein Austausch von Dateien. Plus Inspektion der Änderungen zur eingesetzten Version, um zu schauen, ob Schabernack hineingekommen ist. Rechne pro Lib genau ein Update - nicht jede Lib wird auffällig werden und Updates der Libraries sind auch nur dann zwingend nötig, wenn die Betriebsplattform breaking changes mitbringt, die eine Lib abschießen.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Machst Du 4 Wochen Urlaub und 2 Tage nach Abreise kommt ein Zero-Day Exploit für eine deiner Libs hoch, kannst Du angeschmiert sein.

      Urlaub? Da war ich schon 6 Wochen weg … („Wat mutt, mutt!“)

      Für eine Einpersonenfirma ist das kaum zu stemmen.

      SSH/SFTP reicht mir. Ohne Zugriff keine Pflege.

      Vermutlich mache ich es wie bisher: „Verkauft wie geliefert.“ Ich verwende ja ohnehin bevorzugt „Vanilla“ - also keinen Drittanbieterkram. Ausnahmen (wie das unten besprochene, im Fehlerfall nur nicht funktionierende tinyMCE) bestätigen die Regel.

      Bei uns im Unternehmen ist der Prozess für eine FLOSS-Integration komplex und setzt immer eine Code-Inspektion voraus.

      Hm. Das wird wirtschaftlich heikel, wenn ich aberzehntausende Codezeilen Dritter lesen und vor allem auch verstehen muss. Noch ein Grund auf „Vanilla“ zu setzen. Soll da irgendeine Libary genutzt werden werde ich die dem Kunde genau so aufs Auge drücken wie das von ihm installierte OS, seinen Webserver, sein PHP, seine Datenbank.

      Tests und Updates, die für neue Versionen fällig werden, sind dann eben ein spottbilliges Hand-On. Bei mir dauert sowas auch nur Minuten, denn ich kann mit find, grep, sed & Co recht ordentlich umgehen.

      Ich kann ja auch Aufträge ablehnen und dem Kunde sagen: Nee... da brauchst Du was größeres als einen Einzelkämpfer. Ich mach wegen einem Auftrag keine Aktiengesellschaft auf.