
Secure multithreaded packet sniffer
sniffglue 是一个用 Rust 编写的网络嗅探器。使用线程池并发解析网络数据包,以利用所有 CPU 核心。项目目标是:你可以在不受信任的网络上安全地运行 sniffglue,并且在处理数据包时不能崩溃。默认输出应尽可能有用。

# 使用默认过滤器嗅探(dhcp,dns,tls,http)
sniffglue enp0s25
# 提高过滤器敏感度(arp)
sniffglue -v enp0s25
# 进一步提高过滤器敏感度(cjdns,ssdp,dropbox,含有效 utf8 的数据包)
sniffglue -vv enp0s25
# 几乎全部
sniffglue -vvv enp0s25
# 全部
sniffglue -vvvv enp0s25
pacman -S sniffglue
brew install sniffglue
首次包含在 debian bullseye、ubuntu 21.04 中。
apt install sniffglue
apk add sniffglue
layman -a pentoo
emerge --ask net-analyzer/sniffglue
nix-env -i sniffglue
guix install sniffglue
dnf copr enable atim/sniffglue -y
dnf install sniffglue
要从源码构建,请确保已安装 libpcap 和 libseccomp。在基于 Debian 的系统上:
# 安装依赖
sudo apt install libpcap-dev libseccomp-dev
# 使用 rustup 安装 Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
# 安装 sniffglue 并测试
cargo install sniffglue
sniffglue --help
或者你可以通过 cargo-deb 构建一个 Debian 软件包:
cargo deb
你可以将 sniffglue 构建为 Docker 镜像,用于调试容器设置。该镜像目前约为 11.1MB。建议将其推送到你自己的注册表。
docker build -t sniffglue .
docker run -it --init --rm --net=host sniffglue eth0
scdoc < docs/sniffglue.1.scd > docs/sniffglue.1
如果发现安全问题,请通过 ircs://irc.hackint.org 联系 kpcyrd。
为确保被攻破的进程不会危及系统安全,sniffglue 使用 seccomp 来限制进程启动后可以使用的系统调用。这分两个阶段完成:首先在非常开始时(直接在 env_logger 初始化之后),其次在嗅探器设置完成后但在从网络读取数据包之前。
在第二阶段,在所有不需要的系统调用最终被禁用之前,还会应用一些通用的加固措施。这些措施是系统相关的,因此会从 /etc/sniffglue.conf 读取配置文件。该配置文件为 chroot 指定一个空目录,并在 user 中指定一个非特权账户,用于丢弃 root 权限。
该项目包含一个基于 boxxy-rs 的小型 shell,可用于在初始化期间和之后的各个阶段探索沙箱。Travis 也使用它来确保沙箱确实阻止了系统调用。
cargo run --example boxxy
该项目使用 reprotest 进行测试。目前排除了以下变化:
-time - 因为 crates.io 证书在未来会过期-domain_host - 需要 root 权限来执行 unshare(2),已被排除不要忘记安装构建依赖。
ci/reprotest.sh
可以使用 cargo-fuzz 对 sniffglue 的数据包处理进行模糊测试。fuzz/ 目录中提供了所需的一切,该目录随源代码一起分发。请注意,该程序链接到 libpcap,后者未包含在当前模糊测试配置中。
cargo fuzz run read_packet
GPLv3+