18 Sep, 2012

17 commits

  • Cc: Joel Becker
    Acked-by: Serge Hallyn
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman
     
  • Convert ext2, ext3, and ext4 to fully support the posix acl changes,
    using e_uid e_gid instead e_id.

    Enabled building with posix acls enabled, all filesystems supporting
    user namespaces, now also support posix acls when user namespaces are enabled.

    Cc: Theodore Tso
    Cc: Andrew Morton
    Cc: Andreas Dilger
    Cc: Jan Kara
    Cc: Al Viro
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman
     
  • - Pass the user namespace the uid and gid values in the xattr are stored
    in into posix_acl_from_xattr.

    - Pass the user namespace kuid and kgid values should be converted into
    when storing uid and gid values in an xattr in posix_acl_to_xattr.

    - Modify all callers of posix_acl_from_xattr and posix_acl_to_xattr to
    pass in &init_user_ns.

    In the short term this change is not strictly needed but it makes the
    code clearer. In the longer term this change is necessary to be able to
    mount filesystems outside of the initial user namespace that natively
    store posix acls in the linux xattr format.

    Cc: Theodore Tso
    Cc: Andrew Morton
    Cc: Andreas Dilger
    Cc: Jan Kara
    Cc: Al Viro
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman
     
  • - In setxattr if we are setting a posix acl convert uids and gids from
    the current user namespace into the initial user namespace, before
    the xattrs are passed to the underlying filesystem.

    Untranslatable uids and gids are represented as -1 which
    posix_acl_from_xattr will represent as INVALID_UID or INVALID_GID.
    posix_acl_valid will fail if an acl from userspace has any
    INVALID_UID or INVALID_GID values. In net this guarantees that
    untranslatable posix acls will not be stored by filesystems.

    - In getxattr if we are reading a posix acl convert uids and gids from
    the initial user namespace into the current user namespace.

    Uids and gids that can not be tranlsated into the current user namespace
    will be represented as -1.

    - Replace e_id in struct posix_acl_entry with an anymouns union of
    e_uid and e_gid. For the short term retain the e_id field
    until all of the users are converted.

    - Don't set struct posix_acl.e_id in the cases where the acl type
    does not use e_id. Greatly reducing the use of ACL_UNDEFINED_ID.

    - Rework the ordering checks in posix_acl_valid so that I use kuid_t
    and kgid_t types throughout the code, and so that I don't need
    arithmetic on uid and gid types.

    Cc: Theodore Tso
    Cc: Andrew Morton
    Cc: Andreas Dilger
    Cc: Jan Kara
    Cc: Al Viro
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman
     
  • - When tracing capture the kuid.
    - When displaying the data to user space convert the kuid into the
    user namespace of the process that opened the report file.

    Cc: Steven Rostedt
    Cc: Frederic Weisbecker
    Cc: Ingo Molnar
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman
     
  • BSD process accounting conveniently passes the file the accounting
    records will be written into to do_acct_process. The file credentials
    captured the user namespace of the opener of the file. Use the file
    credentials to format the uid and the gid of the current process into
    the user namespace of the user that started the bsd process
    accounting.

    Cc: Pavel Emelyanov
    Reviewed-by: Serge Hallyn
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman
     
  • - Explicitly limit exit task stat broadcast to the initial user and
    pid namespaces, as it is already limited to the initial network
    namespace.

    - For broadcast task stats explicitly generate all of the idenitiers
    in terms of the initial user namespace and the initial pid
    namespace.

    - For request stats report them in terms of the current user namespace
    and the current pid namespace. Netlink messages are delivered
    syncrhonously to the kernel allowing us to get the user namespace
    and the pid namespace from the current task.

    - Pass the namespaces for representing pids and uids and gids
    into bacct_add_task.

    Cc: Balbir Singh
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman
     
  • - Explicitly format uids gids in audit messges in the initial user
    namespace. This is safe because auditd is restrected to be in
    the initial user namespace.

    - Convert audit_sig_uid into a kuid_t.

    - Enable building the audit code and user namespaces at the same time.

    The net result is that the audit subsystem now uses kuid_t and kgid_t whenever
    possible making it almost impossible to confuse a raw uid_t with a kuid_t
    preventing bugs.

    Cc: Al Viro
    Cc: Eric Paris
    Cc: Greg Kroah-Hartman
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman
     
  • Always store audit loginuids in type kuid_t.

    Print loginuids by converting them into uids in the appropriate user
    namespace, and then printing the resulting uid.

    Modify audit_get_loginuid to return a kuid_t.

    Modify audit_set_loginuid to take a kuid_t.

    Modify /proc//loginuid on read to convert the loginuid into the
    user namespace of the opener of the file.

    Modify /proc//loginud on write to convert the loginuid
    rom the user namespace of the opener of the file.

    Cc: Al Viro
    Cc: Eric Paris
    Cc: Paul Moore ?
    Cc: David Miller
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman
     
  • The audit filter code guarantees that uid are always compared with
    uids and gids are always compared with gids, as the comparason
    operations are type specific. Take advantage of this proper to define
    audit_uid_comparator and audit_gid_comparator which use the type safe
    comparasons from uidgid.h.

    Build on audit_uid_comparator and audit_gid_comparator and replace
    audit_compare_id with audit_compare_uid and audit_compare_gid. This
    is one of those odd cases where being type safe and duplicating code
    leads to simpler shorter and more concise code.

    Don't allow bitmask operations in uid and gid comparisons in
    audit_data_to_entry. Bitmask operations are already denined in
    audit_rule_to_entry.

    Convert constants in audit_rule_to_entry and audit_data_to_entry into
    kuids and kgids when appropriate.

    Convert the uid and gid field in struct audit_names to be of type
    kuid_t and kgid_t respectively, so that the new uid and gid comparators
    can be applied in a type safe manner.

    Cc: Al Viro
    Cc: Eric Paris
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman
     
  • The only place we use the uid and the pid that we calculate in
    audit_receive_msg is in audit_log_common_recv_msg so move the
    calculation of these values into the audit_log_common_recv_msg.

    Simplify the calcuation of the current pid and uid by
    reading them from current instead of reading them from
    NETLINK_CREDS.

    Cc: Al Viro
    Cc: Eric Paris
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman
     
  • Cc: Al Viro
    Cc: Eric Paris
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman
     
  • For user generated audit messages set the portid field in the netlink
    header to the netlink port where the user generated audit message came
    from. Reporting the process id in a port id field was just nonsense.

    Cc: Al Viro
    Cc: Eric Paris
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman
     
  • Use current instead of looking up the current up the current task by
    process identifier. Netlink requests are processed in trhe context of
    the sending task so this is safe.

    Cc: Al Viro
    Cc: Eric Paris
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman
     
  • Now that netlink messages are processed in the context of the sender
    tty_audit_push_task can be called directly and audit_prepare_user_tty
    which only added looking up the task of the tty by process id is
    not needed.

    Cc: Al Viro
    Cc: Eric Paris
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman
     
  • Get caller process uid and gid and pid values from the current task
    instead of the NETLINK_CB. This is simpler than passing NETLINK_CREDS
    from from audit_receive_msg to audit_filter_user_rules and avoid the
    chance of being hit by the occassional bugs in netlink uid/gid
    credential passing. This is a safe changes because all netlink
    requests are processed in the task of the sending process.

    Cc: Al Viro
    Cc: Eric Paris
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman
     
  • This allows the code to safely make the assumption that all of the
    uids gids and pids that need to be send in audit messages are in the
    initial namespaces.

    If someone cares we may lift this restriction someday but start with
    limiting access so at least the code is always correct.

    Cc: Al Viro
    Cc: Eric Paris
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman
     

