Linux에서 프로세스가 다른 프로세스가 연 소켓 내부에 데이터를 쓸 수 있습니까?
netcat을 사용하여 google.com에 연결한다고 가정해 보겠습니다.
myuser@linux:~$ nc google.com 80
이제 프로세스 pid를 찾아 해당 파일 설명자 폴더를 열 수 있습니다.
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]
이제 해당 소켓 내에서 echo를 사용하여 HTTP 요청을 만들고 싶습니다.
myuser@linux:~$ echo "GET / HTTP/1.1" >> /proc/24285/fd/3
bash: /proc/24285/fd/3: no such device or address
루트로 이 작업을 수행해도 결과는 변경되지 않습니다.
소켓 내부에는 쓸 수 없지만 표준 입력 내부에는 쓸 수 있습니다.
myuser@linux:~$ echo "GET / HTTP/1.1" >> /proc/24285/fd/0
myuser@linux:~$
하지만 그건 내가 하고 싶은 일이 아닙니다.
나는 생각하고 있다: 리눅스 소켓은 파일처럼 취급되어야 한다. 그렇지 않은가? 하나 이상의 프로세스가 동일한 소켓을 사용할 수 있는데 왜 그렇게 할 수 없습니까?
답변1
이는 구현하기 어렵고 거의 유용하지 않기 때문에 불가능합니다. 소켓은 파이프보다 훨씬 더 복잡합니다.
- 소켓은 양방향입니다.
- 다양한 유형의 소켓이 있습니다. 일부 소켓은 바이트 스트림이 아닙니다. 예를 들어 UDP 소켓은 바이트가 아닌 패킷을 보내는 데이터그램 소켓입니다.
- 소켓은 멀티플렉싱을 수행합니다(연결을 기다리는 서버에서 사용하는 소켓과 실제 열린 연결에서 사용하는 소켓 사이에는 약간의 오버로드가 있습니다).
소켓은 양방향이므로 양방향 프로토콜에서 통신하는 데 자주 사용됩니다. 대화에 데이터를 삽입하면 상대방이 귀하의 데이터에 대한 응답을 보낼 수 있으며 해당 응답을 올바른 요청자에게 전달하지 못할 수 있습니다. 이는 소켓에 데이터를 주입하는 유용성을 크게 줄입니다.
기존 대화에 연결하는 대신 기존 클라이언트와 동일한 서버에 연결하려는 경우 이미 수행할 수 있는 방법이 있습니다. 동일한 방식으로 서버에 연결합니다(파일 시스템에서 소켓을 열거나 TCP 또는 UDP 포트). 소켓이 두 프로세스 사이의 이름이 지정되지 않은 소켓인 경우 이는 참여해서는 안 된다는 좋은 힌트이므로 운영 체제에서는 이를 쉽게 만들지 않습니다.
데이터그램 소켓(여기서는 그렇지 않음)을 사용하면 쉘이 바이트 스트림만 이해하고 패킷을 보내는 send
대신 호출하는 것에 대해 알지 못하기 때문에 데이터를 직접 주입할 수 없습니다 write
.
일치시킬 엔드포인트가 있는 경우 파일 설명자를 전달하도록 지시할 수 있습니다.1 2 삼.
그렇지 않으면 소켓을 연 프로세스가 데이터 자체를 보내도록 할 수 있습니다 ptrace
(이것이 gdb
뒤에서 사용되는 것입니다). 이는 주로 의도적으로 설계된 것이며 더러운 속임수로 인해 프로세스가 너무 복잡해지지 않도록 프로세스를 일시 중지합니다. 프로세스가 일시 중지되더라도 프로세스의 데이터 구조가 삽입한 데이터의 현실이나 환경 수정과 일치하지 않게 될 상당한 위험이 있습니다. (시스템이 소켓을 통한 데이터 주입을 허용하더라도 이러한 불일치로 인해 프로세스가 혼동될 위험은 작지만 비슷할 수 있습니다.)
답변2
가능하다고 말하고 싶지만 이를 위해서는 두 프로세스가 협력해야 합니다. 한 프로세스가 소켓 연결을 통해 다른 프로세스에 파일 설명자를 보내도록 할 수 있습니다. 내가 찾은이 예는,이것은 최신 Arch Linux 시스템에서 작동하는 것 같습니다.