Skip to content
  • John Johansen's avatar
    parser: first step implementing fine grained mediation for unix domain sockets · dd44858e
    John Johansen authored
    
    
    This patch implements parsing of fine grained mediation for unix domain
    sockets, that have abstract and anonymous paths. Sockets with file
    system paths are handled by regular file access rules.
    
    The unix network rules follow the general fine grained network
    rule pattern of
    
      [<qualifiers>] af_name [<access expr>] [<rule conds>] [<local expr>] [<peer expr>]
    
    specifically for af_unix this is
    
      [<qualifiers>] 'unix' [<access expr>] [<rule conds>] [<local expr>] [<peer expr>]
    
      <qualifiers> = [ 'audit' ] [ 'allow' | 'deny' ]
    
      <access expr> = ( <access> | <access list> )
    
      <access> = ( 'server' | 'create' | 'bind' | 'listen' | 'accept' |
                   'connect' | 'shutdown' | 'getattr' | 'setattr' |
    	       'getopt' | 'setopt' |
                   'send' | 'receive' | 'r' | 'w' | 'rw' )
      (some access modes are incompatible with some rules or require additional
       parameters)
    
      <access list> = '(' <access> ( [','] <WS> <access> )* ')'
    
      <WS> = white space
    
      <rule conds> = ( <type cond> | <protocol cond> )*
         each cond can appear at most once
    
      <type cond> = 'type' '='  ( <AARE> | '(' ( '"' <AARE> '"' | <AARE> )+ ')' )
    
      <protocol cond> = 'protocol' '='  ( <AARE> | '(' ( '"' <AARE> '"' | <AARE> )+ ')' )
    
      <local expr> = ( <path cond> | <attr cond> | <opt cond> )*
         each cond can appear at most once
    
      <peer expr> = 'peer' '=' ( <path cond> | <label cond> )+
         each cond can appear at most once
    
      <path cond> = 'path' '=' ( <AARE> | '(' '"' <AARE> '"' | <AARE> ')' )
    
      <label cond> = 'label' '=' ( <AARE> | '(' '"' <AARE> '"' | <AARE> ')')
    
      <attr cond> = 'attr' '=' ( <AARE> | '(' '"' <AARE> '"' | <AARE> ')' )
    
      <opt cond> = 'opt' '=' ( <AARE> | '(' '"' <AARE> '"' | <AARE> ')' )
    
      <AARE> = ?*[]{}^ ( see man page )
    
     unix domain socket rules are accumulated so that the granted unix
     socket permissions are the union of all the listed unix rule permissions.
    
     unix domain socket rules are broad and general and become more restrictive
     as further information is specified. Policy may be specified down to
     the path and label level. The content of the communication is not
     examined.
    
     Some permissions are not compatible with all unix rules.
    
     unix socket rule permissions are implied when a rule does not explicitly
     state an access list. By default if a rule does not have an access list
     all permissions that are compatible with the specified set of local
     and peer conditionals are implied.
    
     The 'server', 'r', 'w' and 'rw' permissions are aliases for other permissions.
     server = (create, bind, listen, accept)
     r = (receive, getattr, getopt)
     w = (create, connect, send, setattr, setopt)
    
    In addition it supports the v7 kernel abi semantics around generic
    network rules. The v7 abi removes the masking unix and netlink
    address families from the generic masking and uses fine grained
    mediation for an address type if supplied.
    
    This means that the rules
    
      network unix,
      network netlink,
    
    are now enforced instead of ignored. The parser previously could accept
    these but the kernel would ignore anything written to them. If a network
    rule is supplied it takes precedence over the finer grained mediation
    rule. If permission is not granted via a broad network access rule
    fine grained mediation is applied.
    
    Signed-off-by: default avatarJohn Johansen <john.johansen@canonical.com>
    Acked-by: default avatarSeth Arnold <seth.arnold@canonical.com>
    dd44858e