10 Oct, 2020

2 commits

  • Add a new attribute NLMSGERR_ATTR_POLICY to the extended ACK
    to advertise the policy, e.g. if an attribute was out of range,
    you'll know the range that's permissible.

    Add new NL_SET_ERR_MSG_ATTR_POL() and NL_SET_ERR_MSG_ATTR_POL()
    macros to set this, since realistically it's only useful to do
    this when the bad attribute (offset) is also returned.

    Use it in lib/nlattr.c which practically does all the policy
    validation.

    v2:
    - add and use netlink_policy_dump_attr_size_estimate()
    v3:
    - remove redundant break
    v4:
    - really remove redundant break ... sorry

    Reviewed-by: Jakub Kicinski
    Signed-off-by: Johannes Berg
    Signed-off-by: Jakub Kicinski

    Johannes Berg
     
  • Refactor the per-attribute policy writing into a new
    helper function, to be used later for dumping out the
    policy of a rejected attribute.

    v2:
    - fix some indentation
    v3:
    - change variable order in netlink_policy_dump_write()

    Reviewed-by: Jakub Kicinski
    Signed-off-by: Johannes Berg
    Signed-off-by: Jakub Kicinski

    Johannes Berg
     

06 Oct, 2020

1 commit

  • We don't have good validation policy for existing unsigned int attrs
    which serve as flags (for new ones we could use NLA_BITFIELD32).
    With increased use of policy dumping having the validation be
    expressed as part of the policy is important. Add validation
    policy in form of a mask of supported/valid bits.

    Support u64 in the uAPI to be future-proof, but really for now
    the embedded mask member can only hold 32 bits, so anything with
    bit 32+ set will always fail validation.

    Signed-off-by: Jakub Kicinski
    Signed-off-by: David S. Miller

    Jakub Kicinski
     

04 Oct, 2020

2 commits

  • Rework the policy dump code a bit to support adding multiple
    policies to a single dump, in order to e.g. support per-op
    policies in generic netlink.

    v2:
    - move kernel-doc to implementation [Jakub]
    - squash the first patch to not flip-flop on the prototype
    [Jakub]
    - merge netlink_policy_dump_get_policy_idx() with the old
    get_policy_idx() we already had
    - rebase without Jakub's patch to have per-op dump

    Signed-off-by: Johannes Berg
    Signed-off-by: David S. Miller

    Johannes Berg
     
  • The maxtype is really an integral part of the policy, and while we
    haven't gotten into a situation yet where this happens, it seems
    that some developer might eventually have two places pointing to
    identical policies, with different maxattr to exclude some attrs
    in one of the places.

    Even if not, it's really the right thing to compare both since the
    two data items fundamentally belong together.

    v2:
    - also do the proper comparison in get_policy_idx()

    Signed-off-by: Johannes Berg
    Signed-off-by: David S. Miller

    Johannes Berg
     

03 Oct, 2020

2 commits

  • Whenever netlink dump uses more than 2 cb->args[] entries
    code gets hard to read. We're about to add more state to
    ctrl_dumppolicy() so create a structure.

    Since the structure is typed and clearly named we can remove
    the local fam_id variable and use ctx->fam_id directly.

    v3:
    - rebase onto explicit free fix
    v1:
    - s/nl_policy_dump/netlink_policy_dump_state/
    - forward declare struct netlink_policy_dump_state,
    and move from passing unsigned long to actual pointer type
    - add build bug on
    - u16 fam_id
    - s/args/ctx/

    Signed-off-by: Jakub Kicinski
    Reviewed-by: Johannes Berg
    Signed-off-by: David S. Miller

    Jakub Kicinski
     
  • [ Upstream commit a95bc734e60449e7b073ff7ff70c35083b290ae9 ]

    If userspace doesn't complete the policy dump, we leak the
    allocated state. Fix this.

    Fixes: d07dcf9aadd6 ("netlink: add infrastructure to expose policies to userspace")
    Signed-off-by: Johannes Berg
    Reviewed-by: Jakub Kicinski
    Signed-off-by: David S. Miller

    Johannes Berg
     

05 Sep, 2020

