lkml.org 
[lkml]   [2009]   [May]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 17/51] lsm: Relocate the IPv4 security_inet_conn_request() hooks
    2.6.29-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Paul Moore <paul.moore@hp.com>

    [NOTE: present in Linus' tree as 284904aa79466a4736f4c775fdbe5c7407fa136c]

    The current placement of the security_inet_conn_request() hooks do not allow
    individual LSMs to override the IP options of the connection's request_sock.
    This is a problem as both SELinux and Smack have the ability to use labeled
    networking protocols which make use of IP options to carry security attributes
    and the inability to set the IP options at the start of the TCP handshake is
    problematic.

    This patch moves the IPv4 security_inet_conn_request() hooks past the code
    where the request_sock's IP options are set/reset so that the LSM can safely
    manipulate the IP options as needed. This patch intentionally does not change
    the related IPv6 hooks as IPv6 based labeling protocols which use IPv6 options
    are not currently implemented, once they are we will have a better idea of
    the correct placement for the IPv6 hooks.

    Signed-off-by: Paul Moore <paul.moore@hp.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    net/ipv4/syncookies.c | 9 +++++----
    net/ipv4/tcp_ipv4.c | 7 ++++---
    2 files changed, 9 insertions(+), 7 deletions(-)

    --- a/net/ipv4/syncookies.c
    +++ b/net/ipv4/syncookies.c
    @@ -288,10 +288,6 @@ struct sock *cookie_v4_check(struct sock
    if (!req)
    goto out;

    - if (security_inet_conn_request(sk, skb, req)) {
    - reqsk_free(req);
    - goto out;
    - }
    ireq = inet_rsk(req);
    treq = tcp_rsk(req);
    treq->rcv_isn = ntohl(th->seq) - 1;
    @@ -322,6 +318,11 @@ struct sock *cookie_v4_check(struct sock
    }
    }

    + if (security_inet_conn_request(sk, skb, req)) {
    + reqsk_free(req);
    + goto out;
    + }
    +
    req->expires = 0UL;
    req->retrans = 0;

    --- a/net/ipv4/tcp_ipv4.c
    +++ b/net/ipv4/tcp_ipv4.c
    @@ -1239,14 +1239,15 @@ int tcp_v4_conn_request(struct sock *sk,

    tcp_openreq_init(req, &tmp_opt, skb);

    - if (security_inet_conn_request(sk, skb, req))
    - goto drop_and_free;
    -
    ireq = inet_rsk(req);
    ireq->loc_addr = daddr;
    ireq->rmt_addr = saddr;
    ireq->no_srccheck = inet_sk(sk)->transparent;
    ireq->opt = tcp_v4_save_options(sk, skb);
    +
    + if (security_inet_conn_request(sk, skb, req))
    + goto drop_and_free;
    +
    if (!want_cookie)
    TCP_ECN_create_request(req, tcp_hdr(skb));




    \
     
     \ /
      Last update: 2009-05-15 00:51    [W:0.024 / U:1.256 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site