[ubuntu-hardened] [PATCH] Initial policy load from load_policy

Joshua Brindle method at manicmethod.com
Tue Nov 13 16:05:07 GMT 2007


Chad Sellers wrote:
> On 11/7/07 4:26 PM, "Stephen Smalley" <sds at tycho.nsa.gov> wrote:
>
>   
>> On Wed, 2007-11-07 at 16:17 -0500, Chad Sellers wrote:
>>     
>>> The below patch adds a -i option to load_policy to perform the initial
>>> policy load. The inital policy load is currently done in systems using
>>> sysvinit by init itself, which then re-exec's itself. Ubuntu uses
>>> upstart instead of sysvinit. In talks with the Ubuntu folks, they'd
>>> prefer to load policy from initramfs before upstart starts rather than
>>> patching upstart.
>>>
>>> Signed-off-by: Chad Sellers <csellers at tresys.com>
>>>       

Is this ready to be merged or are there outstanding issues?

>>> ---
>>>
>>> load_policy.8 |   19 ++++++++++++++++++-
>>> load_policy.c |   29 +++++++++++++++++++++++++----
>>> 2 files changed, 43 insertions(+), 5 deletions(-)
>>>
>>> Index: policycoreutils/load_policy/load_policy.c
>>> ===================================================================
>>> --- policycoreutils/load_policy/load_policy.c    (revision 2679)
>>> +++ policycoreutils/load_policy/load_policy.c    (working copy)
>>> @@ -19,13 +19,13 @@
>>>  
>>>  void usage(char *progname)
>>>  {
>>> -    fprintf(stderr, _("usage:  %s [-q]\n"), progname);
>>> +    fprintf(stderr, _("usage:  %s [-qi]\n"), progname);
>>>      exit(1);
>>>  }
>>>  
>>>  int main(int argc, char **argv)
>>>  {
>>> -    int ret, opt, quiet = 0, nargs;
>>> +    int ret, opt, quiet = 0, nargs, init=0, enforce=0;
>>>  
>>>  #ifdef USE_NLS
>>>      setlocale(LC_ALL, "");
>>> @@ -33,7 +33,7 @@
>>>      textdomain(PACKAGE);
>>>  #endif
>>>  
>>> -    while ((opt = getopt(argc, argv, "bq")) > 0) {
>>> +    while ((opt = getopt(argc, argv, "bqi")) > 0) {
>>>          switch (opt) {
>>>          case 'b':
>>>              fprintf(stderr, "%s:  Warning! The -b option is no longer
>>> supported, booleans are always preserved across reloads.  Continuing...\n",
>>> @@ -43,6 +43,9 @@
>>>              quiet = 1;
>>>              sepol_debug(0);
>>>              break;
>>> +        case 'i':
>>> +            init = 1;
>>> +            break;
>>>          default:
>>>              usage(argv[0]);
>>>          }
>>> @@ -62,7 +65,25 @@
>>>              argv[0], argv[optind++]);
>>>      }
>>>  
>>> -    ret = selinux_mkload_policy(1);
>>> +    if (init) {
>>> +        if (is_selinux_enabled() == 1) {
>>> +            /* SELinux is already enabled, we should not do an initial
>>> load again */
>>> +            fprintf(stderr,
>>> +                _("%s:  Policy is already loaded and initial load
>>> requested\n"),
>>> +                argv[0]);
>>> +            exit(2);
>>> +        }
>>> +        ret = selinux_init_load_policy(&enforce);
>>> +        if (ret != 0 ) {
>>> +             if (enforce > 0) {
>>> +                /* SELinux in enforcing mode but load_policy failed */
>>>       
>> An error message here would be helpful, assuming that such error
>> messages are displayed at all on the console.
>>
>>     
> I was planning to just display the error in the caller, as the caller will
> be the one to halt the system (not load_policy).
>
>   
>> How do you plan to handle an error in the caller?  System should be
>> halted in this case.
>>
>>     
> I plan to check the return value in the caller and halt in this case. That's
> why I added a new return value (3). Basically, something like this:
>
> set +e
> chroot /root load_policy -i
> RET=$?
> if [ $RET -eq 3 ]; then echo "SELinux policy load failed and enforcing mode
> requested, halting now"; halt;
> elif [ $RET -ne 0 ]; then echo "SELinux policy load failed, continuing";
> fi
>
>   
>>> +                exit(3);
>>> +            }
>>> +        }
>>> +    }
>>> +    else {
>>> +        ret = selinux_mkload_policy(1);
>>> +    }
>>>      if (ret < 0) {
>>>          fprintf(stderr, _("%s:  Can't load policy:  %s\n"),
>>>              argv[0], strerror(errno));
>>> Index: policycoreutils/load_policy/load_policy.8
>>> ===================================================================
>>> --- policycoreutils/load_policy/load_policy.8    (revision 2679)
>>> +++ policycoreutils/load_policy/load_policy.8    (working copy)
>>> @@ -4,7 +4,7 @@
>>>  
>>>  .SH SYNOPSIS
>>>  .B load_policy
>>> -[-q]
>>> +[-qi]
>>>  .br
>>>  .SH DESCRIPTION
>>>  .PP
>>> @@ -17,7 +17,24 @@
>>>  .TP
>>>  .B \-q
>>>  suppress warning messages.
>>> +.TP
>>> +.B \-i
>>> +inital policy load. Only use this if this is the first time policy is
>>> being loaded since boot (usually called from initramfs).
>>>  
>>> +.SH "EXIT STATUS"
>>> +.TP
>>> +.B 0
>>> +Success
>>> +.TP
>>> +.B 1
>>> +Invalid option
>>> +.TP
>>> +.B 2
>>> +Policy load failed
>>> +.TP
>>> +.B 3
>>> +Initial policy load failed and enforcing mode requested
>>> +
>>>  .SH SEE ALSO
>>>  .B booleans
>>>  (8),
>>>
>>>
>>> --
>>> This message was distributed to subscribers of the selinux mailing list.
>>> If you no longer wish to subscribe, send mail to majordomo at tycho.nsa.gov with
>>> the words "unsubscribe selinux" without quotes as the message.
>>>       
>
>
>
> --
> This message was distributed to subscribers of the selinux mailing list.
> If you no longer wish to subscribe, send mail to majordomo at tycho.nsa.gov with
> the words "unsubscribe selinux" without quotes as the message.
>
>   





More information about the ubuntu-hardened mailing list