Sehr geehrte GitHub,
Die Sache ist die: Es gibt ein Sicherheitsproblem, das schon seit einiger Zeit ein offenes Geheimnis ist. Die Leute sprechen darüber in Issue Trackern. Es taucht in Sicherheitsmeldungen auf. Es wird in Slack-Threads diskutiert, die unweigerlich mit „... aber wir bräuchten GitHub, um diese Daten tatsächlich offenzulegen“ enden.
Ich mache Sie darauf aufmerksam, weil ich es leid bin, zu sehen, wie diese Diskussion immer wieder auf die gleiche Weise endet. Die Sicherheitscommunity verlangt lediglich Einblick in Daten, über die Sie bereits verfügen. Ohne diesen Einblick kommen wir nicht weiter. Paketregister können Benutzer nicht warnen. Sicherheitstools können verdächtige Verweise nicht kennzeichnen. Angreifer hingegen sind sich dieser Schwachstelle sehr wohl bewusst. Sie nutzen sie bereits aus, genau wie Shai Hulud.
Die Feiertage stehen vor der Tür. Und ich glaube, ich war dieses Jahr ziemlich brav. Mein einziger Wunsch ist, dass Sie uns die Mittel geben, das Ökosystem besser zu schützen. Ich hoffe, das ist nicht zu viel verlangt!
Was ist das Problem?
Paketmanager wie Ihr eigenes npm sowie Drittanbieter wie Bun und PyPI ermöglichen es Entwicklern, ein GitHub-Repository direkt als Abhängigkeit zu installieren. Ihre eigenen GitHub Actions basieren auf derselben Grundfunktion.
npm install github:trusted-org/trusted-package#commit-sha
bun install github:trusted-org/trusted-package#commit-sha
pip install git+https://github.com/trusted-org/trusted-package#commit- Verwendet: vertrauenswürdige-Organisation/vertrauenswürdiges-Paket@Commit-SHADie meisten Leute würden sich das ansehen und denken: „Wo liegt hier das Sicherheitsproblem? Ich gebe doch buchstäblich das genaue Repository an.“
Ja. Das habe ich auch gedacht.
Aber hier ist, was passiert: Wenn dieser Commit-SHA in einer Fork des Repositorys vorhanden ist, ziehst du den Code aus dem Fork. Nicht aus dem Repository in deiner URL. Aus dem Fork. Was zum Teufel?
Lassen Sie das einen Moment auf sich wirken. Ich warte... Die URL lautet vertrauenswürdige Organisation/vertrauenswürdiges PaketWenn jedoch ein Angreifer dieses Repository geforkt, einen bösartigen Commit hinzugefügt und Sie dazu gebracht hat, auf den SHA dieses Commits zu verweisen, haben Sie gerade seinen Code installiert. Nicht den Code, den Sie erwartet haben. Nicht das Repository, das Sie angegeben haben. Sondern seinen.
Warum passiert das?
Dies geschieht aufgrund des „Fork Network“ von GitHub.
Wahrscheinlich haben Sie noch nie davon gehört. Die Sache ist die: Wenn Sie ein Repository forken, erhalten Sie keine vollständig unabhängige Kopie. Ihr Fork wird Teil eines Netzwerks und teilt sich den zugrunde liegenden Git-Objektspeicher mit dem Original und allen anderen Forks. Auf diese Weise bewältigt GitHub die Skalierung. Es werden nicht Millionen Kopien derselben Commits gespeichert. Das leuchtet ein.
Das ist auch der Grund, warum dieser Angriff funktioniert.
Die oben genannten Befehle führen letztendlich zu GitHubs „Laden Sie ein Repository-Archiv (tar) herunter.Endpunkt. In der Dokumentation steht dazu Folgendes: Eigentümer Parameter:

