1f65b2180SDag-Erling Smørgrav /*- 2f65b2180SDag-Erling Smørgrav * Copyright (c) 2001 Networks Associates Technology, Inc. 3f65b2180SDag-Erling Smørgrav * All rights reserved. 4f65b2180SDag-Erling Smørgrav * 5f65b2180SDag-Erling Smørgrav * This software was developed for the FreeBSD Project by ThinkSec AS and 6f65b2180SDag-Erling Smørgrav * NAI Labs, the Security Research Division of Network Associates, Inc. 7f65b2180SDag-Erling Smørgrav * under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the 8f65b2180SDag-Erling Smørgrav * DARPA CHATS research program. 9f65b2180SDag-Erling Smørgrav * 10f65b2180SDag-Erling Smørgrav * Redistribution and use in source and binary forms, with or without 11f65b2180SDag-Erling Smørgrav * modification, are permitted provided that the following conditions 12f65b2180SDag-Erling Smørgrav * are met: 13f65b2180SDag-Erling Smørgrav * 1. Redistributions of source code must retain the above copyright 14f65b2180SDag-Erling Smørgrav * notice, this list of conditions and the following disclaimer. 15f65b2180SDag-Erling Smørgrav * 2. Redistributions in binary form must reproduce the above copyright 16f65b2180SDag-Erling Smørgrav * notice, this list of conditions and the following disclaimer in the 17f65b2180SDag-Erling Smørgrav * documentation and/or other materials provided with the distribution. 18f65b2180SDag-Erling Smørgrav * 3. The name of the author may not be used to endorse or promote 19f65b2180SDag-Erling Smørgrav * products derived from this software without specific prior written 20f65b2180SDag-Erling Smørgrav * permission. 21f65b2180SDag-Erling Smørgrav * 22f65b2180SDag-Erling Smørgrav * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 23f65b2180SDag-Erling Smørgrav * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24f65b2180SDag-Erling Smørgrav * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25f65b2180SDag-Erling Smørgrav * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 26f65b2180SDag-Erling Smørgrav * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27f65b2180SDag-Erling Smørgrav * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28f65b2180SDag-Erling Smørgrav * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29f65b2180SDag-Erling Smørgrav * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30f65b2180SDag-Erling Smørgrav * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31f65b2180SDag-Erling Smørgrav * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32f65b2180SDag-Erling Smørgrav * SUCH DAMAGE. 33f65b2180SDag-Erling Smørgrav */ 34f65b2180SDag-Erling Smørgrav 35f65b2180SDag-Erling Smørgrav #include <sys/cdefs.h> 36f65b2180SDag-Erling Smørgrav __FBSDID("$FreeBSD$"); 37f65b2180SDag-Erling Smørgrav 38f65b2180SDag-Erling Smørgrav #include <sys/types.h> 39f65b2180SDag-Erling Smørgrav #include <sys/wait.h> 40f65b2180SDag-Erling Smørgrav 41f65b2180SDag-Erling Smørgrav #include <errno.h> 42f65b2180SDag-Erling Smørgrav #include <stdlib.h> 43f65b2180SDag-Erling Smørgrav #include <string.h> 44f65b2180SDag-Erling Smørgrav #include <unistd.h> 45f65b2180SDag-Erling Smørgrav 46f65b2180SDag-Erling Smørgrav #include <security/pam_appl.h> 47f65b2180SDag-Erling Smørgrav #include <security/pam_modules.h> 48f65b2180SDag-Erling Smørgrav #include <security/openpam.h> 49f65b2180SDag-Erling Smørgrav 50f65b2180SDag-Erling Smørgrav static int 51f65b2180SDag-Erling Smørgrav _pam_exec(pam_handle_t *pamh __unused, int flags __unused, 52f65b2180SDag-Erling Smørgrav int argc, const char *argv[]) 53f65b2180SDag-Erling Smørgrav { 54f65b2180SDag-Erling Smørgrav int childerr, status; 55f65b2180SDag-Erling Smørgrav pid_t pid; 56f65b2180SDag-Erling Smørgrav 57f65b2180SDag-Erling Smørgrav if (argc < 1) 58f65b2180SDag-Erling Smørgrav return (PAM_SERVICE_ERR); 59f65b2180SDag-Erling Smørgrav 60f65b2180SDag-Erling Smørgrav /* 61f65b2180SDag-Erling Smørgrav * XXX For additional credit, divert child's stdin/stdout/stderr 62f65b2180SDag-Erling Smørgrav * to the conversation function. 63f65b2180SDag-Erling Smørgrav */ 64f65b2180SDag-Erling Smørgrav childerr = 0; 65f65b2180SDag-Erling Smørgrav if ((pid = vfork()) == 0) { 66f65b2180SDag-Erling Smørgrav execv(argv[0], argv); 67f65b2180SDag-Erling Smørgrav childerr = errno; 68f65b2180SDag-Erling Smørgrav _exit(1); 69f65b2180SDag-Erling Smørgrav } else if (pid == -1) { 70f65b2180SDag-Erling Smørgrav openpam_log(PAM_LOG_ERROR, "vfork(): %m"); 71f65b2180SDag-Erling Smørgrav return (PAM_SYSTEM_ERR); 72f65b2180SDag-Erling Smørgrav } 73f65b2180SDag-Erling Smørgrav if (waitpid(pid, &status, 0) == -1) { 74f65b2180SDag-Erling Smørgrav openpam_log(PAM_LOG_ERROR, "waitpid(): %m"); 75f65b2180SDag-Erling Smørgrav return (PAM_SYSTEM_ERR); 76f65b2180SDag-Erling Smørgrav } 77f65b2180SDag-Erling Smørgrav if (childerr != 0) { 78f65b2180SDag-Erling Smørgrav openpam_log(PAM_LOG_ERROR, "execv(): %m"); 79f65b2180SDag-Erling Smørgrav return (PAM_SYSTEM_ERR); 80f65b2180SDag-Erling Smørgrav } 81f65b2180SDag-Erling Smørgrav if (WIFSIGNALED(status)) { 82f65b2180SDag-Erling Smørgrav openpam_log(PAM_LOG_ERROR, "%s caught signal %d%s", 83f65b2180SDag-Erling Smørgrav argv[0], WTERMSIG(status), 84f65b2180SDag-Erling Smørgrav WCOREDUMP(status) ? " (core dumped)" : ""); 85f65b2180SDag-Erling Smørgrav return (PAM_SYSTEM_ERR); 86f65b2180SDag-Erling Smørgrav } 87f65b2180SDag-Erling Smørgrav if (!WIFEXITED(status)) { 88f65b2180SDag-Erling Smørgrav openpam_log(PAM_LOG_ERROR, "unknown status 0x%x", status); 89f65b2180SDag-Erling Smørgrav return (PAM_SYSTEM_ERR); 90f65b2180SDag-Erling Smørgrav } 91f65b2180SDag-Erling Smørgrav if (WEXITSTATUS(status) != 0) { 92f65b2180SDag-Erling Smørgrav openpam_log(PAM_LOG_ERROR, "%s returned code %d", 93f65b2180SDag-Erling Smørgrav argv[0], WEXITSTATUS(status)); 94f65b2180SDag-Erling Smørgrav return (PAM_SYSTEM_ERR); 95f65b2180SDag-Erling Smørgrav } 96f65b2180SDag-Erling Smørgrav return (PAM_SUCCESS); 97f65b2180SDag-Erling Smørgrav } 98f65b2180SDag-Erling Smørgrav 99f65b2180SDag-Erling Smørgrav PAM_EXTERN int 100f65b2180SDag-Erling Smørgrav pam_sm_authenticate(pam_handle_t *pamh, int flags, 101f65b2180SDag-Erling Smørgrav int argc, const char *argv[]) 102f65b2180SDag-Erling Smørgrav { 103f65b2180SDag-Erling Smørgrav 104f65b2180SDag-Erling Smørgrav return (_pam_exec(pamh, flags, argc, argv)); 105f65b2180SDag-Erling Smørgrav } 106f65b2180SDag-Erling Smørgrav 107f65b2180SDag-Erling Smørgrav PAM_EXTERN int 108f65b2180SDag-Erling Smørgrav pam_sm_setcred(pam_handle_t *pamh, int flags, 109f65b2180SDag-Erling Smørgrav int argc, const char *argv[]) 110f65b2180SDag-Erling Smørgrav { 111f65b2180SDag-Erling Smørgrav 112f65b2180SDag-Erling Smørgrav return (_pam_exec(pamh, flags, argc, argv)); 113f65b2180SDag-Erling Smørgrav } 114f65b2180SDag-Erling Smørgrav 115f65b2180SDag-Erling Smørgrav PAM_EXTERN int 116f65b2180SDag-Erling Smørgrav pam_sm_acct_mgmt(pam_handle_t *pamh, int flags, 117f65b2180SDag-Erling Smørgrav int argc, const char *argv[]) 118f65b2180SDag-Erling Smørgrav { 119f65b2180SDag-Erling Smørgrav 120f65b2180SDag-Erling Smørgrav return (_pam_exec(pamh, flags, argc, argv)); 121f65b2180SDag-Erling Smørgrav } 122f65b2180SDag-Erling Smørgrav 123f65b2180SDag-Erling Smørgrav PAM_EXTERN int 124f65b2180SDag-Erling Smørgrav pam_sm_open_session(pam_handle_t *pamh, int flags, 125f65b2180SDag-Erling Smørgrav int argc, const char *argv[]) 126f65b2180SDag-Erling Smørgrav { 127f65b2180SDag-Erling Smørgrav 128f65b2180SDag-Erling Smørgrav return (_pam_exec(pamh, flags, argc, argv)); 129f65b2180SDag-Erling Smørgrav } 130f65b2180SDag-Erling Smørgrav 131f65b2180SDag-Erling Smørgrav PAM_EXTERN int 132f65b2180SDag-Erling Smørgrav pam_sm_close_session(pam_handle_t *pamh, int flags, 133f65b2180SDag-Erling Smørgrav int argc, const char *argv[]) 134f65b2180SDag-Erling Smørgrav { 135f65b2180SDag-Erling Smørgrav 136f65b2180SDag-Erling Smørgrav return (_pam_exec(pamh, flags, argc, argv)); 137f65b2180SDag-Erling Smørgrav } 138f65b2180SDag-Erling Smørgrav 139f65b2180SDag-Erling Smørgrav PAM_EXTERN int 140f65b2180SDag-Erling Smørgrav pam_sm_chauthtok(pam_handle_t *pamh, int flags, 141f65b2180SDag-Erling Smørgrav int argc, const char *argv[]) 142f65b2180SDag-Erling Smørgrav { 143f65b2180SDag-Erling Smørgrav 144f65b2180SDag-Erling Smørgrav return (_pam_exec(pamh, flags, argc, argv)); 145f65b2180SDag-Erling Smørgrav } 146f65b2180SDag-Erling Smørgrav 147f65b2180SDag-Erling Smørgrav PAM_MODULE_ENTRY("pam_exec"); 148