Was genau ist das git://-Protokoll?

Lesezeit: 5 Minuten

Ich habe das ISO-OSI-Diagramm überprüft, in dem Sie die anderen beiden Protokolle sehen können, die git verwendet:

https: (Dies ist http über ssl)

und

sch

aber keine Erwähnung git://

Hier ist ISO-OSI:

https://en.wikipedia.org/wiki/OSI_model

  • Beachten Sie, dass die Wikipedia-Seite keine vollständige Liste der Layer-7-Protokolle ist.

    – David Maust

    21. November 2015 um 18:18 Uhr

  • Wenn Sie eine bessere Liste haben, geben Sie mir bitte die URL …

    – kade galt

    21. November 2015 um 18:57 Uhr

  • Ich meine, es gibt zu viele Layer-7-Protokolle, um eine vollständige Liste zu führen. Die IANA hat eine Registrierung für Portnummern, und es gibt RFCs von der IETF für viele wichtige Protokolle. Die nützlichste Liste, die ich finden konnte, ist wiki.wireshark.org/ProtocolReference

    – David Maust

    21. November 2015 um 19:25 Uhr


Benutzer-Avatar
VonC

Das git-Protokoll ist ein spezieller Daemon, der mit Git geliefert wird; Es lauscht auf einem dedizierten Port (9418), der einen ähnlichen Dienst wie das SSH-Protokoll bietet, jedoch absolut ohne Authentifizierung.

Es wurde ganz am Anfang von Git eingeführt, in commit 2386d65 (Juli 2005, Git 0.99.1)

Fügen Sie den ersten Schnitt bei der Verbindungslogik “git protocol” hinzu.

Nützlich, um Dinge von einem dedizierten Server abzurufen. Anstatt sich mit ssh zu verbinden oder einfach eine lokale Pipeline zu starten, verbinden wir uns über TCP mit der anderen Seite und versuchen zu sehen, ob ein Git-Server zuhört.

Da ich den Git-Server noch nicht geschrieben habe, wird das natürlich nie passieren. Aber der Server muss wirklich nur einen Port abhören und ein “git-upload-pack” ausführen, wenn sich jemand verbindet.

(Es sollte eine Paketzeile lesen, die das Format haben sollte

"git-upload-pack directoryname\n"

und schließlich könnten wir andere Befehle haben, die der Server akzeptieren könnte).

Das Protokoll ist zunächst in der beschrieben Nächstes Commit 9b011b2

Es gibt zwei Pack-Push-Pull-Protokolle.

  • upload-pack (S) | fetch/clone-pack (C)-Protokoll:
  • send-pack | receive-pack Protokoll

Heutzutage ist die vollständige Charakteristik eines Git-Daemon-Servers in beschrieben Documentation/git-daemon.txt.

Ein wirklich einfacher TCP-Git-Daemon, der normalerweise auf Port “lauscht”DEFAULT_GIT_PORT“alias 9418.
Es wartet auf eine Verbindung, die nach einem Dienst fragt, und bedient diesen Dienst, wenn er aktiviert ist.

Beachten Sie, dass 9418, obwohl es nicht im OSI-Modell aufgeführt ist, von Anfang an als aufgeführt wird IANA (Internet Assigned Numbers Authority)

