Comment «stracer» une socket de domaine unix?

Un peu difficile à expliquer, mais j'ai remarqué en strace le PID qui a la prise ouverte que je ne vois aucune communication. Comment puis-je m'asseoir au milieu d'un file socket pour regarder la communication?

Les sockets sont une API kernel pour la communication. A l'aide de l'API socket, vous pouvez échanger des données entre deux noeuds finaux sur des connections TCP / IP, des associations SCTP, des datagrammes UDP ou entre deux process (datagramme ou connection) à l'aide de sockets de domaine Unix.

En tant qu' API de kernel, toute interaction avec une socket s'effectue via des appels système ( socket , bind , connect , listn , accept , sendmsg , send , recv , write/read …).

Donc typiquement, strace sera capable de tracer ceux-ci car strace trace les appels système. Le seul mécanisme de communication que strace ne peut pas tracer est IPC par rapport à la memory partagée (car lire / écrire quelque chose dans la memory n'implique évidemment pas d'appel système).

Plus probablement, dans votre cas, c'est autre chose. Mon pari serait que l'application est multi-thread et vous ne stracing le bon fil. Ou il se peut que l'application soit setuid / setgid et ne soit pas démarrée en tant que superuser.

Si vous voulez comparer ce qui est échangé sur les sockets du domaine Unix, les options sont les suivantes:

  • strace et autre débogueur ptrace (trace le server ou les clients)
  • Le système d'audit ( auditd / auditctl ), encore une fois, qui retrace les appels système
  • utilisez une astuce LD_PRELOAD pour envelopper les appels système qui interagissent avec le socket
  • instrument le code de l'application pour y append la journalisation.
  • systemtap et d'autres systèmes de calage / debugging de kernel de bas niveau comme déjà mentionné
  • insérez un homme au milieu.

Pour le MITM, vous pourriez par exemple utiliser socat . Ici pour une socket de domaine Unix orientée connection comme pour X11:

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

Ensuite, vous voyez le trafic X11 que xlogo et le server X échangent.

Vous ne pouvez pas "strace une socket", strace fonctionne sur les process, donc vous pouvez strace tous les process qui parlent à la socket, mais vous ne pouvez pas utiliser strace pour voir absolument toutes les communications impliquant la socket. Vous pouvez peut- être aller quelque part avec dtrace ou systemtap s'ils sont disponibles sur votre OS, mais c'est un peu de travail.