14 Sep, 2012

3 commits

  • In net/dns_resolver/dns_key.c and net/rxrpc/ar-key.c make them
    work with user namespaces enabled where key_alloc takes kuids and kgids.
    Pass GLOBAL_ROOT_UID and GLOBAL_ROOT_GID instead of bare 0's.

    Cc: Sage Weil
    Cc: ceph-devel@vger.kernel.org
    Cc: David Howells
    Cc: David Miller
    Cc: linux-afs@lists.infradead.org
    Acked-by: Serge Hallyn
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman
     
  • - Replace key_user ->user_ns equality checks with kuid_has_mapping checks.
    - Use from_kuid to generate key descriptions
    - Use kuid_t and kgid_t and the associated helpers instead of uid_t and gid_t
    - Avoid potential problems with file descriptor passing by displaying
    keys in the user namespace of the opener of key status proc files.

    Cc: linux-security-module@vger.kernel.org
    Cc: keyrings@linux-nfs.org
    Cc: David Howells
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman
     
  • Blink Blink this had not been converted to use struct pid ages ago?

    - On drm open capture the openers kuid and struct pid.
    - On drm close release the kuid and struct pid
    - When reporting the uid and pid convert the kuid and struct pid
    into values in the appropriate namespace.

    Cc: dri-devel@lists.freedesktop.org
    Acked-by: Dave Airlie
    Acked-by: Serge Hallyn
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman
     

07 Sep, 2012

3 commits


24 Aug, 2012

2 commits


17 Aug, 2012

1 commit


15 Aug, 2012

