[apparmor] [patch 18/12] v3 unix socket rules
Tyler Hicks
tyhicks at canonical.com
Fri Sep 5 17:56:22 UTC 2014
On 2014-09-05 10:36:32, John Johansen wrote:
> On 09/05/2014 10:23 AM, Tyler Hicks wrote:
> > On 2014-09-05 09:25:03, John Johansen wrote:
> >> Do not output local permissions for rules that have peer_conditionals
> >>
> >> while it is not possible to specify a rule with local conditionals with
> >> peer conditionals
> >> eg.
> >> unix listen peer=(addr=@foo),
> >>
> >> a rule such as
> >> unix peer=(addr=@foo),
> >>
> >> is possible, and was setting all permissions for local as well as the peer
> >> condition permissions.
> >>
> >> Currently this means the create permission must be specified in a separate
> >> rule from a rule with a peer= condition, if create is to be allowed. This
> >> isn't too much of an issue but it does mean rule such as
> >> unix connect peer=(addr=@foo),
> >
> > As a policy author, I would not have expected connect to imply create
> > permission. Also, our apparmor.d man page states that create will not
> > be implied:
> >
> > If a rule is specified with a peer component it will only imply accept
> > (stream), connect (stream), listen, receive and send. It will not
> > imply the create, bind, listen, shutdown, getattr, or setattr
> > permissions.
> >
> okay good
>
> > Note that listen is specified in the "will imply" and the "will not
> > imply" list. We need to fix that. Which list should it be in?
> >
> listen is a local perm, it is specified on a socket before it can accept
> connections.
>
> >>
> >> Can not imply the ability to create a socket. Which may indeed be the
> >> behavior if we wish to enforce that the socket was created in another
> >> process and passed in. Is this what we want to do?
> >
> > Yes, I think that's what we want. The ability to call socket() would
> > allow a confined application to autoload a kernel module that implements
> > the network family specified in the socket() params. There could be
> > cases where you don't want to allow that autoload to be triggered by a
> > confined program but do want the program to inherit a socket fd that was
> > opened by a program with greater privs.
> >
> good
>
> >>
> >> Signed-off-by: John Johansen <john.johansen at canonical.com>
> >
> > While I agree with the intent of this patch, I'm not ready to ack it
> > just yet because it seems to quietly drop the connect perm instead of
> > throwing an error.
> >
> it is not so much dropping the accept perm, as mask it it out when a rule
> that doesn't specify permissions has its permission mask set to all perms.
>
> If a rule specifies the create perm or any other local perm it should
> be screened out sooner than the rule generation, in the move_conds,
> move_peer_conds, or constructors for unix_rule
>
>
> > $ echo "/t { unix create peer=(addr=@foo), }" | ./apparmor_parser -qQ ; echo $?
> > 0
> >
> > In fact, our error throwing in the case of local perms and peer conds is
> > pretty inconsistent right now:
> >
> yes :(
>
> > $ for p in create bind listen shutdown getattr setattr; do \
> > echo "/t { unix $p peer=(addr=@foo), }" | ./apparmor_parser -qQM && echo "Quietly dropped: $p"; \
> > done
> > Quietly dropped: create
> > AppArmor parser error, in stdin line 1: unix socket 'bind' access cannot be used with message rule conditionals
> > AppArmor parser error, in stdin line 1: unix socket 'listen' access cannot be used with message rule conditionals
> > Quietly dropped: shutdown
> > Quietly dropped: getattr
> > Quietly dropped: setattr
> >
> > I think all of those "Quietly dropped:" lines should result in a parser
> > error.
> >
> ugh we need a patch to fix that
Ok, well lets treat that as a separate issue. Stick my acked-by on your
patch, commit it to trunk, and then I'll send out a fix for this issue.
Thanks!
Tyler
>
> > Tyler
> >
> >>
> >> ---
> >>
> >> === modified file 'parser/af_unix.cc'
> >> --- parser/af_unix.cc 2014-09-05 15:49:33 +0000
> >> +++ parser/af_unix.cc 2014-09-05 16:13:04 +0000
> >> @@ -334,7 +334,7 @@
> >> }
> >>
> >> write_to_prot(buffer);
> >> - if (mask & AA_NET_CREATE) {
> >> + if ((mask & AA_NET_CREATE) && !has_peer_conds()) {
> >> buf = buffer.str();
> >> if (!prof.policy.rules->add_rule(buf.c_str(), deny,
> >> map_perms(AA_NET_CREATE),
> >> @@ -355,7 +355,8 @@
> >> buffer << "\\x00";
> >>
> >> /* create already masked off */
> >> - if (mask & AA_LOCAL_NET_PERMS & ~AA_LOCAL_NET_CMD) {
> >> + if ((mask & AA_LOCAL_NET_PERMS & ~AA_LOCAL_NET_CMD) &&
> >> + !has_peer_conds()) {
> >> buf = buffer.str();
> >> if (!prof.policy.rules->add_rule(buf.c_str(), deny,
> >> map_perms(mask & AA_LOCAL_NET_PERMS & ~AA_LOCAL_NET_CMD),
> >> @@ -364,7 +365,7 @@
> >> goto fail;
> >> }
> >>
> >> - if (mask & AA_NET_LISTEN) {
> >> + if ((mask & AA_NET_LISTEN) && !has_peer_conds()) {
> >> std::ostringstream tmp(buffer.str());
> >> tmp.seekp(0, ios_base::end);
> >> tmp << "\\x" << std::setfill('0') << std::setw(2) << std::hex << CMD_LISTEN;
> >> @@ -377,7 +378,7 @@
> >> dfaflags))
> >> goto fail;
> >> }
> >> - if (mask & AA_NET_OPT) {
> >> + if ((mask & AA_NET_OPT) && !has_peer_conds()) {
> >> std::ostringstream tmp(buffer.str());
> >> tmp.seekp(0, ios_base::end);
> >> tmp << "\\x" << std::setfill('0') << std::setw(2) << std::hex << CMD_OPT;
> >>
> >>
> >> --
> >> AppArmor mailing list
> >> AppArmor at lists.ubuntu.com
> >> Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/apparmor
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <https://lists.ubuntu.com/archives/apparmor/attachments/20140905/10bfa2bb/attachment.pgp>
More information about the AppArmor
mailing list