Skip to content
Permalink
Casey-Schaufle…
Switch branches/tags

Commits on Jun 16, 2021

  1. AppArmor: Remove the exclusive flag

    With the inclusion of the interface LSM process attribute
    mechanism AppArmor no longer needs to be treated as an
    "exclusive" security module. Remove the flag that indicates
    it is exclusive. Remove the stub getpeersec_dgram AppArmor
    hook as it has no effect in the single LSM case and
    interferes in the multiple LSM case.
    
    Acked-by: Stephen Smalley <sds@tycho.nsa.gov>
    Acked-by: John Johansen <john.johansen@canonical.com>
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  2. LSM: Add /proc attr entry for full LSM context

    Add an entry /proc/.../attr/context which displays the full
    process security "context" in compound format:
            lsm1\0value\0lsm2\0value\0...
    This entry is not writable.
    
    A security module may decide that its policy does not allow
    this information to be displayed. In this case none of the
    information will be displayed.
    
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    Cc: linux-api@vger.kernel.org
    Cc: linux-doc@vger.kernel.org
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  3. Audit: Add record for multiple object LSM attributes

    Create a new audit record type to contain the object information
    when there are multiple security modules that may require such data.
    This record is linked with the same timestamp and serial number.
    
    An example of the MAC_OBJ_CONTEXTS (1421) record is:
    
            type=UNKNOWN[1421]
            msg=audit(1601152467.009:1050):
            obj_selinux=unconfined_u:object_r:user_home_t:s0
    
    Not all security modules that can provide object information
    do so in all cases. It is possible that a security module won't
    apply an object attribute in all cases.
    
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    Cc: linux-audit@redhat.com
    To: Paul Moore <paul@paul-moore.com>
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  4. Audit: Add record for multiple process LSM attributes

    Create a new audit record type to contain the subject information
    when there are multiple security modules that require such data.
    This record is linked with the same timestamp and serial number
    using the audit_alloc_local() mechanism.
    The record is produced only in cases where there is more than one
    security module with a process "context".
    In cases where this record is produced the subj= fields of
    other records in the audit event will be set to "subj=?".
    
    An example of the MAC_TASK_CONTEXTS (1420) record is:
    
            type=UNKNOWN[1420]
            msg=audit(1600880931.832:113)
            subj_apparmor==unconfined
            subj_smack=_
    
    There will be a subj_$LSM= entry for each security module
    LSM that supports the secid_to_secctx and secctx_to_secid
    hooks. The BPF security module implements secid/secctx
    translation hooks, so it has to be considered to provide a
    secctx even though it may not actually do so.
    
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    To: paul@paul-moore.com
    To: linux-audit@redhat.com
    To: rgb@redhat.com
    Cc: netdev@vger.kernel.org
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  5. audit: add support for non-syscall auxiliary records

    Standalone audit records have the timestamp and serial number generated
    on the fly and as such are unique, making them standalone.  This new
    function audit_alloc_local() generates a local audit context that will
    be used only for a standalone record and its auxiliary record(s).  The
    context is discarded immediately after the local associated records are
    produced.
    
    Signed-off-by: Richard Guy Briggs <rgb@redhat.com>
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    Cc: linux-audit@redhat.com
    To: Richard Guy Briggs <rgb@redhat.com>
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  6. LSM: Verify LSM display sanity in binder

    Verify that the tasks on the ends of a binder transaction
    use the same "interface_lsm" security module. This prevents
    confusion of security "contexts".
    
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Reviewed-by: John Johansen <john.johansen@canonical.com>
    Acked-by: Stephen Smalley <sds@tycho.nsa.gov>
    Acked-by: Paul Moore <paul@paul-moore.com>
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  7. NET: Store LSM netlabel data in a lsmblob

    Netlabel uses LSM interfaces requiring an lsmblob and
    the internal storage is used to pass information between
    these interfaces, so change the internal data from a secid
    to a lsmblob. Update the netlabel interfaces and their
    callers to accommodate the change. This requires that the
    modules using netlabel use the lsm_id.slot to access the
    correct secid when using netlabel.
    
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Reviewed-by: John Johansen <john.johansen@canonical.com>
    Acked-by: Stephen Smalley <sds@tycho.nsa.gov>
    Acked-by: Paul Moore <paul@paul-moore.com>
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    Cc: netdev@vger.kernel.org
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  8. LSM: security_secid_to_secctx in netlink netfilter

    Change netlink netfilter interfaces to use lsmcontext
    pointers, and remove scaffolding.
    
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Reviewed-by: John Johansen <john.johansen@canonical.com>
    Acked-by: Stephen Smalley <sds@tycho.nsa.gov>
    Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    Cc: netdev@vger.kernel.org
    Cc: netfilter-devel@vger.kernel.org
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  9. LSM: Use lsmcontext in security_inode_getsecctx

    Change the security_inode_getsecctx() interface to fill
    a lsmcontext structure instead of data and length pointers.
    This provides the information about which LSM created the
    context so that security_release_secctx() can use the
    correct hook.
    
    Acked-by: Stephen Smalley <sds@tycho.nsa.gov>
    Acked-by: Paul Moore <paul@paul-moore.com>
    Acked-by: Chuck Lever <chuck.lever@oracle.com>
    Reviewed-by: John Johansen <john.johansen@canonical.com>
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    Cc: linux-nfs@vger.kernel.org
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  10. LSM: Use lsmcontext in security_secid_to_secctx

    Replace the (secctx,seclen) pointer pair with a single
    lsmcontext pointer to allow return of the LSM identifier
    along with the context and context length. This allows
    security_release_secctx() to know how to release the
    context. Callers have been modified to use or save the
    returned data from the new structure.
    
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Acked-by: Stephen Smalley <sds@tycho.nsa.gov>
    Acked-by: Paul Moore <paul@paul-moore.com>
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    Cc: netdev@vger.kernel.org
    Cc: linux-audit@redhat.com
    Cc: netfilter-devel@vger.kernel.org
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  11. LSM: Ensure the correct LSM context releaser

    Add a new lsmcontext data structure to hold all the information
    about a "security context", including the string, its size and
    which LSM allocated the string. The allocation information is
    necessary because LSMs have different policies regarding the
    lifecycle of these strings. SELinux allocates and destroys
    them on each use, whereas Smack provides a pointer to an entry
    in a list that never goes away.
    
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Reviewed-by: John Johansen <john.johansen@canonical.com>
    Acked-by: Stephen Smalley <sds@tycho.nsa.gov>
    Acked-by: Chuck Lever <chuck.lever@oracle.com>
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    Cc: linux-integrity@vger.kernel.org
    Cc: netdev@vger.kernel.org
    Cc: linux-audit@redhat.com
    Cc: netfilter-devel@vger.kernel.org
    To: Pablo Neira Ayuso <pablo@netfilter.org>
    Cc: linux-nfs@vger.kernel.org
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  12. LSM: Specify which LSM to display

    Create a new entry "interface_lsm" in the procfs attr directory for
    controlling which LSM security information is displayed for a
    process. A process can only read or write its own display value.
    
    The name of an active LSM that supplies hooks for
    human readable data may be written to "interface_lsm" to set the
    value. The name of the LSM currently in use can be read from
    "interface_lsm". At this point there can only be one LSM capable
    of display active. A helper function lsm_task_ilsm() is
    provided to get the interface lsm slot for a task_struct.
    
    Setting the "interface_lsm" requires that all security modules using
    setprocattr hooks allow the action. Each security module is
    responsible for defining its policy.
    
    AppArmor hook provided by John Johansen <john.johansen@canonical.com>
    SELinux hook provided by Stephen Smalley <stephen.smalley.work@gmail.com>
    
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Stephen Smalley <stephen.smalley.work@gmail.com>
    Cc: Paul Moore <paul@paul-moore.com>
    Cc: John Johansen <john.johansen@canonical.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: linux-api@vger.kernel.org
    Cc: linux-doc@vger.kernel.org
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  13. IMA: Change internal interfaces to use lsmblobs

    The IMA interfaces ima_get_action() and ima_match_policy()
    call LSM functions that use lsmblobs. Change the IMA functions
    to pass the lsmblob to be compatible with the LSM functions.
    
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Reviewed-by: John Johansen <john.johansen@canonical.com>
    Acked-by: Stephen Smalley <sds@tycho.nsa.gov>
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    Cc: linux-integrity@vger.kernel.org
    To: Mimi Zohar <zohar@linux.ibm.com>
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  14. LSM: Use lsmblob in security_cred_getsecid

    Change the security_cred_getsecid() interface to fill in a
    lsmblob instead of a u32 secid. The associated data elements
    in the audit sub-system are changed from a secid to a lsmblob
    to accommodate multiple possible LSM audit users.
    
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Reviewed-by: John Johansen <john.johansen@canonical.com>
    Acked-by: Stephen Smalley <sds@tycho.nsa.gov>
    Acked-by: Paul Moore <paul@paul-moore.com>
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    Cc: linux-integrity@vger.kernel.org
    Cc: linux-audit@redhat.com
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  15. LSM: Use lsmblob in security_inode_getsecid

    Change the security_inode_getsecid() interface to fill in a
    lsmblob structure instead of a u32 secid. This allows for its
    callers to gather data from all registered LSMs. Data is provided
    for IMA and audit.
    
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Reviewed-by: John Johansen <john.johansen@canonical.com>
    Acked-by: Stephen Smalley <sds@tycho.nsa.gov>
    Acked-by: Paul Moore <paul@paul-moore.com>
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    Cc: linux-integrity@vger.kernel.org
    Cc: linux-audit@redhat.com
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  16. LSM: Use lsmblob in security_task_getsecid

    Change the security_task_getsecid_subj() and
    security_task_getsecid_obj() interfaces to fill in
    a lsmblob structure instead of a u32 secid in support of
    LSM stacking. Audit interfaces will need to collect all
    possible secids for possible reporting.
    
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Reviewed-by: John Johansen <john.johansen@canonical.com>
    Acked-by: Stephen Smalley <sds@tycho.nsa.gov>
    Acked-by: Paul Moore <paul@paul-moore.com>
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    Cc: linux-integrity@vger.kernel.org
    Cc: linux-audit@redhat.com
    Cc: netdev@vger.kernel.org
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  17. LSM: Use lsmblob in security_ipc_getsecid

    There may be more than one LSM that provides IPC data
    for auditing. Change security_ipc_getsecid() to fill in
    a lsmblob structure instead of the u32 secid. The
    audit data structure containing the secid will be updated
    later, so there is a bit of scaffolding here.
    
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Reviewed-by: John Johansen <john.johansen@canonical.com>
    Acked-by: Stephen Smalley <sds@tycho.nsa.gov>
    Acked-by: Paul Moore <paul@paul-moore.com>
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    Cc: linux-audit@redhat.com
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  18. LSM: Use lsmblob in security_secid_to_secctx

    Change security_secid_to_secctx() to take a lsmblob as input
    instead of a u32 secid. It will then call the LSM hooks
    using the lsmblob element allocated for that module. The
    callers have been updated as well. This allows for the
    possibility that more than one module may be called upon
    to translate a secid to a string, as can occur in the
    audit code.
    
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    Cc: netdev@vger.kernel.org
    Cc: linux-audit@redhat.com
    Cc: netfilter-devel@vger.kernel.org
    To: Pablo Neira Ayuso <pablo@netfilter.org>
    To: Paul Moore <paul@paul-moore.com>
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  19. LSM: Use lsmblob in security_secctx_to_secid

    Change the security_secctx_to_secid interface to use a lsmblob
    structure in place of the single u32 secid in support of
    module stacking. Change its callers to do the same.
    
    The security module hook is unchanged, still passing back a secid.
    The infrastructure passes the correct entry from the lsmblob.
    
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    Cc: netdev@vger.kernel.org
    Cc: netfilter-devel@vger.kernel.org
    To: Pablo Neira Ayuso <pablo@netfilter.org>
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  20. LSM: Use lsmblob in security_kernel_act_as

    Change the security_kernel_act_as interface to use a lsmblob
    structure in place of the single u32 secid in support of
    module stacking. Change its only caller, set_security_override,
    to do the same. Change that one's only caller,
    set_security_override_from_ctx, to call it with the new
    parameter type.
    
    The security module hook is unchanged, still taking a secid.
    The infrastructure passes the correct entry from the lsmblob.
    lsmblob_init() is used to fill the lsmblob structure, however
    this will be removed later in the series when security_secctx_to_secid()
    is updated to provide a lsmblob instead of a secid.
    
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Reviewed-by: John Johansen <john.johansen@canonical.com>
    Acked-by: Stephen Smalley <sds@tycho.nsa.gov>
    Acked-by: Paul Moore <paul@paul-moore.com>
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    To: David Howells <dhowells@redhat.com>
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  21. LSM: Use lsmblob in security_audit_rule_match

    Change the secid parameter of security_audit_rule_match
    to a lsmblob structure pointer. Pass the entry from the
    lsmblob structure for the approprite slot to the LSM hook.
    
    Change the users of security_audit_rule_match to use the
    lsmblob instead of a u32. The scaffolding function lsmblob_init()
    fills the blob with the value of the old secid, ensuring that
    it is available to the appropriate module hook. The sources of
    the secid, security_task_getsecid() and security_inode_getsecid(),
    will be converted to use the blob structure later in the series.
    At the point the use of lsmblob_init() is dropped.
    
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Reviewed-by: John Johansen <john.johansen@canonical.com>
    Acked-by: Stephen Smalley <sds@tycho.nsa.gov>
    Acked-by: Paul Moore <paul@paul-moore.com>
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    Cc: linux-audit@redhat.com
    Cc: linux-integrity@vger.kernel.org
    To: Mimi Zohar <zohar@linux.ibm.com>
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  22. IMA: avoid label collisions with stacked LSMs

    Integrity measurement may filter on security module information
    and needs to be clear in the case of multiple active security
    modules which applies. Provide a boot option ima_rules_lsm= to
    allow the user to specify an active securty module to apply
    filters to. If not specified, use the first registered module
    that supports the audit_rule_match() LSM hook. Allow the user
    to specify in the IMA policy an lsm= option to specify the
    security module to use for a particular rule.
    
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    To: Mimi Zohar <zohar@linux.ibm.com>
    To: linux-integrity@vger.kernel.org
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  23. LSM: provide lsm name and id slot mappings

    Provide interfaces to map LSM slot numbers and LSM names.
    Update the LSM registration code to save this information.
    
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  24. LSM: Add the lsmblob data structure.

    When more than one security module is exporting data to
    audit and networking sub-systems a single 32 bit integer
    is no longer sufficient to represent the data. Add a
    structure to be used instead.
    
    The lsmblob structure is currently an array of
    u32 "secids". There is an entry for each of the
    security modules built into the system that would
    use secids if active. The system assigns the module
    a "slot" when it registers hooks. If modules are
    compiled in but not registered there will be unused
    slots.
    
    A new lsm_id structure, which contains the name
    of the LSM and its slot number, is created. There
    is an instance for each LSM, which assigns the name
    and passes it to the infrastructure to set the slot.
    
    The audit rules data is expanded to use an array of
    security module data rather than a single instance.
    Because IMA uses the audit rule functions it is
    affected as well.
    
    Acked-by: Stephen Smalley <sds@tycho.nsa.gov>
    Acked-by: Paul Moore <paul@paul-moore.com>
    Acked-by: John Johansen <john.johansen@canonical.com>
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    Cc: <bpf@vger.kernel.org>
    Cc: linux-audit@redhat.com
    Cc: linux-security-module@vger.kernel.org
    Cc: selinux@vger.kernel.org
    To: Mimi Zohar <zohar@linux.ibm.com>
    To: Mickaël Salaün <mic@linux.microsoft.com>
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021
  25. LSM: Infrastructure management of the sock security

    Move management of the sock->sk_security blob out
    of the individual security modules and into the security
    infrastructure. Instead of allocating the blobs from within
    the modules the modules tell the infrastructure how much
    space is required, and the space is allocated there.
    
    Acked-by: Paul Moore <paul@paul-moore.com>
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Reviewed-by: John Johansen <john.johansen@canonical.com>
    Acked-by: Stephen Smalley <sds@tycho.nsa.gov>
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    cschaufler authored and intel-lab-lkp committed Jun 16, 2021