Sehen commit ba8a497 (Sep. 2005, Git 0.99.7a:

[PATCH] Hinweis zur IANA-Bestätigung hinzufügen

Der Git-Port (9418) wird jetzt offiziell von IANA gelistet.
Also dokumentiere es.


Mit Git 2.31 (Q1 2021) Zeilenumbrüche im Host- und Pfadteil von git:// URL sind jetzt verboten.

Sehen Commit 6aed567, übertrage a02ea57 (07.01.2021) von Jeff König (peff).
(Zusammengeführt von Junio ​​C. Hamano — gitster in c7b1aaf übergeben25. Januar 2021)

git_connect_git(): Zeilenumbrüche in Host und Pfad verbieten

Berichtet von: Harold Kim
Unterzeichnet von: Jeff King

Wenn wir uns mit a verbinden git:// Server senden wir eine anfängliche Anfrage, die in etwa so aussieht:

002dgit-upload-pack repo.git\0host=example.com

Wenn der Repo-Pfad einen Zeilenumbruch enthält, ist er wörtlich enthalten, und wir erhalten:

002egit-upload-pack repo
.git\0host=example.com

Dies funktioniert gut, wenn Sie wirklich einen Zeilenumbruch in Ihrem Repository-Namen haben; Die Serverseite verwendet das pktline-Framing, um die Zeichenfolge zu analysieren, nicht Zeilenumbrüche.

Es gibt jedoch viele Sonstiges Protokolle in freier Wildbahn, die Zeilenumbrüche analysieren, wie HTTP.

Also eine sorgfältig konstruierte git:// Die URL kann sich tatsächlich in eine gültige HTTP-Anforderung verwandeln.
Zum Beispiel:

git://localhost:1234/%0d%0a%0d%0aGET%20/%20HTTP/1.1 %0d%0aHost:localhost%0d%0a%0d%0a

wird:

0050git-upload-pack /
GET / HTTP/1.1
Host:localhost

host=localhost:1234

auf dem Draht.
Auch dies ist kein Problem für einen echten Git-Server, aber es bedeutet, dass das Einspeisen einer schädlichen URL in Git (z. B. über ein Submodul) dazu führen kann, dass es unerwartete protokollübergreifende Anforderungen stellt.

Da Repository-Namen mit Zeilenumbrüchen vermutlich ziemlich selten sind (und wir sie in der Tat bereits in git-over-http verbieten), lassen wir sie einfach über dieses Protokoll verbieten.

Hostnamen könnten ebenfalls einen Zeilenumbruch einfügen, aber das ist in der Praxis kein Problem; Wir würden versuchen, den Hostnamen mit einem Zeilenumbruch aufzulösen, was nicht funktionieren würde.
Trotzdem schadet es nicht, hier auf Nummer sicher zu gehen, da wir nicht erwarten würden, dass sie überhaupt funktionieren.

Die ssh- und lokalen Codepfade sind von diesem Patch nicht betroffen.
In beiden Fällen versuchen wir, upload-pack über eine Shell auszuführen, und zitieren den Zeilenumbruch, damit er intakt bleibt.
Ein Angreifer kann natürlich eine ssh-URL auf einen beliebigen Port verweisen, aber wenn es dort keinen tatsächlichen ssh-Server gibt, würden wir sowieso nie so weit kommen, unseren Shell-Befehl zu senden.
Wir könnte schränken Zeilenumbrüche in diesen Protokollen ebenfalls aus Vorsicht ein, aber es scheint wenig Nutzen zu haben, dies zu tun.

Der neue Test hier wird neben dem ausgeführt git-daemon(Mann) Tests, die das gleiche Protokoll abdecken, aber es sollte den Daemon überhaupt nicht kontaktieren.
Theoretisch könnten wir den Test robuster machen, indem wir ein tatsächliches Repository mit einem Zeilenumbruch darin einrichten (damit unser Klon erfolgreich wäre, wenn unsere neue Überprüfung nicht eintritt).
Aber ein Repo-Verzeichnis mit einem Zeilenumbruch ist wahrscheinlich nicht über alle Dateisysteme hinweg portierbar.
Ebenso könnten wir das Protokoll von git-daemon überprüfen, dass es überhaupt nicht kontaktiert wurde, aber wir zeichnen das Protokoll derzeit nicht auf (und es würde sowieso den Test mit dem Schreiben des Protokolls des Daemons rassig machen).
Wir überprüfen einfach die clientseitige stderr, um sicherzustellen, dass wir den erwarteten Codepfad treffen.

  • Ich beende gerade Kapitel 3 und stelle meine Notizen in Google Docs, falls Sie interessiert sind.

    – kade galt

    21. November 2015 um 19:00 Uhr

  • @cadegalt sicher, bitte hinterlassen Sie die URL in den Kommentaren.

    – VonC

    21. November 2015 um 19:03 Uhr

  • bit.ly/caa-docs-so – wenn Sie Feedback haben, lassen Sie es mich wissen. Ich möchte das eines Tages lehren.

    – kade galt

    21. November 2015 um 21:37 Uhr

Wenn ich das nicht falsch verstehe, fragen Sie möglicherweise nach der URI des benutzerdefinierten GIT-Protokolls. Wenn ja, dann ist die GIT-URI x-github-client://openRepo/<RepoLink> Es öffnet Repo in der GIT Desktop-Anwendung.

Hoffe es hilft dir oder jemandem.

1216870cookie-checkWas genau ist das git://-Protokoll?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy