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:
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:
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 verbietenBerichtet 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.
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