Commits on Jun 10, 2021

  1. Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf

    Pablo Neira Ayuso says:
    
    ====================
    Netfilter fixes for net
    
    The following patchset contains Netfilter fixes for net:
    
    1) Fix a crash when stateful expression with its own gc callback
       is used in a set definition.
    
    2) Skip IPv6 packets from any link-local address in IPv6 fib expression.
       Add a selftest for this scenario, from Florian Westphal.
    ====================
    
    Signed-off-by: David S. Miller <davem@davemloft.net>
    davem330 committed Jun 10, 2021
  2. Merge branch 'tcp-options-oob-fixes'

    Maxim Mikityanskiy says:
    
    ====================
    Fix out of bounds when parsing TCP options
    
    This series fixes out-of-bounds access in various places in the kernel
    where parsing of TCP options takes place. Fortunately, many more
    occurrences don't have this bug.
    
    v2 changes:
    
    synproxy: Added an early return when length < 0 to avoid calling
    skb_header_pointer with negative length.
    
    sch_cake: Added doff validation to avoid parsing garbage.
    ====================
    
    Signed-off-by: David S. Miller <davem@davemloft.net>
    davem330 committed Jun 10, 2021
  3. sch_cake: Fix out of bounds when parsing TCP options and header

    The TCP option parser in cake qdisc (cake_get_tcpopt and
    cake_tcph_may_drop) could read one byte out of bounds. When the length
    is 1, the execution flow gets into the loop, reads one byte of the
    opcode, and if the opcode is neither TCPOPT_EOL nor TCPOPT_NOP, it reads
    one more byte, which exceeds the length of 1.
    
    This fix is inspired by commit 9609dad ("ipv4: tcp_input: fix stack
    out of bounds when parsing TCP options.").
    
    v2 changes:
    
    Added doff validation in cake_get_tcphdr to avoid parsing garbage as TCP
    header. Although it wasn't strictly an out-of-bounds access (memory was
    allocated), garbage values could be read where CAKE expected the TCP
    header if doff was smaller than 5.
    
    Cc: Young Xiao <92siuyang@gmail.com>
    Fixes: 8b71388 ("sch_cake: Add optional ACK filter")
    Signed-off-by: Maxim Mikityanskiy <maximmi@nvidia.com>
    Acked-by: Toke Høiland-Jørgensen <toke@toke.dk>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    nvmmax authored and davem330 committed Jun 10, 2021
  4. mptcp: Fix out of bounds when parsing TCP options

    The TCP option parser in mptcp (mptcp_get_options) could read one byte
    out of bounds. When the length is 1, the execution flow gets into the
    loop, reads one byte of the opcode, and if the opcode is neither
    TCPOPT_EOL nor TCPOPT_NOP, it reads one more byte, which exceeds the
    length of 1.
    
    This fix is inspired by commit 9609dad ("ipv4: tcp_input: fix stack
    out of bounds when parsing TCP options.").
    
    Cc: Young Xiao <92siuyang@gmail.com>
    Fixes: cec37a6 ("mptcp: Handle MP_CAPABLE options for outgoing connections")
    Signed-off-by: Maxim Mikityanskiy <maximmi@nvidia.com>
    Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    nvmmax authored and davem330 committed Jun 10, 2021
  5. netfilter: synproxy: Fix out of bounds when parsing TCP options

    The TCP option parser in synproxy (synproxy_parse_options) could read
    one byte out of bounds. When the length is 1, the execution flow gets
    into the loop, reads one byte of the opcode, and if the opcode is
    neither TCPOPT_EOL nor TCPOPT_NOP, it reads one more byte, which exceeds
    the length of 1.
    
    This fix is inspired by commit 9609dad ("ipv4: tcp_input: fix stack
    out of bounds when parsing TCP options.").
    
    v2 changes:
    
    Added an early return when length < 0 to avoid calling
    skb_header_pointer with negative length.
    
    Cc: Young Xiao <92siuyang@gmail.com>
    Fixes: 48b1de4 ("netfilter: add SYNPROXY core/target")
    Signed-off-by: Maxim Mikityanskiy <maximmi@nvidia.com>
    Reviewed-by: Florian Westphal <fw@strlen.de>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    nvmmax authored and davem330 committed Jun 10, 2021
  6. net/packet: annotate data race in packet_sendmsg()

    There is a known race in packet_sendmsg(), addressed
    in commit 32d3182 ("net/packet: fix race in tpacket_snd()")
    
    Now we have data_race(), we can use it to avoid a future KCSAN warning,
    as syzbot loves stressing af_packet sockets :)
    
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    neebe000 authored and davem330 committed Jun 10, 2021
  7. inet: annotate date races around sk->sk_txhash

    UDP sendmsg() path can be lockless, it is possible for another
    thread to re-connect an change sk->sk_txhash under us.
    
    There is no serious impact, but we can use READ_ONCE()/WRITE_ONCE()
    pair to document the race.
    
    BUG: KCSAN: data-race in __ip4_datagram_connect / skb_set_owner_w
    
    write to 0xffff88813397920c of 4 bytes by task 30997 on cpu 1:
     sk_set_txhash include/net/sock.h:1937 [inline]
     __ip4_datagram_connect+0x69e/0x710 net/ipv4/datagram.c:75
     __ip6_datagram_connect+0x551/0x840 net/ipv6/datagram.c:189
     ip6_datagram_connect+0x2a/0x40 net/ipv6/datagram.c:272
     inet_dgram_connect+0xfd/0x180 net/ipv4/af_inet.c:580
     __sys_connect_file net/socket.c:1837 [inline]
     __sys_connect+0x245/0x280 net/socket.c:1854
     __do_sys_connect net/socket.c:1864 [inline]
     __se_sys_connect net/socket.c:1861 [inline]
     __x64_sys_connect+0x3d/0x50 net/socket.c:1861
     do_syscall_64+0x4a/0x90 arch/x86/entry/common.c:47
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    read to 0xffff88813397920c of 4 bytes by task 31039 on cpu 0:
     skb_set_hash_from_sk include/net/sock.h:2211 [inline]
     skb_set_owner_w+0x118/0x220 net/core/sock.c:2101
     sock_alloc_send_pskb+0x452/0x4e0 net/core/sock.c:2359
     sock_alloc_send_skb+0x2d/0x40 net/core/sock.c:2373
     __ip6_append_data+0x1743/0x21a0 net/ipv6/ip6_output.c:1621
     ip6_make_skb+0x258/0x420 net/ipv6/ip6_output.c:1983
     udpv6_sendmsg+0x160a/0x16b0 net/ipv6/udp.c:1527
     inet6_sendmsg+0x5f/0x80 net/ipv6/af_inet6.c:642
     sock_sendmsg_nosec net/socket.c:654 [inline]
     sock_sendmsg net/socket.c:674 [inline]
     ____sys_sendmsg+0x360/0x4d0 net/socket.c:2350
     ___sys_sendmsg net/socket.c:2404 [inline]
     __sys_sendmmsg+0x315/0x4b0 net/socket.c:2490
     __do_sys_sendmmsg net/socket.c:2519 [inline]
     __se_sys_sendmmsg net/socket.c:2516 [inline]
     __x64_sys_sendmmsg+0x53/0x60 net/socket.c:2516
     do_syscall_64+0x4a/0x90 arch/x86/entry/common.c:47
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    value changed: 0xbca3c43d -> 0xfdb309e0
    
    Reported by Kernel Concurrency Sanitizer on:
    CPU: 0 PID: 31039 Comm: syz-executor.2 Not tainted 5.13.0-rc3-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: syzbot <syzkaller@googlegroups.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    neebe000 authored and davem330 committed Jun 10, 2021
  8. net: annotate data race in sock_error()

    sock_error() is known to be racy. The code avoids
    an atomic operation is sk_err is zero, and this field
    could be changed under us, this is fine.
    
    Sysbot reported:
    
    BUG: KCSAN: data-race in sock_alloc_send_pskb / unix_release_sock
    
    write to 0xffff888131855630 of 4 bytes by task 9365 on cpu 1:
     unix_release_sock+0x2e9/0x6e0 net/unix/af_unix.c:550
     unix_release+0x2f/0x50 net/unix/af_unix.c:859
     __sock_release net/socket.c:599 [inline]
     sock_close+0x6c/0x150 net/socket.c:1258
     __fput+0x25b/0x4e0 fs/file_table.c:280
     ____fput+0x11/0x20 fs/file_table.c:313
     task_work_run+0xae/0x130 kernel/task_work.c:164
     tracehook_notify_resume include/linux/tracehook.h:189 [inline]
     exit_to_user_mode_loop kernel/entry/common.c:174 [inline]
     exit_to_user_mode_prepare+0x156/0x190 kernel/entry/common.c:208
     __syscall_exit_to_user_mode_work kernel/entry/common.c:290 [inline]
     syscall_exit_to_user_mode+0x20/0x40 kernel/entry/common.c:301
     do_syscall_64+0x56/0x90 arch/x86/entry/common.c:57
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    read to 0xffff888131855630 of 4 bytes by task 9385 on cpu 0:
     sock_error include/net/sock.h:2269 [inline]
     sock_alloc_send_pskb+0xe4/0x4e0 net/core/sock.c:2336
     unix_dgram_sendmsg+0x478/0x1610 net/unix/af_unix.c:1671
     unix_seqpacket_sendmsg+0xc2/0x100 net/unix/af_unix.c:2055
     sock_sendmsg_nosec net/socket.c:654 [inline]
     sock_sendmsg net/socket.c:674 [inline]
     ____sys_sendmsg+0x360/0x4d0 net/socket.c:2350
     __sys_sendmsg_sock+0x25/0x30 net/socket.c:2416
     io_sendmsg fs/io_uring.c:4367 [inline]
     io_issue_sqe+0x231a/0x6750 fs/io_uring.c:6135
     __io_queue_sqe+0xe9/0x360 fs/io_uring.c:6414
     __io_req_task_submit fs/io_uring.c:2039 [inline]
     io_async_task_func+0x312/0x590 fs/io_uring.c:5074
     __tctx_task_work fs/io_uring.c:1910 [inline]
     tctx_task_work+0x1d4/0x3d0 fs/io_uring.c:1924
     task_work_run+0xae/0x130 kernel/task_work.c:164
     tracehook_notify_signal include/linux/tracehook.h:212 [inline]
     handle_signal_work kernel/entry/common.c:145 [inline]
     exit_to_user_mode_loop kernel/entry/common.c:171 [inline]
     exit_to_user_mode_prepare+0xf8/0x190 kernel/entry/common.c:208
     __syscall_exit_to_user_mode_work kernel/entry/common.c:290 [inline]
     syscall_exit_to_user_mode+0x20/0x40 kernel/entry/common.c:301
     do_syscall_64+0x56/0x90 arch/x86/entry/common.c:57
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    value changed: 0x00000000 -> 0x00000068
    
    Reported by Kernel Concurrency Sanitizer on:
    CPU: 0 PID: 9385 Comm: syz-executor.3 Not tainted 5.13.0-rc4-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: syzbot <syzkaller@googlegroups.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    neebe000 authored and davem330 committed Jun 10, 2021
  9. Merge branch 'bridge-egress-fixes'

    Nikolay Aleksandrov says:
    
    ====================
    net: bridge: vlan tunnel egress path fixes
    
    These two fixes take care of tunnel_dst problems in the vlan tunnel egress
    path. Patch 01 fixes a null ptr deref due to the lockless use of tunnel_dst
    pointer without checking it first, and patch 02 fixes a use-after-free
    issue due to wrong dst refcounting (dst_clone() -> dst_hold_safe()).
    
    Both fix the same commit and should be queued for stable backports:
    Fixes: 11538d0 ("bridge: vlan dst_metadata hooks in ingress and egress paths")
    
    v2: no changes, added stable list to CC
    ====================
    
    Signed-off-by: David S. Miller <davem@davemloft.net>
    davem330 committed Jun 10, 2021
  10. net: bridge: fix vlan tunnel dst refcnt when egressing

    The egress tunnel code uses dst_clone() and directly sets the result
    which is wrong because the entry might have 0 refcnt or be already deleted,
    causing number of problems. It also triggers the WARN_ON() in dst_hold()[1]
    when a refcnt couldn't be taken. Fix it by using dst_hold_safe() and
    checking if a reference was actually taken before setting the dst.
    
    [1] dmesg WARN_ON log and following refcnt errors
     WARNING: CPU: 5 PID: 38 at include/net/dst.h:230 br_handle_egress_vlan_tunnel+0x10b/0x134 [bridge]
     Modules linked in: 8021q garp mrp bridge stp llc bonding ipv6 virtio_net
     CPU: 5 PID: 38 Comm: ksoftirqd/5 Kdump: loaded Tainted: G        W         5.13.0-rc3+ torvalds#360
     Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-1.fc33 04/01/2014
     RIP: 0010:br_handle_egress_vlan_tunnel+0x10b/0x134 [bridge]
     Code: e8 85 bc 01 e1 45 84 f6 74 90 45 31 f6 85 db 48 c7 c7 a0 02 19 a0 41 0f 94 c6 31 c9 31 d2 44 89 f6 e8 64 bc 01 e1 85 db 75 02 <0f> 0b 31 c9 31 d2 44 89 f6 48 c7 c7 70 02 19 a0 e8 4b bc 01 e1 49
     RSP: 0018:ffff8881003d39e8 EFLAGS: 00010246
     RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
     RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffffffffa01902a0
     RBP: ffff8881040c6700 R08: 0000000000000000 R09: 0000000000000001
     R10: 2ce93d0054fe0d00 R11: 54fe0d00000e0000 R12: ffff888109515000
     R13: 0000000000000000 R14: 0000000000000001 R15: 0000000000000401
     FS:  0000000000000000(0000) GS:ffff88822bf40000(0000) knlGS:0000000000000000
     CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
     CR2: 00007f42ba70f030 CR3: 0000000109926000 CR4: 00000000000006e0
     Call Trace:
      br_handle_vlan+0xbc/0xca [bridge]
      __br_forward+0x23/0x164 [bridge]
      deliver_clone+0x41/0x48 [bridge]
      br_handle_frame_finish+0x36f/0x3aa [bridge]
      ? skb_dst+0x2e/0x38 [bridge]
      ? br_handle_ingress_vlan_tunnel+0x3e/0x1c8 [bridge]
      ? br_handle_frame_finish+0x3aa/0x3aa [bridge]
      br_handle_frame+0x2c3/0x377 [bridge]
      ? __skb_pull+0x33/0x51
      ? vlan_do_receive+0x4f/0x36a
      ? br_handle_frame_finish+0x3aa/0x3aa [bridge]
      __netif_receive_skb_core+0x539/0x7c6
      ? __list_del_entry_valid+0x16e/0x1c2
      __netif_receive_skb_list_core+0x6d/0xd6
      netif_receive_skb_list_internal+0x1d9/0x1fa
      gro_normal_list+0x22/0x3e
      dev_gro_receive+0x55b/0x600
      ? detach_buf_split+0x58/0x140
      napi_gro_receive+0x94/0x12e
      virtnet_poll+0x15d/0x315 [virtio_net]
      __napi_poll+0x2c/0x1c9
      net_rx_action+0xe6/0x1fb
      __do_softirq+0x115/0x2d8
      run_ksoftirqd+0x18/0x20
      smpboot_thread_fn+0x183/0x19c
      ? smpboot_unregister_percpu_thread+0x66/0x66
      kthread+0x10a/0x10f
      ? kthread_mod_delayed_work+0xb6/0xb6
      ret_from_fork+0x22/0x30
     ---[ end trace 49f61b07f775fd2b ]---
     dst_release: dst:00000000c02d677a refcnt:-1
     dst_release underflow
    
    Cc: stable@vger.kernel.org
    Fixes: 11538d0 ("bridge: vlan dst_metadata hooks in ingress and egress paths")
    Signed-off-by: Nikolay Aleksandrov <nikolay@nvidia.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Nikolay Aleksandrov authored and davem330 committed Jun 10, 2021
Older