/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk

« back to all changes in this revision

Viewing changes to plugin-runner.c

  • Committer: Teddy Hogeborn
  • Date: 2015-03-10 18:03:38 UTC
  • Revision ID: teddy@recompile.se-20150310180338-pcxw6r2qmw9k6br9
Add ":!RSA" to GnuTLS priority string, to disallow non-DHE kx.

If Mandos was somehow made to use a non-ephemeral Diffie-Hellman key
exchange algorithm in the TLS handshake, any saved network traffic
could then be decrypted later if the Mandos client key was obtained.
By default, Mandos uses ephemeral DH key exchanges which does not have
this problem, but a non-ephemeral key exchange algorithm was still
enabled by default.  The simplest solution is to simply turn that off,
which ensures that Mandos will always use ephemeral DH key exchanges.

There is a "PFS" priority string specifier, but we can't use it because:

1. Security-wise, it is a mix between "NORMAL" and "SECURE128" - it
   enables a lot more algorithms than "SECURE256".

2. It is only available since GnuTLS 3.2.4.

Thanks to Andreas Fischer <af@bantuX.org> for reporting this issue.

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
/*
3
3
 * Mandos plugin runner - Run Mandos plugins
4
4
 *
5
 
 * Copyright © 2008-2016 Teddy Hogeborn
6
 
 * Copyright © 2008-2016 Björn Påhlsson
 
5
 * Copyright © 2008-2014 Teddy Hogeborn
 
6
 * Copyright © 2008-2014 Björn Påhlsson
7
7
 * 
8
8
 * This program is free software: you can redistribute it and/or
9
9
 * modify it under the terms of the GNU General Public License as
76
76
#define BUFFER_SIZE 256
77
77
 
78
78
#define PDIR "/lib/mandos/plugins.d"
79
 
#define PHDIR "/lib/mandos/plugin-helpers"
80
79
#define AFILE "/conf/conf.d/mandos/plugin-runner.conf"
81
80
 
82
81
const char *argp_program_version = "plugin-runner " VERSION;
348
347
 
349
348
int main(int argc, char *argv[]){
350
349
  char *plugindir = NULL;
351
 
  char *pluginhelperdir = NULL;
352
350
  char *argfile = NULL;
353
351
  FILE *conffp;
354
352
  struct dirent **direntries = NULL;
416
414
      .doc = "Group ID the plugins will run as", .group = 3 },
417
415
    { .name = "debug", .key = 132,
418
416
      .doc = "Debug mode", .group = 4 },
419
 
    { .name = "plugin-helper-dir", .key = 133,
420
 
      .arg = "DIRECTORY",
421
 
      .doc = "Specify a different plugin helper directory",
422
 
      .group = 2 },
423
417
    /*
424
418
     * These reproduce what we would get without ARGP_NO_HELP
425
419
     */
551
545
    case 132:                   /* --debug */
552
546
      debug = true;
553
547
      break;
554
 
    case 133:                   /* --plugin-helper-dir */
555
 
      free(pluginhelperdir);
556
 
      pluginhelperdir = strdup(arg);
557
 
      if(pluginhelperdir != NULL){
558
 
        errno = 0;
559
 
      }
560
 
      break;
561
548
      /*
562
549
       * These reproduce what we would get without ARGP_NO_HELP
563
550
       */
614
601
    case 130:                   /* --userid */
615
602
    case 131:                   /* --groupid */
616
603
    case 132:                   /* --debug */
617
 
    case 133:                   /* --plugin-helper-dir */
618
604
    case '?':                   /* --help */
619
605
    case -3:                    /* --usage */
620
606
    case 'V':                   /* --version */
701
687
        custom_argc += 1;
702
688
        {
703
689
          char **new_argv = realloc(custom_argv, sizeof(char *)
704
 
                                    * ((size_t)custom_argc + 1));
 
690
                                    * ((unsigned int)
 
691
                                       custom_argc + 1));
705
692
          if(new_argv == NULL){
706
693
            error(0, errno, "realloc");
707
694
            exitstatus = EX_OSERR;
774
761
    goto fallback;
775
762
  }
776
763
  
777
 
  {
778
 
    char *pluginhelperenv;
779
 
    bool bret = true;
780
 
    ret = asprintf(&pluginhelperenv, "MANDOSPLUGINHELPERDIR=%s",
781
 
                   pluginhelperdir != NULL ? pluginhelperdir : PHDIR);
782
 
    if(ret != -1){
783
 
      bret = add_environment(getplugin(NULL), pluginhelperenv, true);
784
 
    }
785
 
    if(ret == -1 or not bret){
786
 
      error(0, errno, "Failed to set MANDOSPLUGINHELPERDIR"
787
 
            " environment variable to \"%s\" for all plugins\n",
788
 
            pluginhelperdir != NULL ? pluginhelperdir : PHDIR);
789
 
    }
790
 
    if(ret != -1){
791
 
      free(pluginhelperenv);
792
 
    }
793
 
  }
794
 
  
795
764
  if(debug){
796
765
    for(plugin *p = plugin_list; p != NULL; p=p->next){
797
766
      fprintf(stderr, "Plugin: %s has %d arguments\n",
826
795
          }
827
796
        }
828
797
      }
829
 
      close(plugindir_fd);
 
