使用libpcap获取数据包的uid

Get uid of packet with libpcap

本文关键字:uid 数据包 获取 libpcap 使用      更新时间:2023-10-16

是否可以使用libpcap获取捕获的tcp数据包的有效uid?换句话说,我可以使用libpcap来获取创建所述数据包的用户id吗?

否,UID信息(如果有)不会通过pcap使用的AF_PACKET通道传播。

如果数据包是从另一台计算机发送的,则不能保证发送数据包的人拥有用户ID,例如,它可能是由一个没有用户ID概念的小型嵌入式操作系统发送的。

如果数据包是从您的计算机发送的,libpcap本身无法告诉您发送数据包的用户ID。但是,如果您解析TCP数据包,您可以获得数据包的源IP地址和端口号,并且根据您运行的操作系统,您可能能够获得计算机上所有活动TCP连接的表,可能具有与其相关联的进程ID或用户ID。(但是,请注意,例如,在UN*X系统上,给定TCP连接的给定文件描述符可以由使用不同有效或真实用户ID运行的多个进程共享,在这种情况下,如果您只有使用libpcap捕获的传输数据包,则您将没有足够的信息来确定发送数据包的进程的有效或真实的用户ID,因为您不知道发送数据包的进程。)

连接(使用SO_ATTACH_BPF)到AF_PACKET套接字(使用pcap_fileno()获得)的eBPF接收筛选器可以使用bpf_get_socket_uid(skb)获取与数据包关联的本地套接字(如果有)的所有者uid。主要问题是如何将这些信息发送到用户空间。。。

最简单的方法是为要监视的每个用户创建一个单独的捕获,并添加一个eBPF过滤器以仅匹配该uid。但很明显,这并不能很好地适应用户数量,而且它需要你有一个你感兴趣的uid的特定列表

我的下一个想法是,你可以将uid附加/预附加到传递到用户空间的数据包中(然后修补libpcap以提取它),但不幸的是,这种类型的eBPF过滤器(BPF_PROG_type_SOCKET_filter)不允许修改数据包。

这就需要使用一些带外方法将信息传递到用户空间,例如,对于每个TCP SYN数据包,您可以将套接字uid与足够的信息一起发送,以通过eBPF环形缓冲区唯一标识到用户空间的连接(src ip、dst ip、src port、dst port)。