- Nach copy.fail wurden weitere Linux-Kernel-Schwachstellen bekanntgegeben
- Derzeit wird die Lage als ein Zeitpunkt eingeschätzt, an dem NPM-Supply-Chain-Angriffe besonders großen Schaden anrichten können
- Es gibt die Empfehlung, Linux-Kernel-Patches aus der Distribution als Ausnahme zu behandeln
- Ansonsten ist es vermutlich besser, die Installation neuer Software für etwa eine Woche auszusetzen
- Es wird darauf hingewiesen, dass sich Sachlage oder Umstände seit der Veröffentlichung geändert haben könnten; falls etwas falsch oder unklar erscheint, solle man vor einem Fazit Kontakt aufnehmen
1 Kommentare
Hacker-News-Kommentare
Das war immer ein Albtraum, der irgendwann explodieren musste. Es gibt viel zu viele Pakete, und entsprechend ist die Angriffsfläche der Supply Chain so riesig geworden, dass das früher oder später alle treffen musste.
Aber es war eben zu bequem. Menschen, die warnen oder den Schaden mindern wollten, wurden von Leuten abgetan, die nie etwas auf andere Weise gemacht hatten, und
"import antigravity"war einfach zu verlockend, um darauf zu verzichten.Es wirkt, als wären wir jetzt in der Phase angekommen, in der wir „den Preis bezahlen“
Fast alles, einschließlich Compiler und Kernel, wurde aus dem Quellcode gebaut, und die Build-Server/-Infrastruktur hatten überhaupt keinen Internetzugang; es gab ein Verfahren, um Änderungen kontrolliert hereinzuholen. Relevante CVEs wurden jedes Mal geprüft, wenn sie veröffentlicht wurden, um zu entscheiden, ob sie uns betreffen und wie wir sie abmildern oder behandeln.
In der Firma danach hatten die Builds Internetzugang, und es wurde aktualisiert, sobald neue Versionen erschienen. Die Leute hielten das für gute Praxis, weil man so die neuesten Bugfixes bekomme, und die CVE-Prüfung lag beim Security-Team.
Das Startup danach hatte einen Mix aus verschiedenen Praktiken. Einiges war sehr gut, aber es gab auch viele CVE-Schulden. Zum Beispiel waren Secure Boot und verschlüsselte Datenträger auf den Servern im Einsatz, und die Sicherheit der Kommunikation zwischen Komponenten war recht gut verstanden.
Alle glauben, dass sie es richtig machen. Es ist fast unmöglich, Menschen, die „oft upgraden“, davon zu überzeugen, dass damit auch das Risiko steigt, neue Probleme einzuführen. Die Branche braucht ein besseres Bündel an Best Practices, und ich persönlich halte den Umgang des ersten Unternehmens mit Abhängigkeiten für besser. Insgesamt waren dort die Sicherheitspraktiken gut verankert, und das Produkt war wirklich sicher
Dann wäre irgendwann jede nützliche Software durch Fuzzing-Tests, Property-Tests und formale Verifikation gegangen, und alle, die Schwachstellen suchen, müssten wieder bei null anfangen.
Natürlich setzt das voraus, dass wir die Zwischenphase überstehen, in der Staaten ihre verbleibenden Mittel auf ihre schlimmsten Gegner werfen. Oder wir schlagen am Ende eben wieder mit Tierknochen aufeinander ein
Auf Betriebssystemebene würde ein gestartetes Programm ein Capability-Token von der Shell oder dem Aufrufer übergeben bekommen, und jeder Systemaufruf müsste als erstes Argument eine Capability erhalten. Also würde
"open path /foo"zuopen(cap, "/foo"). Diese Capability könnte auf ein Fake-Dateisystem, einen Zweig des echten Dateisystems, ein Netzwerkdateisystem oder irgendetwas anderes zeigen, und das Programm müsste nicht wissen, in welcher Sandbox es lebt.Auch auf Bibliotheks-/Sprachebene müsste man beim Import von Third-Party-Bibliotheken wie npm-Modulen bei jedem Importzeitpunkt oder Aufrufort Rechte mitgeben. So eine Bibliothek sollte nicht Lese-/Schreibzugriff auf jedes Byte im Adressraum meines Programms haben und auch nicht auf meinem Computer alles tun können, als wäre sie ich. Die Kernfrage lautet: Wie groß ist der Blast Radius dieses Codes? Wenn eine verwendete Bibliothek bösartig oder verwundbar ist, braucht man vernünftige Standardannahmen für das Schadensausmaß. Ein Aufruf wie
lib::add(1, 2)sollte nicht zu einer dauerhaften vollständigen Kompromittierung meines Computers führen.SeL4 bietet schon lange schnelle und effiziente Capabilities auf Betriebssystemebene, und das funktioniert gut. In vielen Fällen ist es schneller als Linux und sehr nützlich für transparente Sandboxing-Mechanismen, User-Space-Treiber, Interprozesskommunikation, Sicherheitsverbesserungen und mehr. Man kann Linux sogar als Prozess auf SeL4 laufen lassen. Ich will ein Betriebssystem, das alle Funktionen eines Linux-Desktops hat, aber sich wie SeL4 verhält.
Leider scheint es keine Programmiersprache zu geben, die die Art von Capabilities auf Sprachebene bietet, die ich haben möchte. Rust kommt ziemlich nah heran, aber man bräuchte eine Möglichkeit, Third-Party-Crates daran zu hindern, beliebigen unsafe Code aufzurufen. Einschließlich unsafe, das von nicht vertrauenswürdigen Abhängigkeiten hereingezogen wird. Außerdem müssten alte Soundness-Bugs in Rust behoben werden, und es bräuchte eine Capability-basierte Standardbibliothek. Globale Dinge wie
open()oderlisten()müssten verschwinden; es dürfte nur noch Formen wieopenat()geben und entsprechende Gegenstücke für andere Teile des Betriebssystems.Wenn LLMs weiter besser werden, lasse ich sie das in ein paar Jahren vielleicht einfach komplett bauen, falls es niemand vorher tut. Die Sicherheit moderner Desktop-Betriebssysteme ist ein Witz
Wir brauchen auch für Code eine Hygienekultur, und die unterscheidet sich gar nicht so sehr von den Normen, die die meisten Kulturen rund ums Essen entwickelt haben. Es ist eine Kombination grober Heuristiken, aber dieses Gefühl von „igitt“ rettet Milliarden Menschen das Leben
Heute reduziere ich meine Exposition gegenüber Abhängigkeiten stärker als je zuvor, besonders bei Dingen, die sich in ein paar hundert Zeilen implementieren lassen. Das ist wirklich ein Paradigmenwechsel
Der Ansatz „warte eine Woche mit der Softwareinstallation“ funktioniert nicht. Erst vor ein paar Monaten traf eine massive Schwachstelle das Web; es war ein zeitverzögerter Angriff, der über einen Monat lang latent blieb und dann aktiviert wurde.
Wenn alle anfangen, eine Woche zu warten, warten Angreifer eben zwei Wochen. Cyberkriminelle müssen nicht sofort ausnutzen, sie müssen nur irgendwann erfolgreich ausnutzen. Viele Arten von Schwachstellen wie Typosquatting ändern sich dadurch ebenfalls nicht
Der Grund ist, dass es für diese Schwachstellen wahrscheinlich noch keine Patches gibt und selbst wenn doch, sehr wahrscheinlich bald noch schlimmere entdeckt werden
Aber ohne jede Verzögerung kann man von einem Exploit getroffen werden, den noch niemand gesehen hat
Außerdem hing die Entdeckung solcher Kompromittierungen überhaupt nicht davon ab, ob sie tatsächlich ausgenutzt worden waren. Deshalb verstehe ich die Aussage „wenn alle eine Woche warten, warten Angreifer zwei Wochen“ nicht
Als andere Option könnte man auf ein Betriebssystem wie FreeBSD wechseln, das Sicherheit nicht im YOLO-Stil behandelt.
Security-Fixes werden nicht einfach unkoordiniert in den FreeBSD-Kernel geworfen. Sie gehen über das FreeBSD-Security-Team, und wenige Minuten nachdem ein Patch in den src-Tree gelangt ist, werden Binärupdates über FreeBSD Update und pkgbase für 15.0-RELEASE ausgeliefert.
Es dauert ungefähr ein paar Sekunden, bis auf Slack die Nachricht „Patch gepusht“ erscheint, 10 bis 30 Sekunden für den Upload des Patches und höchstens etwa eine Minute für die Synchronisierung der Mirrors
Fairerweise betraf mein Report nichts Zentrales und war auch nicht leicht auszunutzen, aber Debian, OpenBSD, SUSE und Gentoo hatten alle innerhalb einer Woche Patches: https://www.maxchernoff.ca/p/luatex-vulnerabilities#timeline
Ich will damit nicht das ganze Betriebssystem anhand der Bearbeitung eines einzelnen kleineren Reports bewerten. Alles andere, was ich gesehen habe, spricht eher dafür, dass FreeBSD Security-Meldungen ziemlich ernst nimmt. Mit derselben Logik könnte man das aber auch auf Linux-Kernel-Bugs anwenden. Solche Fälle von schlecht gemanagten Patches sind auch unter Linux ziemlich selten
Es bevorzugt Nutzbarkeit gegenüber Sicherheit. Ein bekanntes Beispiel gibt es hier: https://vez.mrsk.me/freebsd-defaults
Ich schätze Beiträge zum Projekt, aber solange es solche schlechten Defaults gibt, kann ich Leuten mit gutem Gewissen keinen Wechsel empfehlen
Wenn man FreeBSD und Sicherheit will, sollte man eher HardenedBSD von Shawn Webb verwenden
Selbst Security-Experten müssen inzwischen akzeptieren, dass unsere Welt auf einem extrem fragilen Gleichgewicht steht. Ich glaube, die Leute unterschätzen das massiv.
Nicht nur die IT-Welt, die ganze Welt ist auf zahllosen sehr fragilen Gleichgewichten aufgebaut. Security-Exploits wird es immer geben. Nicht nur in Software, sondern auch in der realen Welt. Jemand hat sich mal in eine Sicherheitskonferenz eingeschlichen, und das war nur ein YouTuber. Klar, das war kein Hochsicherheitsevent, aber das ist das Beispiel, das mir einfällt. Im Grunde ist es in den meisten Fällen wirklich leicht, Sicherheit zu umgehen.
Was ich sagen will: Fundamental funktioniert unsere Welt nur deshalb, weil die meisten Menschen Dinge eben nicht ausnutzen. Menschliche Gesellschaften haben schon immer so funktioniert und werden das wahrscheinlich auch weiter tun
Soweit ich weiß, ist der YouTuber Max Fosh sogar mehrfach in die International Security Expo hineingekommen. In Großbritannien benutzte er in https://www.youtube.com/watch?v=qM3imMiERdU, in den USA in https://www.youtube.com/watch?v=NmgLwxK8TvA jeweils die Aliasnamen „Rob Banks“ und „Nick Everything“.
Ich habe mich einmal mit Sicherheitskultur beschäftigt, und meistens läuft es am Ende auf eine gleitende Skala hinaus: auf der einen Seite Sicherheit, auf der anderen Bequemlichkeit/Zugänglichkeit. Je sicherer, desto weniger zugänglich, und umgekehrt
Für Supply-Chain-Angriffe auf Dependency-Manager wie npm, PyPI und Cargo gibt es bereits eine brauchbare Lösung. Man konfiguriert sie so, dass nur Paketversionen installiert werden, die ein paar Tage alt sind.
Alle größeren jüngsten Angriffe wurden innerhalb eines Tages entdeckt und zurückgerollt; so hätte man sie sicher vermeiden können. Dieses Verhalten sollte der Standard sein. Freiwillige Beta-Tester und Security-Scanner-Firmen können ruhig die neuesten Paketversionen einen Tag früher verwenden. Eine Möglichkeit dazu gibt es hier: https://cooldowns.dev/
Ein Artefakt-Manager. Er sorgt dafür, dass nur genehmigte Dinge bezogen werden. Man kann schnell aktualisieren, wenn es nötig ist, und ansonsten konsistent validierte stabile Versionen verwenden. Man braucht ein wenig Konfigurations-Override, aber das ist leicht machbar.
Ich habe mir einmal ein ähnliches, eher zusammengebasteltes Tool für denselben Zweck selbst gebaut; das hier ist ein gutes Projekt
Außerhalb von Unternehmen funktioniert das natürlich nicht ohne Weiteres
Sobald sie entdeckt sind, gibt es direkt eine Explosionswelle von Exploits, und verzögerte Updates geben aufgeregten Angreifern mehr Zeit
Ein anderes Modell ist Perl-CPAN, das nur Quelldateien verteilt
Wer Continuous Integration und containerisierte Builds erst relativ kürzlich eingeführt hat, sollte prüfen, ob das System bei jedem Build aus mehreren Paketen
latestzieht.Wir erstellen einen Basis-Container, in dem alle externen Abhängigkeiten enthalten sind, und aktualisieren ihn nur dann explizit, wenn wir entscheiden, dass es Zeit dafür ist.
Dadurch hinken wir dem neuesten Stand vielleicht etwas hinterher, tragen aber viel weniger das Risiko, dass zufällige Supply-Chain-Schwachstellen sofort weltweit ausgerollt werden
Das ist ein aktiv schädlicher Meinungsbeitrag. Die Logik ist schwer nachzuvollziehen.
Es dauert 45 Sekunden zu prüfen, wie alt die Schwachstellen copyfail und dirtyfrag tatsächlich sind. Das ist länger als das Lesen des Artikels. Dirtyfrag kann Systeme betreffen, die bis 2017 zurückreichen.
Betroffen ist also nicht „neue“ Software. Und tatsächlich ist ältere Software in einem schlechteren Zustand, weil es viel mehr Zeit gab, Probleme darin zu finden
Irgendwann wird jemand den gesamten Stack vom Betriebssystem bis zur Anwendung mit Upgrades auf Basis von Proof-Carrying Code neu bauen.
Der einzige Weg, vertrauenswürdigen Code auszuführen, ist Co-Design und Co-Build von Beweisen und Code
Das gilt nicht nur für Software, sondern eigentlich für fast alles.
Ich weiß nicht mehr, wo ich das gelesen habe, aber am Ende läuft es auf den Unterschied zwischen Bedarf und Wunsch hinaus.
Ich habe diese Regel schon benutzt, wenn ich zwischen Neuwagen und Gebrauchtwagen, zwischen teurem Staubsauger und Basismodell gewählt habe. Das Gleiche gilt für glänzende neue Gadgets, dafür, etwas Neues in den Tech-Stack aufzunehmen, oder einen neuen Tech-Stack auszuwählen
Ich würde gern besser verstehen, was copyfail ist und wie es mit NPM-Paketen zusammenhängt.
So wie ich es bisher verstanden habe, ist copyfail ein Kernel-Bug, der es einem bösartigen npm-Paket ermöglichen könnte, auf einem Linux-Server Root-Rechte zu erlangen.
Das würde bedeuten, dass jetzt, wo es noch ungepatchte Server gibt, der perfekte Zeitpunkt für Angreifer wäre, auf NPM-Pakete zu zielen.
Liegt der Grund, warum der Rat nicht einfach „aktualisiert euren Kernel“ lautet, darin, dass weiterhin neue verwandte Probleme gefunden werden, die noch nicht gepatcht sind?
Wenn ein beliebtes NPM-Paket kompromittiert würde und einen copy.fail-Exploit enthielte, wären viele Systeme für eine Root-Rechteausweitung verwundbar