Es gibt keine Garantie dafür, dass der Code direkt zum Repository gehört, und es gibt auch keine Warnungen darüber, dass er möglicherweise aus einem Fork stammt. Ehrlich gesagt? Angesichts der Architektur ist dieses Verhalten durchaus sinnvoll. Der Commit existiert im gemeinsamen Graphen. GitHub stellt ihn bereit. Das ist nicht falsch.
Was ist Ein Problem dabei ist, dass dadurch eine Mehrdeutigkeit entsteht, die niemand sonst durchschauen kann. Sie bitten um vertrauenswürdige OrganisationSie erhalten Code vom Angreifer. GitHub hat Ihre Anfrage erfüllt. Sie haben nur nicht das bekommen, was Sie Ihrer Meinung nach angefordert hatten. Und kein Tool außerhalb von GitHub kann den Unterschied erkennen.
Die Asymmetrie
Wir haben es wirklich sehr geschätzt, dass Sie diesen Warnhinweis auf GitHub.com hinzugefügt haben. Eine Warnung für solche Commits zu sehen? Das ist nützlich. Es zeigt, dass Sie wissen, dass dies ein Problem ist, das es wert ist, angesprochen zu werden.

Aber hier ist das Problem: Paketmanager schauen sich Ihre Website nicht an. Sie rufen Ihre API auf. Und die API gibt ihnen keinerlei Hinweis darauf, dass etwas Ungewöhnliches vor sich geht. Keine Kennzeichnung, keine Metadaten, nichts dokumentiert. Daher kann npm die Benutzer nicht warnen. PyPI kann die Benutzer nicht warnen. Bun kann die Benutzer nicht warnen. Die Informationen sind vorhanden. Sie zeigen sie bereits im Frontend an. Aber das Ökosystem kann nicht darauf zugreifen.
Warum nicht?
Zeit, streng zu werden
Erinnern Sie sich noch anden Endpunkt„Repository-Archiv herunterladen (tar)“, überden wir gesprochen haben? Derzeit ist er die größte Schwachstelle. Aber er ist auch der naheliegendste Ort, um dieses Problem zu beheben.
Hier ist eine Idee: Fügen Sie ein streng Parameter. Wenn dieser gesetzt ist, schlägt die Anfrage fehl, wenn der Commit nur in einem Fork vorhanden ist, nicht jedoch im tatsächlich angegebenen Repository. Paketmanager nehmen daran teil, alle anderen behalten das aktuelle Verhalten bei, es kommt zu keinen Störungen.
Sie führen diese Überprüfung bereits im Frontend für das Warnbanner durch. Geben Sie der API einfach die gleiche Funktion. Natürlich wäre es ideal, wenn Sie generell mehr Informationen zum Fork-Netzwerk in Ihrer API bereitstellen könnten, aber zumindest löst dies das offensichtlichste Problem.
Frohe Feiertage!
Ich schreibe dies nicht als Beschwerde. Ich schreibe, weil wir alle ein sicheres und zuverlässiges Ökosystem wollen. Sie haben das Problem bereits anerkannt, indem Sie die Warnung auf GitHub.com veröffentlicht haben. Jetzt würde es einen großen Unterschied machen, wenn Sie dasselbe Signal über die API verbreiten würden, damit das Ökosystem darauf reagieren kann.
Eine kleine Verbesserung Ihrerseits würde eine erhebliche Verbesserung im gesamten Ökosystem bewirken. Ist das nicht die beste Art von Verbesserung?
Und da gerade Weihnachtszeit ist, möchte ich etwas mitteilen, das ich hinter den Kulissen gehört habe. In den letzten Wochen habe ich mit einigen der größeren Akteure im Ökosystem gesprochen, und es herrscht eine stille, gemeinsame Sorge, dass etwas schiefgehen könnte, während alle versuchen, sich frei zu nehmen, um Zeit mit ihren Lieben zu verbringen. Die Behebung dieses einen Problems wird dieses Risiko natürlich nicht beseitigen, aber die Sorge ist real und weit verbreitet.
Frohe Feiertage, GitHub. Auf ein ruhiges Jahresende.
Sichern Sie Ihre Software jetzt.



.avif)