14 commits

  • Cc: Maxim Krasnyansky
    Acked-by: David S. Miller
    Acked-by: Serge Hallyn
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman
     
  • Cc: Dan Carpenter
    Cc: Alexey Dobriyan
    Cc: John W. Linville
    Acked-by: David S. Miller
    Acked-by: Serge Hallyn
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman
     
  • - Only allow adding matches from the initial user namespace
    - Add the appropriate conversion functions to handle matches
    against sockets in other user namespaces.

    Cc: Jan Engelhardt
    Cc: Patrick McHardy
    Cc: Pablo Neira Ayuso
    Acked-by: David S. Miller
    Acked-by: Serge Hallyn
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman
     
  • xt_recent creates a bunch of proc files and initializes their uid
    and gids to the values of ip_list_uid and ip_list_gid. When
    initialize those proc files convert those values to kuids so they
    can continue to reside on the /proc inode.

    Cc: Pablo Neira Ayuso
    Cc: Patrick McHardy
    Cc: Jan Engelhardt
    Acked-by: David S. Miller
    Acked-by: Serge Hallyn
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman
     
  • xt_LOG always writes messages via sb_add via printk. Therefore when
    xt_LOG logs the uid and gid of a socket a packet came from the
    values should be converted to be in the initial user namespace.

    Thus making xt_LOG as user namespace safe as possible.

    Cc: Pablo Neira Ayuso
    Cc: Patrick McHardy
    Acked-by: David S. Miller
    Acked-by: Serge Hallyn
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman
     
  • The flow classifier can use uids and gids of the sockets that
    are transmitting packets and do insert those uids and gids
    into the packet classification calcuation. I don't fully
    understand the details but it appears that we can depend
    on specific uids and gids when making traffic classification
    decisions.

    To work with user namespaces enabled map from kuids and kgids
    into uids and gids in the initial user namespace giving raw
    integer values the code can play with and depend on.

    To avoid issues of userspace depending on uids and gids in
    packet classifiers installed from other user namespaces
    and getting confused deny all packet classifiers that
    use uids or gids that are not comming from a netlink socket
    in the initial user namespace.

    Cc: Patrick McHardy
    Cc: Eric Dumazet
    Cc: Jamal Hadi Salim
    Cc: Changli Gao
    Acked-by: David S. Miller
    Acked-by: Serge Hallyn
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman
     
  • cls_flow.c plays with uids and gids. Unless I misread that
    code it is possible for classifiers to depend on the specific uid and
    gid values. Therefore I need to know the user namespace of the
    netlink socket that is installing the packet classifiers. Pass
    in the rtnetlink skb so I can access the NETLINK_CB of the passed
    packet. In particular I want access to sk_user_ns(NETLINK_CB(in_skb).ssk).

    Pass in not the user namespace but the incomming rtnetlink skb into
    the the classifier change routines as that is generally the more useful
    parameter.

    Cc: Jamal Hadi Salim
    Acked-by: David S. Miller
    Acked-by: Serge Hallyn
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman
     
  • At logging instance creation capture the peer netlink socket's user
    namespace. Use the captured peer user namespace when reporting socket
    uids to the peer.

    The peer socket's user namespace is guaranateed to be valid until the user
    closes the netlink socket. nfnetlink_log removes instances during the final
    close of a socket. __build_packet_message does not get called after an
    instance is destroyed. Therefore it is safe to let the peer netlink socket
    take care of the user namespace reference counting for us.

    Acked-by: David S. Miller
    Acked-by: Serge Hallyn
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman
     
  • Compute the user namespace of the socket that we are replying to
    and translate the kuids of reported sockets into that user namespace.

    Cc: Andrew Vagin
    Acked-by: David S. Miller
    Acked-by: Pavel Emelyanov
    Acked-by: Serge Hallyn
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman
     
  • Add a helper sk_user_ns to make it easy to find the user namespace
    of the process that opened a socket.

    Acked-by: David S. Miller
    Acked-by: Serge Hallyn
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman
     
  • The sending socket of an skb is already available by it's port id
    in the NETLINK_CB. If you want to know more like to examine the
    credentials on the sending socket you have to look up the sending
    socket by it's port id and all of the needed functions and data
    structures are static inside of af_netlink.c. So do the simple
    thing and pass the sending socket to the receivers in the NETLINK_CB.

    I intend to use this to get the user namespace of the sending socket
    in inet_diag so that I can report uids in the context of the process
    who opened the socket, the same way I report uids in the contect
    of the process who opens files.

    Acked-by: David S. Miller
    Acked-by: Serge Hallyn
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman
     
  • Cc: Ralf Baechle
    Acked-by: David S. Miller
    Acked-by: Serge Hallyn
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman
     
  • There is a least one modular user so export free_pid_ns so modules can
    capture and use the pid namespace on the very rare occasion when it
    makes sense.

    Acked-by: David S. Miller
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman
     
  • Correct a long standing omission and use struct pid in the owner
    field of struct ip6_flowlabel when the share type is IPV6_FL_S_PROCESS.
    This guarantees we don't have issues when pid wraparound occurs.

    Use a kuid_t in the owner field of struct ip6_flowlabel when the
    share type is IPV6_FL_S_USER to add user namespace support.

    In /proc/net/ip6_flowlabel capture the current pid namespace when
    opening the file and release the pid namespace when the file is
    closed ensuring we print the pid owner value that is meaning to
    the reader of the file. Similarly use from_kuid_munged to print
    uid values that are meaningful to the reader of the file.

    This requires exporting pid_nr_ns so that ipv6 can continue to built
    as a module. Yoiks what silliness

    Acked-by: David S. Miller
    Acked-by: Serge Hallyn
    Signed-off-by: Eric W. Biederman

    Eric W. Biederman