Ist es unter Linux möglich, dass ein Prozess in einen Socket schreibt, der von einem anderen geöffnet wurde?
Angenommen, ich öffne mit netcat eine Verbindung zu google.com:
myuser@linux:~$ nc google.com 80
Jetzt kann ich nach der Prozess-PID suchen und ihren Dateideskriptor-Ordner öffnen:
myuser@linux:~$ ls -la /proc/24105/fd
totale 0
dr-x------ 2 myuser myuser 0 2012-03-10 19:01 .
dr-xr-xr-x 7 myuser myuser 0 2012-03-10 19:01 ..
lrwx------ 1 myuser myuser 64 2012-03-10 19:02 0 -> /dev/pts/12
lrwx------ 1 myuser myuser 64 2012-03-10 19:02 1 -> /dev/pts/12
lrwx------ 1 myuser myuser 64 2012-03-10 19:01 2 -> /dev/pts/12
lrwx------ 1 myuser myuser 64 2012-03-10 19:02 3 -> socket:[3947162]
Jetzt möchte ich die HTTP-Anfrage mit einem Echo in diesem Socket stellen:
myuser@linux:~$ echo "GET / HTTP/1.1" >> /proc/24285/fd/3
bash: /proc/24285/fd/3: no such device or address
Wenn Sie es als root tun, ändert sich das Ergebnis nicht.
Ich kann nicht in den Socket schreiben, aber ich kann in den Standard schreiben:
myuser@linux:~$ echo "GET / HTTP/1.1" >> /proc/24285/fd/0
myuser@linux:~$
Aber es ist nicht das, was ich tun möchte.
Ich dachte: Ein Linux-Socket sollte wie eine Datei behandelt werden, nicht wahr? Ein oder mehrere Prozesse können denselben Socket verwenden. Warum kann ich das nicht tun?
nc
kann dies tun, aber wenn Sie dies versuchen, wird "Transportendpunkt ist nicht verbunden" angezeigt. Beispiel Befehlnc -v --send-only -U /proc/123/fd/3 <<< 'GET /'$'\n\n'
gdb -p 24285
und dann kann ich mit in den Dateideskriptor schreibencall write(3, "test",4)
. Es funktioniert, aber ich möchte das Gleiche aus dem Prozess heraus tun, da die Verwendung von gdb das Stoppen des Prozesses erfordert (Antworten:
Dies ist nicht möglich, da es schwierig zu implementieren und selten nützlich wäre. Muffen sind viel komplexer als Rohre:
Da Sockets bidirektional sind, werden sie häufig zur Kommunikation unter bidirektionalen Protokollen verwendet. Wenn Sie Daten in die Konversation einfügen, sendet die andere Seite möglicherweise eine Antwort auf Ihre Daten, und es gibt keine Möglichkeit, die Antwort an den richtigen Anforderer zu senden. Dies verringert die Nützlichkeit der Ermöglichung der Dateninjektion in Sockets erheblich.
Wenn Sie versuchen, denselben Server wie einen vorhandenen Client zu kontaktieren und keine vorhandene Konversation zu bearbeiten, gibt es bereits eine Möglichkeit, dies zu tun: Wenden Sie sich auf dieselbe Weise an den Server (öffnen Sie einen Socket im Dateisystem oder einen TCP oder UDP-Port). Wenn der Socket zwischen zwei Prozessen namenlos ist, ist dies ein guter Hinweis darauf, dass Sie nicht teilnehmen sollten, sodass das Betriebssystem es nicht einfach macht.
Mit einem Datagramm-Socket (hier nicht der Fall) konnten Sie keine Daten direkt einfügen, da die Shell nur Byteströme versteht und nicht weiß, ob sie aufruft,
send
anstattwrite
ein Paket zu senden.Wenn Sie mit einem Endpunkt zusammenarbeiten, können Sie festlegen, dass der Dateideskriptor 1 2 3 übergeben soll .
Andernfalls können Sie den Prozess, bei dem der Socket geöffnet ist, veranlassen, die Daten selbst mit zu senden
ptrace
(diesgdb
wird unter der Haube verwendet). Dadurch wird der Prozess von Natur aus unterbrochen, sodass Ihre schmutzigen Tricks den Prozess nicht zu sehr verwirren. Selbst wenn der Prozess angehalten wird, besteht ein großes Risiko, dass die Datenstrukturen des Prozesses nicht mit der Realität der von Ihnen injizierten Daten- oder Umgebungsänderungen übereinstimmen. (Beachten Sie, dass selbst wenn das System das Einspeisen von Daten über einen Socket zulässt, ein ähnliches, wenn auch geringeres Risiko besteht, den Prozess mit diesen Inkonsistenzen zu verwechseln.)quelle
Ich würde sagen, es ist möglich, aber beide Prozesse müssen zusammenarbeiten, um dies zu tun. Sie können von einem Prozess einen Dateideskriptor über eine Socket-Verbindung an einen anderen Prozess senden lassen. Ich habe dieses Beispiel gefunden, das auf einem aktuellen Arch Linux-Computer zu funktionieren scheint.
quelle