• Eyal Birger's avatar
    xfrm: fix "disable_policy" flag use when arriving from different devices · e6175a2e
    Eyal Birger authored
    In IPv4 setting the "disable_policy" flag on a device means no policy
    should be enforced for traffic originating from the device. This was
    implemented by seting the DST_NOPOLICY flag in the dst based on the
    originating device.
    
    However, dsts are cached in nexthops regardless of the originating
    devices, in which case, the DST_NOPOLICY flag value may be incorrect.
    
    Consider the following setup:
    
                         +------------------------------+
                         | ROUTER                       |
      +-------------+    | +-----------------+          |
      | ipsec src   |----|-|ipsec0           |          |
      +-------------+    | |disable_policy=0 |   +----+ |
                         | +-----------------+   |eth1|-|-----
      +-------------+    | +-----------------+   +----+ |
      | noipsec src |----|-|eth0             |          |
      +-------------+    | |disable_policy=1 |          |
                         | +-----------------+          |
                         +------------------------------+
    
    Where ROUTER has a default route towards eth1.
    
    dst entries for traffic arriving from eth0 would have DST_NOPOLICY
    and would be cached and therefore can be reused by traffic originating
    from ipsec0, skipping policy check.
    
    Fix by setting a IPSKB_NOPOLICY flag in IPCB and observing it instead
    of the DST in IN/FWD IPv4 policy checks.
    
    Fixes: 1da177e4 ("Linux-2.6.12-rc2")
    Reported-by: default avatarShmulik Ladkani <shmulik.ladkani@gmail.com>
    Signed-off-by: default avatarEyal Birger <eyal.birger@gmail.com>
    Signed-off-by: default avatarSteffen Klassert <steffen.klassert@secunet.com>
    e6175a2e
route.c 94.8 KB