URL: https://github.com/SSSD/sssd/pull/5709
Author: elkoniu
 Title: #5709: General: Hardeninig getenv() usage
Action: opened

PR body:
"""
Pointer returned by getenv() should be cached locally before
it is passed down to sub functions.

This PR fixes this for:
* pam_sm_authenticate()
* sysdb_ldb_connect()
* files_init_file_sources()

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1977830
"""

To pull the PR as Git branch:
git remote add ghsssd https://github.com/SSSD/sssd
git fetch ghsssd pull/5709/head:pr5709
git checkout pr5709
From fff571c34dec909b882a0018327c51b06b025050 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pawe=C5=82=20Po=C5=82awski?= <ppola...@redhat.com>
Date: Tue, 13 Jul 2021 00:40:30 +0200
Subject: [PATCH] General: Hardeninig getenv() usage

Pointer returned by getenv() should be cached locally before
it is passed down to sub functions.

This PR fixes this for:
* pam_sm_authenticate()
* sysdb_ldb_connect()
* files_init_file_sources()

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1977830
---
 src/db/sysdb_init.c              | 28 ++++++++++++++++++++++------
 src/providers/files/files_init.c |  6 ++++++
 src/sss_client/pam_sss_gss.c     | 17 ++++++++++++-----
 3 files changed, 40 insertions(+), 11 deletions(-)

diff --git a/src/db/sysdb_init.c b/src/db/sysdb_init.c
index 1f47e03a35..3be15dc06a 100644
--- a/src/db/sysdb_init.c
+++ b/src/db/sysdb_init.c
@@ -51,25 +51,36 @@ errno_t sysdb_ldb_connect(TALLOC_CTX *mem_ctx,
                           int flags,
                           struct ldb_context **_ldb)
 {
+    TALLOC_CTX *tmp_ctx = NULL;
     int ret;
     struct ldb_context *ldb;
     const char *mod_path;
 
+    tmp_ctx = talloc_new(NULL);
+    if (tmp_ctx == NULL) {
+        ret = ENOMEM;
+        goto done;
+    }
+
     if (_ldb == NULL) {
-        return EINVAL;
+        ret = EINVAL;
+        goto done;
     }
 
     ldb = ldb_init(mem_ctx, NULL);
     if (!ldb) {
-        return EIO;
+        ret = EIO;
+        goto done;
     }
 
     ret = ldb_set_debug(ldb, ldb_debug_messages, NULL);
     if (ret != LDB_SUCCESS) {
-        return EIO;
+        ret = EIO;
+        goto done;
     }
 
-    mod_path = getenv(LDB_MODULES_PATH);
+    /* getenv() returns pointer to external memory, which may change */
+    mod_path = talloc_strdup(tmp_ctx, getenv(LDB_MODULES_PATH));
     if (mod_path != NULL) {
         DEBUG(SSSDBG_TRACE_ALL, "Setting ldb module path to [%s].\n", mod_path);
         ldb_set_modules_dir(ldb, mod_path);
@@ -77,12 +88,17 @@ errno_t sysdb_ldb_connect(TALLOC_CTX *mem_ctx,
 
     ret = ldb_connect(ldb, filename, flags, NULL);
     if (ret != LDB_SUCCESS) {
-        return EIO;
+        ret = EIO;
+        goto done;
     }
 
     *_ldb = ldb;
 
-    return EOK;
+    ret = EOK;
+
+done:
+    talloc_free(tmp_ctx);
+    return ret;
 }
 
 static errno_t sysdb_ldb_reconnect(TALLOC_CTX *mem_ctx,
diff --git a/src/providers/files/files_init.c b/src/providers/files/files_init.c
index 1ce4bcf272..7926787138 100644
--- a/src/providers/files/files_init.c
+++ b/src/providers/files/files_init.c
@@ -60,6 +60,9 @@ static errno_t files_init_file_sources(TALLOC_CTX *mem_ctx,
     } else {
         dfl_passwd_files = DEFAULT_PASSWD_FILE;
     }
+
+    /* getenv() returns pointer to external memory, which may change */
+    dfl_passwd_files = talloc_strdup(tmp_ctx, dfl_passwd_files);
     DEBUG(SSSDBG_TRACE_FUNC,
           "Using default passwd file: [%s].\n", dfl_passwd_files);
 
@@ -72,6 +75,9 @@ static errno_t files_init_file_sources(TALLOC_CTX *mem_ctx,
     } else {
         env_group_files = DEFAULT_GROUP_FILE;
     }
+
+    /* getenv() returns pointer to external memory, which may change */
+    env_group_files = talloc_strdup(tmp_ctx, env_group_files);
     DEBUG(SSSDBG_TRACE_FUNC,
           "Using default group file: [%s].\n", DEFAULT_GROUP_FILE);
 
diff --git a/src/sss_client/pam_sss_gss.c b/src/sss_client/pam_sss_gss.c
index 51be36ecea..494f90b8bd 100644
--- a/src/sss_client/pam_sss_gss.c
+++ b/src/sss_client/pam_sss_gss.c
@@ -30,6 +30,7 @@
 #include <sys/types.h>
 #include <sys/syslog.h>
 #include <unistd.h>
+#include <string.h>
 
 #include "util/sss_format.h"
 #include "sss_client/sss_cli.h"
@@ -492,9 +493,9 @@ int pam_sm_authenticate(pam_handle_t *pamh,
                         int argc,
                         const char **argv)
 {
-    const char *pam_service;
-    const char *pam_user;
-    const char *ccache;
+    const char *pam_service = NULL;
+    const char *pam_user = NULL;
+    const char *ccache = NULL;
     char *username = NULL;
     char *domain = NULL;
     char *target = NULL;
@@ -511,9 +512,14 @@ int pam_sm_authenticate(pam_handle_t *pamh,
         }
     }
 
-
     /* Get non-default ccache if specified, may be NULL. */
-    ccache = getenv("KRB5CCNAME");
+    /* getenv() returns pointer to external memory, which may change */
+    ccache = strdup(getenv("KRB5CCNAME"));
+    if (NULL == ccache) {
+        ERROR(pamh, "Out of memory!");
+        ret = ENOMEM;
+        goto done;
+    }
 
     uid = getuid();
     euid = geteuid();
@@ -566,6 +572,7 @@ int pam_sm_authenticate(pam_handle_t *pamh,
     free(domain);
     free(target);
     free(upn);
+    free(ccache);
 
     return errno_to_pam(pamh, ret);
 }
_______________________________________________
sssd-devel mailing list -- sssd-devel@lists.fedorahosted.org
To unsubscribe send an email to sssd-devel-le...@lists.fedorahosted.org
Fedora Code of Conduct: 
https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: 
https://lists.fedorahosted.org/archives/list/sssd-devel@lists.fedorahosted.org
Do not reply to spam on the list, report it: 
https://pagure.io/fedora-infrastructure

Reply via email to