2003-05-10 11:28:02 +02:00
|
|
|
/*-
|
|
|
|
* Copyright (c) 2002 Networks Associates Technology, Inc.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* This software was developed for the FreeBSD Project by ThinkSec AS and
|
|
|
|
* NAI Labs, the Security Research Division of Network Associates, Inc.
|
|
|
|
* under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the
|
|
|
|
* DARPA CHATS research program.
|
2000-06-12 08:38:54 +02:00
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
*
|
2003-05-10 11:28:02 +02:00
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
1999-12-30 05:08:44 +01:00
|
|
|
*/
|
2004-06-01 03:28:20 +02:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2003,2004 Damien Miller <djm@mindrot.org>
|
|
|
|
* Copyright (c) 2003,2004 Darren Tucker <dtucker@zip.com.au>
|
|
|
|
*
|
|
|
|
* Permission to use, copy, modify, and distribute this software for any
|
|
|
|
* purpose with or without fee is hereby granted, provided that the above
|
|
|
|
* copyright notice and this permission notice appear in all copies.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
|
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
|
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
|
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
|
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
|
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
|
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
*/
|
1999-12-30 05:08:44 +01:00
|
|
|
|
2016-01-27 07:45:56 +01:00
|
|
|
/* Based on FreeBSD: src/crypto/openssh/auth2-pam-freebsd.c,v 1.11 2003/03/31 13:48:18 des */
|
|
|
|
|
1999-12-30 05:08:44 +01:00
|
|
|
#include "includes.h"
|
2006-03-15 04:42:54 +01:00
|
|
|
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <sys/wait.h>
|
2006-07-13 00:45:14 +02:00
|
|
|
|
|
|
|
#include <errno.h>
|
2006-03-15 04:42:54 +01:00
|
|
|
#include <signal.h>
|
2006-09-01 07:38:36 +02:00
|
|
|
#include <stdarg.h>
|
2020-01-20 11:09:27 +01:00
|
|
|
#include <stdlib.h>
|
2006-07-24 06:51:00 +02:00
|
|
|
#include <string.h>
|
|
|
|
#include <unistd.h>
|
1999-12-30 05:08:44 +01:00
|
|
|
|
|
|
|
#ifdef USE_PAM
|
2004-01-02 08:01:30 +01:00
|
|
|
#if defined(HAVE_SECURITY_PAM_APPL_H)
|
2003-05-10 11:28:02 +02:00
|
|
|
#include <security/pam_appl.h>
|
2004-01-02 08:01:30 +01:00
|
|
|
#elif defined (HAVE_PAM_PAM_APPL_H)
|
|
|
|
#include <pam/pam_appl.h>
|
|
|
|
#endif
|
2003-05-10 11:28:02 +02:00
|
|
|
|
2016-08-16 05:30:56 +02:00
|
|
|
#if !defined(SSHD_PAM_SERVICE)
|
|
|
|
extern char *__progname;
|
|
|
|
# define SSHD_PAM_SERVICE __progname
|
|
|
|
#endif
|
|
|
|
|
2005-05-26 11:59:48 +02:00
|
|
|
/* OpenGroup RFC86.0 and XSSO specify no "const" on arguments */
|
|
|
|
#ifdef PAM_SUN_CODEBASE
|
2016-05-20 02:01:58 +02:00
|
|
|
# define sshpam_const /* Solaris, HP-UX, SunOS */
|
2005-05-26 11:59:48 +02:00
|
|
|
#else
|
2016-05-20 02:01:58 +02:00
|
|
|
# define sshpam_const const /* LinuxPAM, OpenPAM, AIX */
|
2005-05-26 11:59:48 +02:00
|
|
|
#endif
|
|
|
|
|
2006-08-05 04:43:32 +02:00
|
|
|
/* Ambiguity in spec: is it an array of pointers or a pointer to an array? */
|
|
|
|
#ifdef PAM_SUN_CODEBASE
|
|
|
|
# define PAM_MSG_MEMBER(msg, n, member) ((*(msg))[(n)].member)
|
|
|
|
#else
|
|
|
|
# define PAM_MSG_MEMBER(msg, n, member) ((msg)[(n)]->member)
|
|
|
|
#endif
|
|
|
|
|
2006-08-05 06:07:20 +02:00
|
|
|
#include "xmalloc.h"
|
2018-07-10 11:39:52 +02:00
|
|
|
#include "sshbuf.h"
|
|
|
|
#include "ssherr.h"
|
2006-08-05 06:07:20 +02:00
|
|
|
#include "hostfile.h"
|
2002-04-04 21:02:28 +02:00
|
|
|
#include "auth.h"
|
2001-02-07 02:58:33 +01:00
|
|
|
#include "auth-pam.h"
|
2001-01-22 06:34:40 +01:00
|
|
|
#include "canohost.h"
|
2003-05-10 11:28:02 +02:00
|
|
|
#include "log.h"
|
|
|
|
#include "msg.h"
|
|
|
|
#include "packet.h"
|
2004-05-13 09:29:35 +02:00
|
|
|
#include "misc.h"
|
2003-05-10 11:28:02 +02:00
|
|
|
#include "servconf.h"
|
|
|
|
#include "ssh2.h"
|
2003-08-25 05:08:49 +02:00
|
|
|
#include "auth-options.h"
|
2020-01-23 11:06:45 +01:00
|
|
|
#include "misc.h"
|
2006-08-05 06:07:20 +02:00
|
|
|
#ifdef GSSAPI
|
|
|
|
#include "ssh-gss.h"
|
|
|
|
#endif
|
|
|
|
#include "monitor_wrap.h"
|
1999-12-30 05:08:44 +01:00
|
|
|
|
2003-05-14 07:11:48 +02:00
|
|
|
extern ServerOptions options;
|
2018-07-10 11:39:52 +02:00
|
|
|
extern struct sshbuf *loginmsg;
|
2004-04-18 03:00:26 +02:00
|
|
|
extern u_int utmp_len;
|
2003-05-14 07:11:48 +02:00
|
|
|
|
2005-05-25 08:18:09 +02:00
|
|
|
/* so we don't silently change behaviour */
|
2003-05-10 11:28:02 +02:00
|
|
|
#ifdef USE_POSIX_THREADS
|
2005-05-25 08:18:09 +02:00
|
|
|
# error "USE_POSIX_THREADS replaced by UNSUPPORTED_POSIX_THREADS_HACK"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Formerly known as USE_POSIX_THREADS, using this is completely unsupported
|
|
|
|
* and generally a bad idea. Use at own risk and do not expect support if
|
|
|
|
* this breaks.
|
|
|
|
*/
|
|
|
|
#ifdef UNSUPPORTED_POSIX_THREADS_HACK
|
2003-05-10 11:28:02 +02:00
|
|
|
#include <pthread.h>
|
|
|
|
/*
|
2003-11-21 13:48:55 +01:00
|
|
|
* Avoid namespace clash when *not* using pthreads for systems *with*
|
|
|
|
* pthreads, which unconditionally define pthread_t via sys/types.h
|
2003-05-10 11:28:02 +02:00
|
|
|
* (e.g. Linux)
|
|
|
|
*/
|
2003-11-21 13:48:55 +01:00
|
|
|
typedef pthread_t sp_pthread_t;
|
2003-05-10 11:28:02 +02:00
|
|
|
#else
|
2004-01-13 12:35:58 +01:00
|
|
|
typedef pid_t sp_pthread_t;
|
2018-09-13 04:13:50 +02:00
|
|
|
#define pthread_exit fake_pthread_exit
|
|
|
|
#define pthread_create fake_pthread_create
|
|
|
|
#define pthread_cancel fake_pthread_cancel
|
|
|
|
#define pthread_join fake_pthread_join
|
2004-01-13 12:35:58 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
struct pam_ctxt {
|
|
|
|
sp_pthread_t pam_thread;
|
|
|
|
int pam_psock;
|
|
|
|
int pam_csock;
|
|
|
|
int pam_done;
|
|
|
|
};
|
|
|
|
|
|
|
|
static void sshpam_free_ctx(void *);
|
|
|
|
static struct pam_ctxt *cleanup_ctxt;
|
|
|
|
|
2005-05-25 08:18:09 +02:00
|
|
|
#ifndef UNSUPPORTED_POSIX_THREADS_HACK
|
2003-05-10 11:28:02 +02:00
|
|
|
/*
|
|
|
|
* Simulate threads with processes.
|
|
|
|
*/
|
2000-05-31 03:20:11 +02:00
|
|
|
|
2004-01-14 12:14:04 +01:00
|
|
|
static int sshpam_thread_status = -1;
|
2020-01-23 11:06:45 +01:00
|
|
|
static sshsig_t sshpam_oldsig;
|
2004-01-14 12:14:04 +01:00
|
|
|
|
2005-07-17 09:04:47 +02:00
|
|
|
static void
|
2004-01-14 12:14:04 +01:00
|
|
|
sshpam_sigchld_handler(int sig)
|
|
|
|
{
|
2020-01-23 08:10:22 +01:00
|
|
|
ssh_signal(SIGCHLD, SIG_DFL);
|
2004-01-14 13:07:56 +01:00
|
|
|
if (cleanup_ctxt == NULL)
|
|
|
|
return; /* handler called after PAM cleanup, shouldn't happen */
|
2004-05-24 03:55:36 +02:00
|
|
|
if (waitpid(cleanup_ctxt->pam_thread, &sshpam_thread_status, WNOHANG)
|
2005-07-17 09:18:49 +02:00
|
|
|
<= 0) {
|
2004-05-24 03:55:36 +02:00
|
|
|
/* PAM thread has not exitted, privsep slave must have */
|
|
|
|
kill(cleanup_ctxt->pam_thread, SIGTERM);
|
2016-07-22 06:06:36 +02:00
|
|
|
while (waitpid(cleanup_ctxt->pam_thread,
|
|
|
|
&sshpam_thread_status, 0) == -1) {
|
|
|
|
if (errno == EINTR)
|
|
|
|
continue;
|
|
|
|
return;
|
|
|
|
}
|
2004-05-24 03:55:36 +02:00
|
|
|
}
|
2004-01-14 12:14:04 +01:00
|
|
|
if (WIFSIGNALED(sshpam_thread_status) &&
|
|
|
|
WTERMSIG(sshpam_thread_status) == SIGTERM)
|
|
|
|
return; /* terminated by pthread_cancel */
|
|
|
|
if (!WIFEXITED(sshpam_thread_status))
|
2007-08-10 06:32:34 +02:00
|
|
|
sigdie("PAM: authentication thread exited unexpectedly");
|
2004-01-14 12:14:04 +01:00
|
|
|
if (WEXITSTATUS(sshpam_thread_status) != 0)
|
2007-08-10 06:32:34 +02:00
|
|
|
sigdie("PAM: authentication thread exited uncleanly");
|
2004-01-14 12:14:04 +01:00
|
|
|
}
|
|
|
|
|
2006-07-24 06:51:00 +02:00
|
|
|
/* ARGSUSED */
|
2003-05-10 11:28:02 +02:00
|
|
|
static void
|
2006-07-24 06:51:00 +02:00
|
|
|
pthread_exit(void *value)
|
2003-05-10 11:28:02 +02:00
|
|
|
{
|
|
|
|
_exit(0);
|
|
|
|
}
|
1999-12-30 05:08:44 +01:00
|
|
|
|
2006-07-24 06:51:00 +02:00
|
|
|
/* ARGSUSED */
|
2003-05-10 11:28:02 +02:00
|
|
|
static int
|
2006-07-24 06:51:00 +02:00
|
|
|
pthread_create(sp_pthread_t *thread, const void *attr,
|
2003-05-10 11:28:02 +02:00
|
|
|
void *(*thread_start)(void *), void *arg)
|
|
|
|
{
|
|
|
|
pid_t pid;
|
2005-07-16 03:33:06 +02:00
|
|
|
struct pam_ctxt *ctx = arg;
|
2003-05-10 11:28:02 +02:00
|
|
|
|
2004-03-04 10:03:54 +01:00
|
|
|
sshpam_thread_status = -1;
|
2003-05-10 11:28:02 +02:00
|
|
|
switch ((pid = fork())) {
|
|
|
|
case -1:
|
|
|
|
error("fork(): %s", strerror(errno));
|
2019-06-07 06:26:54 +02:00
|
|
|
return errno;
|
2003-05-10 11:28:02 +02:00
|
|
|
case 0:
|
2005-07-16 03:33:06 +02:00
|
|
|
close(ctx->pam_psock);
|
|
|
|
ctx->pam_psock = -1;
|
2003-05-10 11:28:02 +02:00
|
|
|
thread_start(arg);
|
|
|
|
_exit(1);
|
|
|
|
default:
|
|
|
|
*thread = pid;
|
2005-07-16 03:33:06 +02:00
|
|
|
close(ctx->pam_csock);
|
|
|
|
ctx->pam_csock = -1;
|
2020-01-23 08:10:22 +01:00
|
|
|
sshpam_oldsig = ssh_signal(SIGCHLD, sshpam_sigchld_handler);
|
2003-05-10 11:28:02 +02:00
|
|
|
return (0);
|
|
|
|
}
|
|
|
|
}
|
1999-12-30 05:08:44 +01:00
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
static int
|
|
|
|
pthread_cancel(sp_pthread_t thread)
|
2000-12-03 01:51:51 +01:00
|
|
|
{
|
2020-01-23 08:10:22 +01:00
|
|
|
ssh_signal(SIGCHLD, sshpam_oldsig);
|
2003-05-10 11:28:02 +02:00
|
|
|
return (kill(thread, SIGTERM));
|
2000-12-03 01:51:51 +01:00
|
|
|
}
|
|
|
|
|
2006-07-24 06:51:00 +02:00
|
|
|
/* ARGSUSED */
|
2003-05-10 11:28:02 +02:00
|
|
|
static int
|
2006-07-24 06:51:00 +02:00
|
|
|
pthread_join(sp_pthread_t thread, void **value)
|
2000-12-03 01:51:51 +01:00
|
|
|
{
|
2003-05-10 11:28:02 +02:00
|
|
|
int status;
|
|
|
|
|
2004-01-14 12:14:04 +01:00
|
|
|
if (sshpam_thread_status != -1)
|
|
|
|
return (sshpam_thread_status);
|
2020-01-23 08:10:22 +01:00
|
|
|
ssh_signal(SIGCHLD, sshpam_oldsig);
|
2016-07-22 06:06:36 +02:00
|
|
|
while (waitpid(thread, &status, 0) == -1) {
|
|
|
|
if (errno == EINTR)
|
|
|
|
continue;
|
|
|
|
fatal("%s: waitpid: %s", __func__, strerror(errno));
|
|
|
|
}
|
2003-05-10 11:28:02 +02:00
|
|
|
return (status);
|
2000-12-03 01:51:51 +01:00
|
|
|
}
|
2003-05-10 11:28:02 +02:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
2003-09-23 14:12:38 +02:00
|
|
|
static pam_handle_t *sshpam_handle = NULL;
|
|
|
|
static int sshpam_err = 0;
|
|
|
|
static int sshpam_authenticated = 0;
|
|
|
|
static int sshpam_session_open = 0;
|
|
|
|
static int sshpam_cred_established = 0;
|
2003-12-18 05:34:31 +01:00
|
|
|
static int sshpam_account_status = -1;
|
2016-07-18 01:33:25 +02:00
|
|
|
static int sshpam_maxtries_reached = 0;
|
2003-11-17 11:41:42 +01:00
|
|
|
static char **sshpam_env = NULL;
|
2004-03-30 12:57:57 +02:00
|
|
|
static Authctxt *sshpam_authctxt = NULL;
|
2004-05-30 12:43:59 +02:00
|
|
|
static const char *sshpam_password = NULL;
|
2019-01-20 00:22:18 +01:00
|
|
|
static char *sshpam_rhost = NULL;
|
|
|
|
static char *sshpam_laddr = NULL;
|
2003-05-10 11:28:02 +02:00
|
|
|
|
2003-11-17 11:41:42 +01:00
|
|
|
/* Some PAM implementations don't implement this */
|
|
|
|
#ifndef HAVE_PAM_GETENVLIST
|
|
|
|
static char **
|
|
|
|
pam_getenvlist(pam_handle_t *pamh)
|
|
|
|
{
|
|
|
|
/*
|
2019-06-07 16:10:59 +02:00
|
|
|
* XXX - If necessary, we can still support environment passing
|
2003-11-17 11:41:42 +01:00
|
|
|
* for platforms without pam_getenvlist by searching for known
|
|
|
|
* env vars (e.g. KRB5CCNAME) from the PAM environment.
|
|
|
|
*/
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2019-05-17 05:14:12 +02:00
|
|
|
#ifndef HAVE_PAM_PUTENV
|
|
|
|
static int
|
|
|
|
pam_putenv(pam_handle_t *pamh, const char *name_value)
|
|
|
|
{
|
|
|
|
return PAM_SUCCESS;
|
|
|
|
}
|
|
|
|
#endif /* HAVE_PAM_PUTENV */
|
|
|
|
|
2004-08-16 15:12:05 +02:00
|
|
|
/*
|
|
|
|
* Some platforms, notably Solaris, do not enforce password complexity
|
|
|
|
* rules during pam_chauthtok() if the real uid of the calling process
|
|
|
|
* is 0, on the assumption that it's being called by "passwd" run by root.
|
|
|
|
* This wraps pam_chauthtok and sets/restore the real uid so PAM will do
|
|
|
|
* the right thing.
|
|
|
|
*/
|
|
|
|
#ifdef SSHPAM_CHAUTHTOK_NEEDS_RUID
|
|
|
|
static int
|
|
|
|
sshpam_chauthtok_ruid(pam_handle_t *pamh, int flags)
|
|
|
|
{
|
|
|
|
int result;
|
|
|
|
|
|
|
|
if (sshpam_authctxt == NULL)
|
|
|
|
fatal("PAM: sshpam_authctxt not initialized");
|
|
|
|
if (setreuid(sshpam_authctxt->pw->pw_uid, -1) == -1)
|
|
|
|
fatal("%s: setreuid failed: %s", __func__, strerror(errno));
|
|
|
|
result = pam_chauthtok(pamh, flags);
|
|
|
|
if (setreuid(0, -1) == -1)
|
|
|
|
fatal("%s: setreuid failed: %s", __func__, strerror(errno));
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
# define pam_chauthtok(a,b) (sshpam_chauthtok_ruid((a), (b)))
|
|
|
|
#endif
|
|
|
|
|
2020-01-20 12:13:26 +01:00
|
|
|
static void
|
2004-06-19 04:54:38 +02:00
|
|
|
sshpam_password_change_required(int reqd)
|
2003-12-18 05:34:31 +01:00
|
|
|
{
|
2018-03-03 06:21:20 +01:00
|
|
|
extern struct sshauthopt *auth_opts;
|
|
|
|
static int saved_port, saved_agent, saved_x11;
|
|
|
|
|
2004-01-14 14:15:07 +01:00
|
|
|
debug3("%s %d", __func__, reqd);
|
2004-03-30 12:57:57 +02:00
|
|
|
if (sshpam_authctxt == NULL)
|
2004-03-08 13:04:06 +01:00
|
|
|
fatal("%s: PAM authctxt not initialized", __func__);
|
2004-03-30 12:57:57 +02:00
|
|
|
sshpam_authctxt->force_pwchange = reqd;
|
2003-12-18 05:34:31 +01:00
|
|
|
if (reqd) {
|
2018-03-03 06:21:20 +01:00
|
|
|
saved_port = auth_opts->permit_port_forwarding_flag;
|
|
|
|
saved_agent = auth_opts->permit_agent_forwarding_flag;
|
|
|
|
saved_x11 = auth_opts->permit_x11_forwarding_flag;
|
|
|
|
auth_opts->permit_port_forwarding_flag = 0;
|
|
|
|
auth_opts->permit_agent_forwarding_flag = 0;
|
|
|
|
auth_opts->permit_x11_forwarding_flag = 0;
|
2003-12-18 05:34:31 +01:00
|
|
|
} else {
|
2018-03-03 06:21:20 +01:00
|
|
|
if (saved_port)
|
|
|
|
auth_opts->permit_port_forwarding_flag = saved_port;
|
|
|
|
if (saved_agent)
|
|
|
|
auth_opts->permit_agent_forwarding_flag = saved_agent;
|
|
|
|
if (saved_x11)
|
|
|
|
auth_opts->permit_x11_forwarding_flag = saved_x11;
|
2003-12-18 05:34:31 +01:00
|
|
|
}
|
|
|
|
}
|
2004-02-10 03:23:28 +01:00
|
|
|
|
2003-11-17 11:41:42 +01:00
|
|
|
/* Import regular and PAM environment from subprocess */
|
|
|
|
static void
|
2018-07-10 11:39:52 +02:00
|
|
|
import_environments(struct sshbuf *b)
|
2003-11-17 11:41:42 +01:00
|
|
|
{
|
|
|
|
char *env;
|
2018-07-10 11:39:52 +02:00
|
|
|
u_int n, i, num_env;
|
|
|
|
int r;
|
2003-11-17 11:41:42 +01:00
|
|
|
|
2004-01-14 14:15:07 +01:00
|
|
|
debug3("PAM: %s entering", __func__);
|
|
|
|
|
2005-05-25 08:18:09 +02:00
|
|
|
#ifndef UNSUPPORTED_POSIX_THREADS_HACK
|
2003-12-18 05:34:31 +01:00
|
|
|
/* Import variables set by do_pam_account */
|
2018-07-10 11:39:52 +02:00
|
|
|
if ((r = sshbuf_get_u32(b, &n)) != 0)
|
|
|
|
fatal("%s: buffer error: %s", __func__, ssh_err(r));
|
|
|
|
if (n > INT_MAX)
|
|
|
|
fatal("%s: invalid PAM account status %u", __func__, n);
|
|
|
|
sshpam_account_status = (int)n;
|
|
|
|
if ((r = sshbuf_get_u32(b, &n)) != 0)
|
|
|
|
fatal("%s: buffer error: %s", __func__, ssh_err(r));
|
|
|
|
sshpam_password_change_required(n != 0);
|
2003-12-18 05:34:31 +01:00
|
|
|
|
2003-11-17 11:41:42 +01:00
|
|
|
/* Import environment from subprocess */
|
2018-07-10 11:39:52 +02:00
|
|
|
if ((r = sshbuf_get_u32(b, &num_env)) != 0)
|
|
|
|
fatal("%s: buffer error: %s", __func__, ssh_err(r));
|
2006-05-04 08:24:34 +02:00
|
|
|
if (num_env > 1024)
|
|
|
|
fatal("%s: received %u environment variables, expected <= 1024",
|
|
|
|
__func__, num_env);
|
|
|
|
sshpam_env = xcalloc(num_env + 1, sizeof(*sshpam_env));
|
2003-11-17 11:41:42 +01:00
|
|
|
debug3("PAM: num env strings %d", num_env);
|
2018-07-10 11:39:52 +02:00
|
|
|
for(i = 0; i < num_env; i++) {
|
|
|
|
if ((r = sshbuf_get_cstring(b, &(sshpam_env[i]), NULL)) != 0)
|
|
|
|
fatal("%s: buffer error: %s", __func__, ssh_err(r));
|
|
|
|
}
|
2003-11-17 11:41:42 +01:00
|
|
|
sshpam_env[num_env] = NULL;
|
|
|
|
|
|
|
|
/* Import PAM environment from subprocess */
|
2018-07-10 11:39:52 +02:00
|
|
|
if ((r = sshbuf_get_u32(b, &num_env)) != 0)
|
|
|
|
fatal("%s: buffer error: %s", __func__, ssh_err(r));
|
2003-11-17 11:41:42 +01:00
|
|
|
debug("PAM: num PAM env strings %d", num_env);
|
2018-07-10 11:39:52 +02:00
|
|
|
for (i = 0; i < num_env; i++) {
|
|
|
|
if ((r = sshbuf_get_cstring(b, &env, NULL)) != 0)
|
|
|
|
fatal("%s: buffer error: %s", __func__, ssh_err(r));
|
2003-11-17 11:41:42 +01:00
|
|
|
/* Errors are not fatal here */
|
2018-07-10 11:39:52 +02:00
|
|
|
if ((r = pam_putenv(sshpam_handle, env)) != PAM_SUCCESS) {
|
2003-11-17 11:41:42 +01:00
|
|
|
error("PAM: pam_putenv: %s",
|
2018-07-10 11:39:52 +02:00
|
|
|
pam_strerror(sshpam_handle, r));
|
2003-11-17 11:41:42 +01:00
|
|
|
}
|
2020-06-26 08:07:12 +02:00
|
|
|
/*
|
|
|
|
* XXX this possibly leaks env because it is not documented
|
|
|
|
* what pam_putenv() does with it. Does it copy it? Does it
|
|
|
|
* take ownweship? We don't know, so it's safest just to leak.
|
|
|
|
*/
|
2003-11-17 11:41:42 +01:00
|
|
|
}
|
2004-03-04 09:54:10 +01:00
|
|
|
#endif
|
2003-11-17 11:41:42 +01:00
|
|
|
}
|
|
|
|
|
2000-09-16 07:09:27 +02:00
|
|
|
/*
|
2003-05-10 11:28:02 +02:00
|
|
|
* Conversation function for authentication thread.
|
2000-09-16 07:09:27 +02:00
|
|
|
*/
|
2003-05-10 11:28:02 +02:00
|
|
|
static int
|
2005-05-26 11:59:48 +02:00
|
|
|
sshpam_thread_conv(int n, sshpam_const struct pam_message **msg,
|
2003-08-25 05:08:49 +02:00
|
|
|
struct pam_response **resp, void *data)
|
1999-12-30 05:08:44 +01:00
|
|
|
{
|
2018-07-10 11:39:52 +02:00
|
|
|
struct sshbuf *buffer;
|
2003-05-10 11:28:02 +02:00
|
|
|
struct pam_ctxt *ctxt;
|
2003-09-23 14:12:38 +02:00
|
|
|
struct pam_response *reply;
|
2018-07-10 11:39:52 +02:00
|
|
|
int r, i;
|
|
|
|
u_char status;
|
2003-05-10 11:28:02 +02:00
|
|
|
|
2004-02-17 10:46:59 +01:00
|
|
|
debug3("PAM: %s entering, %d messages", __func__, n);
|
2003-09-23 14:12:38 +02:00
|
|
|
*resp = NULL;
|
|
|
|
|
2004-06-30 12:34:31 +02:00
|
|
|
if (data == NULL) {
|
|
|
|
error("PAM: conversation function passed a null context");
|
|
|
|
return (PAM_CONV_ERR);
|
|
|
|
}
|
2003-05-10 11:28:02 +02:00
|
|
|
ctxt = data;
|
|
|
|
if (n <= 0 || n > PAM_MAX_NUM_MSG)
|
|
|
|
return (PAM_CONV_ERR);
|
2003-09-23 14:12:38 +02:00
|
|
|
|
2006-05-04 08:24:34 +02:00
|
|
|
if ((reply = calloc(n, sizeof(*reply))) == NULL)
|
2018-07-10 11:39:52 +02:00
|
|
|
return PAM_CONV_ERR;
|
|
|
|
if ((buffer = sshbuf_new()) == NULL) {
|
|
|
|
free(reply);
|
|
|
|
return PAM_CONV_ERR;
|
|
|
|
}
|
2003-09-23 14:12:38 +02:00
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
for (i = 0; i < n; ++i) {
|
|
|
|
switch (PAM_MSG_MEMBER(msg, i, msg_style)) {
|
|
|
|
case PAM_PROMPT_ECHO_OFF:
|
|
|
|
case PAM_PROMPT_ECHO_ON:
|
2018-07-10 11:39:52 +02:00
|
|
|
if ((r = sshbuf_put_cstring(buffer,
|
|
|
|
PAM_MSG_MEMBER(msg, i, msg))) != 0)
|
|
|
|
fatal("%s: buffer error: %s",
|
|
|
|
__func__, ssh_err(r));
|
2003-11-21 13:48:55 +01:00
|
|
|
if (ssh_msg_send(ctxt->pam_csock,
|
2018-07-10 11:39:52 +02:00
|
|
|
PAM_MSG_MEMBER(msg, i, msg_style), buffer) == -1)
|
2003-11-17 11:27:55 +01:00
|
|
|
goto fail;
|
2018-07-10 11:39:52 +02:00
|
|
|
|
|
|
|
if (ssh_msg_recv(ctxt->pam_csock, buffer) == -1)
|
2003-11-17 11:27:55 +01:00
|
|
|
goto fail;
|
2018-07-10 11:39:52 +02:00
|
|
|
if ((r = sshbuf_get_u8(buffer, &status)) != 0)
|
|
|
|
fatal("%s: buffer error: %s",
|
|
|
|
__func__, ssh_err(r));
|
|
|
|
if (status != PAM_AUTHTOK)
|
2003-05-10 11:28:02 +02:00
|
|
|
goto fail;
|
2018-07-10 11:39:52 +02:00
|
|
|
if ((r = sshbuf_get_cstring(buffer,
|
|
|
|
&reply[i].resp, NULL)) != 0)
|
|
|
|
fatal("%s: buffer error: %s",
|
|
|
|
__func__, ssh_err(r));
|
2003-05-10 11:28:02 +02:00
|
|
|
break;
|
|
|
|
case PAM_ERROR_MSG:
|
|
|
|
case PAM_TEXT_INFO:
|
2018-07-10 11:39:52 +02:00
|
|
|
if ((r = sshbuf_put_cstring(buffer,
|
|
|
|
PAM_MSG_MEMBER(msg, i, msg))) != 0)
|
|
|
|
fatal("%s: buffer error: %s",
|
|
|
|
__func__, ssh_err(r));
|
2003-11-21 13:48:55 +01:00
|
|
|
if (ssh_msg_send(ctxt->pam_csock,
|
2018-07-10 11:39:52 +02:00
|
|
|
PAM_MSG_MEMBER(msg, i, msg_style), buffer) == -1)
|
2003-11-17 11:27:55 +01:00
|
|
|
goto fail;
|
2003-05-10 11:28:02 +02:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
goto fail;
|
1999-12-30 05:08:44 +01:00
|
|
|
}
|
2018-07-10 11:39:52 +02:00
|
|
|
sshbuf_reset(buffer);
|
1999-12-30 05:08:44 +01:00
|
|
|
}
|
2018-07-10 11:39:52 +02:00
|
|
|
sshbuf_free(buffer);
|
2003-09-23 14:12:38 +02:00
|
|
|
*resp = reply;
|
2003-05-10 11:28:02 +02:00
|
|
|
return (PAM_SUCCESS);
|
2003-09-23 14:12:38 +02:00
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
fail:
|
2003-09-23 14:12:38 +02:00
|
|
|
for(i = 0; i < n; i++) {
|
2013-06-02 00:07:31 +02:00
|
|
|
free(reply[i].resp);
|
2003-09-23 14:12:38 +02:00
|
|
|
}
|
2013-06-02 00:07:31 +02:00
|
|
|
free(reply);
|
2018-07-10 11:39:52 +02:00
|
|
|
sshbuf_free(buffer);
|
2003-05-10 11:28:02 +02:00
|
|
|
return (PAM_CONV_ERR);
|
|
|
|
}
|
1999-12-30 05:08:44 +01:00
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
/*
|
|
|
|
* Authentication thread.
|
|
|
|
*/
|
|
|
|
static void *
|
|
|
|
sshpam_thread(void *ctxtp)
|
|
|
|
{
|
|
|
|
struct pam_ctxt *ctxt = ctxtp;
|
2018-07-10 11:39:52 +02:00
|
|
|
struct sshbuf *buffer = NULL;
|
2003-09-02 15:12:06 +02:00
|
|
|
struct pam_conv sshpam_conv;
|
2018-07-10 11:39:52 +02:00
|
|
|
int r, flags = (options.permit_empty_passwd == 0 ?
|
2004-07-01 06:00:14 +02:00
|
|
|
PAM_DISALLOW_NULL_AUTHTOK : 0);
|
2005-05-25 08:18:09 +02:00
|
|
|
#ifndef UNSUPPORTED_POSIX_THREADS_HACK
|
2003-11-17 11:41:42 +01:00
|
|
|
extern char **environ;
|
|
|
|
char **env_from_pam;
|
|
|
|
u_int i;
|
2003-05-10 11:28:02 +02:00
|
|
|
const char *pam_user;
|
2005-05-26 11:59:48 +02:00
|
|
|
const char **ptr_pam_user = &pam_user;
|
2006-09-17 03:57:46 +02:00
|
|
|
char *tz = getenv("TZ");
|
2003-05-10 11:28:02 +02:00
|
|
|
|
2013-12-19 01:31:44 +01:00
|
|
|
sshpam_err = pam_get_item(sshpam_handle, PAM_USER,
|
2005-05-26 11:59:48 +02:00
|
|
|
(sshpam_const void **)ptr_pam_user);
|
2013-12-19 01:31:44 +01:00
|
|
|
if (sshpam_err != PAM_SUCCESS)
|
|
|
|
goto auth_fail;
|
2006-09-17 03:57:46 +02:00
|
|
|
|
2003-11-17 11:41:42 +01:00
|
|
|
environ[0] = NULL;
|
2006-09-17 03:57:46 +02:00
|
|
|
if (tz != NULL)
|
|
|
|
if (setenv("TZ", tz, 1) == -1)
|
|
|
|
error("PAM: could not set TZ environment: %s",
|
|
|
|
strerror(errno));
|
2004-07-21 12:54:47 +02:00
|
|
|
|
|
|
|
if (sshpam_authctxt != NULL) {
|
|
|
|
setproctitle("%s [pam]",
|
|
|
|
sshpam_authctxt->valid ? pam_user : "unknown");
|
|
|
|
}
|
2003-05-10 11:28:02 +02:00
|
|
|
#endif
|
1999-12-30 05:08:44 +01:00
|
|
|
|
2003-09-02 15:12:06 +02:00
|
|
|
sshpam_conv.conv = sshpam_thread_conv;
|
|
|
|
sshpam_conv.appdata_ptr = ctxt;
|
|
|
|
|
2004-03-30 12:57:57 +02:00
|
|
|
if (sshpam_authctxt == NULL)
|
2004-03-08 13:04:06 +01:00
|
|
|
fatal("%s: PAM authctxt not initialized", __func__);
|
|
|
|
|
2018-07-10 11:39:52 +02:00
|
|
|
if ((buffer = sshbuf_new()) == NULL)
|
|
|
|
fatal("%s: sshbuf_new failed", __func__);
|
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
sshpam_err = pam_set_item(sshpam_handle, PAM_CONV,
|
|
|
|
(const void *)&sshpam_conv);
|
|
|
|
if (sshpam_err != PAM_SUCCESS)
|
|
|
|
goto auth_fail;
|
2004-07-01 06:00:14 +02:00
|
|
|
sshpam_err = pam_authenticate(sshpam_handle, flags);
|
2016-07-18 01:33:25 +02:00
|
|
|
if (sshpam_err == PAM_MAXTRIES)
|
|
|
|
sshpam_set_maxtries_reached(1);
|
2003-05-10 11:28:02 +02:00
|
|
|
if (sshpam_err != PAM_SUCCESS)
|
|
|
|
goto auth_fail;
|
2003-12-18 05:34:31 +01:00
|
|
|
|
2017-03-29 00:50:54 +02:00
|
|
|
if (!do_pam_account()) {
|
|
|
|
sshpam_err = PAM_ACCT_EXPIRED;
|
|
|
|
goto auth_fail;
|
|
|
|
}
|
|
|
|
if (sshpam_authctxt->force_pwchange) {
|
|
|
|
sshpam_err = pam_chauthtok(sshpam_handle,
|
|
|
|
PAM_CHANGE_EXPIRED_AUTHTOK);
|
|
|
|
if (sshpam_err != PAM_SUCCESS)
|
2003-12-18 05:34:31 +01:00
|
|
|
goto auth_fail;
|
2017-03-29 00:50:54 +02:00
|
|
|
sshpam_password_change_required(0);
|
2003-12-18 06:08:59 +01:00
|
|
|
}
|
2003-12-18 05:34:31 +01:00
|
|
|
|
2018-07-10 11:39:52 +02:00
|
|
|
if ((r = sshbuf_put_cstring(buffer, "OK")) != 0)
|
|
|
|
fatal("%s: buffer error: %s", __func__, ssh_err(r));
|
2003-11-17 11:41:42 +01:00
|
|
|
|
2005-05-25 08:18:09 +02:00
|
|
|
#ifndef UNSUPPORTED_POSIX_THREADS_HACK
|
2003-12-18 05:34:31 +01:00
|
|
|
/* Export variables set by do_pam_account */
|
2018-07-10 11:39:52 +02:00
|
|
|
if ((r = sshbuf_put_u32(buffer, sshpam_account_status)) != 0 ||
|
|
|
|
(r = sshbuf_put_u32(buffer, sshpam_authctxt->force_pwchange)) != 0)
|
|
|
|
fatal("%s: buffer error: %s", __func__, ssh_err(r));
|
2003-12-18 05:34:31 +01:00
|
|
|
|
2003-11-17 11:41:42 +01:00
|
|
|
/* Export any environment strings set in child */
|
2018-07-10 11:39:52 +02:00
|
|
|
for (i = 0; environ[i] != NULL; i++) {
|
|
|
|
/* Count */
|
|
|
|
if (i > INT_MAX)
|
2019-06-07 16:10:59 +02:00
|
|
|
fatal("%s: too many environment strings", __func__);
|
2018-07-10 11:39:52 +02:00
|
|
|
}
|
|
|
|
if ((r = sshbuf_put_u32(buffer, i)) != 0)
|
|
|
|
fatal("%s: buffer error: %s", __func__, ssh_err(r));
|
|
|
|
for (i = 0; environ[i] != NULL; i++) {
|
|
|
|
if ((r = sshbuf_put_cstring(buffer, environ[i])) != 0)
|
|
|
|
fatal("%s: buffer error: %s", __func__, ssh_err(r));
|
|
|
|
}
|
2003-11-17 11:41:42 +01:00
|
|
|
/* Export any environment strings set by PAM in child */
|
|
|
|
env_from_pam = pam_getenvlist(sshpam_handle);
|
2018-07-10 11:39:52 +02:00
|
|
|
for (i = 0; env_from_pam != NULL && env_from_pam[i] != NULL; i++) {
|
|
|
|
/* Count */
|
|
|
|
if (i > INT_MAX)
|
2019-06-07 16:10:59 +02:00
|
|
|
fatal("%s: too many PAM environment strings", __func__);
|
2018-07-10 11:39:52 +02:00
|
|
|
}
|
|
|
|
if ((r = sshbuf_put_u32(buffer, i)) != 0)
|
|
|
|
fatal("%s: buffer error: %s", __func__, ssh_err(r));
|
|
|
|
for (i = 0; env_from_pam != NULL && env_from_pam[i] != NULL; i++) {
|
|
|
|
if ((r = sshbuf_put_cstring(buffer, env_from_pam[i])) != 0)
|
|
|
|
fatal("%s: buffer error: %s", __func__, ssh_err(r));
|
|
|
|
}
|
2005-05-25 08:18:09 +02:00
|
|
|
#endif /* UNSUPPORTED_POSIX_THREADS_HACK */
|
2003-11-17 11:41:42 +01:00
|
|
|
|
2003-11-17 11:27:55 +01:00
|
|
|
/* XXX - can't do much about an error here */
|
2018-07-10 11:39:52 +02:00
|
|
|
ssh_msg_send(ctxt->pam_csock, sshpam_err, buffer);
|
|
|
|
sshbuf_free(buffer);
|
2003-05-10 11:28:02 +02:00
|
|
|
pthread_exit(NULL);
|
|
|
|
|
|
|
|
auth_fail:
|
2018-07-10 11:39:52 +02:00
|
|
|
if ((r = sshbuf_put_cstring(buffer,
|
|
|
|
pam_strerror(sshpam_handle, sshpam_err))) != 0)
|
|
|
|
fatal("%s: buffer error: %s", __func__, ssh_err(r));
|
2003-11-17 11:27:55 +01:00
|
|
|
/* XXX - can't do much about an error here */
|
2006-05-15 09:22:33 +02:00
|
|
|
if (sshpam_err == PAM_ACCT_EXPIRED)
|
2018-07-10 11:39:52 +02:00
|
|
|
ssh_msg_send(ctxt->pam_csock, PAM_ACCT_EXPIRED, buffer);
|
2016-07-18 01:33:25 +02:00
|
|
|
else if (sshpam_maxtries_reached)
|
2018-07-10 11:39:52 +02:00
|
|
|
ssh_msg_send(ctxt->pam_csock, PAM_MAXTRIES, buffer);
|
2006-05-15 09:22:33 +02:00
|
|
|
else
|
2018-07-10 11:39:52 +02:00
|
|
|
ssh_msg_send(ctxt->pam_csock, PAM_AUTH_ERR, buffer);
|
|
|
|
sshbuf_free(buffer);
|
2003-05-10 11:28:02 +02:00
|
|
|
pthread_exit(NULL);
|
2003-11-21 13:56:47 +01:00
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
return (NULL); /* Avoid warning for non-pthread case */
|
1999-12-30 05:08:44 +01:00
|
|
|
}
|
|
|
|
|
2003-10-07 03:30:15 +02:00
|
|
|
void
|
|
|
|
sshpam_thread_cleanup(void)
|
1999-12-30 05:08:44 +01:00
|
|
|
{
|
2003-10-07 03:30:15 +02:00
|
|
|
struct pam_ctxt *ctxt = cleanup_ctxt;
|
|
|
|
|
2004-01-14 14:15:07 +01:00
|
|
|
debug3("PAM: %s entering", __func__);
|
2003-10-07 03:30:15 +02:00
|
|
|
if (ctxt != NULL && ctxt->pam_thread != 0) {
|
|
|
|
pthread_cancel(ctxt->pam_thread);
|
|
|
|
pthread_join(ctxt->pam_thread, NULL);
|
|
|
|
close(ctxt->pam_psock);
|
|
|
|
close(ctxt->pam_csock);
|
|
|
|
memset(ctxt, 0, sizeof(*ctxt));
|
|
|
|
cleanup_ctxt = NULL;
|
|
|
|
}
|
2003-05-10 11:28:02 +02:00
|
|
|
}
|
1999-12-30 05:08:44 +01:00
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
static int
|
2005-05-26 11:59:48 +02:00
|
|
|
sshpam_null_conv(int n, sshpam_const struct pam_message **msg,
|
2003-08-25 05:08:49 +02:00
|
|
|
struct pam_response **resp, void *data)
|
2003-05-10 11:28:02 +02:00
|
|
|
{
|
2004-02-17 10:46:59 +01:00
|
|
|
debug3("PAM: %s entering, %d messages", __func__, n);
|
2003-05-10 11:28:02 +02:00
|
|
|
return (PAM_CONV_ERR);
|
|
|
|
}
|
1999-12-30 05:08:44 +01:00
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
static struct pam_conv null_conv = { sshpam_null_conv, NULL };
|
|
|
|
|
2004-09-11 14:28:01 +02:00
|
|
|
static int
|
2005-05-26 11:59:48 +02:00
|
|
|
sshpam_store_conv(int n, sshpam_const struct pam_message **msg,
|
2004-09-11 14:28:01 +02:00
|
|
|
struct pam_response **resp, void *data)
|
|
|
|
{
|
|
|
|
struct pam_response *reply;
|
2018-07-10 11:39:52 +02:00
|
|
|
int r, i;
|
2004-09-11 14:28:01 +02:00
|
|
|
|
|
|
|
debug3("PAM: %s called with %d messages", __func__, n);
|
|
|
|
*resp = NULL;
|
|
|
|
|
|
|
|
if (n <= 0 || n > PAM_MAX_NUM_MSG)
|
|
|
|
return (PAM_CONV_ERR);
|
|
|
|
|
2006-05-04 08:24:34 +02:00
|
|
|
if ((reply = calloc(n, sizeof(*reply))) == NULL)
|
2004-09-11 14:28:01 +02:00
|
|
|
return (PAM_CONV_ERR);
|
|
|
|
|
|
|
|
for (i = 0; i < n; ++i) {
|
|
|
|
switch (PAM_MSG_MEMBER(msg, i, msg_style)) {
|
|
|
|
case PAM_ERROR_MSG:
|
|
|
|
case PAM_TEXT_INFO:
|
2018-07-10 11:39:52 +02:00
|
|
|
if ((r = sshbuf_putf(loginmsg, "%s\n",
|
|
|
|
PAM_MSG_MEMBER(msg, i, msg))) != 0)
|
|
|
|
fatal("%s: buffer error: %s",
|
|
|
|
__func__, ssh_err(r));
|
2004-09-11 14:28:01 +02:00
|
|
|
reply[i].resp_retcode = PAM_SUCCESS;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
goto fail;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*resp = reply;
|
|
|
|
return (PAM_SUCCESS);
|
|
|
|
|
|
|
|
fail:
|
|
|
|
for(i = 0; i < n; i++) {
|
2013-06-02 00:07:31 +02:00
|
|
|
free(reply[i].resp);
|
2004-09-11 14:28:01 +02:00
|
|
|
}
|
2013-06-02 00:07:31 +02:00
|
|
|
free(reply);
|
2004-09-11 14:28:01 +02:00
|
|
|
return (PAM_CONV_ERR);
|
|
|
|
}
|
|
|
|
|
|
|
|
static struct pam_conv store_conv = { sshpam_store_conv, NULL };
|
|
|
|
|
2003-10-07 03:30:15 +02:00
|
|
|
void
|
|
|
|
sshpam_cleanup(void)
|
2003-05-10 11:28:02 +02:00
|
|
|
{
|
2008-03-11 12:58:25 +01:00
|
|
|
if (sshpam_handle == NULL || (use_privsep && !mm_is_monitor()))
|
2003-09-23 14:12:38 +02:00
|
|
|
return;
|
2008-03-11 12:58:25 +01:00
|
|
|
debug("PAM: cleanup");
|
2003-05-10 11:28:02 +02:00
|
|
|
pam_set_item(sshpam_handle, PAM_CONV, (const void *)&null_conv);
|
|
|
|
if (sshpam_session_open) {
|
2008-03-11 12:58:25 +01:00
|
|
|
debug("PAM: closing session");
|
2003-05-10 11:28:02 +02:00
|
|
|
pam_close_session(sshpam_handle, PAM_SILENT);
|
|
|
|
sshpam_session_open = 0;
|
1999-12-30 05:08:44 +01:00
|
|
|
}
|
2009-07-12 14:07:21 +02:00
|
|
|
if (sshpam_cred_established) {
|
|
|
|
debug("PAM: deleting credentials");
|
|
|
|
pam_setcred(sshpam_handle, PAM_DELETE_CRED);
|
|
|
|
sshpam_cred_established = 0;
|
|
|
|
}
|
2004-02-10 03:23:28 +01:00
|
|
|
sshpam_authenticated = 0;
|
2003-05-10 11:28:02 +02:00
|
|
|
pam_end(sshpam_handle, sshpam_err);
|
|
|
|
sshpam_handle = NULL;
|
1999-12-30 05:08:44 +01:00
|
|
|
}
|
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
static int
|
2019-01-20 00:22:18 +01:00
|
|
|
sshpam_init(struct ssh *ssh, Authctxt *authctxt)
|
1999-12-30 05:08:44 +01:00
|
|
|
{
|
2019-01-20 00:22:18 +01:00
|
|
|
const char *pam_user, *user = authctxt->user;
|
2005-05-26 11:59:48 +02:00
|
|
|
const char **ptr_pam_user = &pam_user;
|
Merge 9.2 (#657)
* upstream: attemp FIDO key signing without PIN and use the error
code returned to fall back only if necessary. Avoids PIN prompts for FIDO
tokens that don't require them; part of GHPR#302
OpenBSD-Commit-ID: 4f752aaf9f2e7c28bcaaf3d4f8fc290131bd038e
* Install Cygwin packages based on OS not config.
* initial list of allowed signers
* upstream: whitespace
OpenBSD-Commit-ID: d297e4387935d4aef091c5e9432578c2e513f538
* upstream: whitespace
OpenBSD-Commit-ID: a5d015efbfd228dc598ffdef612d2da3a579e5d8
* Add cygwin-release test target.
This also moves the cygwin package install from the workflow file to
setup_ci.sh so that we can install different sets of Cygwin packages
for different test configs.
* Add Windows 2022 test targets.
* Add libcrypt-devel to cygwin-release deps.
Based on feedback from vinschen at redhat.com.
* cross-sign allowed_signers with PGP key
Provides continuity of trust from legacy PGP release key to
the SSHSIG signing keys that we will use henceforth for git
signing.
* additional keys
* upstream: whitespace
OpenBSD-Commit-ID: c2bcbf93610d3d62ed206cdf9bf9ff98c6aaf232
* Move sftp from valgrind-2 to 3 to rebalance.
* upstream: sk-usbhid: fix key_lookup() on tokens with built-in UV
explicitly test whether the token performs built-in UV (e.g. biometric
tokens) and enable UV in that case. From Pedro Martelletto via GHPR#388
OpenBSD-Commit-ID: 007eb7e387d27cf3029ab06b88224e03eca62ccd
* Remove arc4random_uniform from arc4random.c
This was previously moved into its own file (matching OpenBSD) which
prematurely committed in commit 73541f2.
* Move OPENBSD ORIGINAL marker.
Putting this after the copyright statement (which doesn't change)
instead of before the version identifier (which does) prevents merge
conflicts when resyncing changes.
* Resync arc4random with OpenBSD.
This brings us up to current, including djm's random-reseeding change,
as prompted by logan at cyberstorm.mu in bz#3467. It brings the
platform-specific hooks from LibreSSL Portable, simplified to match our
use case. ok djm@.
* Remove DEF_WEAK, it's already in defines.h.
* openbsd-compat/bsd-asprintf: add <stdio.h> include for vsnprintf
Fixes the following build failure with Clang 15 on musl:
```
bsd-asprintf.c:51:8: error: call to undeclared library function 'vsnprintf' with type 'int (char *, unsigned long, const char *, struct __va_list_tag *)'; ISO C99 and laterclang -O2 -pipe -fdiagnostics-color=always -frecord-gcc-switches -pipe -Wunknown-warning-option -Qunused-arguments -Wall -Wpointer-arith -Wuninitialized -Wsign-compare -Wformat-security -Wsizeof-pointer-memaccess -Wno-pointer-sign -Wno-unused-result -Wmisleading-indentation -Wbitwise-instead-of-logical -fno-strict-aliasing -mretpoline -ftrapv -fzero-call-used-regs=all -fno-builtin-memset -fstack-protector-strong -fPIE -I. -I. -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -D_DEFAULT_SOURCE -DSSHDIR=\"/etc/ssh\" -D_PATH_SSH_PROGRAM=\"/usr/bin/ssh\" -D_PATH_SSH_ASKPASS_DEFAULT=\"/usr/lib/misc/ssh-askpass\" -D_PATH_SFTP_SERVER=\"/usr/lib/misc/sftp-server\" -D_PATH_SSH_KEY_SIGN=\"/usr/lib/misc/ssh-keysign\" -D_PATH_SSH_PKCS11_HELPER=\"/usr/lib/misc/ssh-pkcs11-helper\" -D_PATH_SSH_SK_HELPER=\"/usr/lib/misc/ssh-sk-helper\" -D_PATH_SSH_PIDDIR=\"/run\" -D_PATH_PRIVSEP_CHROOT_DIR=\"/var/empty\" -DHAVE_CONFIG_H -c cipher-aes.c -o cipher-aes.o
do not support
implicit function declarations [-Wimplicit-function-declaration]
ret = vsnprintf(string, INIT_SZ, fmt, ap2);
^
bsd-asprintf.c:51:8: note: include the header <stdio.h> or explicitly provide a declaration for 'vsnprintf'
1 error generated.
```
* upstream: notifier_complete(NULL, ...) is a noop, so no need to test
that ctx!=NULL; from Corinna Vinschen
OpenBSD-Commit-ID: ade2f2e9cc519d01a586800c25621d910bce384a
* upstream: fix repeated words ok miod@ jmc@
OpenBSD-Commit-ID: 6765daefe26a6b648cc15cadbbe337596af709b7
* upstream: .Li -> .Vt where appropriate; from josiah frentsos,
tweaked by schwarze
ok schwarze
OpenBSD-Commit-ID: 565046e3ce68b46c2f440a93d67c2a92726de8ed
* upstream: ssh-agent: attempt FIDO key signing without PIN and use
the error to determine whether a PIN is required and prompt only if
necessary. from Corinna Vinschen
OpenBSD-Commit-ID: dd6be6a0b7148608e834ee737c3479b3270b00dd
* upstream: a little extra debugging
OpenBSD-Commit-ID: edf1601c1d0905f6da4c713f4d9cecc7d1c0295a
* upstream: sk_enroll: never drop SSH_SK_USER_VERIFICATION_REQD flag
from response
Now that all FIDO signing calls attempt first without PIN and then
fall back to trying PIN only if that attempt fails, we can remove the
hack^wtrick that removed the UV flag from the keys returned during
enroll.
By Corinna Vinschen
OpenBSD-Commit-ID: 684517608c8491503bf80cd175425f0178d91d7f
* upstream: sftp: Don't attempt to complete arguments for
non-existent commands
If user entered a non-existent command (e.g. because they made a
typo) there is no point in trying to complete its arguments. Skip
calling complete_match() if that's the case.
From Michal Privoznik
OpenBSD-Commit-ID: cf39c811a68cde2aeb98fc85addea4000ef6b07a
* upstream: sftp: Be a bit more clever about completions
There are commands (e.g. "get" or "put") that accept two
arguments, a local path and a remote path. However, the way
current completion is written doesn't take this distinction into
account and always completes remote or local paths.
By expanding CMD struct and "cmds" array this distinction can be
reflected and with small adjustment to completer code the correct
path can be completed.
By Michal Privoznik, ok dtucker@
OpenBSD-Commit-ID: 1396d921c4eb1befd531f5c4a8ab47e7a74b610b
* upstream: correct error value
OpenBSD-Commit-ID: 780efcbad76281f11f14b2a5ff04eb6db3dfdad4
* upstream: actually hook up restrict_websafe; the command-line flag
was never actually used. Spotted by Matthew Garrett
OpenBSD-Commit-ID: 0b363518ac4c2819dbaa3dfad4028633ab9cdff1
* upstream: Add a sshkey_check_rsa_length() call for checking the
length of an RSA key; ok markus@
OpenBSD-Commit-ID: de77cd5b11594297eda82edc594b0d32b8535134
* upstream: add a RequiredRSASize for checking RSA key length in
ssh(1). User authentication keys that fall beneath this limit will be
ignored. If a host presents a host key beneath this limit then the connection
will be terminated (unfortunately there are no fallbacks in the protocol for
host authentication).
feedback deraadt, Dmitry Belyavskiy; ok markus@
OpenBSD-Commit-ID: 430e339b2a79fa9ecc63f2837b06fdd88a7da13a
* upstream: Add RequiredRSASize for sshd(8); RSA keys that fall
beneath this limit will be ignored for user and host-based authentication.
Feedback deraadt@ ok markus@
OpenBSD-Commit-ID: 187931dfc19d51873df5930a04f2d972adf1f7f1
* upstream: better debugging for connect_next()
OpenBSD-Commit-ID: d16a307a0711499c971807f324484ed3a6036640
* upstream: sftp-server(8): add a "users-groups-by-id@openssh.com"
extension request that allows the client to obtain user/group names that
correspond to a set of uids/gids.
Will be used to make directory listings more useful and consistent
in sftp(1).
ok markus@
OpenBSD-Commit-ID: 7ebabde0bcb95ef949c4840fe89e697e30df47d3
* upstream: extend sftp-common.c:extend ls_file() to support supplied
user/group names; ok markus@
OpenBSD-Commit-ID: c70c70498b1fdcf158531117e405b6245863bfb0
* upstream: sftp client library support for
users-groups-by-id@openssh.com; ok markus@
OpenBSD-Commit-ID: ddb2f33a2da6349a9a89a8b5bcb9ca7c999394de
* upstream: use users-groups-by-id@openssh.com sftp-server extension
(when available) to fill in user/group names for directory listings.
Implement a client-side cache of see uid/gid=>user/group names. ok markus@
OpenBSD-Commit-ID: f239aeeadfa925a37ceee36ee8b256b8ccf4466e
* avoid Wuninitialized false positive in gcc-12ish
* no need for glob.h here
it also causes portability problems
* upstream: add RequiredRSASize to the list of keywords accepted by
-o; spotted by jmc@
OpenBSD-Commit-ID: fe871408cf6f9d3699afeda876f8adbac86a035e
* upstream: Fix typo. From AlexanderStohr via github PR#343.
OpenBSD-Commit-ID: a134c9b4039e48803fc6a87f955b0f4a03181497
* upstream: openssh-9.1
OpenBSD-Commit-ID: 5a467b2ee81da01a86adf1ad93b62b1728494e56
* crank versions in RPM spec files
* update release notes URL
* update .depend
* remove mention of --with-security-key-builtin
it is enabled by default when libfido2 is installed
* mention libfido2 autodetection
* whitespace at EOL
* Test commits to all branches of portable.
Only test OpenBSD upstream on commits to master since that's what it
tracks.
* Add 9.1 branch to CI status page.
* Add LibreSSL 3.6.0 to test suite.
While there, bump OpenSSL to latest 1.1.1q release.
* upstream: honour user's umask if it is more restrictive then the ssh
default (022); based on patch from Alex Henrie, ok dtucker@ deraadt@
OpenBSD-Commit-ID: fe1b9e15fc9a4f49fc338e848ce14d8727abe82d
* skip bsd-poll.h if poll.h found; ok dtucker
* Fix snprintf configure test for clang 15
Clang 15 -Wimplicit-int defaults to an error in C99 mode and above.
A handful of tests have "main(..." and not "int main(..." which caused
the tests to produce incorrect results.
* undef _get{short,long} before redefining
* revert c64b62338b4 and guard POLL* defines instead
c64b62338b4 broke OSX builds, which do have poll.h but lack ppoll(2)
Spotted by dtucker
* OpenSSL dev branch now identifies as 3.2.0.
* upstream: document "-O no-restrict-websafe"; spotted by Ross L
Richardson
OpenBSD-Commit-ID: fe9eaa50237693a14ebe5b5614bf32a02145fe8b
* upstream: ssh-agent.1: - use Nm not Xr for self-ref - while here,
wrap a long line
ssh-agent.c:
- add -O to usage()
OpenBSD-Commit-ID: 855dac4695cef22e96d69c53436496bc408ca389
* upstream: use correct type with sizeof ok djm@
OpenBSD-Commit-ID: d6c882c2e8a42ff831a5b3cbc2c961ecb2dd6143
* upstream: when scp(1) is using the SFTP protocol for transport (the
default), better match scp/rcp's handling of globs that don't match the
globbed characters but do match literally (e.g. trying to transfer
"foo.[1]").
Previously scp(1) in SFTP mode would not match these pathnames but
legacy scp/rcp mode would.
Reported by Michael Yagliyan in bz3488; ok dtucker@
OpenBSD-Commit-ID: d8a3773f53015ba811fddba7473769a2fd343e11
* upstream: regress test for unmatched glob characters; fails before
previous commit but passes now. bz3488; prodded by dtucker@
OpenBSD-Regress-ID: 0cc5cc9ea4a6fd170dc61b9212f15badaafb3bbd
* upstream: Be more paranoid with host/domain names coming from the
never write a name with bad characters to a known_hosts file.
reported by David Leadbeater, ok deraadt@
OpenBSD-Commit-ID: ba9b25fa8b5490b49398471e0c9657b0cbc7a5ad
* upstream: begin big refactor of sshkey
Move keytype data and some of the type-specific code (allocation,
cleanup, etc) out into each key type's implementation. Subsequent
commits will move more, with the goal of having each key-*.c file
owning as much of its keytype's implementation as possible.
lots of feedback + ok markus@
OpenBSD-Commit-ID: 0f2b4334f73914344e9e5b3d33522d41762a57ec
* upstream: factor out sshkey_equal_public()
feedback/ok markus@
OpenBSD-Commit-ID: 1368ba114cb37732fe6ec3d89c7e6d27ea6fdc94
* upstream: factor out public key serialization
feedback/ok markus@
OpenBSD-Commit-ID: a3570c4b97290c5662890aea7328d87f55939033
* upstream: refactor and simplify sshkey_read()
feedback/ok markus@
OpenBSD-Commit-ID: 0d93b7a56e31cd06a8bb0d2191d084ce254b0971
* upstream: factor out key generation
feedback/ok markus@
OpenBSD-Commit-ID: 5b4211bff4de8d9adb84bc72857a8c42c44e7ceb
* upstream: refactor sshkey_from_private()
feedback/ok markus@
OpenBSD-Commit-ID: e5dbe7a3545930c50f70ee75c867a1e08b382b53
* upstream: refactor sshkey_from_blob_internal()
feedback/ok markus@
OpenBSD-Commit-ID: 1f46c0cbb8060ee9666a02749594ad6658c8e283
* upstream: refactor sshkey_sign() and sshkey_verify()
feedback/ok markus@
OpenBSD-Commit-ID: 368e662c128c99d05cc043b1308d2b6c71a4d3cc
* upstream: refactor certify
feedback/ok markus@
OpenBSD-Commit-ID: 35d742992e223eaca3537e6fb3d3002c08eed4f6
* upstream: refactor sshkey_private_serialize_opt()
feedback/ok markus@
OpenBSD-Commit-ID: 61e0fe989897901294efe7c3b6d670cefaf44cbd
* upstream: refactor sshkey_private_deserialize
feedback/ok markus@
OpenBSD-Commit-ID: f5ca6932fdaf840a5e8250becb38315a29b5fc9f
* fix merge botch
* upstream: allow ssh-keyscan(1) to accept CIDR address ranges, e.g.
ssh-keyscan 192.168.0.0/24
If a CIDR range is passed, then it will be expanded to all possible
addresses in the range including the all-0s and all-1s addresses.
bz#976 feedback/ok markus@
OpenBSD-Commit-ID: ce6c5211f936ac0053fd4a2ddb415277931e6c4b
* upstream: put sshkey_check_rsa_length() back in sshkey.c to unbreak
OPENSSL=no builds
OpenBSD-Commit-ID: 99eec58abe382ecd14b14043b195ee1babb9cf6e
* OpenSSL dev branch is 302 not 320.
While there, also accept 301 which it shat it was previously.
* upstream: Use variable for diff options
instead of unconditionally specifying "-rN". This will make life easier
in -portable where not all diff's understand -N.
OpenBSD-Regress-ID: 8b8a407115546be1c6d72d350b1e4f1f960d3cd3
* Check for sockaddr_in.sin_len.
If found, set SOCK_HAS_LEN which is used in addr.c. Should fix keyscan
tests on platforms with this (eg old NetBSD).
* Always use compat getentropy.
Have it call native getentropy and fall back as required. Should fix
issues of platforms where libc has getentropy but it is not implemented
in the kernel. Based on github PR#354 from simsergey.
* Include time.h when defining timegm.
Fixes build on some platforms eg recent AIX.
* Compat tests need libcrypto.
This was moved to CHANNELLIBS during the libs refactor. Spotted by
rapier at psc.edu.
* Run compat regress tests too.
* Add tests for OpenSSL 3.0.7 and LibreSSL 3.6.1.
* Only run opensslver tests if built with OpenSSL.
* Increase selfhosted job timeout.
The default job timeout of 360 (6h) is not enough to complete the
regress tests for some of the slow VMs depending on the load on the host.
Increase to 600 (10h).
* Fix compat regress to work with non-GNU make.
* Link libssh into compat tests.
The cygwin compat code uses xmalloc, so add libssh.a so pick up that.
* Rerun tests on changes to Makefile.in in any dir.
* upstream: replace recently-added valid_domain() check for hostnames
going to known_hosts with a more relaxed check for bad characters; previous
commit broke address literals. Reported by/feedback from florian@
OpenBSD-Commit-ID: 10b86dc6a4b206adaa0c11b58b6d5933898d43e0
* Don't run openbsd-compat tests on Cygwin.
Add "compat-tests" to the default TEST_TARGET so we can override as
necessary. Override TEST_TARGET for Cygwin as the tests don't currently
compile there.
* Fix broken zlib link.
* configure.ac: Add <pty.h> include for openpty
Another Clang 16ish fix (which makes -Wimplicit-function-declaration
an error by default). github PR#355.
See: 2efd71da49b9cfeab7987058cf5919e473ff466b
See: be197635329feb839865fdc738e34e24afd1fca8
* configure.ac: Fix -Wstrict-prototypes
Clang 16 now warns on this and it'll be removed in C23, so let's
just be future proof. It also reduces noise when doing general
Clang 16 porting work (which is a big job as it is). github PR#355.
Signed-off-by: Sam James <sam@gentoo.org>
* Fix setres*id checks to work with clang-16.
glibc has the prototypes for setresuid and setresgid behind _GNU_SOURCE,
and clang 16 will error out on implicit function definitions, so add
_GNU_SOURCE and the required headers to the configure checks. From
sam at @gentoo.org via bz#3497.
* Fix tracing disable on FreeBSD.
Some versions of FreeBSD do not support using id 0 to refer to the
current pid for procctl, so pass getpid() explicitly. From
emaste at freebsd.org.
* Use "prohibit-password" in -portable comments.
"without-password" is the deprecated alias for "prohibit-password",
so we should reference the latter. From emaste at freebsd.org.
* Link to branch-specific queries for V_9_1 status.
* upstream: Fix typo. From pablomh via -portable github PR#344.
OpenBSD-Commit-ID: d056ee2e73691dc3ecdb44a6de68e6b88cd93827
* upstream: Import regenerated moduli.
OpenBSD-Commit-ID: b0e54ee4d703bd6929bbc624068666a7a42ecb1f
* Add CIFuzz integration
* Run cifuzz workflow on the actions as regular CI.
* Whitespace change to trigger CIFuzz workflow.
* Do not run CIFuzz on selfhosted tree.
We already run it on the regular tree, no need to double up.
* Add CIFuzz status badge.
* Branch-specific links for master status badges.
* Fix merge conflict.
* upstream: fix parsing of hex cert expiry time; was checking whether the
start time began with "0x", not the expiry time.
from Ed Maste
OpenBSD-Commit-ID: 6269242c3e1a130b47c92cfca4d661df15f05739
* upstream: Check for and disallow MaxStartups values less than or
equal to zero during config parsing, rather than faling later at runtime.
bz#3489, ok djm@
OpenBSD-Commit-ID: d79c2b7a8601eb9be493629a91245d761154308b
* upstream: Remove some set but otherwise unused variables, spotted
in -portable by clang 16's -Wunused-but-set-variable. ok djm@
OpenBSD-Commit-ID: 3d943ddf2369b38fbf89f5f19728e7dc1daf3982
* upstream: The IdentityFile option in ssh_config can also be used to
specify a public key file, as documented in ssh.1 for the -i option. Document
this also for IdentityFile in ssh_config.5, for documentation completeness.
From laalsaas at systemli.org via portable github PR#352, ok jmc@ djm@
OpenBSD-Commit-ID: 2f943be9f96e60ef81a9a4faa25b009999f9883b
* Split out rekey test since it runs the longest.
* Update checkout and upload actions.
Update actions/checkout and actions/upload-artifact to main branch for
compatibility with node.js v16.
* Add valrind-5 test here too.
* Run vm startup and shutdown from runner temp dir.
Should work even if the github workspace dir is on a stale sshfs mount.
* Shutdown any VM before trying to check out repo.
In the case where the previous run did not clean up, the checkout will
fail as it'll leave a stale mount.
* Avoid assuming layout of fd_set
POSIX doesn't specify the internal layout of the fd_set object, so let's
not assume it is just a bit mask. This increases compatibility with
systems that have a different layout.
The assumption is also worthless as we already refuse to use file
descriptors over FD_SETSIZE anyway. Meaning that the default size of
fd_set is quite sufficient.
* Fix comment text. From emaste at freebsd.org.
* Defer seed_rng until after closefrom call.
seed_rng will initialize OpenSSL, and some engine providers (eg Intel's
QAT) will open descriptors for their own use. bz#3483, patch from
joel.d.schuetze at intel.com, ok djm@
* upstream: typo in comment
OpenBSD-Commit-ID: 39c58f41e0f32d1ff31731fa6f5bbbc3ad25084a
* upstream: rename client_global_hostkeys_private_confirm() to
client_global_hostkeys_prove_confirm(), as it handles the
"hostkeys-prove00@openssh.com" message; no functional change
OpenBSD-Commit-ID: 31e09bd3cca6eed26855b88fb8beed18e9bd026d
* upstream: Remove errant colon and simplify format
string in error messages. Patch from vapier at chromium.org.
OpenBSD-Commit-ID: fc28466ebc7b74e0072331947a89bdd239c160d3
* upstream: Fix typo in fatal error message.
Patch from vapier at chromium.org.
OpenBSD-Commit-ID: 8a0c164a6a25eef0eedfc30df95bfa27644e35cf
* Skip reexec test on OpenSSL 1.1.1 specifically.
OpenSSL 1.1.1 has a bug in its RNG that breaks reexec fallback, so skip
that test. See bz#3483 for details.
* Remove seed passing over reexec.
This was added for the benefit of platforms using ssh-rand-helper to
prevent a delay on each connection as sshd reseeded itself.
ssh-random-helper is long gone, and since the re-exec happens before the
chroot the re-execed sshd can reseed itself normally. ok djm@
* upstream: Handle dynamic remote port forwarding in escape commandline's
-R processing. bz#3499, ok djm@
OpenBSD-Commit-ID: 194ee4cfe7ed0e2b8ad0727f493c798a50454208
* Add dfly62 test target.
* If we haven't found it yet, recheck for sys/stat.h.
On some very old platforms, sys/stat.h needs sys/types.h, however
autoconf 2.71's AC_CHECK_INCLUDES_DEFAULT checks for them in the
opposite order, which in combination with modern autoconf's
"present but cannot be compiled" behaviour causes it to not be
detected.
* Add fallback for old platforms w/out MAP_ANON.
* Remove explicit "default" test config argument.
Not specifying the test config implicitly selects default args.
* Remove unused self-hosted test targets.
* Rename "os" in matrix to "target".
This is in preparation to distinguish this from the host that the runner
runs on in case where they are separate (eg VMs).
* Add "libvirt" label to dfly30.
* Make "config" in matrix singular and pass in env.
This will allow the startup scripts to adapt their behaviour based on
the type and config.
* Run vmstartup from temp dir.
This will allow us to create ephemeral disk images per-runner.
* Rework how selfhosted tests interact with runners.
Previously there was one runner per test target (mostly VMs). This had
a few limitations:
- multiple tests that ran on the same target (eg multiple build
configs) were serialized on availability or that runner.
- it needed manual balancing of VMs over host machines.
To address this, make VMs that use ephemeral disks (ie most of them)
all use a pool of runners with the "libvirt" label. This requires that
we distinguish between "host" and "target" for those. Native runners
and VMs with persistent disks (eg the constantly-updated snapshot ones)
specify the same host and target.
This should improve test throughput.
* Skip unit tests on slow riscv64 hardware.
* Use -fzero-call-used-regs=used on clang 15.
clang 15 seems to have a problem with -fzero-call-used-reg=all which
causes spurious "incorrect signature" failures with ED25519. On those
versions, use -fzero-call-used-regs=used instead. (We may add exceptions
later if specific versions prove to be OK). Also move the GCC version
check to match.
Initial investigation by Daniel Pouzzner (douzzer at mega nu), workaround
suggested by Bill Wendling (morbo at google com). bz#3475, ok djm@
* upstream: In channel_request_remote_forwarding the parameters for
permission_set_add are leaked as they are also duplicated in the call. Found
by CodeChecker. ok djm
OpenBSD-Commit-ID: 4aef50fa9be7c0b138188814c8fe3dccc196f61e
* upstream: New EnableEscapeCommandline ssh_config(5) option
This option (default "no") controls whether the ~C escape is available.
Turning it off by default means we will soon be able to use a stricter
default pledge(2) in the client.
feedback deraadt@ dtucker@; tested in snaps for a while
OpenBSD-Commit-ID: 7e277595d60acb8263118dcb66554472257b387a
* upstream: tighten pledge(2) after session establishment
feedback, ok & testing in snaps deraadt@
OpenBSD-Commit-ID: aecf4d49d28586dfbcc74328d9333398fef9eb58
* upstream: Add void to client_repledge args to fix compiler warning. ok djm@
OpenBSD-Commit-ID: 7e964a641ce4a0a0a11f047953b29929d7a4b866
* upstream: Log output of ssh-agent and ssh-add
This should make debugging easier.
OpenBSD-Regress-ID: 5974b02651f428d7e1079b41304c498ca7e306c8
* upstream: Clean up ssh-add and ssh-agent logs.
OpenBSD-Regress-ID: 9eda8e4c3714d7f943ab2e73ed58a233bd29cd2c
* Restore ssh-agent permissions on exit.
...enough that subsequent builds can overwrite ssh-agent if necessary.
* upstream: make struct sshbuf private
and remove an unused field; ok dtucker
OpenBSD-Commit-ID: c7a3d77c0b8c153d463398606a8d57569186a0c3
* upstream: Remove duplicate includes.
Patch from AtariDreams via github PR#364.
OpenBSD-Commit-ID: b9186638a05cb8b56ef7c0de521922b6723644ea
* Fix typo in comment. Spotted by tim@
* Update autotools
Regenerate config files using latest autotools
* disable SANDBOX_SECCOMP_FILTER_DEBUG
It was mistakenly enabled in 2580916e4872
Reported by Peter sec-openssh-com.22.fichtner AT 0sg.net
* Add SANDBOX_DEBUG to the kitchensink test build.
* upstream: Fix comment typo.
OpenBSD-Regress-ID: 3b04faced6511bb5e74648c6a4ef4bf2c4decf03
* upstream: remove '?' from getopt(3) loops
userspace: remove vestigial '?' cases from top-level getopt(3) loops
getopt(3) returns '?' when it encounters a flag not present in the in
the optstring or if a flag is missing its option argument. We can
handle this case with the "default" failure case with no loss of
legibility. Hence, remove all the redundant "case '?':" lines.
Prompted by dlg@. With help from dlg@ and millert@.
Link: https://marc.info/?l=openbsd-tech&m=167011979726449&w=2
ok naddy@ millert@ dlg@
OpenBSD-Commit-ID: b2f89346538ce4f5b33ab8011a23e0626a67e66e
* upstream: Add server debugging for hostbased auth.
auth_debug_add queues messages about the auth process which is sent to
the client after successful authentication. This also sends those to
the server debug log to aid in debugging. From bz#3507, ok djm@
OpenBSD-Commit-ID: 46ff67518cccf9caf47e06393e2a121ee5aa258a
* upstream: Warn if no host keys for hostbased auth can be loaded.
OpenBSD-Commit-ID: 2a0a13132000cf8d3593133c1b49768aa3c95977
* use calloc for allocating arc4random structs
ok dtucker
* Move obsdsnap test VMs to ephemeral runners.
* Run upstream obsdsnap tests on ephemeral runners.
* obsdsnap test VMs runs-on libvirt too.
* Fetch regress logs from obj dir.
* Set group perms on regress dir.
This ensures that the tests don't fail due to StrictMode checks.
* Use sudo when resetting perms on directories.
* Add tests for LibreSSL 3.7.0 and OpenSSL 1.1.1s.
* Simply handling of SSH_CONNECTION PAM env var.
Prompted by bz#3508: there's no need to cache the value of
sshpam_conninfo so remove the global. While there, add check of
return value from pam_putenv. ok djm@
* upstream: The idiomatic way of coping with signed char vs unsigned
char (which did not come from stdio read functions) in the presence of
ctype macros, is to always cast to (unsigned char). casting to (int)
for a "macro" which is documented to take int, is weird. And sadly wrong,
because of the sing extension risk.. same diff from florian
OpenBSD-Commit-ID: 65b9a49a68e22ff3a0ebd593f363e9f22dd73fea
* upstream: add a -X option to both scp(1) and sftp(1) to allow
control over some SFTP protocol knobs: the copy buffer length and
the number of inflight requests, both of which are used during
upload/download.
Previously these could be controlled in sftp(1) using the -b/-R options.
This makes them available in both SFTP protocol clients using the same
option character sequence.
ok dtucker@
OpenBSD-Commit-ID: 27502bffc589776f5da1f31df8cb51abe9a15f1c
* upstream: add -X to usage();
OpenBSD-Commit-ID: 1bdc3df7de11d766587b0428318336dbffe4a9d0
* upstream: Clear signal mask early in main(); sshd may have been
started with one or more signals masked (sigprocmask(2) is not cleared
on fork/exec) and this could interfere with various things, e.g. the
login grace timer.
Execution environments that fail to clear the signal mask before running
sshd are clearly broken, but apparently they do exist.
Reported by Sreedhar Balasubramanian; ok dtucker@
OpenBSD-Commit-ID: 77078c0b1c53c780269fc0c416f121d05e3010ae
* upstream: Mention that scp uses the SFTP protocol and remove
reference to legacy flag. Spotted by, feedback and ok jmc@
OpenBSD-Commit-ID: 9dfe04966f52e941966b46c7a2972147f95281b3
* upstream: spelling fixes; from paul tagliamonte amendments to his
diff are noted on tech
OpenBSD-Commit-ID: d776dd03d0b882ca9c83b84f6b384f6f9bd7de4a
* upstream: fix bug in PermitRemoteOpen which caused it to ignore its
first argument unless it was one of the special keywords "any" or "none".
Reported by Georges Chaudy in bz3515; ok dtucker@
OpenBSD-Commit-ID: c5678a39f1ff79993d5ae3cfac5746a4ae148ea5
* upstream: regression test for PermitRemoteOpen
OpenBSD-Regress-ID: 8271aafbf5c21950cd5bf966f08e585cebfe630c
* upstream: suppress "Connection closed" message when in quiet mode
OpenBSD-Commit-ID: 8a3ab7176764da55f60bfacfeae9b82d84e3908f
* upstream: add ptimeout API for keeping track of poll/ppoll
timeouts; ok dtucker markus
OpenBSD-Commit-ID: 3335268ca135b3ec15a947547d7cfbb8ff929ead
* upstream: replace manual poll/ppoll timeout math with ptimeout API
feedback markus / ok markus dtucker
OpenBSD-Commit-ID: c5ec4f2d52684cdb788cd9cbc1bcf89464014be2
* upstream: Add channel_force_close()
This will forcibly close an open channel by simulating read/write errors,
draining the IO buffers and calling the detach function.
Previously the detach function was only ever called during channel garbage
collection, but there was no way to signal the user of a channel (e.g.
session.c) that its channel was being closed deliberately (vs. by the
usual state-machine logic). So this adds an extra "force" argument to the
channel cleanup callback to indicate this condition.
ok markus dtucker
OpenBSD-Commit-ID: 23052707a42bdc62fda2508636e624afd466324b
* upstream: tweak channel ctype names
These are now used by sshd_config:ChannelTimeouts to specify timeouts by
channel type, so force them all to use a similar format without whitespace.
ok dtucker markus
OpenBSD-Commit-ID: 66834765bb4ae14f96d2bb981ac98a7dae361b65
* upstream: Add channel_set_xtype()
This sets an "extended" channel type after channel creation (e.g.
"session:subsystem:sftp") that will be used for setting channel inactivity
timeouts.
ok markus dtucker
OpenBSD-Commit-ID: 42564aa92345045b4a74300528f960416a15d4ca
* upstream: Implement channel inactivity timeouts
This adds a sshd_config ChannelTimeouts directive that allows channels that
have not seen traffic in a configurable interval to be automatically closed.
Different timeouts may be applied to session, X11, agent and TCP forwarding
channels.
Note: this only affects channels over an opened SSH connection and not
the connection itself. Most clients close the connection when their channels
go away, with a notable exception being ssh(1) in multiplexing mode.
ok markus dtucker
OpenBSD-Commit-ID: ae8bba3ed9d9f95ff2e2dc8dcadfa36b48e6c0b8
* unbreak scp on NetBSD 4.x
e555d5cad5 effectively increased the default copy buffer size for SFTP
transfers. This caused NetBSD 4.x to hang during the "copy local file to
remote file in place" scp.sh regression test.
This puts back the original 32KB copy buffer size until we can properly
figure out why.
lots of debugging assistance from dtucker@
* upstream: Copy bytes from the_banana[] rather than banana()
Fixes test failure due to segfault seen on arm64 with xonly snap.
ok djm
OpenBSD-Regress-ID: 86e2aa4bbd1dff1bc4ebb2969c0d6474485be046
* upstream: unit tests for misc.c:ptimeout_* API
OpenBSD-Regress-ID: 01f8fb12d08e5aaadd4bd4e71f456b6588be9a94
* upstream: fix typo in verbose logging
OpenBSD-Regress-ID: 0497cdb66e003b2f50ed77291a9104fba2e017e9
* upstream: regression test for ChannelTimeout
OpenBSD-Regress-ID: 280bfbefcfa415428ad744e43f69a8dede8ad685
* upstream: Save debug logs from ssh for debugging purposes.
OpenBSD-Regress-ID: 109e40b06de1c006a3b8e0d8745b790b2c5870a0
* Set OPENSSL_BIN from OpenSSL directory.
* Check openssl_bin path is executable before using.
* Use autoconf to find openssl binary.
It's possible to install an OpenSSL in a path not in the system's
default library search path. OpenSSH can still use this (eg if you
specify an rpath) but the openssl binary there may not work. If one is
available on the system path just use that.
* Use our own netcat for dynamic-forward test.
That way we can be surer about its behaviour rather than trying to
second-guess the behaviour of various netcat implementations.
* upstream: When OpenSSL is not available, skip parts of percent test
that require it. Based on github pr#368 from ren mingshuai.
OpenBSD-Regress-ID: 49a375b2cf61ccb95b52e75e2e025cd10988ebb2
* don't test IPv6 addresses if platform lacks support
* Skip dynamic-forward test on minix3.
This test relies on loopback addresses which minix does not have.
Previously the test would not run at all since it also doesn't have
netcat, but now we use our own netcat it tries and fails.
* try to improve logging for dynamic-forward test
previously the logs from the ssh used to exercise the forwarding
channel would clobber the logs from the ssh actually doing the
forwarding
* upstream: tweak previous; ok djm
OpenBSD-Commit-ID: 229c493452766d70a78b0f02f6ff9894f9028858
* upstream: Switch scp from using pipes to a socketpair for
communication with it's ssh sub-processes. We no longer need to reserve two
descriptors to ensure that we don't end up using fd 0-2 unexpectedly, that is
handled by sanitise_stdfd() in main(). Based on an original diff from djm@.
OK deraadt@ djm@
OpenBSD-Commit-ID: b80c372faac462471e955ddeab9480d668a2e48d
* add back use of pipes in scp.c under USE_PIPES
This matches sftp.c which prefers socketpair but uses pipes on
some older platforms.
* remove buffer len workaround for NetBSD 4.x
Switching to from pipes to a socketpair for communicating with the
ssh process avoids the (kernel bug?) problem.
* upstream: rewrite this test to use a multiplexed ssh session so we can
control its lifecycle without risk of race conditions; fixes some of the
Github integration tests for openssh-portable
OpenBSD-Regress-ID: 5451cad59ba0d43ae9eeda48ec80f54405fee969
* upstream: remove whitespace at EOL from code extracted from SUPERCOP
OpenBSD-Commit-ID: 1ec524ff2fbb9387d731601437c82008f35a60f4
* upstream: ignore bogus upload/download buffer lengths in the limits
extension
OpenBSD-Commit-ID: c5b023e0954693ba9a5376e4280c739b5db575f8
* upstream: clamp the minimum buffer lengths and number of inflight
requests too
OpenBSD-Commit-ID: c4965f62fa0ba850940fd66ae3f60cf516bbcd56
* upstream: avoid printf("%s", NULL) if using ssh
-oUserKnownHostsFile=none and a hostkey in one of the system known hosts file
changes; ok dtucker@
OpenBSD-Commit-ID: 7ca87614bfc6da491315536a7f2301434a9fe614
* upstream: Add a "Host" line to the output of ssh -G showing the
original host arg. Inspired by patch from vincent at bernat.ch via bz#3343,
ok djm@
OpenBSD-Commit-ID: 59c0f60a222113a44d0650cd394376e3beecc883
* Remove skipping test when scp not in path.
An upcoming change renders this obsolete by adding scp's path to the
test sshd's PATH, and removing this first will make the subsequent sync
easier.
* upstream: Add scp's path to test sshd's PATH.
If the scp we're testing is fully qualified (eg it's not in the system
PATH) then add its path to the under-test sshd's PATH so we can find
it. Prompted by bz#3518.
OpenBSD-Regress-ID: 7df4f5a0be3aa135495b7e5a6719d3cbc26cc4c0
* upstream: Move scp path setting to a helper function. The previous
commit to add scp to the test sshd's path causes the t-envpass test to fail
when the test scp is given using a fully qualified path. Put this in a
helper function and only call it from the scp tests.
OpenBSD-Regress-ID: 7533dc1c4265c1de716abb062957994195b36df4
* Retry package installation 3 times.
When setting up the CI environment, retry package installation 3 times
before going up. Should help prevent spurious failures during
infrastructure issues.
* upstream: Document "UserKnownHostsFile none". ok djm@
OpenBSD-Commit-ID: f695742d39e34ecdcc3c861c3739a84648a4bce5
* upstream: fix double phrase in previous;
OpenBSD-Commit-ID: 671e6c8dc5e9230518b2bbfa143daaa88adc66c2
* upstream: Instead of skipping the all-tokens test if we don't have
OpenSSL (since we use it to compute the hash), put the hash at the end and
just omit it if we don't have it. Prompted by bz#3521.
OpenBSD-Regress-ID: c79ecba64250ed3b6417294b6c965e6b12ca5eea
* upstream: Shell syntax fix. From ren mingshuai vi github PR#369.
OpenBSD-Regress-ID: 6696b2eeefe128099fc3d7ea9f23252cc35156f9
* Allow writev is seccomp sandbox.
This seems to be used by recent glibcs at least in some configurations.
From bz#3512, ok djm@
* upstream: update OpenSSH's Ed25519 code to the last version of SUPERCOP
(20221122) and change the import approach to the same one we use for
Streamlined NTRUPrime: use a shell script to extract the bits we need from
SUPERCOP, make some minor adjustments and squish them all into a single file.
ok tb@ tobhe@
OpenBSD-Commit-ID: 1bc0fd624cb6af440905b8ba74ac7c03311b8e3b
* upstream: adapt to ed25519 changes in src/usr.bin/ssh
OpenBSD-Regress-ID: 4b3e7ba7ee486ae8a0b4790f8112eded2bb7dcd5
* upstream: Add a sshd_config UnusedConnectionTimeout option to terminate
client connections that have no open channels for some length of time. This
complements the recently-added ChannelTimeout option that terminates inactive
channels after a timeout.
ok markus@
OpenBSD-Commit-ID: ca983be74c0350364c11f8ba3bd692f6f24f5da9
* upstream: unbreak test: cannot access shell positional parameters
past $9 without wrapping the position in braces (i.e. need ${10}, etc.)
OpenBSD-Regress-ID: 3750ec98d5d409ce6a93406fedde6f220d2ea2ac
* upstream: regression test for UnusedConnectionTimeout
OpenBSD-Regress-ID: 7f29001374a68e71e5e078f69e4520cf4bcca084
* upstream: also check that an active session inhibits
UnusedConnectionTimeout idea markus@
OpenBSD-Regress-ID: 55c0fb61f3bf9e092b0a53f9041d3d2012f14003
* upstream: For "ssh -V" always exit 0, there is no need to check opt
again. This was missed when the fallthrough in the switch case above it was
removed. OK deraadt@
OpenBSD-Commit-ID: 5583e5d8f6d62a8a4215cfa95a69932f344c8120
* upstream: Add a -V (version) option to sshd like the ssh client
has. OK markus@ deraadt@
OpenBSD-Commit-ID: abe990ec3e636fb040132aab8cbbede98f0c413e
* upstream: when restoring non-blocking mode to stdio fds, restore
exactly the flags that ssh started with and don't just clobber them with
zero, as this could also remove the append flag from the set;
bz3523; ok dtucker@
OpenBSD-Commit-ID: 1336b03e881db7564a4b66014eb24c5230e9a0c0
* Skip connection-timeout when missing FD passing.
This tests uses multiplexing which uses file descriptor passing, so
skip it if we don't have that. Fixes test failures on Cygwin.
* Skip connection-timeout test under Valgrind.
Valgrind slows things down so much that the timeout test fails. Skip
this test until we figure out if we can make it work.
* upstream: tweak previous; ok djm
OpenBSD-Commit-ID: df71ce4180c58202dfdc1d92626cfe900b91b7c3
* upstream: Create and install sshd random relink kit.
../Makefile.inc and Makfile are concatenated for reuse, which hopefully won't
be too fragile, we'll see if we need a different approach. The resulting sshd
binary is tested with the new sshd -V option before installation. As the
binary layout is now semi-unknown (meaning relative, fixed, and gadget
offsets are not precisely known), change the filesystem permissions to 511 to
prevent what I call "logged in BROP". I have ideas for improving this further
but this is a first step ok djm
OpenBSD-Commit-ID: 1e0a2692b7e20b126dda60bf04999d1d30d959d8
* upstream: delete useless dependency
OpenBSD-Commit-ID: e1dc11143f83082e3154d6094f9136d0dc2637ad
* fix libfido2 detection without pkg-config
Place libfido2 before additional libraries (that it may depend upon)
and not after. bz3530 from James Zhang; ok dtucker@
* Skip connection-timeout test on minix3.
Minix 3's Unix domain sockets don't seem to work the way we expect, so
skip connection-timeout test on that platform. While there, group
together all similarly skipped tests and explicitly comment.
* upstream: fix double-free caused by compat_kex_proposal(); bz3522
by dtucker@, ok me
OpenBSD-Commit-ID: 2bfc37cd2d41f67dad64c17a64cf2cd3806a5c80
* upstream: openssh-9.2
OpenBSD-Commit-ID: f7389f32413c74d6e2055f05cf65e7082de03923
* upstream: Check if we can copy sshd or need to use sudo to do so
during reexec test. Skip test if neither can work. Patch from anton@, tweaks
from me.
OpenBSD-Regress-ID: 731b96ae74d02d5744e1f1a8e51d09877ffd9b6d
* upstream: test compat_kex_proposal(); by dtucker@
OpenBSD-Regress-ID: 0e404ee264db546f9fdbf53390689ab5f8d38bf2
* adapt compat_kex_proposal() test to portable
* update version in README
* crank versions in RPM specs
* remove files from libssh project
* re-merge arc4random.c
* re-merge misc.c
* remove unused files from libssh.vcxproj
* fix outstanding merge conflicts
* fix build errors
* modify upstream workflows to trigger on workflow dispatch instead of all PRs
* fix scp client hanging with pipes
* fix some failing bash tests
* make bash test compatible with Windows
* address scp's sftp mode buf len limitations
* address review feedback
* address review feedback
* update comment
---------
Signed-off-by: Sam James <sam@gentoo.org>
Co-authored-by: djm@openbsd.org <djm@openbsd.org>
Co-authored-by: Darren Tucker <dtucker@dtucker.net>
Co-authored-by: Damien Miller <djm@mindrot.org>
Co-authored-by: Sam James <sam@gentoo.org>
Co-authored-by: jsg@openbsd.org <jsg@openbsd.org>
Co-authored-by: jmc@openbsd.org <jmc@openbsd.org>
Co-authored-by: dtucker@openbsd.org <dtucker@openbsd.org>
Co-authored-by: Harmen Stoppels <harmenstoppels@gmail.com>
Co-authored-by: Rochdi Nassah <rochdinassah.1998@gmail.com>
Co-authored-by: David Korczynski <david@adalogics.com>
Co-authored-by: Pierre Ossman <ossman@cendio.se>
Co-authored-by: mbuhl@openbsd.org <mbuhl@openbsd.org>
Co-authored-by: Rose <83477269+AtariDreams@users.noreply.github.com>
Co-authored-by: cheloha@openbsd.org <cheloha@openbsd.org>
Co-authored-by: deraadt@openbsd.org <deraadt@openbsd.org>
Co-authored-by: tb@openbsd.org <tb@openbsd.org>
Co-authored-by: millert@openbsd.org <millert@openbsd.org>
2023-02-09 22:57:36 +01:00
|
|
|
int r;
|
2003-05-10 11:28:02 +02:00
|
|
|
|
2020-11-11 02:30:46 +01:00
|
|
|
#if defined(PAM_SUN_CODEBASE) && defined(PAM_MAX_RESP_SIZE)
|
|
|
|
/* Protect buggy PAM implementations from excessively long usernames */
|
|
|
|
if (strlen(user) >= PAM_MAX_RESP_SIZE)
|
|
|
|
fatal("Username too long from %s port %d",
|
|
|
|
ssh_remote_ipaddr(ssh), ssh_remote_port(ssh));
|
|
|
|
#endif
|
2019-01-20 00:22:18 +01:00
|
|
|
if (sshpam_handle == NULL) {
|
|
|
|
if (ssh == NULL) {
|
|
|
|
fatal("%s: called initially with no "
|
|
|
|
"packet context", __func__);
|
|
|
|
}
|
|
|
|
} if (sshpam_handle != NULL) {
|
2003-05-10 11:28:02 +02:00
|
|
|
/* We already have a PAM context; check if the user matches */
|
|
|
|
sshpam_err = pam_get_item(sshpam_handle,
|
2005-05-26 11:59:48 +02:00
|
|
|
PAM_USER, (sshpam_const void **)ptr_pam_user);
|
2003-05-10 11:28:02 +02:00
|
|
|
if (sshpam_err == PAM_SUCCESS && strcmp(user, pam_user) == 0)
|
|
|
|
return (0);
|
|
|
|
pam_end(sshpam_handle, sshpam_err);
|
|
|
|
sshpam_handle = NULL;
|
|
|
|
}
|
|
|
|
debug("PAM: initializing for \"%s\"", user);
|
2003-09-13 14:02:05 +02:00
|
|
|
sshpam_err =
|
2004-09-11 15:07:03 +02:00
|
|
|
pam_start(SSHD_PAM_SERVICE, user, &store_conv, &sshpam_handle);
|
2004-03-30 12:57:57 +02:00
|
|
|
sshpam_authctxt = authctxt;
|
2004-03-08 13:04:06 +01:00
|
|
|
|
2003-05-18 12:45:47 +02:00
|
|
|
if (sshpam_err != PAM_SUCCESS) {
|
2003-08-25 05:08:49 +02:00
|
|
|
pam_end(sshpam_handle, sshpam_err);
|
2003-05-18 12:45:47 +02:00
|
|
|
sshpam_handle = NULL;
|
|
|
|
return (-1);
|
|
|
|
}
|
2018-12-07 05:41:16 +01:00
|
|
|
|
2019-01-20 00:22:18 +01:00
|
|
|
if (ssh != NULL && sshpam_rhost == NULL) {
|
|
|
|
/*
|
|
|
|
* We need to cache these as we don't have packet context
|
|
|
|
* during the kbdint flow.
|
|
|
|
*/
|
|
|
|
sshpam_rhost = xstrdup(auth_get_canonical_hostname(ssh,
|
|
|
|
options.use_dns));
|
2021-04-03 08:47:37 +02:00
|
|
|
sshpam_laddr = get_local_ipaddr(
|
2019-01-20 00:22:18 +01:00
|
|
|
ssh_packet_get_connection_in(ssh));
|
|
|
|
}
|
|
|
|
if (sshpam_rhost != NULL) {
|
|
|
|
debug("PAM: setting PAM_RHOST to \"%s\"", sshpam_rhost);
|
|
|
|
sshpam_err = pam_set_item(sshpam_handle, PAM_RHOST,
|
|
|
|
sshpam_rhost);
|
|
|
|
if (sshpam_err != PAM_SUCCESS) {
|
|
|
|
pam_end(sshpam_handle, sshpam_err);
|
|
|
|
sshpam_handle = NULL;
|
|
|
|
return (-1);
|
|
|
|
}
|
Merge 9.2 (#657)
* upstream: attemp FIDO key signing without PIN and use the error
code returned to fall back only if necessary. Avoids PIN prompts for FIDO
tokens that don't require them; part of GHPR#302
OpenBSD-Commit-ID: 4f752aaf9f2e7c28bcaaf3d4f8fc290131bd038e
* Install Cygwin packages based on OS not config.
* initial list of allowed signers
* upstream: whitespace
OpenBSD-Commit-ID: d297e4387935d4aef091c5e9432578c2e513f538
* upstream: whitespace
OpenBSD-Commit-ID: a5d015efbfd228dc598ffdef612d2da3a579e5d8
* Add cygwin-release test target.
This also moves the cygwin package install from the workflow file to
setup_ci.sh so that we can install different sets of Cygwin packages
for different test configs.
* Add Windows 2022 test targets.
* Add libcrypt-devel to cygwin-release deps.
Based on feedback from vinschen at redhat.com.
* cross-sign allowed_signers with PGP key
Provides continuity of trust from legacy PGP release key to
the SSHSIG signing keys that we will use henceforth for git
signing.
* additional keys
* upstream: whitespace
OpenBSD-Commit-ID: c2bcbf93610d3d62ed206cdf9bf9ff98c6aaf232
* Move sftp from valgrind-2 to 3 to rebalance.
* upstream: sk-usbhid: fix key_lookup() on tokens with built-in UV
explicitly test whether the token performs built-in UV (e.g. biometric
tokens) and enable UV in that case. From Pedro Martelletto via GHPR#388
OpenBSD-Commit-ID: 007eb7e387d27cf3029ab06b88224e03eca62ccd
* Remove arc4random_uniform from arc4random.c
This was previously moved into its own file (matching OpenBSD) which
prematurely committed in commit 73541f2.
* Move OPENBSD ORIGINAL marker.
Putting this after the copyright statement (which doesn't change)
instead of before the version identifier (which does) prevents merge
conflicts when resyncing changes.
* Resync arc4random with OpenBSD.
This brings us up to current, including djm's random-reseeding change,
as prompted by logan at cyberstorm.mu in bz#3467. It brings the
platform-specific hooks from LibreSSL Portable, simplified to match our
use case. ok djm@.
* Remove DEF_WEAK, it's already in defines.h.
* openbsd-compat/bsd-asprintf: add <stdio.h> include for vsnprintf
Fixes the following build failure with Clang 15 on musl:
```
bsd-asprintf.c:51:8: error: call to undeclared library function 'vsnprintf' with type 'int (char *, unsigned long, const char *, struct __va_list_tag *)'; ISO C99 and laterclang -O2 -pipe -fdiagnostics-color=always -frecord-gcc-switches -pipe -Wunknown-warning-option -Qunused-arguments -Wall -Wpointer-arith -Wuninitialized -Wsign-compare -Wformat-security -Wsizeof-pointer-memaccess -Wno-pointer-sign -Wno-unused-result -Wmisleading-indentation -Wbitwise-instead-of-logical -fno-strict-aliasing -mretpoline -ftrapv -fzero-call-used-regs=all -fno-builtin-memset -fstack-protector-strong -fPIE -I. -I. -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -D_DEFAULT_SOURCE -DSSHDIR=\"/etc/ssh\" -D_PATH_SSH_PROGRAM=\"/usr/bin/ssh\" -D_PATH_SSH_ASKPASS_DEFAULT=\"/usr/lib/misc/ssh-askpass\" -D_PATH_SFTP_SERVER=\"/usr/lib/misc/sftp-server\" -D_PATH_SSH_KEY_SIGN=\"/usr/lib/misc/ssh-keysign\" -D_PATH_SSH_PKCS11_HELPER=\"/usr/lib/misc/ssh-pkcs11-helper\" -D_PATH_SSH_SK_HELPER=\"/usr/lib/misc/ssh-sk-helper\" -D_PATH_SSH_PIDDIR=\"/run\" -D_PATH_PRIVSEP_CHROOT_DIR=\"/var/empty\" -DHAVE_CONFIG_H -c cipher-aes.c -o cipher-aes.o
do not support
implicit function declarations [-Wimplicit-function-declaration]
ret = vsnprintf(string, INIT_SZ, fmt, ap2);
^
bsd-asprintf.c:51:8: note: include the header <stdio.h> or explicitly provide a declaration for 'vsnprintf'
1 error generated.
```
* upstream: notifier_complete(NULL, ...) is a noop, so no need to test
that ctx!=NULL; from Corinna Vinschen
OpenBSD-Commit-ID: ade2f2e9cc519d01a586800c25621d910bce384a
* upstream: fix repeated words ok miod@ jmc@
OpenBSD-Commit-ID: 6765daefe26a6b648cc15cadbbe337596af709b7
* upstream: .Li -> .Vt where appropriate; from josiah frentsos,
tweaked by schwarze
ok schwarze
OpenBSD-Commit-ID: 565046e3ce68b46c2f440a93d67c2a92726de8ed
* upstream: ssh-agent: attempt FIDO key signing without PIN and use
the error to determine whether a PIN is required and prompt only if
necessary. from Corinna Vinschen
OpenBSD-Commit-ID: dd6be6a0b7148608e834ee737c3479b3270b00dd
* upstream: a little extra debugging
OpenBSD-Commit-ID: edf1601c1d0905f6da4c713f4d9cecc7d1c0295a
* upstream: sk_enroll: never drop SSH_SK_USER_VERIFICATION_REQD flag
from response
Now that all FIDO signing calls attempt first without PIN and then
fall back to trying PIN only if that attempt fails, we can remove the
hack^wtrick that removed the UV flag from the keys returned during
enroll.
By Corinna Vinschen
OpenBSD-Commit-ID: 684517608c8491503bf80cd175425f0178d91d7f
* upstream: sftp: Don't attempt to complete arguments for
non-existent commands
If user entered a non-existent command (e.g. because they made a
typo) there is no point in trying to complete its arguments. Skip
calling complete_match() if that's the case.
From Michal Privoznik
OpenBSD-Commit-ID: cf39c811a68cde2aeb98fc85addea4000ef6b07a
* upstream: sftp: Be a bit more clever about completions
There are commands (e.g. "get" or "put") that accept two
arguments, a local path and a remote path. However, the way
current completion is written doesn't take this distinction into
account and always completes remote or local paths.
By expanding CMD struct and "cmds" array this distinction can be
reflected and with small adjustment to completer code the correct
path can be completed.
By Michal Privoznik, ok dtucker@
OpenBSD-Commit-ID: 1396d921c4eb1befd531f5c4a8ab47e7a74b610b
* upstream: correct error value
OpenBSD-Commit-ID: 780efcbad76281f11f14b2a5ff04eb6db3dfdad4
* upstream: actually hook up restrict_websafe; the command-line flag
was never actually used. Spotted by Matthew Garrett
OpenBSD-Commit-ID: 0b363518ac4c2819dbaa3dfad4028633ab9cdff1
* upstream: Add a sshkey_check_rsa_length() call for checking the
length of an RSA key; ok markus@
OpenBSD-Commit-ID: de77cd5b11594297eda82edc594b0d32b8535134
* upstream: add a RequiredRSASize for checking RSA key length in
ssh(1). User authentication keys that fall beneath this limit will be
ignored. If a host presents a host key beneath this limit then the connection
will be terminated (unfortunately there are no fallbacks in the protocol for
host authentication).
feedback deraadt, Dmitry Belyavskiy; ok markus@
OpenBSD-Commit-ID: 430e339b2a79fa9ecc63f2837b06fdd88a7da13a
* upstream: Add RequiredRSASize for sshd(8); RSA keys that fall
beneath this limit will be ignored for user and host-based authentication.
Feedback deraadt@ ok markus@
OpenBSD-Commit-ID: 187931dfc19d51873df5930a04f2d972adf1f7f1
* upstream: better debugging for connect_next()
OpenBSD-Commit-ID: d16a307a0711499c971807f324484ed3a6036640
* upstream: sftp-server(8): add a "users-groups-by-id@openssh.com"
extension request that allows the client to obtain user/group names that
correspond to a set of uids/gids.
Will be used to make directory listings more useful and consistent
in sftp(1).
ok markus@
OpenBSD-Commit-ID: 7ebabde0bcb95ef949c4840fe89e697e30df47d3
* upstream: extend sftp-common.c:extend ls_file() to support supplied
user/group names; ok markus@
OpenBSD-Commit-ID: c70c70498b1fdcf158531117e405b6245863bfb0
* upstream: sftp client library support for
users-groups-by-id@openssh.com; ok markus@
OpenBSD-Commit-ID: ddb2f33a2da6349a9a89a8b5bcb9ca7c999394de
* upstream: use users-groups-by-id@openssh.com sftp-server extension
(when available) to fill in user/group names for directory listings.
Implement a client-side cache of see uid/gid=>user/group names. ok markus@
OpenBSD-Commit-ID: f239aeeadfa925a37ceee36ee8b256b8ccf4466e
* avoid Wuninitialized false positive in gcc-12ish
* no need for glob.h here
it also causes portability problems
* upstream: add RequiredRSASize to the list of keywords accepted by
-o; spotted by jmc@
OpenBSD-Commit-ID: fe871408cf6f9d3699afeda876f8adbac86a035e
* upstream: Fix typo. From AlexanderStohr via github PR#343.
OpenBSD-Commit-ID: a134c9b4039e48803fc6a87f955b0f4a03181497
* upstream: openssh-9.1
OpenBSD-Commit-ID: 5a467b2ee81da01a86adf1ad93b62b1728494e56
* crank versions in RPM spec files
* update release notes URL
* update .depend
* remove mention of --with-security-key-builtin
it is enabled by default when libfido2 is installed
* mention libfido2 autodetection
* whitespace at EOL
* Test commits to all branches of portable.
Only test OpenBSD upstream on commits to master since that's what it
tracks.
* Add 9.1 branch to CI status page.
* Add LibreSSL 3.6.0 to test suite.
While there, bump OpenSSL to latest 1.1.1q release.
* upstream: honour user's umask if it is more restrictive then the ssh
default (022); based on patch from Alex Henrie, ok dtucker@ deraadt@
OpenBSD-Commit-ID: fe1b9e15fc9a4f49fc338e848ce14d8727abe82d
* skip bsd-poll.h if poll.h found; ok dtucker
* Fix snprintf configure test for clang 15
Clang 15 -Wimplicit-int defaults to an error in C99 mode and above.
A handful of tests have "main(..." and not "int main(..." which caused
the tests to produce incorrect results.
* undef _get{short,long} before redefining
* revert c64b62338b4 and guard POLL* defines instead
c64b62338b4 broke OSX builds, which do have poll.h but lack ppoll(2)
Spotted by dtucker
* OpenSSL dev branch now identifies as 3.2.0.
* upstream: document "-O no-restrict-websafe"; spotted by Ross L
Richardson
OpenBSD-Commit-ID: fe9eaa50237693a14ebe5b5614bf32a02145fe8b
* upstream: ssh-agent.1: - use Nm not Xr for self-ref - while here,
wrap a long line
ssh-agent.c:
- add -O to usage()
OpenBSD-Commit-ID: 855dac4695cef22e96d69c53436496bc408ca389
* upstream: use correct type with sizeof ok djm@
OpenBSD-Commit-ID: d6c882c2e8a42ff831a5b3cbc2c961ecb2dd6143
* upstream: when scp(1) is using the SFTP protocol for transport (the
default), better match scp/rcp's handling of globs that don't match the
globbed characters but do match literally (e.g. trying to transfer
"foo.[1]").
Previously scp(1) in SFTP mode would not match these pathnames but
legacy scp/rcp mode would.
Reported by Michael Yagliyan in bz3488; ok dtucker@
OpenBSD-Commit-ID: d8a3773f53015ba811fddba7473769a2fd343e11
* upstream: regress test for unmatched glob characters; fails before
previous commit but passes now. bz3488; prodded by dtucker@
OpenBSD-Regress-ID: 0cc5cc9ea4a6fd170dc61b9212f15badaafb3bbd
* upstream: Be more paranoid with host/domain names coming from the
never write a name with bad characters to a known_hosts file.
reported by David Leadbeater, ok deraadt@
OpenBSD-Commit-ID: ba9b25fa8b5490b49398471e0c9657b0cbc7a5ad
* upstream: begin big refactor of sshkey
Move keytype data and some of the type-specific code (allocation,
cleanup, etc) out into each key type's implementation. Subsequent
commits will move more, with the goal of having each key-*.c file
owning as much of its keytype's implementation as possible.
lots of feedback + ok markus@
OpenBSD-Commit-ID: 0f2b4334f73914344e9e5b3d33522d41762a57ec
* upstream: factor out sshkey_equal_public()
feedback/ok markus@
OpenBSD-Commit-ID: 1368ba114cb37732fe6ec3d89c7e6d27ea6fdc94
* upstream: factor out public key serialization
feedback/ok markus@
OpenBSD-Commit-ID: a3570c4b97290c5662890aea7328d87f55939033
* upstream: refactor and simplify sshkey_read()
feedback/ok markus@
OpenBSD-Commit-ID: 0d93b7a56e31cd06a8bb0d2191d084ce254b0971
* upstream: factor out key generation
feedback/ok markus@
OpenBSD-Commit-ID: 5b4211bff4de8d9adb84bc72857a8c42c44e7ceb
* upstream: refactor sshkey_from_private()
feedback/ok markus@
OpenBSD-Commit-ID: e5dbe7a3545930c50f70ee75c867a1e08b382b53
* upstream: refactor sshkey_from_blob_internal()
feedback/ok markus@
OpenBSD-Commit-ID: 1f46c0cbb8060ee9666a02749594ad6658c8e283
* upstream: refactor sshkey_sign() and sshkey_verify()
feedback/ok markus@
OpenBSD-Commit-ID: 368e662c128c99d05cc043b1308d2b6c71a4d3cc
* upstream: refactor certify
feedback/ok markus@
OpenBSD-Commit-ID: 35d742992e223eaca3537e6fb3d3002c08eed4f6
* upstream: refactor sshkey_private_serialize_opt()
feedback/ok markus@
OpenBSD-Commit-ID: 61e0fe989897901294efe7c3b6d670cefaf44cbd
* upstream: refactor sshkey_private_deserialize
feedback/ok markus@
OpenBSD-Commit-ID: f5ca6932fdaf840a5e8250becb38315a29b5fc9f
* fix merge botch
* upstream: allow ssh-keyscan(1) to accept CIDR address ranges, e.g.
ssh-keyscan 192.168.0.0/24
If a CIDR range is passed, then it will be expanded to all possible
addresses in the range including the all-0s and all-1s addresses.
bz#976 feedback/ok markus@
OpenBSD-Commit-ID: ce6c5211f936ac0053fd4a2ddb415277931e6c4b
* upstream: put sshkey_check_rsa_length() back in sshkey.c to unbreak
OPENSSL=no builds
OpenBSD-Commit-ID: 99eec58abe382ecd14b14043b195ee1babb9cf6e
* OpenSSL dev branch is 302 not 320.
While there, also accept 301 which it shat it was previously.
* upstream: Use variable for diff options
instead of unconditionally specifying "-rN". This will make life easier
in -portable where not all diff's understand -N.
OpenBSD-Regress-ID: 8b8a407115546be1c6d72d350b1e4f1f960d3cd3
* Check for sockaddr_in.sin_len.
If found, set SOCK_HAS_LEN which is used in addr.c. Should fix keyscan
tests on platforms with this (eg old NetBSD).
* Always use compat getentropy.
Have it call native getentropy and fall back as required. Should fix
issues of platforms where libc has getentropy but it is not implemented
in the kernel. Based on github PR#354 from simsergey.
* Include time.h when defining timegm.
Fixes build on some platforms eg recent AIX.
* Compat tests need libcrypto.
This was moved to CHANNELLIBS during the libs refactor. Spotted by
rapier at psc.edu.
* Run compat regress tests too.
* Add tests for OpenSSL 3.0.7 and LibreSSL 3.6.1.
* Only run opensslver tests if built with OpenSSL.
* Increase selfhosted job timeout.
The default job timeout of 360 (6h) is not enough to complete the
regress tests for some of the slow VMs depending on the load on the host.
Increase to 600 (10h).
* Fix compat regress to work with non-GNU make.
* Link libssh into compat tests.
The cygwin compat code uses xmalloc, so add libssh.a so pick up that.
* Rerun tests on changes to Makefile.in in any dir.
* upstream: replace recently-added valid_domain() check for hostnames
going to known_hosts with a more relaxed check for bad characters; previous
commit broke address literals. Reported by/feedback from florian@
OpenBSD-Commit-ID: 10b86dc6a4b206adaa0c11b58b6d5933898d43e0
* Don't run openbsd-compat tests on Cygwin.
Add "compat-tests" to the default TEST_TARGET so we can override as
necessary. Override TEST_TARGET for Cygwin as the tests don't currently
compile there.
* Fix broken zlib link.
* configure.ac: Add <pty.h> include for openpty
Another Clang 16ish fix (which makes -Wimplicit-function-declaration
an error by default). github PR#355.
See: 2efd71da49b9cfeab7987058cf5919e473ff466b
See: be197635329feb839865fdc738e34e24afd1fca8
* configure.ac: Fix -Wstrict-prototypes
Clang 16 now warns on this and it'll be removed in C23, so let's
just be future proof. It also reduces noise when doing general
Clang 16 porting work (which is a big job as it is). github PR#355.
Signed-off-by: Sam James <sam@gentoo.org>
* Fix setres*id checks to work with clang-16.
glibc has the prototypes for setresuid and setresgid behind _GNU_SOURCE,
and clang 16 will error out on implicit function definitions, so add
_GNU_SOURCE and the required headers to the configure checks. From
sam at @gentoo.org via bz#3497.
* Fix tracing disable on FreeBSD.
Some versions of FreeBSD do not support using id 0 to refer to the
current pid for procctl, so pass getpid() explicitly. From
emaste at freebsd.org.
* Use "prohibit-password" in -portable comments.
"without-password" is the deprecated alias for "prohibit-password",
so we should reference the latter. From emaste at freebsd.org.
* Link to branch-specific queries for V_9_1 status.
* upstream: Fix typo. From pablomh via -portable github PR#344.
OpenBSD-Commit-ID: d056ee2e73691dc3ecdb44a6de68e6b88cd93827
* upstream: Import regenerated moduli.
OpenBSD-Commit-ID: b0e54ee4d703bd6929bbc624068666a7a42ecb1f
* Add CIFuzz integration
* Run cifuzz workflow on the actions as regular CI.
* Whitespace change to trigger CIFuzz workflow.
* Do not run CIFuzz on selfhosted tree.
We already run it on the regular tree, no need to double up.
* Add CIFuzz status badge.
* Branch-specific links for master status badges.
* Fix merge conflict.
* upstream: fix parsing of hex cert expiry time; was checking whether the
start time began with "0x", not the expiry time.
from Ed Maste
OpenBSD-Commit-ID: 6269242c3e1a130b47c92cfca4d661df15f05739
* upstream: Check for and disallow MaxStartups values less than or
equal to zero during config parsing, rather than faling later at runtime.
bz#3489, ok djm@
OpenBSD-Commit-ID: d79c2b7a8601eb9be493629a91245d761154308b
* upstream: Remove some set but otherwise unused variables, spotted
in -portable by clang 16's -Wunused-but-set-variable. ok djm@
OpenBSD-Commit-ID: 3d943ddf2369b38fbf89f5f19728e7dc1daf3982
* upstream: The IdentityFile option in ssh_config can also be used to
specify a public key file, as documented in ssh.1 for the -i option. Document
this also for IdentityFile in ssh_config.5, for documentation completeness.
From laalsaas at systemli.org via portable github PR#352, ok jmc@ djm@
OpenBSD-Commit-ID: 2f943be9f96e60ef81a9a4faa25b009999f9883b
* Split out rekey test since it runs the longest.
* Update checkout and upload actions.
Update actions/checkout and actions/upload-artifact to main branch for
compatibility with node.js v16.
* Add valrind-5 test here too.
* Run vm startup and shutdown from runner temp dir.
Should work even if the github workspace dir is on a stale sshfs mount.
* Shutdown any VM before trying to check out repo.
In the case where the previous run did not clean up, the checkout will
fail as it'll leave a stale mount.
* Avoid assuming layout of fd_set
POSIX doesn't specify the internal layout of the fd_set object, so let's
not assume it is just a bit mask. This increases compatibility with
systems that have a different layout.
The assumption is also worthless as we already refuse to use file
descriptors over FD_SETSIZE anyway. Meaning that the default size of
fd_set is quite sufficient.
* Fix comment text. From emaste at freebsd.org.
* Defer seed_rng until after closefrom call.
seed_rng will initialize OpenSSL, and some engine providers (eg Intel's
QAT) will open descriptors for their own use. bz#3483, patch from
joel.d.schuetze at intel.com, ok djm@
* upstream: typo in comment
OpenBSD-Commit-ID: 39c58f41e0f32d1ff31731fa6f5bbbc3ad25084a
* upstream: rename client_global_hostkeys_private_confirm() to
client_global_hostkeys_prove_confirm(), as it handles the
"hostkeys-prove00@openssh.com" message; no functional change
OpenBSD-Commit-ID: 31e09bd3cca6eed26855b88fb8beed18e9bd026d
* upstream: Remove errant colon and simplify format
string in error messages. Patch from vapier at chromium.org.
OpenBSD-Commit-ID: fc28466ebc7b74e0072331947a89bdd239c160d3
* upstream: Fix typo in fatal error message.
Patch from vapier at chromium.org.
OpenBSD-Commit-ID: 8a0c164a6a25eef0eedfc30df95bfa27644e35cf
* Skip reexec test on OpenSSL 1.1.1 specifically.
OpenSSL 1.1.1 has a bug in its RNG that breaks reexec fallback, so skip
that test. See bz#3483 for details.
* Remove seed passing over reexec.
This was added for the benefit of platforms using ssh-rand-helper to
prevent a delay on each connection as sshd reseeded itself.
ssh-random-helper is long gone, and since the re-exec happens before the
chroot the re-execed sshd can reseed itself normally. ok djm@
* upstream: Handle dynamic remote port forwarding in escape commandline's
-R processing. bz#3499, ok djm@
OpenBSD-Commit-ID: 194ee4cfe7ed0e2b8ad0727f493c798a50454208
* Add dfly62 test target.
* If we haven't found it yet, recheck for sys/stat.h.
On some very old platforms, sys/stat.h needs sys/types.h, however
autoconf 2.71's AC_CHECK_INCLUDES_DEFAULT checks for them in the
opposite order, which in combination with modern autoconf's
"present but cannot be compiled" behaviour causes it to not be
detected.
* Add fallback for old platforms w/out MAP_ANON.
* Remove explicit "default" test config argument.
Not specifying the test config implicitly selects default args.
* Remove unused self-hosted test targets.
* Rename "os" in matrix to "target".
This is in preparation to distinguish this from the host that the runner
runs on in case where they are separate (eg VMs).
* Add "libvirt" label to dfly30.
* Make "config" in matrix singular and pass in env.
This will allow the startup scripts to adapt their behaviour based on
the type and config.
* Run vmstartup from temp dir.
This will allow us to create ephemeral disk images per-runner.
* Rework how selfhosted tests interact with runners.
Previously there was one runner per test target (mostly VMs). This had
a few limitations:
- multiple tests that ran on the same target (eg multiple build
configs) were serialized on availability or that runner.
- it needed manual balancing of VMs over host machines.
To address this, make VMs that use ephemeral disks (ie most of them)
all use a pool of runners with the "libvirt" label. This requires that
we distinguish between "host" and "target" for those. Native runners
and VMs with persistent disks (eg the constantly-updated snapshot ones)
specify the same host and target.
This should improve test throughput.
* Skip unit tests on slow riscv64 hardware.
* Use -fzero-call-used-regs=used on clang 15.
clang 15 seems to have a problem with -fzero-call-used-reg=all which
causes spurious "incorrect signature" failures with ED25519. On those
versions, use -fzero-call-used-regs=used instead. (We may add exceptions
later if specific versions prove to be OK). Also move the GCC version
check to match.
Initial investigation by Daniel Pouzzner (douzzer at mega nu), workaround
suggested by Bill Wendling (morbo at google com). bz#3475, ok djm@
* upstream: In channel_request_remote_forwarding the parameters for
permission_set_add are leaked as they are also duplicated in the call. Found
by CodeChecker. ok djm
OpenBSD-Commit-ID: 4aef50fa9be7c0b138188814c8fe3dccc196f61e
* upstream: New EnableEscapeCommandline ssh_config(5) option
This option (default "no") controls whether the ~C escape is available.
Turning it off by default means we will soon be able to use a stricter
default pledge(2) in the client.
feedback deraadt@ dtucker@; tested in snaps for a while
OpenBSD-Commit-ID: 7e277595d60acb8263118dcb66554472257b387a
* upstream: tighten pledge(2) after session establishment
feedback, ok & testing in snaps deraadt@
OpenBSD-Commit-ID: aecf4d49d28586dfbcc74328d9333398fef9eb58
* upstream: Add void to client_repledge args to fix compiler warning. ok djm@
OpenBSD-Commit-ID: 7e964a641ce4a0a0a11f047953b29929d7a4b866
* upstream: Log output of ssh-agent and ssh-add
This should make debugging easier.
OpenBSD-Regress-ID: 5974b02651f428d7e1079b41304c498ca7e306c8
* upstream: Clean up ssh-add and ssh-agent logs.
OpenBSD-Regress-ID: 9eda8e4c3714d7f943ab2e73ed58a233bd29cd2c
* Restore ssh-agent permissions on exit.
...enough that subsequent builds can overwrite ssh-agent if necessary.
* upstream: make struct sshbuf private
and remove an unused field; ok dtucker
OpenBSD-Commit-ID: c7a3d77c0b8c153d463398606a8d57569186a0c3
* upstream: Remove duplicate includes.
Patch from AtariDreams via github PR#364.
OpenBSD-Commit-ID: b9186638a05cb8b56ef7c0de521922b6723644ea
* Fix typo in comment. Spotted by tim@
* Update autotools
Regenerate config files using latest autotools
* disable SANDBOX_SECCOMP_FILTER_DEBUG
It was mistakenly enabled in 2580916e4872
Reported by Peter sec-openssh-com.22.fichtner AT 0sg.net
* Add SANDBOX_DEBUG to the kitchensink test build.
* upstream: Fix comment typo.
OpenBSD-Regress-ID: 3b04faced6511bb5e74648c6a4ef4bf2c4decf03
* upstream: remove '?' from getopt(3) loops
userspace: remove vestigial '?' cases from top-level getopt(3) loops
getopt(3) returns '?' when it encounters a flag not present in the in
the optstring or if a flag is missing its option argument. We can
handle this case with the "default" failure case with no loss of
legibility. Hence, remove all the redundant "case '?':" lines.
Prompted by dlg@. With help from dlg@ and millert@.
Link: https://marc.info/?l=openbsd-tech&m=167011979726449&w=2
ok naddy@ millert@ dlg@
OpenBSD-Commit-ID: b2f89346538ce4f5b33ab8011a23e0626a67e66e
* upstream: Add server debugging for hostbased auth.
auth_debug_add queues messages about the auth process which is sent to
the client after successful authentication. This also sends those to
the server debug log to aid in debugging. From bz#3507, ok djm@
OpenBSD-Commit-ID: 46ff67518cccf9caf47e06393e2a121ee5aa258a
* upstream: Warn if no host keys for hostbased auth can be loaded.
OpenBSD-Commit-ID: 2a0a13132000cf8d3593133c1b49768aa3c95977
* use calloc for allocating arc4random structs
ok dtucker
* Move obsdsnap test VMs to ephemeral runners.
* Run upstream obsdsnap tests on ephemeral runners.
* obsdsnap test VMs runs-on libvirt too.
* Fetch regress logs from obj dir.
* Set group perms on regress dir.
This ensures that the tests don't fail due to StrictMode checks.
* Use sudo when resetting perms on directories.
* Add tests for LibreSSL 3.7.0 and OpenSSL 1.1.1s.
* Simply handling of SSH_CONNECTION PAM env var.
Prompted by bz#3508: there's no need to cache the value of
sshpam_conninfo so remove the global. While there, add check of
return value from pam_putenv. ok djm@
* upstream: The idiomatic way of coping with signed char vs unsigned
char (which did not come from stdio read functions) in the presence of
ctype macros, is to always cast to (unsigned char). casting to (int)
for a "macro" which is documented to take int, is weird. And sadly wrong,
because of the sing extension risk.. same diff from florian
OpenBSD-Commit-ID: 65b9a49a68e22ff3a0ebd593f363e9f22dd73fea
* upstream: add a -X option to both scp(1) and sftp(1) to allow
control over some SFTP protocol knobs: the copy buffer length and
the number of inflight requests, both of which are used during
upload/download.
Previously these could be controlled in sftp(1) using the -b/-R options.
This makes them available in both SFTP protocol clients using the same
option character sequence.
ok dtucker@
OpenBSD-Commit-ID: 27502bffc589776f5da1f31df8cb51abe9a15f1c
* upstream: add -X to usage();
OpenBSD-Commit-ID: 1bdc3df7de11d766587b0428318336dbffe4a9d0
* upstream: Clear signal mask early in main(); sshd may have been
started with one or more signals masked (sigprocmask(2) is not cleared
on fork/exec) and this could interfere with various things, e.g. the
login grace timer.
Execution environments that fail to clear the signal mask before running
sshd are clearly broken, but apparently they do exist.
Reported by Sreedhar Balasubramanian; ok dtucker@
OpenBSD-Commit-ID: 77078c0b1c53c780269fc0c416f121d05e3010ae
* upstream: Mention that scp uses the SFTP protocol and remove
reference to legacy flag. Spotted by, feedback and ok jmc@
OpenBSD-Commit-ID: 9dfe04966f52e941966b46c7a2972147f95281b3
* upstream: spelling fixes; from paul tagliamonte amendments to his
diff are noted on tech
OpenBSD-Commit-ID: d776dd03d0b882ca9c83b84f6b384f6f9bd7de4a
* upstream: fix bug in PermitRemoteOpen which caused it to ignore its
first argument unless it was one of the special keywords "any" or "none".
Reported by Georges Chaudy in bz3515; ok dtucker@
OpenBSD-Commit-ID: c5678a39f1ff79993d5ae3cfac5746a4ae148ea5
* upstream: regression test for PermitRemoteOpen
OpenBSD-Regress-ID: 8271aafbf5c21950cd5bf966f08e585cebfe630c
* upstream: suppress "Connection closed" message when in quiet mode
OpenBSD-Commit-ID: 8a3ab7176764da55f60bfacfeae9b82d84e3908f
* upstream: add ptimeout API for keeping track of poll/ppoll
timeouts; ok dtucker markus
OpenBSD-Commit-ID: 3335268ca135b3ec15a947547d7cfbb8ff929ead
* upstream: replace manual poll/ppoll timeout math with ptimeout API
feedback markus / ok markus dtucker
OpenBSD-Commit-ID: c5ec4f2d52684cdb788cd9cbc1bcf89464014be2
* upstream: Add channel_force_close()
This will forcibly close an open channel by simulating read/write errors,
draining the IO buffers and calling the detach function.
Previously the detach function was only ever called during channel garbage
collection, but there was no way to signal the user of a channel (e.g.
session.c) that its channel was being closed deliberately (vs. by the
usual state-machine logic). So this adds an extra "force" argument to the
channel cleanup callback to indicate this condition.
ok markus dtucker
OpenBSD-Commit-ID: 23052707a42bdc62fda2508636e624afd466324b
* upstream: tweak channel ctype names
These are now used by sshd_config:ChannelTimeouts to specify timeouts by
channel type, so force them all to use a similar format without whitespace.
ok dtucker markus
OpenBSD-Commit-ID: 66834765bb4ae14f96d2bb981ac98a7dae361b65
* upstream: Add channel_set_xtype()
This sets an "extended" channel type after channel creation (e.g.
"session:subsystem:sftp") that will be used for setting channel inactivity
timeouts.
ok markus dtucker
OpenBSD-Commit-ID: 42564aa92345045b4a74300528f960416a15d4ca
* upstream: Implement channel inactivity timeouts
This adds a sshd_config ChannelTimeouts directive that allows channels that
have not seen traffic in a configurable interval to be automatically closed.
Different timeouts may be applied to session, X11, agent and TCP forwarding
channels.
Note: this only affects channels over an opened SSH connection and not
the connection itself. Most clients close the connection when their channels
go away, with a notable exception being ssh(1) in multiplexing mode.
ok markus dtucker
OpenBSD-Commit-ID: ae8bba3ed9d9f95ff2e2dc8dcadfa36b48e6c0b8
* unbreak scp on NetBSD 4.x
e555d5cad5 effectively increased the default copy buffer size for SFTP
transfers. This caused NetBSD 4.x to hang during the "copy local file to
remote file in place" scp.sh regression test.
This puts back the original 32KB copy buffer size until we can properly
figure out why.
lots of debugging assistance from dtucker@
* upstream: Copy bytes from the_banana[] rather than banana()
Fixes test failure due to segfault seen on arm64 with xonly snap.
ok djm
OpenBSD-Regress-ID: 86e2aa4bbd1dff1bc4ebb2969c0d6474485be046
* upstream: unit tests for misc.c:ptimeout_* API
OpenBSD-Regress-ID: 01f8fb12d08e5aaadd4bd4e71f456b6588be9a94
* upstream: fix typo in verbose logging
OpenBSD-Regress-ID: 0497cdb66e003b2f50ed77291a9104fba2e017e9
* upstream: regression test for ChannelTimeout
OpenBSD-Regress-ID: 280bfbefcfa415428ad744e43f69a8dede8ad685
* upstream: Save debug logs from ssh for debugging purposes.
OpenBSD-Regress-ID: 109e40b06de1c006a3b8e0d8745b790b2c5870a0
* Set OPENSSL_BIN from OpenSSL directory.
* Check openssl_bin path is executable before using.
* Use autoconf to find openssl binary.
It's possible to install an OpenSSL in a path not in the system's
default library search path. OpenSSH can still use this (eg if you
specify an rpath) but the openssl binary there may not work. If one is
available on the system path just use that.
* Use our own netcat for dynamic-forward test.
That way we can be surer about its behaviour rather than trying to
second-guess the behaviour of various netcat implementations.
* upstream: When OpenSSL is not available, skip parts of percent test
that require it. Based on github pr#368 from ren mingshuai.
OpenBSD-Regress-ID: 49a375b2cf61ccb95b52e75e2e025cd10988ebb2
* don't test IPv6 addresses if platform lacks support
* Skip dynamic-forward test on minix3.
This test relies on loopback addresses which minix does not have.
Previously the test would not run at all since it also doesn't have
netcat, but now we use our own netcat it tries and fails.
* try to improve logging for dynamic-forward test
previously the logs from the ssh used to exercise the forwarding
channel would clobber the logs from the ssh actually doing the
forwarding
* upstream: tweak previous; ok djm
OpenBSD-Commit-ID: 229c493452766d70a78b0f02f6ff9894f9028858
* upstream: Switch scp from using pipes to a socketpair for
communication with it's ssh sub-processes. We no longer need to reserve two
descriptors to ensure that we don't end up using fd 0-2 unexpectedly, that is
handled by sanitise_stdfd() in main(). Based on an original diff from djm@.
OK deraadt@ djm@
OpenBSD-Commit-ID: b80c372faac462471e955ddeab9480d668a2e48d
* add back use of pipes in scp.c under USE_PIPES
This matches sftp.c which prefers socketpair but uses pipes on
some older platforms.
* remove buffer len workaround for NetBSD 4.x
Switching to from pipes to a socketpair for communicating with the
ssh process avoids the (kernel bug?) problem.
* upstream: rewrite this test to use a multiplexed ssh session so we can
control its lifecycle without risk of race conditions; fixes some of the
Github integration tests for openssh-portable
OpenBSD-Regress-ID: 5451cad59ba0d43ae9eeda48ec80f54405fee969
* upstream: remove whitespace at EOL from code extracted from SUPERCOP
OpenBSD-Commit-ID: 1ec524ff2fbb9387d731601437c82008f35a60f4
* upstream: ignore bogus upload/download buffer lengths in the limits
extension
OpenBSD-Commit-ID: c5b023e0954693ba9a5376e4280c739b5db575f8
* upstream: clamp the minimum buffer lengths and number of inflight
requests too
OpenBSD-Commit-ID: c4965f62fa0ba850940fd66ae3f60cf516bbcd56
* upstream: avoid printf("%s", NULL) if using ssh
-oUserKnownHostsFile=none and a hostkey in one of the system known hosts file
changes; ok dtucker@
OpenBSD-Commit-ID: 7ca87614bfc6da491315536a7f2301434a9fe614
* upstream: Add a "Host" line to the output of ssh -G showing the
original host arg. Inspired by patch from vincent at bernat.ch via bz#3343,
ok djm@
OpenBSD-Commit-ID: 59c0f60a222113a44d0650cd394376e3beecc883
* Remove skipping test when scp not in path.
An upcoming change renders this obsolete by adding scp's path to the
test sshd's PATH, and removing this first will make the subsequent sync
easier.
* upstream: Add scp's path to test sshd's PATH.
If the scp we're testing is fully qualified (eg it's not in the system
PATH) then add its path to the under-test sshd's PATH so we can find
it. Prompted by bz#3518.
OpenBSD-Regress-ID: 7df4f5a0be3aa135495b7e5a6719d3cbc26cc4c0
* upstream: Move scp path setting to a helper function. The previous
commit to add scp to the test sshd's path causes the t-envpass test to fail
when the test scp is given using a fully qualified path. Put this in a
helper function and only call it from the scp tests.
OpenBSD-Regress-ID: 7533dc1c4265c1de716abb062957994195b36df4
* Retry package installation 3 times.
When setting up the CI environment, retry package installation 3 times
before going up. Should help prevent spurious failures during
infrastructure issues.
* upstream: Document "UserKnownHostsFile none". ok djm@
OpenBSD-Commit-ID: f695742d39e34ecdcc3c861c3739a84648a4bce5
* upstream: fix double phrase in previous;
OpenBSD-Commit-ID: 671e6c8dc5e9230518b2bbfa143daaa88adc66c2
* upstream: Instead of skipping the all-tokens test if we don't have
OpenSSL (since we use it to compute the hash), put the hash at the end and
just omit it if we don't have it. Prompted by bz#3521.
OpenBSD-Regress-ID: c79ecba64250ed3b6417294b6c965e6b12ca5eea
* upstream: Shell syntax fix. From ren mingshuai vi github PR#369.
OpenBSD-Regress-ID: 6696b2eeefe128099fc3d7ea9f23252cc35156f9
* Allow writev is seccomp sandbox.
This seems to be used by recent glibcs at least in some configurations.
From bz#3512, ok djm@
* upstream: update OpenSSH's Ed25519 code to the last version of SUPERCOP
(20221122) and change the import approach to the same one we use for
Streamlined NTRUPrime: use a shell script to extract the bits we need from
SUPERCOP, make some minor adjustments and squish them all into a single file.
ok tb@ tobhe@
OpenBSD-Commit-ID: 1bc0fd624cb6af440905b8ba74ac7c03311b8e3b
* upstream: adapt to ed25519 changes in src/usr.bin/ssh
OpenBSD-Regress-ID: 4b3e7ba7ee486ae8a0b4790f8112eded2bb7dcd5
* upstream: Add a sshd_config UnusedConnectionTimeout option to terminate
client connections that have no open channels for some length of time. This
complements the recently-added ChannelTimeout option that terminates inactive
channels after a timeout.
ok markus@
OpenBSD-Commit-ID: ca983be74c0350364c11f8ba3bd692f6f24f5da9
* upstream: unbreak test: cannot access shell positional parameters
past $9 without wrapping the position in braces (i.e. need ${10}, etc.)
OpenBSD-Regress-ID: 3750ec98d5d409ce6a93406fedde6f220d2ea2ac
* upstream: regression test for UnusedConnectionTimeout
OpenBSD-Regress-ID: 7f29001374a68e71e5e078f69e4520cf4bcca084
* upstream: also check that an active session inhibits
UnusedConnectionTimeout idea markus@
OpenBSD-Regress-ID: 55c0fb61f3bf9e092b0a53f9041d3d2012f14003
* upstream: For "ssh -V" always exit 0, there is no need to check opt
again. This was missed when the fallthrough in the switch case above it was
removed. OK deraadt@
OpenBSD-Commit-ID: 5583e5d8f6d62a8a4215cfa95a69932f344c8120
* upstream: Add a -V (version) option to sshd like the ssh client
has. OK markus@ deraadt@
OpenBSD-Commit-ID: abe990ec3e636fb040132aab8cbbede98f0c413e
* upstream: when restoring non-blocking mode to stdio fds, restore
exactly the flags that ssh started with and don't just clobber them with
zero, as this could also remove the append flag from the set;
bz3523; ok dtucker@
OpenBSD-Commit-ID: 1336b03e881db7564a4b66014eb24c5230e9a0c0
* Skip connection-timeout when missing FD passing.
This tests uses multiplexing which uses file descriptor passing, so
skip it if we don't have that. Fixes test failures on Cygwin.
* Skip connection-timeout test under Valgrind.
Valgrind slows things down so much that the timeout test fails. Skip
this test until we figure out if we can make it work.
* upstream: tweak previous; ok djm
OpenBSD-Commit-ID: df71ce4180c58202dfdc1d92626cfe900b91b7c3
* upstream: Create and install sshd random relink kit.
../Makefile.inc and Makfile are concatenated for reuse, which hopefully won't
be too fragile, we'll see if we need a different approach. The resulting sshd
binary is tested with the new sshd -V option before installation. As the
binary layout is now semi-unknown (meaning relative, fixed, and gadget
offsets are not precisely known), change the filesystem permissions to 511 to
prevent what I call "logged in BROP". I have ideas for improving this further
but this is a first step ok djm
OpenBSD-Commit-ID: 1e0a2692b7e20b126dda60bf04999d1d30d959d8
* upstream: delete useless dependency
OpenBSD-Commit-ID: e1dc11143f83082e3154d6094f9136d0dc2637ad
* fix libfido2 detection without pkg-config
Place libfido2 before additional libraries (that it may depend upon)
and not after. bz3530 from James Zhang; ok dtucker@
* Skip connection-timeout test on minix3.
Minix 3's Unix domain sockets don't seem to work the way we expect, so
skip connection-timeout test on that platform. While there, group
together all similarly skipped tests and explicitly comment.
* upstream: fix double-free caused by compat_kex_proposal(); bz3522
by dtucker@, ok me
OpenBSD-Commit-ID: 2bfc37cd2d41f67dad64c17a64cf2cd3806a5c80
* upstream: openssh-9.2
OpenBSD-Commit-ID: f7389f32413c74d6e2055f05cf65e7082de03923
* upstream: Check if we can copy sshd or need to use sudo to do so
during reexec test. Skip test if neither can work. Patch from anton@, tweaks
from me.
OpenBSD-Regress-ID: 731b96ae74d02d5744e1f1a8e51d09877ffd9b6d
* upstream: test compat_kex_proposal(); by dtucker@
OpenBSD-Regress-ID: 0e404ee264db546f9fdbf53390689ab5f8d38bf2
* adapt compat_kex_proposal() test to portable
* update version in README
* crank versions in RPM specs
* remove files from libssh project
* re-merge arc4random.c
* re-merge misc.c
* remove unused files from libssh.vcxproj
* fix outstanding merge conflicts
* fix build errors
* modify upstream workflows to trigger on workflow dispatch instead of all PRs
* fix scp client hanging with pipes
* fix some failing bash tests
* make bash test compatible with Windows
* address scp's sftp mode buf len limitations
* address review feedback
* address review feedback
* update comment
---------
Signed-off-by: Sam James <sam@gentoo.org>
Co-authored-by: djm@openbsd.org <djm@openbsd.org>
Co-authored-by: Darren Tucker <dtucker@dtucker.net>
Co-authored-by: Damien Miller <djm@mindrot.org>
Co-authored-by: Sam James <sam@gentoo.org>
Co-authored-by: jsg@openbsd.org <jsg@openbsd.org>
Co-authored-by: jmc@openbsd.org <jmc@openbsd.org>
Co-authored-by: dtucker@openbsd.org <dtucker@openbsd.org>
Co-authored-by: Harmen Stoppels <harmenstoppels@gmail.com>
Co-authored-by: Rochdi Nassah <rochdinassah.1998@gmail.com>
Co-authored-by: David Korczynski <david@adalogics.com>
Co-authored-by: Pierre Ossman <ossman@cendio.se>
Co-authored-by: mbuhl@openbsd.org <mbuhl@openbsd.org>
Co-authored-by: Rose <83477269+AtariDreams@users.noreply.github.com>
Co-authored-by: cheloha@openbsd.org <cheloha@openbsd.org>
Co-authored-by: deraadt@openbsd.org <deraadt@openbsd.org>
Co-authored-by: tb@openbsd.org <tb@openbsd.org>
Co-authored-by: millert@openbsd.org <millert@openbsd.org>
2023-02-09 22:57:36 +01:00
|
|
|
}
|
|
|
|
if (ssh != NULL && sshpam_laddr != NULL) {
|
|
|
|
char *conninfo;
|
|
|
|
|
2019-01-20 00:22:18 +01:00
|
|
|
/* Put SSH_CONNECTION in the PAM environment too */
|
Merge 9.2 (#657)
* upstream: attemp FIDO key signing without PIN and use the error
code returned to fall back only if necessary. Avoids PIN prompts for FIDO
tokens that don't require them; part of GHPR#302
OpenBSD-Commit-ID: 4f752aaf9f2e7c28bcaaf3d4f8fc290131bd038e
* Install Cygwin packages based on OS not config.
* initial list of allowed signers
* upstream: whitespace
OpenBSD-Commit-ID: d297e4387935d4aef091c5e9432578c2e513f538
* upstream: whitespace
OpenBSD-Commit-ID: a5d015efbfd228dc598ffdef612d2da3a579e5d8
* Add cygwin-release test target.
This also moves the cygwin package install from the workflow file to
setup_ci.sh so that we can install different sets of Cygwin packages
for different test configs.
* Add Windows 2022 test targets.
* Add libcrypt-devel to cygwin-release deps.
Based on feedback from vinschen at redhat.com.
* cross-sign allowed_signers with PGP key
Provides continuity of trust from legacy PGP release key to
the SSHSIG signing keys that we will use henceforth for git
signing.
* additional keys
* upstream: whitespace
OpenBSD-Commit-ID: c2bcbf93610d3d62ed206cdf9bf9ff98c6aaf232
* Move sftp from valgrind-2 to 3 to rebalance.
* upstream: sk-usbhid: fix key_lookup() on tokens with built-in UV
explicitly test whether the token performs built-in UV (e.g. biometric
tokens) and enable UV in that case. From Pedro Martelletto via GHPR#388
OpenBSD-Commit-ID: 007eb7e387d27cf3029ab06b88224e03eca62ccd
* Remove arc4random_uniform from arc4random.c
This was previously moved into its own file (matching OpenBSD) which
prematurely committed in commit 73541f2.
* Move OPENBSD ORIGINAL marker.
Putting this after the copyright statement (which doesn't change)
instead of before the version identifier (which does) prevents merge
conflicts when resyncing changes.
* Resync arc4random with OpenBSD.
This brings us up to current, including djm's random-reseeding change,
as prompted by logan at cyberstorm.mu in bz#3467. It brings the
platform-specific hooks from LibreSSL Portable, simplified to match our
use case. ok djm@.
* Remove DEF_WEAK, it's already in defines.h.
* openbsd-compat/bsd-asprintf: add <stdio.h> include for vsnprintf
Fixes the following build failure with Clang 15 on musl:
```
bsd-asprintf.c:51:8: error: call to undeclared library function 'vsnprintf' with type 'int (char *, unsigned long, const char *, struct __va_list_tag *)'; ISO C99 and laterclang -O2 -pipe -fdiagnostics-color=always -frecord-gcc-switches -pipe -Wunknown-warning-option -Qunused-arguments -Wall -Wpointer-arith -Wuninitialized -Wsign-compare -Wformat-security -Wsizeof-pointer-memaccess -Wno-pointer-sign -Wno-unused-result -Wmisleading-indentation -Wbitwise-instead-of-logical -fno-strict-aliasing -mretpoline -ftrapv -fzero-call-used-regs=all -fno-builtin-memset -fstack-protector-strong -fPIE -I. -I. -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -D_DEFAULT_SOURCE -DSSHDIR=\"/etc/ssh\" -D_PATH_SSH_PROGRAM=\"/usr/bin/ssh\" -D_PATH_SSH_ASKPASS_DEFAULT=\"/usr/lib/misc/ssh-askpass\" -D_PATH_SFTP_SERVER=\"/usr/lib/misc/sftp-server\" -D_PATH_SSH_KEY_SIGN=\"/usr/lib/misc/ssh-keysign\" -D_PATH_SSH_PKCS11_HELPER=\"/usr/lib/misc/ssh-pkcs11-helper\" -D_PATH_SSH_SK_HELPER=\"/usr/lib/misc/ssh-sk-helper\" -D_PATH_SSH_PIDDIR=\"/run\" -D_PATH_PRIVSEP_CHROOT_DIR=\"/var/empty\" -DHAVE_CONFIG_H -c cipher-aes.c -o cipher-aes.o
do not support
implicit function declarations [-Wimplicit-function-declaration]
ret = vsnprintf(string, INIT_SZ, fmt, ap2);
^
bsd-asprintf.c:51:8: note: include the header <stdio.h> or explicitly provide a declaration for 'vsnprintf'
1 error generated.
```
* upstream: notifier_complete(NULL, ...) is a noop, so no need to test
that ctx!=NULL; from Corinna Vinschen
OpenBSD-Commit-ID: ade2f2e9cc519d01a586800c25621d910bce384a
* upstream: fix repeated words ok miod@ jmc@
OpenBSD-Commit-ID: 6765daefe26a6b648cc15cadbbe337596af709b7
* upstream: .Li -> .Vt where appropriate; from josiah frentsos,
tweaked by schwarze
ok schwarze
OpenBSD-Commit-ID: 565046e3ce68b46c2f440a93d67c2a92726de8ed
* upstream: ssh-agent: attempt FIDO key signing without PIN and use
the error to determine whether a PIN is required and prompt only if
necessary. from Corinna Vinschen
OpenBSD-Commit-ID: dd6be6a0b7148608e834ee737c3479b3270b00dd
* upstream: a little extra debugging
OpenBSD-Commit-ID: edf1601c1d0905f6da4c713f4d9cecc7d1c0295a
* upstream: sk_enroll: never drop SSH_SK_USER_VERIFICATION_REQD flag
from response
Now that all FIDO signing calls attempt first without PIN and then
fall back to trying PIN only if that attempt fails, we can remove the
hack^wtrick that removed the UV flag from the keys returned during
enroll.
By Corinna Vinschen
OpenBSD-Commit-ID: 684517608c8491503bf80cd175425f0178d91d7f
* upstream: sftp: Don't attempt to complete arguments for
non-existent commands
If user entered a non-existent command (e.g. because they made a
typo) there is no point in trying to complete its arguments. Skip
calling complete_match() if that's the case.
From Michal Privoznik
OpenBSD-Commit-ID: cf39c811a68cde2aeb98fc85addea4000ef6b07a
* upstream: sftp: Be a bit more clever about completions
There are commands (e.g. "get" or "put") that accept two
arguments, a local path and a remote path. However, the way
current completion is written doesn't take this distinction into
account and always completes remote or local paths.
By expanding CMD struct and "cmds" array this distinction can be
reflected and with small adjustment to completer code the correct
path can be completed.
By Michal Privoznik, ok dtucker@
OpenBSD-Commit-ID: 1396d921c4eb1befd531f5c4a8ab47e7a74b610b
* upstream: correct error value
OpenBSD-Commit-ID: 780efcbad76281f11f14b2a5ff04eb6db3dfdad4
* upstream: actually hook up restrict_websafe; the command-line flag
was never actually used. Spotted by Matthew Garrett
OpenBSD-Commit-ID: 0b363518ac4c2819dbaa3dfad4028633ab9cdff1
* upstream: Add a sshkey_check_rsa_length() call for checking the
length of an RSA key; ok markus@
OpenBSD-Commit-ID: de77cd5b11594297eda82edc594b0d32b8535134
* upstream: add a RequiredRSASize for checking RSA key length in
ssh(1). User authentication keys that fall beneath this limit will be
ignored. If a host presents a host key beneath this limit then the connection
will be terminated (unfortunately there are no fallbacks in the protocol for
host authentication).
feedback deraadt, Dmitry Belyavskiy; ok markus@
OpenBSD-Commit-ID: 430e339b2a79fa9ecc63f2837b06fdd88a7da13a
* upstream: Add RequiredRSASize for sshd(8); RSA keys that fall
beneath this limit will be ignored for user and host-based authentication.
Feedback deraadt@ ok markus@
OpenBSD-Commit-ID: 187931dfc19d51873df5930a04f2d972adf1f7f1
* upstream: better debugging for connect_next()
OpenBSD-Commit-ID: d16a307a0711499c971807f324484ed3a6036640
* upstream: sftp-server(8): add a "users-groups-by-id@openssh.com"
extension request that allows the client to obtain user/group names that
correspond to a set of uids/gids.
Will be used to make directory listings more useful and consistent
in sftp(1).
ok markus@
OpenBSD-Commit-ID: 7ebabde0bcb95ef949c4840fe89e697e30df47d3
* upstream: extend sftp-common.c:extend ls_file() to support supplied
user/group names; ok markus@
OpenBSD-Commit-ID: c70c70498b1fdcf158531117e405b6245863bfb0
* upstream: sftp client library support for
users-groups-by-id@openssh.com; ok markus@
OpenBSD-Commit-ID: ddb2f33a2da6349a9a89a8b5bcb9ca7c999394de
* upstream: use users-groups-by-id@openssh.com sftp-server extension
(when available) to fill in user/group names for directory listings.
Implement a client-side cache of see uid/gid=>user/group names. ok markus@
OpenBSD-Commit-ID: f239aeeadfa925a37ceee36ee8b256b8ccf4466e
* avoid Wuninitialized false positive in gcc-12ish
* no need for glob.h here
it also causes portability problems
* upstream: add RequiredRSASize to the list of keywords accepted by
-o; spotted by jmc@
OpenBSD-Commit-ID: fe871408cf6f9d3699afeda876f8adbac86a035e
* upstream: Fix typo. From AlexanderStohr via github PR#343.
OpenBSD-Commit-ID: a134c9b4039e48803fc6a87f955b0f4a03181497
* upstream: openssh-9.1
OpenBSD-Commit-ID: 5a467b2ee81da01a86adf1ad93b62b1728494e56
* crank versions in RPM spec files
* update release notes URL
* update .depend
* remove mention of --with-security-key-builtin
it is enabled by default when libfido2 is installed
* mention libfido2 autodetection
* whitespace at EOL
* Test commits to all branches of portable.
Only test OpenBSD upstream on commits to master since that's what it
tracks.
* Add 9.1 branch to CI status page.
* Add LibreSSL 3.6.0 to test suite.
While there, bump OpenSSL to latest 1.1.1q release.
* upstream: honour user's umask if it is more restrictive then the ssh
default (022); based on patch from Alex Henrie, ok dtucker@ deraadt@
OpenBSD-Commit-ID: fe1b9e15fc9a4f49fc338e848ce14d8727abe82d
* skip bsd-poll.h if poll.h found; ok dtucker
* Fix snprintf configure test for clang 15
Clang 15 -Wimplicit-int defaults to an error in C99 mode and above.
A handful of tests have "main(..." and not "int main(..." which caused
the tests to produce incorrect results.
* undef _get{short,long} before redefining
* revert c64b62338b4 and guard POLL* defines instead
c64b62338b4 broke OSX builds, which do have poll.h but lack ppoll(2)
Spotted by dtucker
* OpenSSL dev branch now identifies as 3.2.0.
* upstream: document "-O no-restrict-websafe"; spotted by Ross L
Richardson
OpenBSD-Commit-ID: fe9eaa50237693a14ebe5b5614bf32a02145fe8b
* upstream: ssh-agent.1: - use Nm not Xr for self-ref - while here,
wrap a long line
ssh-agent.c:
- add -O to usage()
OpenBSD-Commit-ID: 855dac4695cef22e96d69c53436496bc408ca389
* upstream: use correct type with sizeof ok djm@
OpenBSD-Commit-ID: d6c882c2e8a42ff831a5b3cbc2c961ecb2dd6143
* upstream: when scp(1) is using the SFTP protocol for transport (the
default), better match scp/rcp's handling of globs that don't match the
globbed characters but do match literally (e.g. trying to transfer
"foo.[1]").
Previously scp(1) in SFTP mode would not match these pathnames but
legacy scp/rcp mode would.
Reported by Michael Yagliyan in bz3488; ok dtucker@
OpenBSD-Commit-ID: d8a3773f53015ba811fddba7473769a2fd343e11
* upstream: regress test for unmatched glob characters; fails before
previous commit but passes now. bz3488; prodded by dtucker@
OpenBSD-Regress-ID: 0cc5cc9ea4a6fd170dc61b9212f15badaafb3bbd
* upstream: Be more paranoid with host/domain names coming from the
never write a name with bad characters to a known_hosts file.
reported by David Leadbeater, ok deraadt@
OpenBSD-Commit-ID: ba9b25fa8b5490b49398471e0c9657b0cbc7a5ad
* upstream: begin big refactor of sshkey
Move keytype data and some of the type-specific code (allocation,
cleanup, etc) out into each key type's implementation. Subsequent
commits will move more, with the goal of having each key-*.c file
owning as much of its keytype's implementation as possible.
lots of feedback + ok markus@
OpenBSD-Commit-ID: 0f2b4334f73914344e9e5b3d33522d41762a57ec
* upstream: factor out sshkey_equal_public()
feedback/ok markus@
OpenBSD-Commit-ID: 1368ba114cb37732fe6ec3d89c7e6d27ea6fdc94
* upstream: factor out public key serialization
feedback/ok markus@
OpenBSD-Commit-ID: a3570c4b97290c5662890aea7328d87f55939033
* upstream: refactor and simplify sshkey_read()
feedback/ok markus@
OpenBSD-Commit-ID: 0d93b7a56e31cd06a8bb0d2191d084ce254b0971
* upstream: factor out key generation
feedback/ok markus@
OpenBSD-Commit-ID: 5b4211bff4de8d9adb84bc72857a8c42c44e7ceb
* upstream: refactor sshkey_from_private()
feedback/ok markus@
OpenBSD-Commit-ID: e5dbe7a3545930c50f70ee75c867a1e08b382b53
* upstream: refactor sshkey_from_blob_internal()
feedback/ok markus@
OpenBSD-Commit-ID: 1f46c0cbb8060ee9666a02749594ad6658c8e283
* upstream: refactor sshkey_sign() and sshkey_verify()
feedback/ok markus@
OpenBSD-Commit-ID: 368e662c128c99d05cc043b1308d2b6c71a4d3cc
* upstream: refactor certify
feedback/ok markus@
OpenBSD-Commit-ID: 35d742992e223eaca3537e6fb3d3002c08eed4f6
* upstream: refactor sshkey_private_serialize_opt()
feedback/ok markus@
OpenBSD-Commit-ID: 61e0fe989897901294efe7c3b6d670cefaf44cbd
* upstream: refactor sshkey_private_deserialize
feedback/ok markus@
OpenBSD-Commit-ID: f5ca6932fdaf840a5e8250becb38315a29b5fc9f
* fix merge botch
* upstream: allow ssh-keyscan(1) to accept CIDR address ranges, e.g.
ssh-keyscan 192.168.0.0/24
If a CIDR range is passed, then it will be expanded to all possible
addresses in the range including the all-0s and all-1s addresses.
bz#976 feedback/ok markus@
OpenBSD-Commit-ID: ce6c5211f936ac0053fd4a2ddb415277931e6c4b
* upstream: put sshkey_check_rsa_length() back in sshkey.c to unbreak
OPENSSL=no builds
OpenBSD-Commit-ID: 99eec58abe382ecd14b14043b195ee1babb9cf6e
* OpenSSL dev branch is 302 not 320.
While there, also accept 301 which it shat it was previously.
* upstream: Use variable for diff options
instead of unconditionally specifying "-rN". This will make life easier
in -portable where not all diff's understand -N.
OpenBSD-Regress-ID: 8b8a407115546be1c6d72d350b1e4f1f960d3cd3
* Check for sockaddr_in.sin_len.
If found, set SOCK_HAS_LEN which is used in addr.c. Should fix keyscan
tests on platforms with this (eg old NetBSD).
* Always use compat getentropy.
Have it call native getentropy and fall back as required. Should fix
issues of platforms where libc has getentropy but it is not implemented
in the kernel. Based on github PR#354 from simsergey.
* Include time.h when defining timegm.
Fixes build on some platforms eg recent AIX.
* Compat tests need libcrypto.
This was moved to CHANNELLIBS during the libs refactor. Spotted by
rapier at psc.edu.
* Run compat regress tests too.
* Add tests for OpenSSL 3.0.7 and LibreSSL 3.6.1.
* Only run opensslver tests if built with OpenSSL.
* Increase selfhosted job timeout.
The default job timeout of 360 (6h) is not enough to complete the
regress tests for some of the slow VMs depending on the load on the host.
Increase to 600 (10h).
* Fix compat regress to work with non-GNU make.
* Link libssh into compat tests.
The cygwin compat code uses xmalloc, so add libssh.a so pick up that.
* Rerun tests on changes to Makefile.in in any dir.
* upstream: replace recently-added valid_domain() check for hostnames
going to known_hosts with a more relaxed check for bad characters; previous
commit broke address literals. Reported by/feedback from florian@
OpenBSD-Commit-ID: 10b86dc6a4b206adaa0c11b58b6d5933898d43e0
* Don't run openbsd-compat tests on Cygwin.
Add "compat-tests" to the default TEST_TARGET so we can override as
necessary. Override TEST_TARGET for Cygwin as the tests don't currently
compile there.
* Fix broken zlib link.
* configure.ac: Add <pty.h> include for openpty
Another Clang 16ish fix (which makes -Wimplicit-function-declaration
an error by default). github PR#355.
See: 2efd71da49b9cfeab7987058cf5919e473ff466b
See: be197635329feb839865fdc738e34e24afd1fca8
* configure.ac: Fix -Wstrict-prototypes
Clang 16 now warns on this and it'll be removed in C23, so let's
just be future proof. It also reduces noise when doing general
Clang 16 porting work (which is a big job as it is). github PR#355.
Signed-off-by: Sam James <sam@gentoo.org>
* Fix setres*id checks to work with clang-16.
glibc has the prototypes for setresuid and setresgid behind _GNU_SOURCE,
and clang 16 will error out on implicit function definitions, so add
_GNU_SOURCE and the required headers to the configure checks. From
sam at @gentoo.org via bz#3497.
* Fix tracing disable on FreeBSD.
Some versions of FreeBSD do not support using id 0 to refer to the
current pid for procctl, so pass getpid() explicitly. From
emaste at freebsd.org.
* Use "prohibit-password" in -portable comments.
"without-password" is the deprecated alias for "prohibit-password",
so we should reference the latter. From emaste at freebsd.org.
* Link to branch-specific queries for V_9_1 status.
* upstream: Fix typo. From pablomh via -portable github PR#344.
OpenBSD-Commit-ID: d056ee2e73691dc3ecdb44a6de68e6b88cd93827
* upstream: Import regenerated moduli.
OpenBSD-Commit-ID: b0e54ee4d703bd6929bbc624068666a7a42ecb1f
* Add CIFuzz integration
* Run cifuzz workflow on the actions as regular CI.
* Whitespace change to trigger CIFuzz workflow.
* Do not run CIFuzz on selfhosted tree.
We already run it on the regular tree, no need to double up.
* Add CIFuzz status badge.
* Branch-specific links for master status badges.
* Fix merge conflict.
* upstream: fix parsing of hex cert expiry time; was checking whether the
start time began with "0x", not the expiry time.
from Ed Maste
OpenBSD-Commit-ID: 6269242c3e1a130b47c92cfca4d661df15f05739
* upstream: Check for and disallow MaxStartups values less than or
equal to zero during config parsing, rather than faling later at runtime.
bz#3489, ok djm@
OpenBSD-Commit-ID: d79c2b7a8601eb9be493629a91245d761154308b
* upstream: Remove some set but otherwise unused variables, spotted
in -portable by clang 16's -Wunused-but-set-variable. ok djm@
OpenBSD-Commit-ID: 3d943ddf2369b38fbf89f5f19728e7dc1daf3982
* upstream: The IdentityFile option in ssh_config can also be used to
specify a public key file, as documented in ssh.1 for the -i option. Document
this also for IdentityFile in ssh_config.5, for documentation completeness.
From laalsaas at systemli.org via portable github PR#352, ok jmc@ djm@
OpenBSD-Commit-ID: 2f943be9f96e60ef81a9a4faa25b009999f9883b
* Split out rekey test since it runs the longest.
* Update checkout and upload actions.
Update actions/checkout and actions/upload-artifact to main branch for
compatibility with node.js v16.
* Add valrind-5 test here too.
* Run vm startup and shutdown from runner temp dir.
Should work even if the github workspace dir is on a stale sshfs mount.
* Shutdown any VM before trying to check out repo.
In the case where the previous run did not clean up, the checkout will
fail as it'll leave a stale mount.
* Avoid assuming layout of fd_set
POSIX doesn't specify the internal layout of the fd_set object, so let's
not assume it is just a bit mask. This increases compatibility with
systems that have a different layout.
The assumption is also worthless as we already refuse to use file
descriptors over FD_SETSIZE anyway. Meaning that the default size of
fd_set is quite sufficient.
* Fix comment text. From emaste at freebsd.org.
* Defer seed_rng until after closefrom call.
seed_rng will initialize OpenSSL, and some engine providers (eg Intel's
QAT) will open descriptors for their own use. bz#3483, patch from
joel.d.schuetze at intel.com, ok djm@
* upstream: typo in comment
OpenBSD-Commit-ID: 39c58f41e0f32d1ff31731fa6f5bbbc3ad25084a
* upstream: rename client_global_hostkeys_private_confirm() to
client_global_hostkeys_prove_confirm(), as it handles the
"hostkeys-prove00@openssh.com" message; no functional change
OpenBSD-Commit-ID: 31e09bd3cca6eed26855b88fb8beed18e9bd026d
* upstream: Remove errant colon and simplify format
string in error messages. Patch from vapier at chromium.org.
OpenBSD-Commit-ID: fc28466ebc7b74e0072331947a89bdd239c160d3
* upstream: Fix typo in fatal error message.
Patch from vapier at chromium.org.
OpenBSD-Commit-ID: 8a0c164a6a25eef0eedfc30df95bfa27644e35cf
* Skip reexec test on OpenSSL 1.1.1 specifically.
OpenSSL 1.1.1 has a bug in its RNG that breaks reexec fallback, so skip
that test. See bz#3483 for details.
* Remove seed passing over reexec.
This was added for the benefit of platforms using ssh-rand-helper to
prevent a delay on each connection as sshd reseeded itself.
ssh-random-helper is long gone, and since the re-exec happens before the
chroot the re-execed sshd can reseed itself normally. ok djm@
* upstream: Handle dynamic remote port forwarding in escape commandline's
-R processing. bz#3499, ok djm@
OpenBSD-Commit-ID: 194ee4cfe7ed0e2b8ad0727f493c798a50454208
* Add dfly62 test target.
* If we haven't found it yet, recheck for sys/stat.h.
On some very old platforms, sys/stat.h needs sys/types.h, however
autoconf 2.71's AC_CHECK_INCLUDES_DEFAULT checks for them in the
opposite order, which in combination with modern autoconf's
"present but cannot be compiled" behaviour causes it to not be
detected.
* Add fallback for old platforms w/out MAP_ANON.
* Remove explicit "default" test config argument.
Not specifying the test config implicitly selects default args.
* Remove unused self-hosted test targets.
* Rename "os" in matrix to "target".
This is in preparation to distinguish this from the host that the runner
runs on in case where they are separate (eg VMs).
* Add "libvirt" label to dfly30.
* Make "config" in matrix singular and pass in env.
This will allow the startup scripts to adapt their behaviour based on
the type and config.
* Run vmstartup from temp dir.
This will allow us to create ephemeral disk images per-runner.
* Rework how selfhosted tests interact with runners.
Previously there was one runner per test target (mostly VMs). This had
a few limitations:
- multiple tests that ran on the same target (eg multiple build
configs) were serialized on availability or that runner.
- it needed manual balancing of VMs over host machines.
To address this, make VMs that use ephemeral disks (ie most of them)
all use a pool of runners with the "libvirt" label. This requires that
we distinguish between "host" and "target" for those. Native runners
and VMs with persistent disks (eg the constantly-updated snapshot ones)
specify the same host and target.
This should improve test throughput.
* Skip unit tests on slow riscv64 hardware.
* Use -fzero-call-used-regs=used on clang 15.
clang 15 seems to have a problem with -fzero-call-used-reg=all which
causes spurious "incorrect signature" failures with ED25519. On those
versions, use -fzero-call-used-regs=used instead. (We may add exceptions
later if specific versions prove to be OK). Also move the GCC version
check to match.
Initial investigation by Daniel Pouzzner (douzzer at mega nu), workaround
suggested by Bill Wendling (morbo at google com). bz#3475, ok djm@
* upstream: In channel_request_remote_forwarding the parameters for
permission_set_add are leaked as they are also duplicated in the call. Found
by CodeChecker. ok djm
OpenBSD-Commit-ID: 4aef50fa9be7c0b138188814c8fe3dccc196f61e
* upstream: New EnableEscapeCommandline ssh_config(5) option
This option (default "no") controls whether the ~C escape is available.
Turning it off by default means we will soon be able to use a stricter
default pledge(2) in the client.
feedback deraadt@ dtucker@; tested in snaps for a while
OpenBSD-Commit-ID: 7e277595d60acb8263118dcb66554472257b387a
* upstream: tighten pledge(2) after session establishment
feedback, ok & testing in snaps deraadt@
OpenBSD-Commit-ID: aecf4d49d28586dfbcc74328d9333398fef9eb58
* upstream: Add void to client_repledge args to fix compiler warning. ok djm@
OpenBSD-Commit-ID: 7e964a641ce4a0a0a11f047953b29929d7a4b866
* upstream: Log output of ssh-agent and ssh-add
This should make debugging easier.
OpenBSD-Regress-ID: 5974b02651f428d7e1079b41304c498ca7e306c8
* upstream: Clean up ssh-add and ssh-agent logs.
OpenBSD-Regress-ID: 9eda8e4c3714d7f943ab2e73ed58a233bd29cd2c
* Restore ssh-agent permissions on exit.
...enough that subsequent builds can overwrite ssh-agent if necessary.
* upstream: make struct sshbuf private
and remove an unused field; ok dtucker
OpenBSD-Commit-ID: c7a3d77c0b8c153d463398606a8d57569186a0c3
* upstream: Remove duplicate includes.
Patch from AtariDreams via github PR#364.
OpenBSD-Commit-ID: b9186638a05cb8b56ef7c0de521922b6723644ea
* Fix typo in comment. Spotted by tim@
* Update autotools
Regenerate config files using latest autotools
* disable SANDBOX_SECCOMP_FILTER_DEBUG
It was mistakenly enabled in 2580916e4872
Reported by Peter sec-openssh-com.22.fichtner AT 0sg.net
* Add SANDBOX_DEBUG to the kitchensink test build.
* upstream: Fix comment typo.
OpenBSD-Regress-ID: 3b04faced6511bb5e74648c6a4ef4bf2c4decf03
* upstream: remove '?' from getopt(3) loops
userspace: remove vestigial '?' cases from top-level getopt(3) loops
getopt(3) returns '?' when it encounters a flag not present in the in
the optstring or if a flag is missing its option argument. We can
handle this case with the "default" failure case with no loss of
legibility. Hence, remove all the redundant "case '?':" lines.
Prompted by dlg@. With help from dlg@ and millert@.
Link: https://marc.info/?l=openbsd-tech&m=167011979726449&w=2
ok naddy@ millert@ dlg@
OpenBSD-Commit-ID: b2f89346538ce4f5b33ab8011a23e0626a67e66e
* upstream: Add server debugging for hostbased auth.
auth_debug_add queues messages about the auth process which is sent to
the client after successful authentication. This also sends those to
the server debug log to aid in debugging. From bz#3507, ok djm@
OpenBSD-Commit-ID: 46ff67518cccf9caf47e06393e2a121ee5aa258a
* upstream: Warn if no host keys for hostbased auth can be loaded.
OpenBSD-Commit-ID: 2a0a13132000cf8d3593133c1b49768aa3c95977
* use calloc for allocating arc4random structs
ok dtucker
* Move obsdsnap test VMs to ephemeral runners.
* Run upstream obsdsnap tests on ephemeral runners.
* obsdsnap test VMs runs-on libvirt too.
* Fetch regress logs from obj dir.
* Set group perms on regress dir.
This ensures that the tests don't fail due to StrictMode checks.
* Use sudo when resetting perms on directories.
* Add tests for LibreSSL 3.7.0 and OpenSSL 1.1.1s.
* Simply handling of SSH_CONNECTION PAM env var.
Prompted by bz#3508: there's no need to cache the value of
sshpam_conninfo so remove the global. While there, add check of
return value from pam_putenv. ok djm@
* upstream: The idiomatic way of coping with signed char vs unsigned
char (which did not come from stdio read functions) in the presence of
ctype macros, is to always cast to (unsigned char). casting to (int)
for a "macro" which is documented to take int, is weird. And sadly wrong,
because of the sing extension risk.. same diff from florian
OpenBSD-Commit-ID: 65b9a49a68e22ff3a0ebd593f363e9f22dd73fea
* upstream: add a -X option to both scp(1) and sftp(1) to allow
control over some SFTP protocol knobs: the copy buffer length and
the number of inflight requests, both of which are used during
upload/download.
Previously these could be controlled in sftp(1) using the -b/-R options.
This makes them available in both SFTP protocol clients using the same
option character sequence.
ok dtucker@
OpenBSD-Commit-ID: 27502bffc589776f5da1f31df8cb51abe9a15f1c
* upstream: add -X to usage();
OpenBSD-Commit-ID: 1bdc3df7de11d766587b0428318336dbffe4a9d0
* upstream: Clear signal mask early in main(); sshd may have been
started with one or more signals masked (sigprocmask(2) is not cleared
on fork/exec) and this could interfere with various things, e.g. the
login grace timer.
Execution environments that fail to clear the signal mask before running
sshd are clearly broken, but apparently they do exist.
Reported by Sreedhar Balasubramanian; ok dtucker@
OpenBSD-Commit-ID: 77078c0b1c53c780269fc0c416f121d05e3010ae
* upstream: Mention that scp uses the SFTP protocol and remove
reference to legacy flag. Spotted by, feedback and ok jmc@
OpenBSD-Commit-ID: 9dfe04966f52e941966b46c7a2972147f95281b3
* upstream: spelling fixes; from paul tagliamonte amendments to his
diff are noted on tech
OpenBSD-Commit-ID: d776dd03d0b882ca9c83b84f6b384f6f9bd7de4a
* upstream: fix bug in PermitRemoteOpen which caused it to ignore its
first argument unless it was one of the special keywords "any" or "none".
Reported by Georges Chaudy in bz3515; ok dtucker@
OpenBSD-Commit-ID: c5678a39f1ff79993d5ae3cfac5746a4ae148ea5
* upstream: regression test for PermitRemoteOpen
OpenBSD-Regress-ID: 8271aafbf5c21950cd5bf966f08e585cebfe630c
* upstream: suppress "Connection closed" message when in quiet mode
OpenBSD-Commit-ID: 8a3ab7176764da55f60bfacfeae9b82d84e3908f
* upstream: add ptimeout API for keeping track of poll/ppoll
timeouts; ok dtucker markus
OpenBSD-Commit-ID: 3335268ca135b3ec15a947547d7cfbb8ff929ead
* upstream: replace manual poll/ppoll timeout math with ptimeout API
feedback markus / ok markus dtucker
OpenBSD-Commit-ID: c5ec4f2d52684cdb788cd9cbc1bcf89464014be2
* upstream: Add channel_force_close()
This will forcibly close an open channel by simulating read/write errors,
draining the IO buffers and calling the detach function.
Previously the detach function was only ever called during channel garbage
collection, but there was no way to signal the user of a channel (e.g.
session.c) that its channel was being closed deliberately (vs. by the
usual state-machine logic). So this adds an extra "force" argument to the
channel cleanup callback to indicate this condition.
ok markus dtucker
OpenBSD-Commit-ID: 23052707a42bdc62fda2508636e624afd466324b
* upstream: tweak channel ctype names
These are now used by sshd_config:ChannelTimeouts to specify timeouts by
channel type, so force them all to use a similar format without whitespace.
ok dtucker markus
OpenBSD-Commit-ID: 66834765bb4ae14f96d2bb981ac98a7dae361b65
* upstream: Add channel_set_xtype()
This sets an "extended" channel type after channel creation (e.g.
"session:subsystem:sftp") that will be used for setting channel inactivity
timeouts.
ok markus dtucker
OpenBSD-Commit-ID: 42564aa92345045b4a74300528f960416a15d4ca
* upstream: Implement channel inactivity timeouts
This adds a sshd_config ChannelTimeouts directive that allows channels that
have not seen traffic in a configurable interval to be automatically closed.
Different timeouts may be applied to session, X11, agent and TCP forwarding
channels.
Note: this only affects channels over an opened SSH connection and not
the connection itself. Most clients close the connection when their channels
go away, with a notable exception being ssh(1) in multiplexing mode.
ok markus dtucker
OpenBSD-Commit-ID: ae8bba3ed9d9f95ff2e2dc8dcadfa36b48e6c0b8
* unbreak scp on NetBSD 4.x
e555d5cad5 effectively increased the default copy buffer size for SFTP
transfers. This caused NetBSD 4.x to hang during the "copy local file to
remote file in place" scp.sh regression test.
This puts back the original 32KB copy buffer size until we can properly
figure out why.
lots of debugging assistance from dtucker@
* upstream: Copy bytes from the_banana[] rather than banana()
Fixes test failure due to segfault seen on arm64 with xonly snap.
ok djm
OpenBSD-Regress-ID: 86e2aa4bbd1dff1bc4ebb2969c0d6474485be046
* upstream: unit tests for misc.c:ptimeout_* API
OpenBSD-Regress-ID: 01f8fb12d08e5aaadd4bd4e71f456b6588be9a94
* upstream: fix typo in verbose logging
OpenBSD-Regress-ID: 0497cdb66e003b2f50ed77291a9104fba2e017e9
* upstream: regression test for ChannelTimeout
OpenBSD-Regress-ID: 280bfbefcfa415428ad744e43f69a8dede8ad685
* upstream: Save debug logs from ssh for debugging purposes.
OpenBSD-Regress-ID: 109e40b06de1c006a3b8e0d8745b790b2c5870a0
* Set OPENSSL_BIN from OpenSSL directory.
* Check openssl_bin path is executable before using.
* Use autoconf to find openssl binary.
It's possible to install an OpenSSL in a path not in the system's
default library search path. OpenSSH can still use this (eg if you
specify an rpath) but the openssl binary there may not work. If one is
available on the system path just use that.
* Use our own netcat for dynamic-forward test.
That way we can be surer about its behaviour rather than trying to
second-guess the behaviour of various netcat implementations.
* upstream: When OpenSSL is not available, skip parts of percent test
that require it. Based on github pr#368 from ren mingshuai.
OpenBSD-Regress-ID: 49a375b2cf61ccb95b52e75e2e025cd10988ebb2
* don't test IPv6 addresses if platform lacks support
* Skip dynamic-forward test on minix3.
This test relies on loopback addresses which minix does not have.
Previously the test would not run at all since it also doesn't have
netcat, but now we use our own netcat it tries and fails.
* try to improve logging for dynamic-forward test
previously the logs from the ssh used to exercise the forwarding
channel would clobber the logs from the ssh actually doing the
forwarding
* upstream: tweak previous; ok djm
OpenBSD-Commit-ID: 229c493452766d70a78b0f02f6ff9894f9028858
* upstream: Switch scp from using pipes to a socketpair for
communication with it's ssh sub-processes. We no longer need to reserve two
descriptors to ensure that we don't end up using fd 0-2 unexpectedly, that is
handled by sanitise_stdfd() in main(). Based on an original diff from djm@.
OK deraadt@ djm@
OpenBSD-Commit-ID: b80c372faac462471e955ddeab9480d668a2e48d
* add back use of pipes in scp.c under USE_PIPES
This matches sftp.c which prefers socketpair but uses pipes on
some older platforms.
* remove buffer len workaround for NetBSD 4.x
Switching to from pipes to a socketpair for communicating with the
ssh process avoids the (kernel bug?) problem.
* upstream: rewrite this test to use a multiplexed ssh session so we can
control its lifecycle without risk of race conditions; fixes some of the
Github integration tests for openssh-portable
OpenBSD-Regress-ID: 5451cad59ba0d43ae9eeda48ec80f54405fee969
* upstream: remove whitespace at EOL from code extracted from SUPERCOP
OpenBSD-Commit-ID: 1ec524ff2fbb9387d731601437c82008f35a60f4
* upstream: ignore bogus upload/download buffer lengths in the limits
extension
OpenBSD-Commit-ID: c5b023e0954693ba9a5376e4280c739b5db575f8
* upstream: clamp the minimum buffer lengths and number of inflight
requests too
OpenBSD-Commit-ID: c4965f62fa0ba850940fd66ae3f60cf516bbcd56
* upstream: avoid printf("%s", NULL) if using ssh
-oUserKnownHostsFile=none and a hostkey in one of the system known hosts file
changes; ok dtucker@
OpenBSD-Commit-ID: 7ca87614bfc6da491315536a7f2301434a9fe614
* upstream: Add a "Host" line to the output of ssh -G showing the
original host arg. Inspired by patch from vincent at bernat.ch via bz#3343,
ok djm@
OpenBSD-Commit-ID: 59c0f60a222113a44d0650cd394376e3beecc883
* Remove skipping test when scp not in path.
An upcoming change renders this obsolete by adding scp's path to the
test sshd's PATH, and removing this first will make the subsequent sync
easier.
* upstream: Add scp's path to test sshd's PATH.
If the scp we're testing is fully qualified (eg it's not in the system
PATH) then add its path to the under-test sshd's PATH so we can find
it. Prompted by bz#3518.
OpenBSD-Regress-ID: 7df4f5a0be3aa135495b7e5a6719d3cbc26cc4c0
* upstream: Move scp path setting to a helper function. The previous
commit to add scp to the test sshd's path causes the t-envpass test to fail
when the test scp is given using a fully qualified path. Put this in a
helper function and only call it from the scp tests.
OpenBSD-Regress-ID: 7533dc1c4265c1de716abb062957994195b36df4
* Retry package installation 3 times.
When setting up the CI environment, retry package installation 3 times
before going up. Should help prevent spurious failures during
infrastructure issues.
* upstream: Document "UserKnownHostsFile none". ok djm@
OpenBSD-Commit-ID: f695742d39e34ecdcc3c861c3739a84648a4bce5
* upstream: fix double phrase in previous;
OpenBSD-Commit-ID: 671e6c8dc5e9230518b2bbfa143daaa88adc66c2
* upstream: Instead of skipping the all-tokens test if we don't have
OpenSSL (since we use it to compute the hash), put the hash at the end and
just omit it if we don't have it. Prompted by bz#3521.
OpenBSD-Regress-ID: c79ecba64250ed3b6417294b6c965e6b12ca5eea
* upstream: Shell syntax fix. From ren mingshuai vi github PR#369.
OpenBSD-Regress-ID: 6696b2eeefe128099fc3d7ea9f23252cc35156f9
* Allow writev is seccomp sandbox.
This seems to be used by recent glibcs at least in some configurations.
From bz#3512, ok djm@
* upstream: update OpenSSH's Ed25519 code to the last version of SUPERCOP
(20221122) and change the import approach to the same one we use for
Streamlined NTRUPrime: use a shell script to extract the bits we need from
SUPERCOP, make some minor adjustments and squish them all into a single file.
ok tb@ tobhe@
OpenBSD-Commit-ID: 1bc0fd624cb6af440905b8ba74ac7c03311b8e3b
* upstream: adapt to ed25519 changes in src/usr.bin/ssh
OpenBSD-Regress-ID: 4b3e7ba7ee486ae8a0b4790f8112eded2bb7dcd5
* upstream: Add a sshd_config UnusedConnectionTimeout option to terminate
client connections that have no open channels for some length of time. This
complements the recently-added ChannelTimeout option that terminates inactive
channels after a timeout.
ok markus@
OpenBSD-Commit-ID: ca983be74c0350364c11f8ba3bd692f6f24f5da9
* upstream: unbreak test: cannot access shell positional parameters
past $9 without wrapping the position in braces (i.e. need ${10}, etc.)
OpenBSD-Regress-ID: 3750ec98d5d409ce6a93406fedde6f220d2ea2ac
* upstream: regression test for UnusedConnectionTimeout
OpenBSD-Regress-ID: 7f29001374a68e71e5e078f69e4520cf4bcca084
* upstream: also check that an active session inhibits
UnusedConnectionTimeout idea markus@
OpenBSD-Regress-ID: 55c0fb61f3bf9e092b0a53f9041d3d2012f14003
* upstream: For "ssh -V" always exit 0, there is no need to check opt
again. This was missed when the fallthrough in the switch case above it was
removed. OK deraadt@
OpenBSD-Commit-ID: 5583e5d8f6d62a8a4215cfa95a69932f344c8120
* upstream: Add a -V (version) option to sshd like the ssh client
has. OK markus@ deraadt@
OpenBSD-Commit-ID: abe990ec3e636fb040132aab8cbbede98f0c413e
* upstream: when restoring non-blocking mode to stdio fds, restore
exactly the flags that ssh started with and don't just clobber them with
zero, as this could also remove the append flag from the set;
bz3523; ok dtucker@
OpenBSD-Commit-ID: 1336b03e881db7564a4b66014eb24c5230e9a0c0
* Skip connection-timeout when missing FD passing.
This tests uses multiplexing which uses file descriptor passing, so
skip it if we don't have that. Fixes test failures on Cygwin.
* Skip connection-timeout test under Valgrind.
Valgrind slows things down so much that the timeout test fails. Skip
this test until we figure out if we can make it work.
* upstream: tweak previous; ok djm
OpenBSD-Commit-ID: df71ce4180c58202dfdc1d92626cfe900b91b7c3
* upstream: Create and install sshd random relink kit.
../Makefile.inc and Makfile are concatenated for reuse, which hopefully won't
be too fragile, we'll see if we need a different approach. The resulting sshd
binary is tested with the new sshd -V option before installation. As the
binary layout is now semi-unknown (meaning relative, fixed, and gadget
offsets are not precisely known), change the filesystem permissions to 511 to
prevent what I call "logged in BROP". I have ideas for improving this further
but this is a first step ok djm
OpenBSD-Commit-ID: 1e0a2692b7e20b126dda60bf04999d1d30d959d8
* upstream: delete useless dependency
OpenBSD-Commit-ID: e1dc11143f83082e3154d6094f9136d0dc2637ad
* fix libfido2 detection without pkg-config
Place libfido2 before additional libraries (that it may depend upon)
and not after. bz3530 from James Zhang; ok dtucker@
* Skip connection-timeout test on minix3.
Minix 3's Unix domain sockets don't seem to work the way we expect, so
skip connection-timeout test on that platform. While there, group
together all similarly skipped tests and explicitly comment.
* upstream: fix double-free caused by compat_kex_proposal(); bz3522
by dtucker@, ok me
OpenBSD-Commit-ID: 2bfc37cd2d41f67dad64c17a64cf2cd3806a5c80
* upstream: openssh-9.2
OpenBSD-Commit-ID: f7389f32413c74d6e2055f05cf65e7082de03923
* upstream: Check if we can copy sshd or need to use sudo to do so
during reexec test. Skip test if neither can work. Patch from anton@, tweaks
from me.
OpenBSD-Regress-ID: 731b96ae74d02d5744e1f1a8e51d09877ffd9b6d
* upstream: test compat_kex_proposal(); by dtucker@
OpenBSD-Regress-ID: 0e404ee264db546f9fdbf53390689ab5f8d38bf2
* adapt compat_kex_proposal() test to portable
* update version in README
* crank versions in RPM specs
* remove files from libssh project
* re-merge arc4random.c
* re-merge misc.c
* remove unused files from libssh.vcxproj
* fix outstanding merge conflicts
* fix build errors
* modify upstream workflows to trigger on workflow dispatch instead of all PRs
* fix scp client hanging with pipes
* fix some failing bash tests
* make bash test compatible with Windows
* address scp's sftp mode buf len limitations
* address review feedback
* address review feedback
* update comment
---------
Signed-off-by: Sam James <sam@gentoo.org>
Co-authored-by: djm@openbsd.org <djm@openbsd.org>
Co-authored-by: Darren Tucker <dtucker@dtucker.net>
Co-authored-by: Damien Miller <djm@mindrot.org>
Co-authored-by: Sam James <sam@gentoo.org>
Co-authored-by: jsg@openbsd.org <jsg@openbsd.org>
Co-authored-by: jmc@openbsd.org <jmc@openbsd.org>
Co-authored-by: dtucker@openbsd.org <dtucker@openbsd.org>
Co-authored-by: Harmen Stoppels <harmenstoppels@gmail.com>
Co-authored-by: Rochdi Nassah <rochdinassah.1998@gmail.com>
Co-authored-by: David Korczynski <david@adalogics.com>
Co-authored-by: Pierre Ossman <ossman@cendio.se>
Co-authored-by: mbuhl@openbsd.org <mbuhl@openbsd.org>
Co-authored-by: Rose <83477269+AtariDreams@users.noreply.github.com>
Co-authored-by: cheloha@openbsd.org <cheloha@openbsd.org>
Co-authored-by: deraadt@openbsd.org <deraadt@openbsd.org>
Co-authored-by: tb@openbsd.org <tb@openbsd.org>
Co-authored-by: millert@openbsd.org <millert@openbsd.org>
2023-02-09 22:57:36 +01:00
|
|
|
xasprintf(&conninfo, "SSH_CONNECTION=%.50s %d %.50s %d",
|
|
|
|
ssh_remote_ipaddr(ssh), ssh_remote_port(ssh),
|
|
|
|
sshpam_laddr, ssh_local_port(ssh));
|
|
|
|
if ((r = pam_putenv(sshpam_handle, conninfo)) != PAM_SUCCESS)
|
|
|
|
logit("pam_putenv: %s", pam_strerror(sshpam_handle, r));
|
|
|
|
free(conninfo);
|
2019-01-20 00:22:18 +01:00
|
|
|
}
|
2018-12-07 05:41:16 +01:00
|
|
|
|
2003-05-18 12:45:47 +02:00
|
|
|
#ifdef PAM_TTY_KLUDGE
|
2003-11-21 13:48:55 +01:00
|
|
|
/*
|
|
|
|
* Some silly PAM modules (e.g. pam_time) require a TTY to operate.
|
|
|
|
* sshd doesn't set the tty until too late in the auth process and
|
2003-05-18 12:45:47 +02:00
|
|
|
* may not even set one (for tty-less connections)
|
2003-11-21 13:48:55 +01:00
|
|
|
*/
|
2003-05-18 12:45:47 +02:00
|
|
|
debug("PAM: setting PAM_TTY to \"ssh\"");
|
|
|
|
sshpam_err = pam_set_item(sshpam_handle, PAM_TTY, "ssh");
|
2003-05-10 11:28:02 +02:00
|
|
|
if (sshpam_err != PAM_SUCCESS) {
|
|
|
|
pam_end(sshpam_handle, sshpam_err);
|
|
|
|
sshpam_handle = NULL;
|
|
|
|
return (-1);
|
1999-12-30 05:08:44 +01:00
|
|
|
}
|
2003-05-18 12:45:47 +02:00
|
|
|
#endif
|
2003-05-10 11:28:02 +02:00
|
|
|
return (0);
|
1999-12-30 05:08:44 +01:00
|
|
|
}
|
|
|
|
|
2018-04-06 06:11:44 +02:00
|
|
|
static void
|
|
|
|
expose_authinfo(const char *caller)
|
|
|
|
{
|
|
|
|
char *auth_info;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Expose authentication information to PAM.
|
|
|
|
* The environment variable is versioned. Please increment the
|
|
|
|
* version suffix if the format of session_info changes.
|
|
|
|
*/
|
|
|
|
if (sshpam_authctxt->session_info == NULL)
|
|
|
|
auth_info = xstrdup("");
|
|
|
|
else if ((auth_info = sshbuf_dup_string(
|
|
|
|
sshpam_authctxt->session_info)) == NULL)
|
|
|
|
fatal("%s: sshbuf_dup_string failed", __func__);
|
|
|
|
|
|
|
|
debug2("%s: auth information in SSH_AUTH_INFO_0", caller);
|
|
|
|
do_pam_putenv("SSH_AUTH_INFO_0", auth_info);
|
|
|
|
free(auth_info);
|
|
|
|
}
|
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
static void *
|
|
|
|
sshpam_init_ctx(Authctxt *authctxt)
|
1999-12-30 05:08:44 +01:00
|
|
|
{
|
2003-05-10 11:28:02 +02:00
|
|
|
struct pam_ctxt *ctxt;
|
2019-06-07 06:26:54 +02:00
|
|
|
int result, socks[2];
|
2001-02-05 13:42:17 +01:00
|
|
|
|
2004-01-14 14:15:07 +01:00
|
|
|
debug3("PAM: %s entering", __func__);
|
2006-05-15 09:22:33 +02:00
|
|
|
/*
|
|
|
|
* Refuse to start if we don't have PAM enabled or do_pam_account
|
|
|
|
* has previously failed.
|
|
|
|
*/
|
|
|
|
if (!options.use_pam || sshpam_account_status == 0)
|
2003-05-14 07:11:48 +02:00
|
|
|
return NULL;
|
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
/* Initialize PAM */
|
2019-01-20 00:22:18 +01:00
|
|
|
if (sshpam_init(NULL, authctxt) == -1) {
|
2003-05-10 11:28:02 +02:00
|
|
|
error("PAM: initialization failed");
|
|
|
|
return (NULL);
|
|
|
|
}
|
2001-02-07 02:58:33 +01:00
|
|
|
|
2018-04-06 06:11:44 +02:00
|
|
|
expose_authinfo(__func__);
|
2007-05-20 07:20:08 +02:00
|
|
|
ctxt = xcalloc(1, sizeof *ctxt);
|
2003-05-10 11:28:02 +02:00
|
|
|
|
|
|
|
/* Start the authentication thread */
|
|
|
|
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, socks) == -1) {
|
|
|
|
error("PAM: failed create sockets: %s", strerror(errno));
|
2013-06-02 00:07:31 +02:00
|
|
|
free(ctxt);
|
2003-05-10 11:28:02 +02:00
|
|
|
return (NULL);
|
|
|
|
}
|
|
|
|
ctxt->pam_psock = socks[0];
|
|
|
|
ctxt->pam_csock = socks[1];
|
2019-04-25 22:36:27 +02:00
|
|
|
result = pthread_create(&ctxt->pam_thread, NULL, sshpam_thread, ctxt);
|
|
|
|
if (result != 0) {
|
2003-05-10 11:28:02 +02:00
|
|
|
error("PAM: failed to start authentication thread: %s",
|
2019-04-25 22:36:27 +02:00
|
|
|
strerror(result));
|
2003-05-10 11:28:02 +02:00
|
|
|
close(socks[0]);
|
|
|
|
close(socks[1]);
|
2013-06-02 00:07:31 +02:00
|
|
|
free(ctxt);
|
2003-05-10 11:28:02 +02:00
|
|
|
return (NULL);
|
1999-12-30 05:08:44 +01:00
|
|
|
}
|
2003-10-07 03:30:15 +02:00
|
|
|
cleanup_ctxt = ctxt;
|
2003-05-10 11:28:02 +02:00
|
|
|
return (ctxt);
|
|
|
|
}
|
1999-12-30 05:08:44 +01:00
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
static int
|
|
|
|
sshpam_query(void *ctx, char **name, char **info,
|
|
|
|
u_int *num, char ***prompts, u_int **echo_on)
|
|
|
|
{
|
2018-07-10 11:39:52 +02:00
|
|
|
struct sshbuf *buffer;
|
2003-05-10 11:28:02 +02:00
|
|
|
struct pam_ctxt *ctxt = ctx;
|
|
|
|
size_t plen;
|
|
|
|
u_char type;
|
|
|
|
char *msg;
|
2004-10-16 10:52:44 +02:00
|
|
|
size_t len, mlen;
|
2018-07-10 11:39:52 +02:00
|
|
|
int r;
|
2003-05-10 11:28:02 +02:00
|
|
|
|
2004-01-14 14:15:07 +01:00
|
|
|
debug3("PAM: %s entering", __func__);
|
2018-07-10 11:39:52 +02:00
|
|
|
if ((buffer = sshbuf_new()) == NULL)
|
|
|
|
fatal("%s: sshbuf_new failed", __func__);
|
2003-05-10 11:28:02 +02:00
|
|
|
*name = xstrdup("");
|
|
|
|
*info = xstrdup("");
|
|
|
|
*prompts = xmalloc(sizeof(char *));
|
|
|
|
**prompts = NULL;
|
|
|
|
plen = 0;
|
|
|
|
*echo_on = xmalloc(sizeof(u_int));
|
2018-07-10 11:39:52 +02:00
|
|
|
while (ssh_msg_recv(ctxt->pam_psock, buffer) == 0) {
|
|
|
|
if ((r = sshbuf_get_u8(buffer, &type)) != 0 ||
|
|
|
|
(r = sshbuf_get_cstring(buffer, &msg, &mlen)) != 0)
|
|
|
|
fatal("%s: buffer error: %s", __func__, ssh_err(r));
|
2003-05-10 11:28:02 +02:00
|
|
|
switch (type) {
|
|
|
|
case PAM_PROMPT_ECHO_ON:
|
|
|
|
case PAM_PROMPT_ECHO_OFF:
|
|
|
|
*num = 1;
|
2004-10-16 10:52:44 +02:00
|
|
|
len = plen + mlen + 1;
|
2015-04-30 01:18:11 +02:00
|
|
|
**prompts = xreallocarray(**prompts, 1, len);
|
2004-10-16 10:52:44 +02:00
|
|
|
strlcpy(**prompts + plen, msg, len - plen);
|
|
|
|
plen += mlen;
|
2003-05-10 11:28:02 +02:00
|
|
|
**echo_on = (type == PAM_PROMPT_ECHO_ON);
|
2013-06-02 00:07:31 +02:00
|
|
|
free(msg);
|
2019-09-13 05:14:39 +02:00
|
|
|
sshbuf_free(buffer);
|
2003-05-10 11:28:02 +02:00
|
|
|
return (0);
|
|
|
|
case PAM_ERROR_MSG:
|
|
|
|
case PAM_TEXT_INFO:
|
|
|
|
/* accumulate messages */
|
2004-10-16 10:52:44 +02:00
|
|
|
len = plen + mlen + 2;
|
2015-04-30 01:18:11 +02:00
|
|
|
**prompts = xreallocarray(**prompts, 1, len);
|
2004-10-16 10:52:44 +02:00
|
|
|
strlcpy(**prompts + plen, msg, len - plen);
|
|
|
|
plen += mlen;
|
|
|
|
strlcat(**prompts + plen, "\n", len - plen);
|
|
|
|
plen++;
|
2013-06-02 00:07:31 +02:00
|
|
|
free(msg);
|
2000-05-31 03:20:11 +02:00
|
|
|
break;
|
2006-05-15 09:22:33 +02:00
|
|
|
case PAM_ACCT_EXPIRED:
|
2016-07-18 01:33:25 +02:00
|
|
|
case PAM_MAXTRIES:
|
|
|
|
if (type == PAM_ACCT_EXPIRED)
|
|
|
|
sshpam_account_status = 0;
|
|
|
|
if (type == PAM_MAXTRIES)
|
|
|
|
sshpam_set_maxtries_reached(1);
|
2006-05-15 09:22:33 +02:00
|
|
|
/* FALLTHROUGH */
|
2003-05-10 11:28:02 +02:00
|
|
|
case PAM_AUTH_ERR:
|
2006-05-15 09:22:33 +02:00
|
|
|
debug3("PAM: %s", pam_strerror(sshpam_handle, type));
|
2005-09-28 14:33:27 +02:00
|
|
|
if (**prompts != NULL && strlen(**prompts) != 0) {
|
2021-08-11 15:07:58 +02:00
|
|
|
free(*info);
|
2005-09-28 14:33:27 +02:00
|
|
|
*info = **prompts;
|
|
|
|
**prompts = NULL;
|
|
|
|
*num = 0;
|
|
|
|
**echo_on = 0;
|
|
|
|
ctxt->pam_done = -1;
|
2013-06-02 00:07:31 +02:00
|
|
|
free(msg);
|
2019-09-13 05:14:39 +02:00
|
|
|
sshbuf_free(buffer);
|
2005-09-28 14:33:27 +02:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
/* FALLTHROUGH */
|
|
|
|
case PAM_SUCCESS:
|
2003-05-10 11:28:02 +02:00
|
|
|
if (**prompts != NULL) {
|
|
|
|
/* drain any accumulated messages */
|
2003-11-18 02:42:07 +01:00
|
|
|
debug("PAM: %s", **prompts);
|
2018-07-10 11:39:52 +02:00
|
|
|
if ((r = sshbuf_put(loginmsg, **prompts,
|
|
|
|
strlen(**prompts))) != 0)
|
|
|
|
fatal("%s: buffer error: %s",
|
|
|
|
__func__, ssh_err(r));
|
2013-06-02 00:07:31 +02:00
|
|
|
free(**prompts);
|
2003-05-10 11:28:02 +02:00
|
|
|
**prompts = NULL;
|
|
|
|
}
|
|
|
|
if (type == PAM_SUCCESS) {
|
2005-01-20 03:29:51 +01:00
|
|
|
if (!sshpam_authctxt->valid ||
|
|
|
|
(sshpam_authctxt->pw->pw_uid == 0 &&
|
|
|
|
options.permit_root_login != PERMIT_YES))
|
2005-01-20 02:43:38 +01:00
|
|
|
fatal("Internal error: PAM auth "
|
|
|
|
"succeeded when it should have "
|
|
|
|
"failed");
|
2018-07-10 11:39:52 +02:00
|
|
|
import_environments(buffer);
|
2003-05-10 11:28:02 +02:00
|
|
|
*num = 0;
|
|
|
|
**echo_on = 0;
|
|
|
|
ctxt->pam_done = 1;
|
2013-06-02 00:07:31 +02:00
|
|
|
free(msg);
|
2019-09-13 05:14:39 +02:00
|
|
|
sshbuf_free(buffer);
|
2003-05-10 11:28:02 +02:00
|
|
|
return (0);
|
|
|
|
}
|
2004-04-18 03:00:26 +02:00
|
|
|
error("PAM: %s for %s%.100s from %.100s", msg,
|
|
|
|
sshpam_authctxt->valid ? "" : "illegal user ",
|
2019-01-20 00:22:18 +01:00
|
|
|
sshpam_authctxt->user, sshpam_rhost);
|
2003-10-09 06:20:15 +02:00
|
|
|
/* FALLTHROUGH */
|
2000-05-31 03:20:11 +02:00
|
|
|
default:
|
2003-05-10 11:28:02 +02:00
|
|
|
*num = 0;
|
|
|
|
**echo_on = 0;
|
2013-06-02 00:07:31 +02:00
|
|
|
free(msg);
|
2003-05-10 11:28:02 +02:00
|
|
|
ctxt->pam_done = -1;
|
2019-09-13 05:14:39 +02:00
|
|
|
sshbuf_free(buffer);
|
2003-05-10 11:28:02 +02:00
|
|
|
return (-1);
|
|
|
|
}
|
1999-12-30 05:08:44 +01:00
|
|
|
}
|
2019-09-13 05:14:39 +02:00
|
|
|
sshbuf_free(buffer);
|
2003-05-10 11:28:02 +02:00
|
|
|
return (-1);
|
1999-12-30 05:08:44 +01:00
|
|
|
}
|
|
|
|
|
2016-07-15 05:49:44 +02:00
|
|
|
/*
|
|
|
|
* Returns a junk password of identical length to that the user supplied.
|
|
|
|
* Used to mitigate timing attacks against crypt(3)/PAM stacks that
|
|
|
|
* vary processing time in proportion to password length.
|
|
|
|
*/
|
|
|
|
static char *
|
|
|
|
fake_password(const char *wire_password)
|
|
|
|
{
|
|
|
|
const char junk[] = "\b\n\r\177INCORRECT";
|
|
|
|
char *ret = NULL;
|
|
|
|
size_t i, l = wire_password != NULL ? strlen(wire_password) : 0;
|
|
|
|
|
|
|
|
if (l >= INT_MAX)
|
|
|
|
fatal("%s: password length too long: %zu", __func__, l);
|
|
|
|
|
|
|
|
ret = malloc(l + 1);
|
2017-03-10 03:40:18 +01:00
|
|
|
if (ret == NULL)
|
|
|
|
return NULL;
|
2016-07-15 05:49:44 +02:00
|
|
|
for (i = 0; i < l; i++)
|
|
|
|
ret[i] = junk[i % (sizeof(junk) - 1)];
|
|
|
|
ret[i] = '\0';
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
/* XXX - see also comment in auth-chall.c:verify_response */
|
|
|
|
static int
|
|
|
|
sshpam_respond(void *ctx, u_int num, char **resp)
|
1999-12-30 05:08:44 +01:00
|
|
|
{
|
2018-07-10 11:39:52 +02:00
|
|
|
struct sshbuf *buffer;
|
2003-05-10 11:28:02 +02:00
|
|
|
struct pam_ctxt *ctxt = ctx;
|
2016-07-15 05:49:44 +02:00
|
|
|
char *fake;
|
2018-07-10 11:39:52 +02:00
|
|
|
int r;
|
2003-05-10 11:28:02 +02:00
|
|
|
|
2006-01-29 06:46:13 +01:00
|
|
|
debug2("PAM: %s entering, %u responses", __func__, num);
|
2003-05-10 11:28:02 +02:00
|
|
|
switch (ctxt->pam_done) {
|
|
|
|
case 1:
|
|
|
|
sshpam_authenticated = 1;
|
|
|
|
return (0);
|
|
|
|
case 0:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return (-1);
|
1999-12-30 05:08:44 +01:00
|
|
|
}
|
2003-05-10 11:28:02 +02:00
|
|
|
if (num != 1) {
|
|
|
|
error("PAM: expected one response, got %u", num);
|
|
|
|
return (-1);
|
|
|
|
}
|
2018-07-10 11:39:52 +02:00
|
|
|
if ((buffer = sshbuf_new()) == NULL)
|
|
|
|
fatal("%s: sshbuf_new failed", __func__);
|
2005-01-20 03:29:51 +01:00
|
|
|
if (sshpam_authctxt->valid &&
|
|
|
|
(sshpam_authctxt->pw->pw_uid != 0 ||
|
2018-07-10 11:39:52 +02:00
|
|
|
options.permit_root_login == PERMIT_YES)) {
|
|
|
|
if ((r = sshbuf_put_cstring(buffer, *resp)) != 0)
|
|
|
|
fatal("%s: buffer error: %s", __func__, ssh_err(r));
|
|
|
|
} else {
|
2016-07-15 05:49:44 +02:00
|
|
|
fake = fake_password(*resp);
|
2018-07-10 11:39:52 +02:00
|
|
|
if ((r = sshbuf_put_cstring(buffer, fake)) != 0)
|
|
|
|
fatal("%s: buffer error: %s", __func__, ssh_err(r));
|
2016-07-15 05:49:44 +02:00
|
|
|
free(fake);
|
|
|
|
}
|
2018-07-10 11:39:52 +02:00
|
|
|
if (ssh_msg_send(ctxt->pam_psock, PAM_AUTHTOK, buffer) == -1) {
|
|
|
|
sshbuf_free(buffer);
|
2003-11-17 11:27:55 +01:00
|
|
|
return (-1);
|
|
|
|
}
|
2018-07-10 11:39:52 +02:00
|
|
|
sshbuf_free(buffer);
|
2003-05-10 11:28:02 +02:00
|
|
|
return (1);
|
1999-12-30 05:08:44 +01:00
|
|
|
}
|
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
static void
|
|
|
|
sshpam_free_ctx(void *ctxtp)
|
1999-12-30 05:08:44 +01:00
|
|
|
{
|
2003-05-10 11:28:02 +02:00
|
|
|
struct pam_ctxt *ctxt = ctxtp;
|
2002-05-08 04:27:55 +02:00
|
|
|
|
2004-01-14 14:15:07 +01:00
|
|
|
debug3("PAM: %s entering", __func__);
|
2003-10-07 03:30:15 +02:00
|
|
|
sshpam_thread_cleanup();
|
2013-06-02 00:07:31 +02:00
|
|
|
free(ctxt);
|
2003-05-10 11:28:02 +02:00
|
|
|
/*
|
|
|
|
* We don't call sshpam_cleanup() here because we may need the PAM
|
|
|
|
* handle at a later stage, e.g. when setting up a session. It's
|
|
|
|
* still on the cleanup list, so pam_end() *will* be called before
|
|
|
|
* the server process terminates.
|
|
|
|
*/
|
2000-09-16 07:09:27 +02:00
|
|
|
}
|
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
KbdintDevice sshpam_device = {
|
|
|
|
"pam",
|
|
|
|
sshpam_init_ctx,
|
|
|
|
sshpam_query,
|
|
|
|
sshpam_respond,
|
|
|
|
sshpam_free_ctx
|
|
|
|
};
|
|
|
|
|
|
|
|
KbdintDevice mm_sshpam_device = {
|
|
|
|
"pam",
|
|
|
|
mm_sshpam_init_ctx,
|
|
|
|
mm_sshpam_query,
|
|
|
|
mm_sshpam_respond,
|
|
|
|
mm_sshpam_free_ctx
|
|
|
|
};
|
2000-10-14 15:36:13 +02:00
|
|
|
|
2001-02-05 13:42:17 +01:00
|
|
|
/*
|
2003-05-10 11:28:02 +02:00
|
|
|
* This replaces auth-pam.c
|
2000-09-16 07:09:27 +02:00
|
|
|
*/
|
2003-05-10 11:28:02 +02:00
|
|
|
void
|
2019-01-20 00:22:18 +01:00
|
|
|
start_pam(struct ssh *ssh)
|
2000-09-16 07:09:27 +02:00
|
|
|
{
|
2019-01-20 00:22:18 +01:00
|
|
|
Authctxt *authctxt = (Authctxt *)ssh->authctxt;
|
|
|
|
|
2003-05-14 07:31:12 +02:00
|
|
|
if (!options.use_pam)
|
|
|
|
fatal("PAM: initialisation requested when UsePAM=no");
|
|
|
|
|
2019-01-20 00:22:18 +01:00
|
|
|
if (sshpam_init(ssh, authctxt) == -1)
|
2003-05-10 11:28:02 +02:00
|
|
|
fatal("PAM: initialisation failed");
|
1999-12-30 05:08:44 +01:00
|
|
|
}
|
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
void
|
|
|
|
finish_pam(void)
|
1999-12-30 05:08:44 +01:00
|
|
|
{
|
2003-10-07 03:30:15 +02:00
|
|
|
sshpam_cleanup();
|
1999-12-30 05:08:44 +01:00
|
|
|
}
|
|
|
|
|
2017-07-28 06:50:59 +02:00
|
|
|
|
2003-08-25 05:08:49 +02:00
|
|
|
u_int
|
|
|
|
do_pam_account(void)
|
1999-12-30 05:08:44 +01:00
|
|
|
{
|
2004-09-11 15:07:03 +02:00
|
|
|
debug("%s: called", __func__);
|
2003-12-18 05:34:31 +01:00
|
|
|
if (sshpam_account_status != -1)
|
|
|
|
return (sshpam_account_status);
|
|
|
|
|
2017-07-28 06:50:59 +02:00
|
|
|
expose_authinfo(__func__);
|
|
|
|
|
2003-08-25 05:08:49 +02:00
|
|
|
sshpam_err = pam_acct_mgmt(sshpam_handle, 0);
|
2004-09-11 15:07:03 +02:00
|
|
|
debug3("PAM: %s pam_acct_mgmt = %d (%s)", __func__, sshpam_err,
|
|
|
|
pam_strerror(sshpam_handle, sshpam_err));
|
2005-07-17 09:04:47 +02:00
|
|
|
|
2003-12-18 05:34:31 +01:00
|
|
|
if (sshpam_err != PAM_SUCCESS && sshpam_err != PAM_NEW_AUTHTOK_REQD) {
|
|
|
|
sshpam_account_status = 0;
|
|
|
|
return (sshpam_account_status);
|
2003-08-25 05:08:49 +02:00
|
|
|
}
|
|
|
|
|
2003-12-18 05:34:31 +01:00
|
|
|
if (sshpam_err == PAM_NEW_AUTHTOK_REQD)
|
2004-06-19 04:54:38 +02:00
|
|
|
sshpam_password_change_required(1);
|
2003-12-18 05:34:31 +01:00
|
|
|
|
|
|
|
sshpam_account_status = 1;
|
|
|
|
return (sshpam_account_status);
|
2003-05-10 11:28:02 +02:00
|
|
|
}
|
2001-04-23 19:28:28 +02:00
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
void
|
|
|
|
do_pam_setcred(int init)
|
|
|
|
{
|
|
|
|
sshpam_err = pam_set_item(sshpam_handle, PAM_CONV,
|
2004-09-11 15:07:03 +02:00
|
|
|
(const void *)&store_conv);
|
2003-05-10 11:28:02 +02:00
|
|
|
if (sshpam_err != PAM_SUCCESS)
|
|
|
|
fatal("PAM: failed to set PAM_CONV: %s",
|
|
|
|
pam_strerror(sshpam_handle, sshpam_err));
|
|
|
|
if (init) {
|
|
|
|
debug("PAM: establishing credentials");
|
|
|
|
sshpam_err = pam_setcred(sshpam_handle, PAM_ESTABLISH_CRED);
|
|
|
|
} else {
|
|
|
|
debug("PAM: reinitializing credentials");
|
|
|
|
sshpam_err = pam_setcred(sshpam_handle, PAM_REINITIALIZE_CRED);
|
|
|
|
}
|
|
|
|
if (sshpam_err == PAM_SUCCESS) {
|
|
|
|
sshpam_cred_established = 1;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (sshpam_authenticated)
|
|
|
|
fatal("PAM: pam_setcred(): %s",
|
|
|
|
pam_strerror(sshpam_handle, sshpam_err));
|
|
|
|
else
|
|
|
|
debug("PAM: pam_setcred(): %s",
|
|
|
|
pam_strerror(sshpam_handle, sshpam_err));
|
1999-12-30 05:08:44 +01:00
|
|
|
}
|
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
static int
|
2005-05-26 11:59:48 +02:00
|
|
|
sshpam_tty_conv(int n, sshpam_const struct pam_message **msg,
|
2003-08-25 05:08:49 +02:00
|
|
|
struct pam_response **resp, void *data)
|
2002-07-23 02:44:07 +02:00
|
|
|
{
|
2003-05-10 11:28:02 +02:00
|
|
|
char input[PAM_MAX_MSG_SIZE];
|
2003-09-23 14:12:38 +02:00
|
|
|
struct pam_response *reply;
|
2002-07-23 02:44:07 +02:00
|
|
|
int i;
|
|
|
|
|
2004-02-17 10:46:59 +01:00
|
|
|
debug3("PAM: %s called with %d messages", __func__, n);
|
|
|
|
|
2003-09-23 14:12:38 +02:00
|
|
|
*resp = NULL;
|
|
|
|
|
2003-11-18 02:42:07 +01:00
|
|
|
if (n <= 0 || n > PAM_MAX_NUM_MSG || !isatty(STDIN_FILENO))
|
2003-05-10 11:28:02 +02:00
|
|
|
return (PAM_CONV_ERR);
|
2003-09-23 14:12:38 +02:00
|
|
|
|
2006-05-04 08:24:34 +02:00
|
|
|
if ((reply = calloc(n, sizeof(*reply))) == NULL)
|
2003-09-23 14:12:38 +02:00
|
|
|
return (PAM_CONV_ERR);
|
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
for (i = 0; i < n; ++i) {
|
|
|
|
switch (PAM_MSG_MEMBER(msg, i, msg_style)) {
|
|
|
|
case PAM_PROMPT_ECHO_OFF:
|
2003-09-23 14:12:38 +02:00
|
|
|
reply[i].resp =
|
2003-11-21 13:48:55 +01:00
|
|
|
read_passphrase(PAM_MSG_MEMBER(msg, i, msg),
|
2003-05-10 11:28:02 +02:00
|
|
|
RP_ALLOW_STDIN);
|
2003-09-23 14:12:38 +02:00
|
|
|
reply[i].resp_retcode = PAM_SUCCESS;
|
2003-05-10 11:28:02 +02:00
|
|
|
break;
|
|
|
|
case PAM_PROMPT_ECHO_ON:
|
2003-11-13 01:21:31 +01:00
|
|
|
fprintf(stderr, "%s\n", PAM_MSG_MEMBER(msg, i, msg));
|
2007-05-20 07:26:07 +02:00
|
|
|
if (fgets(input, sizeof input, stdin) == NULL)
|
|
|
|
input[0] = '\0';
|
2004-07-19 01:39:11 +02:00
|
|
|
if ((reply[i].resp = strdup(input)) == NULL)
|
|
|
|
goto fail;
|
2003-09-23 14:12:38 +02:00
|
|
|
reply[i].resp_retcode = PAM_SUCCESS;
|
2003-05-10 11:28:02 +02:00
|
|
|
break;
|
|
|
|
case PAM_ERROR_MSG:
|
|
|
|
case PAM_TEXT_INFO:
|
2003-11-13 01:21:31 +01:00
|
|
|
fprintf(stderr, "%s\n", PAM_MSG_MEMBER(msg, i, msg));
|
2003-09-23 14:12:38 +02:00
|
|
|
reply[i].resp_retcode = PAM_SUCCESS;
|
2003-05-10 11:28:02 +02:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
goto fail;
|
|
|
|
}
|
2002-07-23 02:44:07 +02:00
|
|
|
}
|
2003-09-23 14:12:38 +02:00
|
|
|
*resp = reply;
|
2003-05-10 11:28:02 +02:00
|
|
|
return (PAM_SUCCESS);
|
2003-09-23 14:12:38 +02:00
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
fail:
|
2003-09-23 14:12:38 +02:00
|
|
|
for(i = 0; i < n; i++) {
|
2013-06-02 00:07:31 +02:00
|
|
|
free(reply[i].resp);
|
2003-09-23 14:12:38 +02:00
|
|
|
}
|
2013-06-02 00:07:31 +02:00
|
|
|
free(reply);
|
2003-05-10 11:28:02 +02:00
|
|
|
return (PAM_CONV_ERR);
|
2002-07-23 02:44:07 +02:00
|
|
|
}
|
|
|
|
|
2004-06-03 06:53:12 +02:00
|
|
|
static struct pam_conv tty_conv = { sshpam_tty_conv, NULL };
|
2003-11-18 02:42:07 +01:00
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
/*
|
|
|
|
* XXX this should be done in the authentication phase, but ssh1 doesn't
|
|
|
|
* support that
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
do_pam_chauthtok(void)
|
1999-12-30 05:08:44 +01:00
|
|
|
{
|
2003-05-10 11:28:02 +02:00
|
|
|
if (use_privsep)
|
2003-08-25 05:08:49 +02:00
|
|
|
fatal("Password expired (unable to change with privsep)");
|
2003-05-10 11:28:02 +02:00
|
|
|
sshpam_err = pam_set_item(sshpam_handle, PAM_CONV,
|
2003-11-18 02:42:07 +01:00
|
|
|
(const void *)&tty_conv);
|
2003-05-10 11:28:02 +02:00
|
|
|
if (sshpam_err != PAM_SUCCESS)
|
|
|
|
fatal("PAM: failed to set PAM_CONV: %s",
|
|
|
|
pam_strerror(sshpam_handle, sshpam_err));
|
|
|
|
debug("PAM: changing password");
|
|
|
|
sshpam_err = pam_chauthtok(sshpam_handle, PAM_CHANGE_EXPIRED_AUTHTOK);
|
|
|
|
if (sshpam_err != PAM_SUCCESS)
|
|
|
|
fatal("PAM: pam_chauthtok(): %s",
|
|
|
|
pam_strerror(sshpam_handle, sshpam_err));
|
2000-05-31 03:20:11 +02:00
|
|
|
}
|
|
|
|
|
2003-11-18 02:42:07 +01:00
|
|
|
void
|
2018-03-03 04:15:51 +01:00
|
|
|
do_pam_session(struct ssh *ssh)
|
2003-11-18 02:42:07 +01:00
|
|
|
{
|
2004-02-10 03:23:28 +01:00
|
|
|
debug3("PAM: opening session");
|
2017-07-28 06:50:59 +02:00
|
|
|
|
|
|
|
expose_authinfo(__func__);
|
|
|
|
|
2003-11-21 13:48:55 +01:00
|
|
|
sshpam_err = pam_set_item(sshpam_handle, PAM_CONV,
|
2004-02-17 13:20:07 +01:00
|
|
|
(const void *)&store_conv);
|
2003-11-18 02:42:07 +01:00
|
|
|
if (sshpam_err != PAM_SUCCESS)
|
|
|
|
fatal("PAM: failed to set PAM_CONV: %s",
|
|
|
|
pam_strerror(sshpam_handle, sshpam_err));
|
|
|
|
sshpam_err = pam_open_session(sshpam_handle, 0);
|
2004-09-11 14:17:26 +02:00
|
|
|
if (sshpam_err == PAM_SUCCESS)
|
|
|
|
sshpam_session_open = 1;
|
|
|
|
else {
|
|
|
|
sshpam_session_open = 0;
|
2018-03-03 04:15:51 +01:00
|
|
|
auth_restrict_session(ssh);
|
2004-09-11 14:17:26 +02:00
|
|
|
error("PAM: pam_open_session(): %s",
|
2003-11-18 02:42:07 +01:00
|
|
|
pam_strerror(sshpam_handle, sshpam_err));
|
2004-09-11 14:17:26 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
is_pam_session_open(void)
|
|
|
|
{
|
|
|
|
return sshpam_session_open;
|
2003-11-18 02:42:07 +01:00
|
|
|
}
|
|
|
|
|
2003-11-21 13:48:55 +01:00
|
|
|
/*
|
2003-08-26 03:58:16 +02:00
|
|
|
* Set a PAM environment string. We need to do this so that the session
|
|
|
|
* modules can handle things like Kerberos/GSI credentials that appear
|
|
|
|
* during the ssh authentication process.
|
|
|
|
*/
|
|
|
|
int
|
2003-11-21 13:48:55 +01:00
|
|
|
do_pam_putenv(char *name, char *value)
|
2003-08-26 03:58:16 +02:00
|
|
|
{
|
|
|
|
int ret = 1;
|
2003-09-16 23:24:25 +02:00
|
|
|
char *compound;
|
|
|
|
size_t len;
|
|
|
|
|
|
|
|
len = strlen(name) + strlen(value) + 2;
|
|
|
|
compound = xmalloc(len);
|
|
|
|
|
|
|
|
snprintf(compound, len, "%s=%s", name, value);
|
|
|
|
ret = pam_putenv(sshpam_handle, compound);
|
2013-06-02 00:07:31 +02:00
|
|
|
free(compound);
|
2003-09-16 23:24:25 +02:00
|
|
|
|
2003-08-26 03:58:16 +02:00
|
|
|
return (ret);
|
|
|
|
}
|
|
|
|
|
2003-11-17 11:41:42 +01:00
|
|
|
char **
|
|
|
|
fetch_pam_child_environment(void)
|
|
|
|
{
|
|
|
|
return sshpam_env;
|
|
|
|
}
|
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
char **
|
|
|
|
fetch_pam_environment(void)
|
|
|
|
{
|
|
|
|
return (pam_getenvlist(sshpam_handle));
|
|
|
|
}
|
2001-02-07 02:58:33 +01:00
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
void
|
|
|
|
free_pam_environment(char **env)
|
|
|
|
{
|
|
|
|
char **envp;
|
2000-05-31 03:20:11 +02:00
|
|
|
|
2003-05-16 10:21:01 +02:00
|
|
|
if (env == NULL)
|
|
|
|
return;
|
|
|
|
|
2003-05-10 11:28:02 +02:00
|
|
|
for (envp = env; *envp; envp++)
|
2013-06-02 00:07:31 +02:00
|
|
|
free(*envp);
|
|
|
|
free(env);
|
1999-12-30 05:08:44 +01:00
|
|
|
}
|
|
|
|
|
2004-05-30 12:43:59 +02:00
|
|
|
/*
|
|
|
|
* "Blind" conversation function for password authentication. Assumes that
|
|
|
|
* echo-off prompts are for the password and stores messages for later
|
|
|
|
* display.
|
|
|
|
*/
|
|
|
|
static int
|
2005-05-26 11:59:48 +02:00
|
|
|
sshpam_passwd_conv(int n, sshpam_const struct pam_message **msg,
|
2004-05-30 12:43:59 +02:00
|
|
|
struct pam_response **resp, void *data)
|
|
|
|
{
|
|
|
|
struct pam_response *reply;
|
2018-07-10 11:39:52 +02:00
|
|
|
int r, i;
|
2004-05-30 12:43:59 +02:00
|
|
|
size_t len;
|
|
|
|
|
|
|
|
debug3("PAM: %s called with %d messages", __func__, n);
|
|
|
|
|
|
|
|
*resp = NULL;
|
|
|
|
|
|
|
|
if (n <= 0 || n > PAM_MAX_NUM_MSG)
|
|
|
|
return (PAM_CONV_ERR);
|
|
|
|
|
2007-05-20 07:20:08 +02:00
|
|
|
if ((reply = calloc(n, sizeof(*reply))) == NULL)
|
2004-05-30 12:43:59 +02:00
|
|
|
return (PAM_CONV_ERR);
|
|
|
|
|
|
|
|
for (i = 0; i < n; ++i) {
|
|
|
|
switch (PAM_MSG_MEMBER(msg, i, msg_style)) {
|
|
|
|
case PAM_PROMPT_ECHO_OFF:
|
|
|
|
if (sshpam_password == NULL)
|
|
|
|
goto fail;
|
2004-07-19 01:39:11 +02:00
|
|
|
if ((reply[i].resp = strdup(sshpam_password)) == NULL)
|
|
|
|
goto fail;
|
2004-05-30 12:43:59 +02:00
|
|
|
reply[i].resp_retcode = PAM_SUCCESS;
|
|
|
|
break;
|
|
|
|
case PAM_ERROR_MSG:
|
|
|
|
case PAM_TEXT_INFO:
|
|
|
|
len = strlen(PAM_MSG_MEMBER(msg, i, msg));
|
|
|
|
if (len > 0) {
|
2018-07-10 11:39:52 +02:00
|
|
|
if ((r = sshbuf_putf(loginmsg, "%s\n",
|
|
|
|
PAM_MSG_MEMBER(msg, i, msg))) != 0)
|
|
|
|
fatal("%s: buffer error: %s",
|
|
|
|
__func__, ssh_err(r));
|
2004-05-30 12:43:59 +02:00
|
|
|
}
|
2004-07-19 01:39:11 +02:00
|
|
|
if ((reply[i].resp = strdup("")) == NULL)
|
|
|
|
goto fail;
|
2004-05-30 12:43:59 +02:00
|
|
|
reply[i].resp_retcode = PAM_SUCCESS;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
goto fail;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*resp = reply;
|
|
|
|
return (PAM_SUCCESS);
|
|
|
|
|
2005-07-17 09:04:47 +02:00
|
|
|
fail:
|
2004-05-30 12:43:59 +02:00
|
|
|
for(i = 0; i < n; i++) {
|
2013-06-02 00:07:31 +02:00
|
|
|
free(reply[i].resp);
|
2004-05-30 12:43:59 +02:00
|
|
|
}
|
2013-06-02 00:07:31 +02:00
|
|
|
free(reply);
|
2004-05-30 12:43:59 +02:00
|
|
|
return (PAM_CONV_ERR);
|
|
|
|
}
|
|
|
|
|
|
|
|
static struct pam_conv passwd_conv = { sshpam_passwd_conv, NULL };
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Attempt password authentication via PAM
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
sshpam_auth_passwd(Authctxt *authctxt, const char *password)
|
|
|
|
{
|
|
|
|
int flags = (options.permit_empty_passwd == 0 ?
|
|
|
|
PAM_DISALLOW_NULL_AUTHTOK : 0);
|
2016-07-15 05:49:44 +02:00
|
|
|
char *fake = NULL;
|
2004-05-30 12:43:59 +02:00
|
|
|
|
|
|
|
if (!options.use_pam || sshpam_handle == NULL)
|
|
|
|
fatal("PAM: %s called when PAM disabled or failed to "
|
|
|
|
"initialise.", __func__);
|
|
|
|
|
|
|
|
sshpam_password = password;
|
|
|
|
sshpam_authctxt = authctxt;
|
|
|
|
|
2004-05-30 14:04:56 +02:00
|
|
|
/*
|
|
|
|
* If the user logging in is invalid, or is root but is not permitted
|
|
|
|
* by PermitRootLogin, use an invalid password to prevent leaking
|
|
|
|
* information via timing (eg if the PAM config has a delay on fail).
|
|
|
|
*/
|
2005-01-20 03:29:51 +01:00
|
|
|
if (!authctxt->valid || (authctxt->pw->pw_uid == 0 &&
|
2005-07-17 09:18:49 +02:00
|
|
|
options.permit_root_login != PERMIT_YES))
|
2016-07-15 05:49:44 +02:00
|
|
|
sshpam_password = fake = fake_password(password);
|
2004-05-30 14:04:56 +02:00
|
|
|
|
2004-05-30 12:43:59 +02:00
|
|
|
sshpam_err = pam_set_item(sshpam_handle, PAM_CONV,
|
|
|
|
(const void *)&passwd_conv);
|
|
|
|
if (sshpam_err != PAM_SUCCESS)
|
|
|
|
fatal("PAM: %s: failed to set PAM_CONV: %s", __func__,
|
|
|
|
pam_strerror(sshpam_handle, sshpam_err));
|
|
|
|
|
|
|
|
sshpam_err = pam_authenticate(sshpam_handle, flags);
|
|
|
|
sshpam_password = NULL;
|
2016-07-15 05:49:44 +02:00
|
|
|
free(fake);
|
2016-07-18 01:33:25 +02:00
|
|
|
if (sshpam_err == PAM_MAXTRIES)
|
|
|
|
sshpam_set_maxtries_reached(1);
|
2005-01-20 03:29:51 +01:00
|
|
|
if (sshpam_err == PAM_SUCCESS && authctxt->valid) {
|
2004-05-30 12:43:59 +02:00
|
|
|
debug("PAM: password authentication accepted for %.100s",
|
|
|
|
authctxt->user);
|
2005-07-17 09:18:49 +02:00
|
|
|
return 1;
|
2004-05-30 12:43:59 +02:00
|
|
|
} else {
|
|
|
|
debug("PAM: password authentication failed for %.100s: %s",
|
|
|
|
authctxt->valid ? authctxt->user : "an illegal user",
|
|
|
|
pam_strerror(sshpam_handle, sshpam_err));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
2016-07-18 01:33:25 +02:00
|
|
|
|
|
|
|
int
|
|
|
|
sshpam_get_maxtries_reached(void)
|
|
|
|
{
|
|
|
|
return sshpam_maxtries_reached;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
sshpam_set_maxtries_reached(int reached)
|
|
|
|
{
|
|
|
|
if (reached == 0 || sshpam_maxtries_reached)
|
|
|
|
return;
|
|
|
|
sshpam_maxtries_reached = 1;
|
|
|
|
options.password_authentication = 0;
|
|
|
|
options.kbd_interactive_authentication = 0;
|
|
|
|
}
|
1999-12-30 05:08:44 +01:00
|
|
|
#endif /* USE_PAM */
|