mirror of
https://github.com/opnsense/src.git
synced 2026-06-07 07:42:26 -04:00
ifnet: Detach BPF descriptors on interface vmove event
When an interface is moving to/from a vnet jail, it may still have BPF descriptors attached. The userland (e.g. tcpdump) does not get noticed that the interface is departing and still opens BPF descriptors thus may result in leaking sensitive traffic (e.g. an interface is moved back to parent jail but a user is still sniffing traffic over it in the child jail). Detach BPF descriptors so that the userland will be signaled. Reviewed by: ae MFC after: 3 days Differential Revision: https://reviews.freebsd.org/D45727
This commit is contained in:
parent
bb0348a179
commit
1ed9b381d4
3 changed files with 33 additions and 0 deletions
|
|
@ -2847,6 +2847,33 @@ bpf_get_bp_params(struct bpf_if *bp, u_int *bif_dlt, u_int *bif_hdrlen)
|
|||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Detach descriptors on interface's vmove event.
|
||||
*/
|
||||
void
|
||||
bpf_ifdetach(struct ifnet *ifp)
|
||||
{
|
||||
struct bpf_if *bp;
|
||||
struct bpf_d *d;
|
||||
|
||||
BPF_LOCK();
|
||||
CK_LIST_FOREACH(bp, &bpf_iflist, bif_next) {
|
||||
if (bp->bif_ifp != ifp)
|
||||
continue;
|
||||
|
||||
/* Detach common descriptors */
|
||||
while ((d = CK_LIST_FIRST(&bp->bif_dlist)) != NULL) {
|
||||
bpf_detachd_locked(d, true);
|
||||
}
|
||||
|
||||
/* Detach writer-only descriptors */
|
||||
while ((d = CK_LIST_FIRST(&bp->bif_wlist)) != NULL) {
|
||||
bpf_detachd_locked(d, true);
|
||||
}
|
||||
}
|
||||
BPF_UNLOCK();
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -428,6 +428,7 @@ void bpfdetach(struct ifnet *);
|
|||
bool bpf_peers_present_if(struct ifnet *);
|
||||
#ifdef VIMAGE
|
||||
int bpf_get_bp_params(struct bpf_if *, u_int *, u_int *);
|
||||
void bpf_ifdetach(struct ifnet *);
|
||||
#endif
|
||||
|
||||
void bpfilterattach(int);
|
||||
|
|
|
|||
|
|
@ -1262,6 +1262,11 @@ finish_vnet_shutdown:
|
|||
static void
|
||||
if_vmove(struct ifnet *ifp, struct vnet *new_vnet)
|
||||
{
|
||||
/*
|
||||
* Detach BPF file descriptors from its interface.
|
||||
*/
|
||||
bpf_ifdetach(ifp);
|
||||
|
||||
/*
|
||||
* Detach from current vnet, but preserve LLADDR info, do not
|
||||
* mark as dead etc. so that the ifnet can be reattached later.
|
||||
|
|
|
|||
Loading…
Reference in a new issue