798
      TEMP_FAILURE_RETRY(close(plugindir_fd));
830
799
    }
831
800
  }
832
801
  
924
893
    ret = (int)TEMP_FAILURE_RETRY(fstat(plugin_fd, &st));
925
894
    if(ret == -1){
926
895
      error(0, errno, "stat");
927
 
      close(plugin_fd);
 
896
      TEMP_FAILURE_RETRY(close(plugin_fd));
928
897
      free(direntries[i]);
929
898
      continue;
930
899
    }
939
908
                plugindir != NULL ? plugindir : PDIR,
940
909
                direntries[i]->d_name);
941
910
      }
942
 
      close(plugin_fd);
 
911
      TEMP_FAILURE_RETRY(close(plugin_fd));
943
912
      free(direntries[i]);
944
913
      continue;
945
914
    }
947
916
    plugin *p = getplugin(direntries[i]->d_name);
948
917
    if(p == NULL){
949
918
      error(0, errno, "getplugin");
950
 
      close(plugin_fd);
 
919
      TEMP_FAILURE_RETRY(close(plugin_fd));
951
920
      free(direntries[i]);
952
921
      continue;
953
922
    }
956
925
        fprintf(stderr, "Ignoring disabled plugin \"%s\"\n",
957
926
                direntries[i]->d_name);
958
927
      }
959
 
      close(plugin_fd);
 
928
      TEMP_FAILURE_RETRY(close(plugin_fd));
960
929
      free(direntries[i]);
961
930
      continue;
962
931
    }
1002
971
    if(pipefd[0] >= FD_SETSIZE){
1003
972
      fprintf(stderr, "pipe()[0] (%d) >= FD_SETSIZE (%d)", pipefd[0],
1004
973
              FD_SETSIZE);
1005
 
      close(pipefd[0]);
1006
 
      close(pipefd[1]);
 
974
      TEMP_FAILURE_RETRY(close(pipefd[0]));
 
975
      TEMP_FAILURE_RETRY(close(pipefd[1]));
1007
976
      exitstatus = EX_OSERR;
1008
977
      free(direntries[i]);
1009
978
      goto fallback;
1013
982
    ret = set_cloexec_flag(pipefd[0]);
1014
983
    if(ret < 0){
1015
984
      error(0, errno, "set_cloexec_flag");
1016
 
      close(pipefd[0]);
1017
 
      close(pipefd[1]);
 
985
      TEMP_FAILURE_RETRY(close(pipefd[0]));
 
986
      TEMP_FAILURE_RETRY(close(pipefd[1]));
1018
987
      exitstatus = EX_OSERR;
1019
988
      free(direntries[i]);
1020
989
      goto fallback;
1022
991
    ret = set_cloexec_flag(pipefd[1]);
1023
992
    if(ret < 0){
1024
993
      error(0, errno, "set_cloexec_flag");
1025
 
      close(pipefd[0]);
1026
 
      close(pipefd[1]);
 
994
      TEMP_FAILURE_RETRY(close(pipefd[0]));
 
995
      TEMP_FAILURE_RETRY(close(pipefd[1]));
1027
996
      exitstatus = EX_OSERR;
1028
997
      free(direntries[i]);
1029
998
      goto fallback;
1048
1017
      error(0, errno, "fork");
1049
1018
      TEMP_FAILURE_RETRY(sigprocmask(SIG_UNBLOCK,
1050
1019
                                     &sigchld_action.sa_mask, NULL));
1051
 
      close(pipefd[0]);
1052
 
      close(pipefd[1]);
 
1020
      TEMP_FAILURE_RETRY(close(pipefd[0]));
 
1021
      TEMP_FAILURE_RETRY(close(pipefd[1]));
1053
1022
      exitstatus = EX_OSERR;
1054
1023
      free(direntries[i]);
1055
1024
      goto fallback;
1083
1052
      /* no return */
1084
1053
    }
1085
1054
    /* Parent process */
1086
 
    close(pipefd[1]);           /* Close unused write end of pipe */
1087
 
    close(plugin_fd);
 
1055
    TEMP_FAILURE_RETRY(close(pipefd[1])); /* Close unused write end of
 
1056
                                             pipe */
 
1057
    TEMP_FAILURE_RETRY(close(plugin_fd));
1088
1058
    plugin *new_plugin = getplugin(direntries[i]->d_name);
1089
1059
    if(new_plugin == NULL){
1090
1060
      error(0, errno, "getplugin");
1136
1106
  
1137
1107
  free(direntries);
1138
1108
  direntries = NULL;
1139
 
  close(dir_fd);
 
1109
  TEMP_FAILURE_RETRY(close(dir_fd));
1140
1110
  dir_fd = -1;
1141
1111
  free_plugin(getplugin(NULL));
1142
1112
  
1340
1310
  free(direntries);
1341
1311
  
1342
1312
  if(dir_fd != -1){
1343
 
    close(dir_fd);
 
1313
    TEMP_FAILURE_RETRY(close(dir_fd));
1344
1314
  }
1345
1315
  
1346
1316
  /* Kill the processes */
1366
1336
  free_plugin_list();
1367
1337
  
1368
1338
  free(plugindir);
1369
 
  free(pluginhelperdir);
1370
1339
  free(argfile);
1371
1340
  
1372
1341
  return exitstatus;