- 
                Notifications
    
You must be signed in to change notification settings  - Fork 5
 
bpf: Fix tnum_overlap to check for zero mask intersection #6237
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
bpf: Fix tnum_overlap to check for zero mask intersection #6237
Conversation
| 
           Upstream branch: f9db3a3  | 
    
| 
           Upstream branch: f9db3a3  | 
    
126a96d    to
    670f396      
    Compare
  
    2991dd5    to
    583dec7      
    Compare
  
    | 
           Upstream branch: 8842732  | 
    
670f396    to
    a91e505      
    Compare
  
    583dec7    to
    e224139      
    Compare
  
    | 
           Upstream branch: 23f852d  | 
    
a91e505    to
    57219ef      
    Compare
  
    e224139    to
    1f11231      
    Compare
  
    | 
           Upstream branch: 54c134f  | 
    
57219ef    to
    b38a5b1      
    Compare
  
    1f11231    to
    2563a04      
    Compare
  
    | 
           Upstream branch: 9f317bd  | 
    
b38a5b1    to
    d3bdb50      
    Compare
  
    2563a04    to
    b8a9697      
    Compare
  
    | 
           Upstream branch: 54c134f  | 
    
d3bdb50    to
    13411f2      
    Compare
  
    b8a9697    to
    0ff1d70      
    Compare
  
    | 
           Upstream branch: e2e668b  | 
    
13411f2    to
    0b54c9f      
    Compare
  
    0ff1d70    to
    75ba762      
    Compare
  
    | 
           Upstream branch: d28c0e4  | 
    
0b54c9f    to
    ff2772e      
    Compare
  
    75ba762    to
    385f65b      
    Compare
  
    | 
           Upstream branch: 5701d5a  | 
    
ff2772e    to
    ab6f527      
    Compare
  
    385f65b    to
    9a71dd4      
    Compare
  
    | 
           Upstream branch: ab01bfa  | 
    
ab6f527    to
    7341e89      
    Compare
  
    9a71dd4    to
    e4f505a      
    Compare
  
    | 
           Upstream branch: e6e10c5  | 
    
7341e89    to
    0a66b98      
    Compare
  
    e4f505a    to
    5119f01      
    Compare
  
    Syzbot reported a kernel warning due to a range invariant violation in the BPF verifier. The issue occurs when tnum_overlap() fails to detect that two tnums don't have any overlapping bits. The problematic BPF program: 0: call bpf_get_prandom_u32 1: r6 = r0 2: r6 &= 0xFFFFFFFFFFFFFFF0 3: r7 = r0 4: r7 &= 0x07 5: r7 -= 0xFF 6: if r6 == r7 goto <exit> After instruction 5, R7 has the range: R7: u64=[0xffffffffffffff01, 0xffffffffffffff08] var_off=(0xffffffffffffff00; 0xf) R6 and R7 don't overlap since they have no agreeing bits. However, is_branch_taken() fails to recognize this, causing the verifier to refine register bounds and trigger range bounds violation: 6: if r6 == r7 goto <exit> true_reg1: u64=[0xffffffffffffff01, 0xffffffffffffff00] var_off=(0xffffffffffffff00, 0x0) true_reg2: u64=[0xffffffffffffff01, 0xffffffffffffff00] var_off=(0xffffffffffffff00, 0x0) The root cause is that tnum_overlap() doesn't properly handle the case where the masks have no overlapping bits. Fix this by adding an early check for zero mask intersection in tnum_overlap(). Reported-by: [email protected] Fixes: f41345f ("bpf: Use tnums for JEQ/JNE is_branch_taken logic") Signed-off-by: KaFai Wan <[email protected]> Reported-by: [email protected]
This patch adds coverage for the warning detected by syzkaller and fixed in the previous patch. Without the previous patch, this test fails with: verifier bug: REG INVARIANTS VIOLATION (true_reg1): range bounds violation u64=[0xffffffffffffff01, 0xffffffffffffff00] s64=[0xffffffffffffff01, 0xffffffffffffff00] u32=[0xffffff01, 0xffffff00] s32=[0xffffff00, 0xffffff00] var_off=(0xffffffffffffff00, 0x0) verifier bug: REG INVARIANTS VIOLATION (true_reg2): range bounds violation u64=[0xffffffffffffff01, 0xffffffffffffff00] s64=[0xffffffffffffff01, 0xffffffffffffff00] u32=[0xffffff01, 0xffffff00] s32=[0xffffff01, 0xffffff00] var_off=(0xffffffffffffff00, 0x0) Signed-off-by: KaFai Wan <[email protected]>
| 
           Upstream branch: 5dae745  | 
    
0a66b98    to
    c029dae      
    Compare
  
    | 
           At least one diff in series https://patchwork.kernel.org/project/netdevbpf/list/?series=1016789 expired. Closing PR.  | 
    
Pull request for series with
subject: bpf: Fix tnum_overlap to check for zero mask intersection
version: 2
url: https://patchwork.kernel.org/project/netdevbpf/list/?series=1016789