유닉스 도메인 소켓을 "추적"하는 방법은 무엇입니까?

유닉스 도메인 소켓을 "추적"하는 방법은 무엇입니까?

설명하기가 조금 어렵지만 strace소켓이 열리는 PID를 입력할 때 어떤 통신도 볼 수 없다는 것을 알았습니다. 소켓 파일 한가운데에 앉아서 통신을 관찰하려면 어떻게 해야 합니까?

답변1

소켓은 통신에 사용되는 커널 API입니다. 소켓 API를 사용하면 TCP/IP 연결, SCTP 연결, UDP 데이터그램을 통해 두 끝점 간에 또는 Unix 도메인 소켓을 사용하여 두 프로세스(데이터그램 또는 연결) 간에 데이터를 교환할 수 있습니다.

커널 API로서 소켓과의 모든 상호 작용은 시스템 호출( socket, bind, connect, listen, accept, sendmsg, send, recv... write/read)을 통해 이루어집니다.

따라서 일반적으로 시스템 호출 추적 strace으로 인해 이를 추적하는 것이 가능 합니다. 추적할 수 없는 strace유일한 strace통신 메커니즘은 공유 메모리의 IPC입니다(메모리에서 무언가를 읽고 쓰는 것은 분명히 시스템 호출을 포함하지 않기 때문입니다).

귀하의 경우에는 다른 것일 가능성이 더 높습니다. 응용 프로그램이 다중 스레드이고 올바른 스레드를 추적하지 않을 것이라고 확신합니다. 또는 응용 프로그램이 setuid/setgid이고 수퍼유저로 시작되지 않을 수 있습니다.

Unix 도메인 소켓을 통해 교환되는 내용을 추적하려는 경우 옵션은 다음과 같습니다.

  • strace및 기타 ptrace디버거(추적 서버 또는 클라이언트)
  • 감사 시스템( auditd/ auditctl), 다시 시스템 호출 추적
  • 트릭을 사용하여 LD_PRELOAD소켓과 상호 작용하는 시스템 호출을 래핑합니다.
  • 애플리케이션의 코드를 계측하여 거기에 로깅을 추가하세요.
  • 앞서 언급했듯이 systemtap 및 기타 저수준 커널 추적/디버깅 시스템
  • 가운데 사람을 삽입합니다.

socatMITM의 경우 예를 들어 X11과 같은 연결 지향 Unix 도메인 소켓을 사용할 수 있습니다 .

socat -x unix-listen:/tmp/.X11-unix/X42,fork unix:/tmp/.X11-unix/X0
DISPLAY=:42 xlogo

xlogo그러면 X 서버와 교환된 X11 트래픽이 표시됩니다.

답변2

"소켓 추적"은 불가능합니다. strace는 프로세스에서 작동하므로 소켓과 통신하는 모든 프로세스를 추적할 수 있지만 소켓과 관련된 모든 통신을 보기 위해 strace를 사용할 수는 없습니다. 너가능한운영 체제에서 사용 가능한 경우 dtrace 또는 systemtap을 사용하여 어딘가로 이동할 수 있지만 상당한 작업이 필요합니다.

관련 정보