1 commit

  • We got slightly different patches removing a double word
    in a comment in net/ipv4/raw.c - picked the version from net.

    Simple conflict in drivers/net/ethernet/ibm/ibmvnic.c. Use cached
    values instead of VNIC login response buffer (following what
    commit 507ebe6444a4 ("ibmvnic: Fix use-after-free of VNIC login
    response buffer") did).

    Signed-off-by: Jakub Kicinski

    Jakub Kicinski
     

01 Sep, 2020

1 commit

  • In the policy export for binary attributes I erroneously used
    a != NLA_VALIDATE_NONE comparison instead of checking for the
    two possible values, which meant that if a validation function
    pointer ended up aliasing the min/max as negatives, we'd hit
    a warning in nla_get_range_unsigned().

    Fix this to correctly check for only the two types that should
    be handled here, i.e. range with or without warn-too-long.

    Reported-by: syzbot+353df1490da781637624@syzkaller.appspotmail.com
    Fixes: 8aa26c575fb3 ("netlink: make NLA_BINARY validation more flexible")
    Signed-off-by: Johannes Berg
    Signed-off-by: David S. Miller

    Johannes Berg
     

24 Aug, 2020

2 commits


20 Aug, 2020

1 commit

  • Evidently, when I did this previously, we didn't have more than
    10 policies and didn't run into the reallocation path, because
    it's missing a memset() for the unused policies. Fix that.

    Fixes: d07dcf9aadd6 ("netlink: add infrastructure to expose policies to userspace")
    Signed-off-by: Johannes Berg
    Signed-off-by: David S. Miller

    Johannes Berg
     

19 Aug, 2020

1 commit

  • Add range validation for NLA_BINARY, allowing validation of any
    combination of combination minimum or maximum lengths, using the
    existing NLA_POLICY_RANGE()/NLA_POLICY_FULL_RANGE() macros, just
    like for integers where the value is checked.

    Also make NLA_POLICY_EXACT_LEN(), NLA_POLICY_EXACT_LEN_WARN()
    and NLA_POLICY_MIN_LEN() special cases of this, removing the old
    types NLA_EXACT_LEN and NLA_MIN_LEN.

    This allows us to save some code where both minimum and maximum
    lengths are requires, currently the policy only allows maximum
    (NLA_BINARY), minimum (NLA_MIN_LEN) or exact (NLA_EXACT_LEN), so
    a range of lengths cannot be accepted and must be checked by the
    code that consumes the attributes later.

    Also, this allows advertising the correct ranges in the policy
    export to userspace. Here, NLA_MIN_LEN and NLA_EXACT_LEN already
    were special cases of NLA_BINARY with min and min/max length
    respectively.

    Signed-off-by: Johannes Berg
    Signed-off-by: David S. Miller

    Johannes Berg
     

01 May, 2020

1 commit

  • Add, and use in generic netlink, helpers to dump out a netlink
    policy to userspace, including all the range validation data,
    nested policies etc.

    This lets userspace discover what the kernel understands.

    For families/commands other than generic netlink, the helpers
    need to be used directly in an appropriate command, or we can
    add some infrastructure (a new netlink family) that those can
    register their policies with for introspection. I'm not that
    familiar with non-generic netlink, so that's left out for now.

    The data exposed to userspace also includes min and max length
    for binary/string data, I've done that instead of letting the
    userspace tools figure out whether min/max is intended based
    on the type so that we can extend this later in the kernel, we
    might want to just use the range data for example.

    Because of this, I opted to not directly expose the NLA_*
    values, even if some of them are already exposed via BPF, as
    with min/max length we don't need to have different types here
    for NLA_BINARY/NLA_MIN_LEN/NLA_EXACT_LEN, we just make them
    all NL_ATTR_TYPE_BINARY with min/max length optionally set.

    Similarly, we don't really need NLA_MSECS, and perhaps can
    remove it in the future - but not if we encode it into the
    userspace API now. It gets mapped to NL_ATTR_TYPE_U64 here.

    Note that the exposing here corresponds to the strict policy
    interpretation, and NLA_UNSPEC items are omitted entirely.
    To get those, change them to NLA_MIN_LEN which behaves in
    exactly the same way, but is exposed.

    Signed-off-by: Johannes Berg
    Signed-off-by: David S. Miller

    Johannes Berg