2 * netsniff-ng - the packet sniffing beast
3 * By Daniel Borkmann <daniel@netsniff-ng.org>
4 * Copyright 2009 - 2012 Daniel Borkmann.
5 * Copyright 2009, 2010 Emmanuel Roullit.
6 * Copyright 1990-1996 The Regents of the University of
7 * California. All rights reserved. (3-clause BSD license)
8 * Subject to the GPL, version 2.
13 #include <arpa/inet.h>
14 #include <sys/types.h>
23 /* This is a bug in libpcap, they actually use 'unsigned long' instead
25 #define EXTRACT_SHORT(packet) \
26 ((unsigned short) ntohs(*(unsigned short *) packet))
27 #define EXTRACT_LONG(packet) \
28 (ntohl(*(unsigned long *) packet))
30 # define BPF_MEMWORDS 16
33 #define BPF_LD_B (BPF_LD | BPF_B)
34 #define BPF_LD_H (BPF_LD | BPF_H)
35 #define BPF_LD_W (BPF_LD | BPF_W)
36 #define BPF_LDX_B (BPF_LDX | BPF_B)
37 #define BPF_LDX_W (BPF_LDX | BPF_W)
38 #define BPF_JMP_JA (BPF_JMP | BPF_JA)
39 #define BPF_JMP_JEQ (BPF_JMP | BPF_JEQ)
40 #define BPF_JMP_JGT (BPF_JMP | BPF_JGT)
41 #define BPF_JMP_JGE (BPF_JMP | BPF_JGE)
42 #define BPF_JMP_JSET (BPF_JMP | BPF_JSET)
43 #define BPF_ALU_ADD (BPF_ALU | BPF_ADD)
44 #define BPF_ALU_SUB (BPF_ALU | BPF_SUB)
45 #define BPF_ALU_MUL (BPF_ALU | BPF_MUL)
46 #define BPF_ALU_DIV (BPF_ALU | BPF_DIV)
47 #define BPF_ALU_MOD (BPF_ALU | BPF_MOD)
48 #define BPF_ALU_NEG (BPF_ALU | BPF_NEG)
49 #define BPF_ALU_AND (BPF_ALU | BPF_AND)
50 #define BPF_ALU_OR (BPF_ALU | BPF_OR)
51 #define BPF_ALU_XOR (BPF_ALU | BPF_XOR)
52 #define BPF_ALU_LSH (BPF_ALU | BPF_LSH)
53 #define BPF_ALU_RSH (BPF_ALU | BPF_RSH)
54 #define BPF_MISC_TAX (BPF_MISC | BPF_TAX)
55 #define BPF_MISC_TXA (BPF_MISC | BPF_TXA)
57 static const char *op_table
[] = {
66 [BPF_JMP_JEQ
] = "jeq",
67 [BPF_JMP_JGT
] = "jgt",
68 [BPF_JMP_JGE
] = "jge",
69 [BPF_JMP_JSET
] = "jset",
70 [BPF_ALU_ADD
] = "add",
71 [BPF_ALU_SUB
] = "sub",
72 [BPF_ALU_MUL
] = "mul",
73 [BPF_ALU_DIV
] = "div",
74 [BPF_ALU_MOD
] = "mod",
75 [BPF_ALU_NEG
] = "neg",
76 [BPF_ALU_AND
] = "and",
78 [BPF_ALU_XOR
] = "xor",
79 [BPF_ALU_LSH
] = "lsh",
80 [BPF_ALU_RSH
] = "rsh",
82 [BPF_MISC_TAX
] = "tax",
83 [BPF_MISC_TXA
] = "txa",
86 void bpf_dump_op_table(void)
89 for (i
= 0; i
< array_size(op_table
); ++i
) {
91 printf("%s\n", op_table
[i
]);
95 static const char *bpf_dump_linux_k(uint32_t k
)
100 /* Linux specific arguments */
101 case (SKF_AD_OFF
+ SKF_AD_PROTOCOL
):
103 case (SKF_AD_OFF
+ SKF_AD_PKTTYPE
):
105 case (SKF_AD_OFF
+ SKF_AD_IFINDEX
):
107 case (SKF_AD_OFF
+ SKF_AD_NLATTR
):
109 case (SKF_AD_OFF
+ SKF_AD_NLATTR_NEST
):
111 case (SKF_AD_OFF
+ SKF_AD_MARK
):
113 case (SKF_AD_OFF
+ SKF_AD_QUEUE
):
115 case (SKF_AD_OFF
+ SKF_AD_HATYPE
):
117 case (SKF_AD_OFF
+ SKF_AD_RXHASH
):
119 case (SKF_AD_OFF
+ SKF_AD_CPU
):
121 case (SKF_AD_OFF
+ SKF_AD_VLAN_TAG
):
123 case (SKF_AD_OFF
+ SKF_AD_VLAN_TAG_PRESENT
):
128 static char *__bpf_dump(const struct sock_filter bpf
, int n
)
131 const char *fmt
, *op
;
132 static char image
[256];
142 case BPF_RET
| BPF_K
:
143 op
= op_table
[BPF_RET
];
146 case BPF_RET
| BPF_A
:
147 op
= op_table
[BPF_RET
];
150 case BPF_RET
| BPF_X
:
151 op
= op_table
[BPF_RET
];
154 case BPF_LD_W
| BPF_ABS
:
155 op
= op_table
[BPF_LD_W
];
156 fmt
= bpf_dump_linux_k(bpf
.k
);
158 case BPF_LD_H
| BPF_ABS
:
159 op
= op_table
[BPF_LD_H
];
160 fmt
= bpf_dump_linux_k(bpf
.k
);
162 case BPF_LD_B
| BPF_ABS
:
163 op
= op_table
[BPF_LD_B
];
164 fmt
= bpf_dump_linux_k(bpf
.k
);
166 case BPF_LD_W
| BPF_LEN
:
167 op
= op_table
[BPF_LD_W
];
170 case BPF_LD_W
| BPF_IND
:
171 op
= op_table
[BPF_LD_W
];
174 case BPF_LD_H
| BPF_IND
:
175 op
= op_table
[BPF_LD_H
];
178 case BPF_LD_B
| BPF_IND
:
179 op
= op_table
[BPF_LD_B
];
182 case BPF_LD
| BPF_IMM
:
183 op
= op_table
[BPF_LD_W
];
186 case BPF_LDX
| BPF_IMM
:
187 op
= op_table
[BPF_LDX
];
190 case BPF_LDX_B
| BPF_MSH
:
191 op
= op_table
[BPF_LDX_B
];
192 fmt
= "4*([%d]&0xf)";
194 case BPF_LD
| BPF_MEM
:
195 op
= op_table
[BPF_LD_W
];
198 case BPF_LDX
| BPF_MEM
:
199 op
= op_table
[BPF_LDX
];
203 op
= op_table
[BPF_ST
];
207 op
= op_table
[BPF_STX
];
211 op
= op_table
[BPF_JMP_JA
];
215 case BPF_JMP_JGT
| BPF_K
:
216 op
= op_table
[BPF_JMP_JGT
];
219 case BPF_JMP_JGE
| BPF_K
:
220 op
= op_table
[BPF_JMP_JGE
];
223 case BPF_JMP_JEQ
| BPF_K
:
224 op
= op_table
[BPF_JMP_JEQ
];
227 case BPF_JMP_JSET
| BPF_K
:
228 op
= op_table
[BPF_JMP_JSET
];
231 case BPF_JMP_JGT
| BPF_X
:
232 op
= op_table
[BPF_JMP_JGT
];
235 case BPF_JMP_JGE
| BPF_X
:
236 op
= op_table
[BPF_JMP_JGE
];
239 case BPF_JMP_JEQ
| BPF_X
:
240 op
= op_table
[BPF_JMP_JEQ
];
243 case BPF_JMP_JSET
| BPF_X
:
244 op
= op_table
[BPF_JMP_JSET
];
247 case BPF_ALU_ADD
| BPF_X
:
248 op
= op_table
[BPF_ALU_ADD
];
251 case BPF_ALU_SUB
| BPF_X
:
252 op
= op_table
[BPF_ALU_SUB
];
255 case BPF_ALU_MUL
| BPF_X
:
256 op
= op_table
[BPF_ALU_MUL
];
259 case BPF_ALU_DIV
| BPF_X
:
260 op
= op_table
[BPF_ALU_DIV
];
263 case BPF_ALU_MOD
| BPF_X
:
264 op
= op_table
[BPF_ALU_MOD
];
267 case BPF_ALU_AND
| BPF_X
:
268 op
= op_table
[BPF_ALU_AND
];
271 case BPF_ALU_OR
| BPF_X
:
272 op
= op_table
[BPF_ALU_OR
];
275 case BPF_ALU_XOR
| BPF_X
:
276 op
= op_table
[BPF_ALU_XOR
];
279 case BPF_ALU_LSH
| BPF_X
:
280 op
= op_table
[BPF_ALU_LSH
];
283 case BPF_ALU_RSH
| BPF_X
:
284 op
= op_table
[BPF_ALU_RSH
];
287 case BPF_ALU_ADD
| BPF_K
:
288 op
= op_table
[BPF_ALU_ADD
];
291 case BPF_ALU_SUB
| BPF_K
:
292 op
= op_table
[BPF_ALU_SUB
];
295 case BPF_ALU_MUL
| BPF_K
:
296 op
= op_table
[BPF_ALU_MUL
];
299 case BPF_ALU_DIV
| BPF_K
:
300 op
= op_table
[BPF_ALU_DIV
];
303 case BPF_ALU_MOD
| BPF_K
:
304 op
= op_table
[BPF_ALU_MOD
];
307 case BPF_ALU_AND
| BPF_K
:
308 op
= op_table
[BPF_ALU_AND
];
311 case BPF_ALU_OR
| BPF_K
:
312 op
= op_table
[BPF_ALU_OR
];
315 case BPF_ALU_XOR
| BPF_K
:
316 op
= op_table
[BPF_ALU_XOR
];
319 case BPF_ALU_LSH
| BPF_K
:
320 op
= op_table
[BPF_ALU_LSH
];
323 case BPF_ALU_RSH
| BPF_K
:
324 op
= op_table
[BPF_ALU_RSH
];
328 op
= op_table
[BPF_ALU_NEG
];
332 op
= op_table
[BPF_MISC_TAX
];
336 op
= op_table
[BPF_MISC_TXA
];
341 slprintf_nocheck(operand
, sizeof(operand
), fmt
, v
);
342 slprintf_nocheck(image
, sizeof(image
),
343 (BPF_CLASS(bpf
.code
) == BPF_JMP
&&
344 BPF_OP(bpf
.code
) != BPF_JA
) ?
345 " L%d: %s %s, L%d, L%d" : " L%d: %s %s",
346 n
, op
, operand
, n
+ 1 + bpf
.jt
, n
+ 1 + bpf
.jf
);
350 void bpf_dump_all(struct sock_fprog
*bpf
)
353 for (i
= 0; i
< bpf
->len
; ++i
)
354 printf("%s\n", __bpf_dump(bpf
->filter
[i
], i
));
357 void bpf_attach_to_sock(int sock
, struct sock_fprog
*bpf
)
361 if (bpf
->filter
[0].code
== BPF_RET
&&
362 bpf
->filter
[0].k
== 0xFFFFFFFF)
365 ret
= setsockopt(sock
, SOL_SOCKET
, SO_ATTACH_FILTER
,
368 panic("Cannot attach filter to socket!\n");
371 void bpf_detach_from_sock(int sock
)
375 ret
= setsockopt(sock
, SOL_SOCKET
, SO_DETACH_FILTER
,
376 &empty
, sizeof(empty
));
378 panic("Cannot detach filter from socket!\n");
381 int enable_kernel_bpf_jit_compiler(void)
385 char *file
= "/proc/sys/net/core/bpf_jit_enable";
387 fd
= open(file
, O_WRONLY
);
391 ret
= write(fd
, "1", strlen("1"));
397 int __bpf_validate(const struct sock_fprog
*bpf
)
400 const struct sock_filter
*p
;
407 for (i
= 0; i
< bpf
->len
; ++i
) {
409 switch (BPF_CLASS(p
->code
)) {
410 /* Check that memory operations use valid addresses. */
413 switch (BPF_MODE(p
->code
)) {
419 /* There's no maximum packet data size
420 * in userland. The runtime packet length
425 if (p
->k
>= BPF_MEMWORDS
)
436 if (p
->k
>= BPF_MEMWORDS
)
440 switch (BPF_OP(p
->code
)) {
453 /* Check for constant division by 0 (undefined
456 if (BPF_RVAL(p
->code
) == BPF_K
&& p
->k
== 0)
464 /* Check that jumps are within the code block,
465 * and that unconditional branches don't go
466 * backwards as a result of an overflow.
467 * Unconditional branches have a 32-bit offset,
468 * so they could overflow; we check to make
469 * sure they don't. Conditional branches have
470 * an 8-bit offset, and the from address is <=
471 * BPF_MAXINSNS, and we assume that BPF_MAXINSNS
472 * is sufficiently small that adding 255 to it
475 * We know that len is <= BPF_MAXINSNS, and we
476 * assume that BPF_MAXINSNS is < the maximum size
477 * of a u_int, so that i + 1 doesn't overflow.
479 * For userland, we don't know that the from
480 * or len are <= BPF_MAXINSNS, but we know that
481 * from <= len, and, except on a 64-bit system,
482 * it's unlikely that len, if it truly reflects
483 * the size of the program we've been handed,
484 * will be anywhere near the maximum size of
485 * a u_int. We also don't check for backward
486 * branches, as we currently support them in
487 * userland for the protochain operation.
490 switch (BPF_OP(p
->code
)) {
492 if (from
+ p
->k
>= bpf
->len
)
499 if (from
+ p
->jt
>= bpf
->len
||
500 from
+ p
->jf
>= bpf
->len
)
516 return BPF_CLASS(bpf
->filter
[bpf
->len
- 1].code
) == BPF_RET
;
519 uint32_t bpf_run_filter(const struct sock_fprog
* fcode
, uint8_t * packet
,
522 /* XXX: caplen == len */
525 struct sock_filter
*bpf
;
526 int32_t mem
[BPF_MEMWORDS
] = { 0, };
528 if (fcode
== NULL
|| fcode
->filter
== NULL
|| fcode
->len
== 0)
541 case BPF_RET
| BPF_K
:
542 return (uint32_t) bpf
->k
;
543 case BPF_RET
| BPF_A
:
545 case BPF_LD_W
| BPF_ABS
:
546 /* No Linux extensions supported here! */
548 if (k
+ sizeof(int32_t) > plen
)
550 A
= EXTRACT_LONG(&packet
[k
]);
552 case BPF_LD_H
| BPF_ABS
:
553 /* No Linux extensions supported here! */
555 if (k
+ sizeof(short) > plen
)
557 A
= EXTRACT_SHORT(&packet
[k
]);
559 case BPF_LD_B
| BPF_ABS
:
560 /* No Linux extensions supported here! */
566 case BPF_LD_W
| BPF_LEN
:
569 case BPF_LDX_W
| BPF_LEN
:
572 case BPF_LD_W
| BPF_IND
:
574 if (k
+ sizeof(int32_t) > plen
)
576 A
= EXTRACT_LONG(&packet
[k
]);
578 case BPF_LD_H
| BPF_IND
:
580 if (k
+ sizeof(short) > plen
)
582 A
= EXTRACT_SHORT(&packet
[k
]);
584 case BPF_LD_B
| BPF_IND
:
590 case BPF_LDX_B
| BPF_MSH
:
594 X
= (packet
[bpf
->k
] & 0xf) << 2;
596 case BPF_LD
| BPF_IMM
:
599 case BPF_LDX
| BPF_IMM
:
602 case BPF_LD
| BPF_MEM
:
605 case BPF_LDX
| BPF_MEM
:
617 case BPF_JMP_JGT
| BPF_K
:
618 bpf
+= (A
> bpf
->k
) ? bpf
->jt
: bpf
->jf
;
620 case BPF_JMP_JGE
| BPF_K
:
621 bpf
+= (A
>= bpf
->k
) ? bpf
->jt
: bpf
->jf
;
623 case BPF_JMP_JEQ
| BPF_K
:
624 bpf
+= (A
== bpf
->k
) ? bpf
->jt
: bpf
->jf
;
626 case BPF_JMP_JSET
| BPF_K
:
627 bpf
+= (A
& bpf
->k
) ? bpf
->jt
: bpf
->jf
;
629 case BPF_JMP_JGT
| BPF_X
:
630 bpf
+= (A
> X
) ? bpf
->jt
: bpf
->jf
;
632 case BPF_JMP_JGE
| BPF_X
:
633 bpf
+= (A
>= X
) ? bpf
->jt
: bpf
->jf
;
635 case BPF_JMP_JEQ
| BPF_X
:
636 bpf
+= (A
== X
) ? bpf
->jt
: bpf
->jf
;
638 case BPF_JMP_JSET
| BPF_X
:
639 bpf
+= (A
& X
) ? bpf
->jt
: bpf
->jf
;
641 case BPF_ALU_ADD
| BPF_X
:
644 case BPF_ALU_SUB
| BPF_X
:
647 case BPF_ALU_MUL
| BPF_X
:
650 case BPF_ALU_DIV
| BPF_X
:
655 case BPF_ALU_MOD
| BPF_X
:
660 case BPF_ALU_AND
| BPF_X
:
663 case BPF_ALU_OR
| BPF_X
:
666 case BPF_ALU_XOR
| BPF_X
:
669 case BPF_ALU_LSH
| BPF_X
:
672 case BPF_ALU_RSH
| BPF_X
:
675 case BPF_ALU_ADD
| BPF_K
:
678 case BPF_ALU_SUB
| BPF_K
:
681 case BPF_ALU_MUL
| BPF_K
:
684 case BPF_ALU_DIV
| BPF_K
:
687 case BPF_ALU_MOD
| BPF_K
:
690 case BPF_ALU_AND
| BPF_K
:
693 case BPF_ALU_OR
| BPF_K
:
696 case BPF_ALU_XOR
| BPF_K
:
699 case BPF_ALU_LSH
| BPF_K
:
702 case BPF_ALU_RSH
| BPF_K
:
718 #ifdef __WITH_TCPDUMP_LIKE_FILTER
719 # include <pcap/pcap.h>
720 # include <pcap/bpf.h>
723 void bpf_parse_rules(char *dev
, char *rulefile
, struct sock_fprog
*bpf
)
727 struct sock_filter sf_single
= { 0x06, 0, 0, 0xFFFFFFFF };
730 if (rulefile
== NULL
) {
732 bpf
->filter
= xmalloc(sizeof(sf_single
));
733 fmemcpy(&bpf
->filter
[0], &sf_single
, sizeof(sf_single
));
737 fp
= fopen(rulefile
, "r");
739 #ifdef __WITH_TCPDUMP_LIKE_FILTER
740 goto try_compile_str
;
742 panic("Cannot open file %s!\n", rulefile
);
745 fmemset(buff
, 0, sizeof(buff
));
746 while (fgets(buff
, sizeof(buff
), fp
) != NULL
) {
747 buff
[sizeof(buff
) - 1] = 0;
748 if (buff
[0] != '{') {
749 fmemset(buff
, 0, sizeof(buff
));
753 fmemset(&sf_single
, 0, sizeof(sf_single
));
754 ret
= sscanf(buff
, "{ 0x%x, %u, %u, 0x%08x },",
755 (unsigned int *) &sf_single
.code
,
756 (unsigned int *) &sf_single
.jt
,
757 (unsigned int *) &sf_single
.jf
,
758 (unsigned int *) &sf_single
.k
);
760 panic("BPF syntax error!\n");
763 bpf
->filter
= xrealloc(bpf
->filter
, 1,
764 bpf
->len
* sizeof(sf_single
));
766 fmemcpy(&bpf
->filter
[bpf
->len
- 1], &sf_single
,
768 fmemset(buff
, 0, sizeof(buff
));
773 if (__bpf_validate(bpf
) == 0)
774 panic("This is not a valid BPF program!\n");
777 #ifdef __WITH_TCPDUMP_LIKE_FILTER
781 struct bpf_program bpfp
;
784 /* For users, who want to have a tcpdump-sytle filter syntax */
785 fd
= pcap_open_live(dev
, 60, 0, 1000, NULL
);
787 panic("Cannot open any device!\n");
789 ret
= pcap_compile(fd
, &bpfp
, rulefile
, 1, 0xffffffff);
791 panic("Cannot compile filter %s: %s\n", rulefile
, pcap_geterr(fd
));
795 bpf
->len
= bpfp
.bf_len
;
796 bpf
->filter
= xrealloc(bpf
->filter
, 1,
797 bpf
->len
* sizeof(sf_single
));
799 for (i
= 0; i
< bpf
->len
; ++i
) {
800 bpf
->filter
[i
].code
= bpfp
.bf_insns
[i
].code
;
801 bpf
->filter
[i
].jt
= bpfp
.bf_insns
[i
].jt
;
802 bpf
->filter
[i
].jf
= bpfp
.bf_insns
[i
].jf
;
803 bpf
->filter
[i
].k
= bpfp
.bf_insns
[i
].k
;
805 if (bpf
->filter
[i
].code
== 0x06 && bpf
->filter
[i
].k
> 0)
806 bpf
->filter
[i
].k
= 0xFFFFFFFF;