Aleksander Machniak
2016-01-21 8ef598b88385cbe9322174c0c63118a082609748
Fix (again) security issue in DBMail driver of password plugin [CVE-2015-2181] (#1490643)

Unify the C program code with the one used by other drivers.
3 files modified
38 ■■■■ changed files
CHANGELOG 1 ●●●● patch | view | raw | blame | history
plugins/password/drivers/dbmail.php 15 ●●●● patch | view | raw | blame | history
plugins/password/helpers/chgdbmailusers.c 22 ●●●●● patch | view | raw | blame | history
CHANGELOG
@@ -16,6 +16,7 @@
- Fix PHP7 warning "session_start(): Session callback expects true/false return value" (#1490624)
- Fix XSS issue in SVG images handling (#1490625)
- Fix missing language name in "Add to Dictionary" request in HTML mode (#1490634)
- Fix (again) security issue in DBMail driver of password plugin [CVE-2015-2181] (#1490643)
RELEASE 1.2-beta
----------------
plugins/password/drivers/dbmail.php
@@ -40,20 +40,9 @@
        $args     = rcmail::get_instance()->config->get('password_dbmail_args', '');
        $command  = "$curdir/chgdbmailusers -c $username -w $password $args";
        if (strlen($command) > 1024) {
            rcube::raise_error(array(
                'code' => 600,
                'type' => 'php',
                'file' => __FILE__, 'line' => __LINE__,
                'message' => "Password plugin: The command is too long."
                ), true, false);
        exec($command, $output, $return_value);
            return PASSWORD_ERROR;
        }
        exec($command, $output, $returnvalue);
        if ($returnvalue == 0) {
        if ($return_value == 0) {
            return PASSWORD_SUCCESS;
        }
        else {
plugins/password/helpers/chgdbmailusers.c
@@ -1,5 +1,4 @@
#include <stdio.h>
#include <string.h>
#include <unistd.h>
// set the UID this script will run as (root user)
@@ -15,27 +14,10 @@
main(int argc, char *argv[])
{
  int cnt,rc,cc;
  char cmnd[1024];
  strcpy(cmnd, CMD);
  if (argc > 1)
  {
    for (cnt = 1; cnt < argc; cnt++)
    {
      strcat(cmnd, " ");
      strcat(cmnd, argv[cnt]);
    }
  }
  else
  {
    fprintf(stderr, "__ %s:  failed %d  %d\n", argv[0], rc, cc);
    return 255;
  }
  int rc, cc;
  cc = setuid(UID);
  rc = system(cmnd);
  rc = execvp(CMD, argv);
  if ((rc != 0) || (cc != 0))
  {