Thread (4 messages) flat view 4 messages, 4 authors, 2017-09-14

Re: Bug with BPF_ALU64 | BPF_END?

From: Y Song <hidden>
Date: 2017-09-14 21:23:36

On Thu, Sep 14, 2017 at 11:14 AM, David Miller [off-list ref] wrote:
From: Edward Cree <redacted>
Date: Thu, 14 Sep 2017 18:53:17 +0100
quoted
Is BPF_END supposed to only be used with BPF_ALU, never with BPF_ALU64?
Yes, only BPF_ALU. The below is LLVM bpf swap insn encoding:

...
// bswap16, bswap32, bswap64
class BSWAP ...
...
  let op = 0xd;     // BPF_END
  let BPFSrc = 1;   // BPF_TO_BE (TODO: use BPF_TO_LE for big-endian target)
  let BPFClass = 4; // BPF_ALU
...
quoted
In kernel/bpf/core.c:___bpf_prog_run(), there are only jump table targets
 for the BPF_ALU case, not for the BPF_ALU64 case (opcodes 0xd7 and 0xdf).
But the verifier doesn't enforce this; by crafting a program that uses
 these opcodes I can get a WARN when they're run (without JIT; it looks
 like the x86 JIT, at least, won't like it either).
Proposed patch below the cut; build-tested only.
Good catch.

A really neat test would be a program that uploads random BPF programs
into the kernel, in a syzkaller'ish way.  It might have triggered this
(eventually).
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help