Resolve conflicts.
This commit is contained in:
parent
09dfa7dfb4
commit
cea45abfda
@ -141,7 +141,7 @@ int
|
||||
krb4_init(uid_t uid)
|
||||
{
|
||||
static int cleanup_registered = 0;
|
||||
char *tkt_root = TKT_ROOT;
|
||||
const char *tkt_root = TKT_ROOT;
|
||||
struct stat st;
|
||||
int fd;
|
||||
|
||||
@ -188,19 +188,20 @@ auth_krb4(const char *server_user, KTEXT auth, char **client)
|
||||
KTEXT_ST reply;
|
||||
char instance[INST_SZ];
|
||||
int r, s;
|
||||
socklen_t slen;
|
||||
u_int cksum;
|
||||
Key_schedule schedule;
|
||||
struct sockaddr_in local, foreign;
|
||||
|
||||
s = packet_get_connection_in();
|
||||
|
||||
r = sizeof(local);
|
||||
slen = sizeof(local);
|
||||
memset(&local, 0, sizeof(local));
|
||||
if (getsockname(s, (struct sockaddr *) & local, &r) < 0)
|
||||
if (getsockname(s, (struct sockaddr *) & local, &slen) < 0)
|
||||
debug("getsockname failed: %.100s", strerror(errno));
|
||||
r = sizeof(foreign);
|
||||
slen = sizeof(foreign);
|
||||
memset(&foreign, 0, sizeof(foreign));
|
||||
if (getpeername(s, (struct sockaddr *) & foreign, &r) < 0) {
|
||||
if (getpeername(s, (struct sockaddr *) & foreign, &slen) < 0) {
|
||||
debug("getpeername failed: %.100s", strerror(errno));
|
||||
fatal_cleanup();
|
||||
}
|
||||
|
@ -17,7 +17,7 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
RCSID("$Id: auth-rsa.c,v 1.18 2000/02/11 10:59:11 markus Exp $");
|
||||
RCSID("$Id: auth-rsa.c,v 1.19 2000/03/23 22:15:33 markus Exp $");
|
||||
|
||||
#include "rsa.h"
|
||||
#include "packet.h"
|
||||
@ -25,6 +25,7 @@ RCSID("$Id: auth-rsa.c,v 1.18 2000/02/11 10:59:11 markus Exp $");
|
||||
#include "ssh.h"
|
||||
#include "mpaux.h"
|
||||
#include "uidswap.h"
|
||||
#include "match.h"
|
||||
#include "servconf.h"
|
||||
|
||||
#include <openssl/rsa.h>
|
||||
@ -61,10 +62,9 @@ extern unsigned char session_id[16];
|
||||
*/
|
||||
|
||||
int
|
||||
auth_rsa_challenge_dialog(BIGNUM *e, BIGNUM *n)
|
||||
auth_rsa_challenge_dialog(RSA *pk)
|
||||
{
|
||||
BIGNUM *challenge, *encrypted_challenge;
|
||||
RSA *pk;
|
||||
BN_CTX *ctx;
|
||||
unsigned char buf[32], mdbuf[16], response[16];
|
||||
MD5_CTX md;
|
||||
@ -77,19 +77,11 @@ auth_rsa_challenge_dialog(BIGNUM *e, BIGNUM *n)
|
||||
/* Generate a random challenge. */
|
||||
BN_rand(challenge, 256, 0, 0);
|
||||
ctx = BN_CTX_new();
|
||||
BN_mod(challenge, challenge, n, ctx);
|
||||
BN_mod(challenge, challenge, pk->n, ctx);
|
||||
BN_CTX_free(ctx);
|
||||
|
||||
/* Create the public key data structure. */
|
||||
pk = RSA_new();
|
||||
pk->e = BN_new();
|
||||
BN_copy(pk->e, e);
|
||||
pk->n = BN_new();
|
||||
BN_copy(pk->n, n);
|
||||
|
||||
/* Encrypt the challenge with the public key. */
|
||||
rsa_public_encrypt(encrypted_challenge, challenge, pk);
|
||||
RSA_free(pk);
|
||||
|
||||
/* Send the encrypted challenge to the client. */
|
||||
packet_start(SSH_SMSG_AUTH_RSA_CHALLENGE);
|
||||
@ -141,7 +133,7 @@ auth_rsa(struct passwd *pw, BIGNUM *client_n)
|
||||
FILE *f;
|
||||
unsigned long linenum = 0;
|
||||
struct stat st;
|
||||
BIGNUM *e, *n;
|
||||
RSA *pk;
|
||||
|
||||
/* Temporarily use the user's uid. */
|
||||
temporarily_use_uid(pw->pw_uid);
|
||||
@ -203,8 +195,9 @@ auth_rsa(struct passwd *pw, BIGNUM *client_n)
|
||||
/* Flag indicating whether authentication has succeeded. */
|
||||
authenticated = 0;
|
||||
|
||||
e = BN_new();
|
||||
n = BN_new();
|
||||
pk = RSA_new();
|
||||
pk->e = BN_new();
|
||||
pk->n = BN_new();
|
||||
|
||||
/*
|
||||
* Go though the accepted keys, looking for the current key. If
|
||||
@ -242,7 +235,7 @@ auth_rsa(struct passwd *pw, BIGNUM *client_n)
|
||||
options = NULL;
|
||||
|
||||
/* Parse the key from the line. */
|
||||
if (!auth_rsa_read_key(&cp, &bits, e, n)) {
|
||||
if (!auth_rsa_read_key(&cp, &bits, pk->e, pk->n)) {
|
||||
debug("%.100s, line %lu: bad key syntax",
|
||||
SSH_USER_PERMITTED_KEYS, linenum);
|
||||
packet_send_debug("%.100s, line %lu: bad key syntax",
|
||||
@ -252,19 +245,20 @@ auth_rsa(struct passwd *pw, BIGNUM *client_n)
|
||||
/* cp now points to the comment part. */
|
||||
|
||||
/* Check if the we have found the desired key (identified by its modulus). */
|
||||
if (BN_cmp(n, client_n) != 0)
|
||||
if (BN_cmp(pk->n, client_n) != 0)
|
||||
continue;
|
||||
|
||||
/* check the real bits */
|
||||
if (bits != BN_num_bits(n))
|
||||
if (bits != BN_num_bits(pk->n))
|
||||
log("Warning: %s, line %ld: keysize mismatch: "
|
||||
"actual %d vs. announced %d.",
|
||||
file, linenum, BN_num_bits(n), bits);
|
||||
file, linenum, BN_num_bits(pk->n), bits);
|
||||
|
||||
/* We have found the desired key. */
|
||||
|
||||
|
||||
/* Perform the challenge-response dialog for this key. */
|
||||
if (!auth_rsa_challenge_dialog(e, n)) {
|
||||
if (!auth_rsa_challenge_dialog(pk)) {
|
||||
/* Wrong response. */
|
||||
verbose("Wrong response to RSA authentication challenge.");
|
||||
packet_send_debug("Wrong response to RSA authentication challenge.");
|
||||
@ -467,8 +461,7 @@ auth_rsa(struct passwd *pw, BIGNUM *client_n)
|
||||
/* Close the file. */
|
||||
fclose(f);
|
||||
|
||||
BN_clear_free(n);
|
||||
BN_clear_free(e);
|
||||
RSA_free(pk);
|
||||
|
||||
if (authenticated)
|
||||
packet_send_debug("RSA authentication accepted.");
|
||||
|
@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
RCSID("$Id: bufaux.c,v 1.7 1999/11/24 19:53:44 markus Exp $");
|
||||
RCSID("$Id: bufaux.c,v 1.8 2000/03/16 20:56:14 markus Exp $");
|
||||
|
||||
#include "ssh.h"
|
||||
#include <openssl/bn.h>
|
||||
@ -33,7 +33,7 @@ buffer_put_bignum(Buffer *buffer, BIGNUM *value)
|
||||
{
|
||||
int bits = BN_num_bits(value);
|
||||
int bin_size = (bits + 7) / 8;
|
||||
char *buf = xmalloc(bin_size);
|
||||
char unsigned *buf = xmalloc(bin_size);
|
||||
int oi;
|
||||
char msg[2];
|
||||
|
||||
@ -47,7 +47,7 @@ buffer_put_bignum(Buffer *buffer, BIGNUM *value)
|
||||
PUT_16BIT(msg, bits);
|
||||
buffer_append(buffer, msg, 2);
|
||||
/* Store the binary data. */
|
||||
buffer_append(buffer, buf, oi);
|
||||
buffer_append(buffer, (char *)buf, oi);
|
||||
|
||||
memset(buf, 0, bin_size);
|
||||
xfree(buf);
|
||||
@ -69,7 +69,7 @@ buffer_get_bignum(Buffer *buffer, BIGNUM *value)
|
||||
bytes = (bits + 7) / 8;
|
||||
if (buffer_len(buffer) < bytes)
|
||||
fatal("buffer_get_bignum: input buffer too small");
|
||||
bin = buffer_ptr(buffer);
|
||||
bin = (unsigned char*) buffer_ptr(buffer);
|
||||
BN_bin2bn(bin, bytes, value);
|
||||
buffer_consume(buffer, bytes);
|
||||
|
||||
|
@ -13,7 +13,7 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
RCSID("$Id: cipher.c,v 1.19 2000/02/22 15:19:29 markus Exp $");
|
||||
RCSID("$Id: cipher.c,v 1.20 2000/03/22 09:55:10 markus Exp $");
|
||||
|
||||
#include "ssh.h"
|
||||
#include "cipher.h"
|
||||
@ -105,18 +105,6 @@ swap_bytes(const unsigned char *src, unsigned char *dst_, int n)
|
||||
}
|
||||
}
|
||||
|
||||
void (*cipher_attack_detected) (const char *fmt,...) = fatal;
|
||||
|
||||
static inline void
|
||||
detect_cbc_attack(const unsigned char *src,
|
||||
unsigned int len)
|
||||
{
|
||||
return;
|
||||
|
||||
log("CRC-32 CBC insertion attack detected");
|
||||
cipher_attack_detected("CRC-32 CBC insertion attack detected");
|
||||
}
|
||||
|
||||
/*
|
||||
* Names of all encryption algorithms.
|
||||
* These must match the numbers defined in cipher.h.
|
||||
@ -299,7 +287,6 @@ cipher_decrypt(CipherContext *context, unsigned char *dest,
|
||||
break;
|
||||
|
||||
case SSH_CIPHER_3DES:
|
||||
/* CRC-32 attack? */
|
||||
SSH_3CBC_DECRYPT(context->u.des3.key1,
|
||||
context->u.des3.key2, &context->u.des3.iv2,
|
||||
context->u.des3.key3, &context->u.des3.iv3,
|
||||
@ -307,7 +294,6 @@ cipher_decrypt(CipherContext *context, unsigned char *dest,
|
||||
break;
|
||||
|
||||
case SSH_CIPHER_BLOWFISH:
|
||||
detect_cbc_attack(src, len);
|
||||
swap_bytes(src, dest, len);
|
||||
BF_cbc_encrypt((void *) dest, dest, len,
|
||||
&context->u.bf.key, context->u.bf.iv,
|
||||
|
@ -12,7 +12,7 @@
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/* RCSID("$Id: cipher.h,v 1.10 1999/11/24 19:53:46 markus Exp $"); */
|
||||
/* RCSID("$Id: cipher.h,v 1.11 2000/03/22 09:55:10 markus Exp $"); */
|
||||
|
||||
#ifndef CIPHER_H
|
||||
#define CIPHER_H
|
||||
@ -89,10 +89,4 @@ void
|
||||
cipher_decrypt(CipherContext * context, unsigned char *dest,
|
||||
const unsigned char *src, unsigned int len);
|
||||
|
||||
/*
|
||||
* If and CRC-32 attack is detected this function is called. Defaults to
|
||||
* fatal, changed to packet_disconnect in sshd and ssh.
|
||||
*/
|
||||
extern void (*cipher_attack_detected) (const char *fmt, ...);
|
||||
|
||||
#endif /* CIPHER_H */
|
||||
|
@ -30,7 +30,7 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
RCSID("$Id: fingerprint.c,v 1.4 1999/11/24 16:15:25 markus Exp $");
|
||||
RCSID("$Id: fingerprint.c,v 1.5 2000/03/16 20:56:14 markus Exp $");
|
||||
|
||||
#include "ssh.h"
|
||||
#include "xmalloc.h"
|
||||
@ -48,7 +48,7 @@ fingerprint(BIGNUM *e, BIGNUM *n)
|
||||
static char retval[80];
|
||||
MD5_CTX md;
|
||||
unsigned char d[16];
|
||||
char *buf;
|
||||
unsigned char *buf;
|
||||
int nlen, elen;
|
||||
|
||||
nlen = BN_num_bytes(n);
|
||||
|
@ -14,7 +14,7 @@
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/* RCSID("$Id: packet.h,v 1.9 2000/01/04 16:54:58 markus Exp $"); */
|
||||
/* RCSID("$Id: packet.h,v 1.10 2000/03/16 20:56:14 markus Exp $"); */
|
||||
|
||||
#ifndef PACKET_H
|
||||
#define PACKET_H
|
||||
@ -145,7 +145,7 @@ char *packet_get_string(unsigned int *length_ptr);
|
||||
* The error message should not contain a newline. The total length of the
|
||||
* message must not exceed 1024 bytes.
|
||||
*/
|
||||
void packet_disconnect(const char *fmt,...) __attribute__((format(printf, 1, 2)));;
|
||||
void packet_disconnect(const char *fmt,...) __attribute__((format(printf, 1, 2)));
|
||||
|
||||
/*
|
||||
* Sends a diagnostic message to the other side. This message can be sent at
|
||||
@ -157,7 +157,7 @@ void packet_disconnect(const char *fmt,...) __attribute__((format(printf, 1,
|
||||
* remote side protocol flags do not indicate that it supports SSH_MSG_DEBUG,
|
||||
* this will do nothing.
|
||||
*/
|
||||
void packet_send_debug(const char *fmt,...) __attribute__((format(printf, 1, 2)));;
|
||||
void packet_send_debug(const char *fmt,...) __attribute__((format(printf, 1, 2)));
|
||||
|
||||
/* Checks if there is any buffered output, and tries to write some of the output. */
|
||||
void packet_write_poll(void);
|
||||
|
@ -37,7 +37,7 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
RCSID("$Id: rsa.c,v 1.12 2000/02/21 21:47:31 markus Exp $");
|
||||
RCSID("$Id: rsa.c,v 1.13 2000/03/16 20:56:14 markus Exp $");
|
||||
|
||||
#include "rsa.h"
|
||||
#include "ssh.h"
|
||||
@ -112,7 +112,7 @@ rsa_generate_key(RSA *prv, RSA *pub, unsigned int bits)
|
||||
void
|
||||
rsa_public_encrypt(BIGNUM *out, BIGNUM *in, RSA *key)
|
||||
{
|
||||
char *inbuf, *outbuf;
|
||||
unsigned char *inbuf, *outbuf;
|
||||
int len, ilen, olen;
|
||||
|
||||
if (BN_num_bits(key->e) < 2 || !BN_is_odd(key->e))
|
||||
@ -143,7 +143,7 @@ rsa_public_encrypt(BIGNUM *out, BIGNUM *in, RSA *key)
|
||||
void
|
||||
rsa_private_decrypt(BIGNUM *out, BIGNUM *in, RSA *key)
|
||||
{
|
||||
char *inbuf, *outbuf;
|
||||
unsigned char *inbuf, *outbuf;
|
||||
int len, ilen, olen;
|
||||
|
||||
olen = BN_num_bytes(key->n);
|
||||
|
@ -13,7 +13,7 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
RCSID("$Id: servconf.c,v 1.30 2000/02/24 18:22:16 markus Exp $");
|
||||
RCSID("$Id: servconf.c,v 1.31 2000/03/07 20:40:41 markus Exp $");
|
||||
|
||||
#include "ssh.h"
|
||||
#include "servconf.h"
|
||||
@ -102,7 +102,7 @@ fill_default_server_options(ServerOptions *options)
|
||||
if (options->print_motd == -1)
|
||||
options->print_motd = 1;
|
||||
if (options->x11_forwarding == -1)
|
||||
options->x11_forwarding = 1;
|
||||
options->x11_forwarding = 0;
|
||||
if (options->x11_display_offset == -1)
|
||||
options->x11_display_offset = 10;
|
||||
if (options->strict_modes == -1)
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: ssh-agent.c,v 1.25 2000/01/02 21:51:03 markus Exp $ */
|
||||
/* $OpenBSD: ssh-agent.c,v 1.26 2000/03/16 20:56:14 markus Exp $ */
|
||||
|
||||
/*
|
||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||
@ -11,7 +11,7 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
RCSID("$OpenBSD: ssh-agent.c,v 1.25 2000/01/02 21:51:03 markus Exp $");
|
||||
RCSID("$OpenBSD: ssh-agent.c,v 1.26 2000/03/16 20:56:14 markus Exp $");
|
||||
|
||||
#include "ssh.h"
|
||||
#include "rsa.h"
|
||||
@ -410,6 +410,7 @@ after_select(fd_set *readset, fd_set *writeset)
|
||||
{
|
||||
unsigned int i;
|
||||
int len, sock;
|
||||
socklen_t slen;
|
||||
char buf[1024];
|
||||
struct sockaddr_un sunaddr;
|
||||
|
||||
@ -419,8 +420,8 @@ after_select(fd_set *readset, fd_set *writeset)
|
||||
break;
|
||||
case AUTH_SOCKET:
|
||||
if (FD_ISSET(sockets[i].fd, readset)) {
|
||||
len = sizeof(sunaddr);
|
||||
sock = accept(sockets[i].fd, (struct sockaddr *) & sunaddr, &len);
|
||||
slen = sizeof(sunaddr);
|
||||
sock = accept(sockets[i].fd, (struct sockaddr *) & sunaddr, &slen);
|
||||
if (sock < 0) {
|
||||
perror("accept from AUTH_SOCKET");
|
||||
break;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -13,7 +13,7 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
RCSID("$Id: ssh.c,v 1.41 2000/02/28 19:51:58 markus Exp $");
|
||||
RCSID("$Id: ssh.c,v 1.43 2000/03/23 21:52:02 markus Exp $");
|
||||
|
||||
#include "xmalloc.h"
|
||||
#include "ssh.h"
|
||||
@ -176,6 +176,7 @@ main(int ac, char **av)
|
||||
struct stat st;
|
||||
struct passwd *pw, pwcopy;
|
||||
int interactive = 0, dummy;
|
||||
int have_pty = 0;
|
||||
uid_t original_effective_uid;
|
||||
int plen;
|
||||
|
||||
@ -616,9 +617,6 @@ main(int ac, char **av)
|
||||
if (host_private_key_loaded)
|
||||
RSA_free(host_private_key); /* Destroys contents safely */
|
||||
|
||||
/* Close connection cleanly after attack. */
|
||||
cipher_attack_detected = packet_disconnect;
|
||||
|
||||
/* Enable compression if requested. */
|
||||
if (options.compression) {
|
||||
debug("Requesting compression at level %d.", options.compression_level);
|
||||
@ -670,9 +668,10 @@ main(int ac, char **av)
|
||||
|
||||
/* Read response from the server. */
|
||||
type = packet_read(&plen);
|
||||
if (type == SSH_SMSG_SUCCESS)
|
||||
if (type == SSH_SMSG_SUCCESS) {
|
||||
interactive = 1;
|
||||
else if (type == SSH_SMSG_FAILURE)
|
||||
have_pty = 1;
|
||||
} else if (type == SSH_SMSG_FAILURE)
|
||||
log("Warning: Remote host failed or refused to allocate a pseudo tty.");
|
||||
else
|
||||
packet_disconnect("Protocol error waiting for pty request response.");
|
||||
@ -800,7 +799,7 @@ main(int ac, char **av)
|
||||
}
|
||||
|
||||
/* Enter the interactive session. */
|
||||
exit_status = client_loop(tty_flag, tty_flag ? options.escape_char : -1);
|
||||
exit_status = client_loop(have_pty, tty_flag ? options.escape_char : -1);
|
||||
|
||||
/* Close the connection to the remote host. */
|
||||
packet_close();
|
||||
|
@ -14,7 +14,7 @@
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/* RCSID("$Id: ssh.h,v 1.33 2000/02/01 22:32:53 d Exp $"); */
|
||||
/* RCSID("$Id: ssh.h,v 1.34 2000/03/23 22:15:33 markus Exp $"); */
|
||||
|
||||
#ifndef SSH_H
|
||||
#define SSH_H
|
||||
@ -321,8 +321,7 @@ int auth_rhosts(struct passwd * pw, const char *client_user);
|
||||
* its host key. Returns true if authentication succeeds.
|
||||
*/
|
||||
int
|
||||
auth_rhosts_rsa(struct passwd * pw, const char *client_user,
|
||||
BIGNUM * client_host_key_e, BIGNUM * client_host_key_n);
|
||||
auth_rhosts_rsa(struct passwd * pw, const char *client_user, RSA* client_host_key);
|
||||
|
||||
/*
|
||||
* Tries to authenticate the user using password. Returns true if
|
||||
@ -370,41 +369,12 @@ int get_remote_port(void);
|
||||
int get_local_port(void);
|
||||
|
||||
|
||||
/*
|
||||
* Tries to match the host name (which must be in all lowercase) against the
|
||||
* comma-separated sequence of subpatterns (each possibly preceded by ! to
|
||||
* indicate negation). Returns true if there is a positive match; zero
|
||||
* otherwise.
|
||||
*/
|
||||
int match_hostname(const char *host, const char *pattern, unsigned int len);
|
||||
|
||||
/*
|
||||
* Checks whether the given host is already in the list of our known hosts.
|
||||
* Returns HOST_OK if the host is known and has the specified key, HOST_NEW
|
||||
* if the host is not known, and HOST_CHANGED if the host is known but used
|
||||
* to have a different host key. The host must be in all lowercase.
|
||||
*/
|
||||
typedef enum {
|
||||
HOST_OK, HOST_NEW, HOST_CHANGED
|
||||
} HostStatus;
|
||||
HostStatus
|
||||
check_host_in_hostfile(const char *filename, const char *host,
|
||||
BIGNUM * e, BIGNUM * n, BIGNUM * ke, BIGNUM * kn);
|
||||
|
||||
/*
|
||||
* Appends an entry to the host file. Returns false if the entry could not
|
||||
* be appended.
|
||||
*/
|
||||
int
|
||||
add_host_to_hostfile(const char *filename, const char *host,
|
||||
BIGNUM * e, BIGNUM * n);
|
||||
|
||||
/*
|
||||
* Performs the RSA authentication challenge-response dialog with the client,
|
||||
* and returns true (non-zero) if the client gave the correct answer to our
|
||||
* challenge; returns zero if the client gives a wrong answer.
|
||||
*/
|
||||
int auth_rsa_challenge_dialog(BIGNUM * e, BIGNUM * n);
|
||||
int auth_rsa_challenge_dialog(RSA *pk);
|
||||
|
||||
/*
|
||||
* Reads a passphrase from /dev/tty with echo turned off. Returns the
|
||||
|
@ -10,7 +10,7 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
RCSID("$OpenBSD: sshconnect.c,v 1.56 2000/02/18 08:50:33 markus Exp $");
|
||||
RCSID("$OpenBSD: sshconnect.c,v 1.58 2000/03/23 22:15:33 markus Exp $");
|
||||
|
||||
#include <openssl/bn.h>
|
||||
#include "xmalloc.h"
|
||||
@ -23,9 +23,12 @@ RCSID("$OpenBSD: sshconnect.c,v 1.56 2000/02/18 08:50:33 markus Exp $");
|
||||
#include "uidswap.h"
|
||||
#include "compat.h"
|
||||
#include "readconf.h"
|
||||
#include "fingerprint.h"
|
||||
|
||||
#include <openssl/rsa.h>
|
||||
#include <openssl/dsa.h>
|
||||
#include <openssl/md5.h>
|
||||
#include "key.h"
|
||||
#include "hostfile.h"
|
||||
|
||||
/* Session id for the current session. */
|
||||
unsigned char session_id[16];
|
||||
@ -634,6 +637,7 @@ try_krb4_authentication()
|
||||
char *realm;
|
||||
CREDENTIALS cred;
|
||||
int r, type, plen;
|
||||
socklen_t slen;
|
||||
Key_schedule schedule;
|
||||
u_long checksum, cksum;
|
||||
MSG_DAT msg_data;
|
||||
@ -676,16 +680,16 @@ try_krb4_authentication()
|
||||
/* Zero the buffer. */
|
||||
(void) memset(auth.dat, 0, MAX_KTXT_LEN);
|
||||
|
||||
r = sizeof(local);
|
||||
slen = sizeof(local);
|
||||
memset(&local, 0, sizeof(local));
|
||||
if (getsockname(packet_get_connection_in(),
|
||||
(struct sockaddr *) & local, &r) < 0)
|
||||
(struct sockaddr *) & local, &slen) < 0)
|
||||
debug("getsockname failed: %s", strerror(errno));
|
||||
|
||||
r = sizeof(foreign);
|
||||
slen = sizeof(foreign);
|
||||
memset(&foreign, 0, sizeof(foreign));
|
||||
if (getpeername(packet_get_connection_in(),
|
||||
(struct sockaddr *) & foreign, &r) < 0) {
|
||||
(struct sockaddr *) & foreign, &slen) < 0) {
|
||||
debug("getpeername failed: %s", strerror(errno));
|
||||
fatal_cleanup();
|
||||
}
|
||||
@ -747,7 +751,7 @@ send_krb4_tgt()
|
||||
CREDENTIALS *creds;
|
||||
char pname[ANAME_SZ], pinst[INST_SZ], prealm[REALM_SZ];
|
||||
int r, type, plen;
|
||||
unsigned char buffer[8192];
|
||||
char buffer[8192];
|
||||
struct stat st;
|
||||
|
||||
/* Don't do anything if we don't have any tickets. */
|
||||
@ -768,7 +772,7 @@ send_krb4_tgt()
|
||||
debug("Kerberos V4 ticket expired: %s", TKT_FILE);
|
||||
return 0;
|
||||
}
|
||||
creds_to_radix(creds, buffer);
|
||||
creds_to_radix(creds, (unsigned char *)buffer);
|
||||
xfree(creds);
|
||||
|
||||
packet_start(SSH_CMSG_HAVE_KRB4_TGT);
|
||||
@ -794,7 +798,7 @@ send_afs_tokens(void)
|
||||
struct ClearToken ct;
|
||||
int i, type, len, plen;
|
||||
char buf[2048], *p, *server_cell;
|
||||
unsigned char buffer[8192];
|
||||
char buffer[8192];
|
||||
|
||||
/* Move over ktc_GetToken, here's something leaner. */
|
||||
for (i = 0; i < 100; i++) { /* just in case */
|
||||
@ -836,10 +840,10 @@ send_afs_tokens(void)
|
||||
creds.pinst[0] = '\0';
|
||||
|
||||
/* Encode token, ship it off. */
|
||||
if (!creds_to_radix(&creds, buffer))
|
||||
if (!creds_to_radix(&creds, (unsigned char*) buffer))
|
||||
break;
|
||||
packet_start(SSH_CMSG_HAVE_AFS_TOKEN);
|
||||
packet_put_string((char *) buffer, strlen(buffer));
|
||||
packet_put_string(buffer, strlen(buffer));
|
||||
packet_send();
|
||||
packet_write_wait();
|
||||
|
||||
@ -1104,7 +1108,9 @@ send_krb5_tgt(krb5_context context, krb5_auth_context auth_context)
|
||||
int
|
||||
try_skey_authentication()
|
||||
{
|
||||
int type, i, payload_len;
|
||||
int type, i;
|
||||
int payload_len;
|
||||
unsigned int clen;
|
||||
char *challenge, *response;
|
||||
|
||||
debug("Doing skey authentication.");
|
||||
@ -1124,7 +1130,8 @@ try_skey_authentication()
|
||||
debug("No challenge for skey authentication.");
|
||||
return 0;
|
||||
}
|
||||
challenge = packet_get_string(&payload_len);
|
||||
challenge = packet_get_string(&clen);
|
||||
packet_integrity_check(payload_len, (4 + clen), type);
|
||||
if (options.cipher == SSH_CIPHER_NONE)
|
||||
log("WARNING: Encryption is disabled! "
|
||||
"Reponse will be transmitted in clear text.");
|
||||
@ -1306,9 +1313,9 @@ read_yes_or_no(const char *prompt, int defval)
|
||||
*/
|
||||
|
||||
void
|
||||
check_host_key(char *host, struct sockaddr *hostaddr, RSA *host_key)
|
||||
check_host_key(char *host, struct sockaddr *hostaddr, Key *host_key)
|
||||
{
|
||||
RSA *file_key;
|
||||
Key *file_key;
|
||||
char *ip = NULL;
|
||||
char hostline[1000], *hostp;
|
||||
HostStatus host_status;
|
||||
@ -1358,47 +1365,34 @@ check_host_key(char *host, struct sockaddr *hostaddr, RSA *host_key)
|
||||
* Store the host key from the known host file in here so that we can
|
||||
* compare it with the key for the IP address.
|
||||
*/
|
||||
file_key = RSA_new();
|
||||
file_key->n = BN_new();
|
||||
file_key->e = BN_new();
|
||||
file_key = key_new(host_key->type);
|
||||
|
||||
/*
|
||||
* Check if the host key is present in the user\'s list of known
|
||||
* hosts or in the systemwide list.
|
||||
*/
|
||||
host_status = check_host_in_hostfile(options.user_hostfile, host,
|
||||
host_key->e, host_key->n,
|
||||
file_key->e, file_key->n);
|
||||
host_status = check_host_in_hostfile(options.user_hostfile, host, host_key, file_key);
|
||||
if (host_status == HOST_NEW)
|
||||
host_status = check_host_in_hostfile(options.system_hostfile, host,
|
||||
host_key->e, host_key->n,
|
||||
file_key->e, file_key->n);
|
||||
host_status = check_host_in_hostfile(options.system_hostfile, host, host_key, file_key);
|
||||
/*
|
||||
* Also perform check for the ip address, skip the check if we are
|
||||
* localhost or the hostname was an ip address to begin with
|
||||
*/
|
||||
if (options.check_host_ip && !local && strcmp(host, ip)) {
|
||||
RSA *ip_key = RSA_new();
|
||||
ip_key->n = BN_new();
|
||||
ip_key->e = BN_new();
|
||||
ip_status = check_host_in_hostfile(options.user_hostfile, ip,
|
||||
host_key->e, host_key->n,
|
||||
ip_key->e, ip_key->n);
|
||||
Key *ip_key = key_new(host_key->type);
|
||||
ip_status = check_host_in_hostfile(options.user_hostfile, ip, host_key, ip_key);
|
||||
|
||||
if (ip_status == HOST_NEW)
|
||||
ip_status = check_host_in_hostfile(options.system_hostfile, ip,
|
||||
host_key->e, host_key->n,
|
||||
ip_key->e, ip_key->n);
|
||||
ip_status = check_host_in_hostfile(options.system_hostfile, ip, host_key, ip_key);
|
||||
if (host_status == HOST_CHANGED &&
|
||||
(ip_status != HOST_CHANGED ||
|
||||
(BN_cmp(ip_key->e, file_key->e) || BN_cmp(ip_key->n, file_key->n))))
|
||||
(ip_status != HOST_CHANGED || !key_equal(ip_key, file_key)))
|
||||
host_ip_differ = 1;
|
||||
|
||||
RSA_free(ip_key);
|
||||
key_free(ip_key);
|
||||
} else
|
||||
ip_status = host_status;
|
||||
|
||||
RSA_free(file_key);
|
||||
key_free(file_key);
|
||||
|
||||
switch (host_status) {
|
||||
case HOST_OK:
|
||||
@ -1406,8 +1400,7 @@ check_host_key(char *host, struct sockaddr *hostaddr, RSA *host_key)
|
||||
debug("Host '%.200s' is known and matches the host key.", host);
|
||||
if (options.check_host_ip) {
|
||||
if (ip_status == HOST_NEW) {
|
||||
if (!add_host_to_hostfile(options.user_hostfile, ip,
|
||||
host_key->e, host_key->n))
|
||||
if (!add_host_to_hostfile(options.user_hostfile, ip, host_key))
|
||||
log("Failed to add the host key for IP address '%.30s' to the list of known hosts (%.30s).",
|
||||
ip, options.user_hostfile);
|
||||
else
|
||||
@ -1427,12 +1420,12 @@ check_host_key(char *host, struct sockaddr *hostaddr, RSA *host_key)
|
||||
} else if (options.strict_host_key_checking == 2) {
|
||||
/* The default */
|
||||
char prompt[1024];
|
||||
char *fp = fingerprint(host_key->e, host_key->n);
|
||||
char *fp = key_fingerprint(host_key);
|
||||
snprintf(prompt, sizeof(prompt),
|
||||
"The authenticity of host '%.200s' can't be established.\n"
|
||||
"Key fingerprint is %d %s.\n"
|
||||
"Key fingerprint is %s.\n"
|
||||
"Are you sure you want to continue connecting (yes/no)? ",
|
||||
host, BN_num_bits(host_key->n), fp);
|
||||
host, fp);
|
||||
if (!read_yes_or_no(prompt, -1))
|
||||
fatal("Aborted by user!\n");
|
||||
}
|
||||
@ -1443,8 +1436,7 @@ check_host_key(char *host, struct sockaddr *hostaddr, RSA *host_key)
|
||||
hostp = host;
|
||||
|
||||
/* If not in strict mode, add the key automatically to the local known_hosts file. */
|
||||
if (!add_host_to_hostfile(options.user_hostfile, hostp,
|
||||
host_key->e, host_key->n))
|
||||
if (!add_host_to_hostfile(options.user_hostfile, hostp, host_key))
|
||||
log("Failed to add the host to the list of known hosts (%.500s).",
|
||||
options.user_hostfile);
|
||||
else
|
||||
@ -1512,6 +1504,14 @@ check_host_key(char *host, struct sockaddr *hostaddr, RSA *host_key)
|
||||
if (options.check_host_ip)
|
||||
xfree(ip);
|
||||
}
|
||||
void
|
||||
check_rsa_host_key(char *host, struct sockaddr *hostaddr, RSA *host_key)
|
||||
{
|
||||
Key k;
|
||||
k.type = KEY_RSA;
|
||||
k.rsa = host_key;
|
||||
check_host_key(host, hostaddr, &k);
|
||||
}
|
||||
|
||||
/*
|
||||
* SSH1 key exchange
|
||||
@ -1587,7 +1587,7 @@ ssh_kex(char *host, struct sockaddr *hostaddr)
|
||||
8 + 4 + sum_len + 0 + 4 + 0 + 0 + 4 + 4 + 4,
|
||||
SSH_SMSG_PUBLIC_KEY);
|
||||
|
||||
check_host_key(host, hostaddr, host_key);
|
||||
check_rsa_host_key(host, hostaddr, host_key);
|
||||
|
||||
client_flags = SSH_PROTOFLAG_SCREEN_NUMBER | SSH_PROTOFLAG_HOST_IN_FWD_OPEN;
|
||||
|
||||
@ -1875,7 +1875,6 @@ ssh_userauth(int host_key_valid, RSA *own_host_key,
|
||||
fatal("Permission denied.");
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
/*
|
||||
* Starts a dialog with the server, and authenticates the current user on the
|
||||
* server. This does not need any extra privileges. The basic connection
|
||||
@ -1906,6 +1905,7 @@ ssh_login(int host_key_valid, RSA *own_host_key, const char *orighost,
|
||||
ssh_kex(host, hostaddr);
|
||||
if (supported_authentications == 0)
|
||||
fatal("supported_authentications == 0.");
|
||||
|
||||
/* authenticate user */
|
||||
ssh_userauth(host_key_valid, own_host_key, original_real_uid, host);
|
||||
}
|
||||
|
@ -9,7 +9,7 @@
|
||||
.\"
|
||||
.\" Created: Sat Apr 22 21:55:14 1995 ylo
|
||||
.\"
|
||||
.\" $Id: sshd.8,v 1.34 2000/02/24 18:22:16 markus Exp $
|
||||
.\" $Id: sshd.8,v 1.37 2000/03/24 03:04:46 brad Exp $
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd September 25, 1999
|
||||
@ -34,39 +34,48 @@
|
||||
.Xr ssh 1 .
|
||||
Together these programs replace rlogin and rsh programs, and
|
||||
provide secure encrypted communications between two untrusted hosts
|
||||
over an insecure network. The programs are intended to be as easy to
|
||||
over an insecure network.
|
||||
The programs are intended to be as easy to
|
||||
install and use as possible.
|
||||
.Pp
|
||||
.Nm
|
||||
is the daemon that listens for connections from clients. It is
|
||||
normally started at boot from
|
||||
is the daemon that listens for connections from clients.
|
||||
It is normally started at boot from
|
||||
.Pa /etc/rc.network .
|
||||
It forks a new
|
||||
daemon for each incoming connection. The forked daemons handle
|
||||
daemon for each incoming connection.
|
||||
The forked daemons handle
|
||||
key exchange, encryption, authentication, command execution,
|
||||
and data exchange.
|
||||
.Pp
|
||||
.Nm
|
||||
works as follows. Each host has a host-specific RSA key
|
||||
(normally 1024 bits) used to identify the host. Additionally, when
|
||||
works as follows.
|
||||
Each host has a host-specific RSA key
|
||||
(normally 1024 bits) used to identify the host.
|
||||
Additionally, when
|
||||
the daemon starts, it generates a server RSA key (normally 768 bits).
|
||||
This key is normally regenerated every hour if it has been used, and
|
||||
is never stored on disk.
|
||||
.Pp
|
||||
Whenever a client connects the daemon, the daemon sends its host
|
||||
and server public keys to the client. The client compares the
|
||||
and server public keys to the client.
|
||||
The client compares the
|
||||
host key against its own database to verify that it has not changed.
|
||||
The client then generates a 256 bit random number. It encrypts this
|
||||
The client then generates a 256 bit random number.
|
||||
It encrypts this
|
||||
random number using both the host key and the server key, and sends
|
||||
the encrypted number to the server. Both sides then start to use this
|
||||
the encrypted number to the server.
|
||||
Both sides then start to use this
|
||||
random number as a session key which is used to encrypt all further
|
||||
communications in the session. The rest of the session is encrypted
|
||||
communications in the session.
|
||||
The rest of the session is encrypted
|
||||
using a conventional cipher, currently Blowfish and 3DES, with 3DES
|
||||
being is used by default. The client selects the encryption algorithm
|
||||
being is used by default.
|
||||
The client selects the encryption algorithm
|
||||
to use from those offered by the server.
|
||||
.Pp
|
||||
Next, the server and the client enter an authentication dialog. The
|
||||
client tries to authenticate itself using
|
||||
Next, the server and the client enter an authentication dialog.
|
||||
The client tries to authenticate itself using
|
||||
.Pa .rhosts
|
||||
authentication,
|
||||
.Pa .rhosts
|
||||
@ -76,7 +85,8 @@ based authentication.
|
||||
.Pp
|
||||
Rhosts authentication is normally disabled
|
||||
because it is fundamentally insecure, but can be enabled in the server
|
||||
configuration file if desired. System security is not improved unless
|
||||
configuration file if desired.
|
||||
System security is not improved unless
|
||||
.Xr rshd 8 ,
|
||||
.Xr rlogind 8 ,
|
||||
.Xr rexecd 8 ,
|
||||
@ -89,13 +99,15 @@ and
|
||||
into that machine).
|
||||
.Pp
|
||||
If the client successfully authenticates itself, a dialog for
|
||||
preparing the session is entered. At this time the client may request
|
||||
preparing the session is entered.
|
||||
At this time the client may request
|
||||
things like allocating a pseudo-tty, forwarding X11 connections,
|
||||
forwarding TCP/IP connections, or forwarding the authentication agent
|
||||
connection over the secure channel.
|
||||
.Pp
|
||||
Finally, the client either requests a shell or execution of a command.
|
||||
The sides then enter session mode. In this mode, either side may send
|
||||
The sides then enter session mode.
|
||||
In this mode, either side may send
|
||||
data at any time, and such data is forwarded to/from the shell or
|
||||
command on the server side, and the user terminal in the client side.
|
||||
.Pp
|
||||
@ -105,7 +117,8 @@ the client, and both sides exit.
|
||||
.Pp
|
||||
.Nm
|
||||
can be configured using command-line options or a configuration
|
||||
file. Command-line options override values specified in the
|
||||
file.
|
||||
Command-line options override values specified in the
|
||||
configuration file.
|
||||
.Pp
|
||||
.Nm
|
||||
@ -118,20 +131,23 @@ The options are as follows:
|
||||
Specifies the number of bits in the server key (default 768).
|
||||
.Pp
|
||||
.It Fl d
|
||||
Debug mode. The server sends verbose debug output to the system
|
||||
log, and does not put itself in the background. The server also will
|
||||
not fork and will only process one connection. This option is only
|
||||
intended for debugging for the server.
|
||||
Debug mode.
|
||||
The server sends verbose debug output to the system
|
||||
log, and does not put itself in the background.
|
||||
The server also will not fork and will only process one connection.
|
||||
This option is only intended for debugging for the server.
|
||||
.It Fl f Ar configuration_file
|
||||
Specifies the name of the configuration file. The default is
|
||||
Specifies the name of the configuration file.
|
||||
The default is
|
||||
.Pa /etc/ssh/sshd_config .
|
||||
.Nm
|
||||
refuses to start if there is no configuration file.
|
||||
.It Fl g Ar login_grace_time
|
||||
Gives the grace time for clients to authenticate themselves (default
|
||||
300 seconds). If the client fails to authenticate the user within
|
||||
this many seconds, the server disconnects and exits. A value of zero
|
||||
indicates no limit.
|
||||
300 seconds).
|
||||
If the client fails to authenticate the user within
|
||||
this many seconds, the server disconnects and exits.
|
||||
A value of zero indicates no limit.
|
||||
.It Fl h Ar host_key_file
|
||||
Specifies the file from which the host key is read (default
|
||||
.Pa /etc/ssh/ssh_host_key ) .
|
||||
@ -146,24 +162,28 @@ is being run from inetd.
|
||||
.Nm
|
||||
is normally not run
|
||||
from inetd because it needs to generate the server key before it can
|
||||
respond to the client, and this may take tens of seconds. Clients
|
||||
would have to wait too long if the key was regenerated every time.
|
||||
However, with small key sizes (e.g. 512) using
|
||||
respond to the client, and this may take tens of seconds.
|
||||
Clients would have to wait too long if the key was regenerated every time.
|
||||
However, with small key sizes (e.g., 512) using
|
||||
.Nm
|
||||
from inetd may
|
||||
be feasible.
|
||||
.It Fl k Ar key_gen_time
|
||||
Specifies how often the server key is regenerated (default 3600
|
||||
seconds, or one hour). The motivation for regenerating the key fairly
|
||||
seconds, or one hour).
|
||||
The motivation for regenerating the key fairly
|
||||
often is that the key is not stored anywhere, and after about an hour,
|
||||
it becomes impossible to recover the key for decrypting intercepted
|
||||
communications even if the machine is cracked into or physically
|
||||
seized. A value of zero indicates that the key will never be regenerated.
|
||||
seized.
|
||||
A value of zero indicates that the key will never be regenerated.
|
||||
.It Fl p Ar port
|
||||
Specifies the port on which the server listens for connections
|
||||
(default 22).
|
||||
.It Fl q
|
||||
Quiet mode. Nothing is sent to the system log. Normally the beginning,
|
||||
Quiet mode.
|
||||
Nothing is sent to the system log.
|
||||
Normally the beginning,
|
||||
authentication, and termination of each connection is logged.
|
||||
.It Fl Q
|
||||
Do not print an error message if RSA support is missing.
|
||||
@ -189,39 +209,43 @@ reads configuration data from
|
||||
.Pa /etc/ssh/sshd_config
|
||||
(or the file specified with
|
||||
.Fl f
|
||||
on the command line). The file
|
||||
contains keyword-value pairs, one per line. Lines starting with
|
||||
on the command line).
|
||||
The file contains keyword-value pairs, one per line.
|
||||
Lines starting with
|
||||
.Ql #
|
||||
and empty lines are interpreted as comments.
|
||||
.Pp
|
||||
The following keywords are possible.
|
||||
.Bl -tag -width Ds
|
||||
.It Cm AFSTokenPassing
|
||||
Specifies whether an AFS token may be forwarded to the server. Default is
|
||||
Specifies whether an AFS token may be forwarded to the server.
|
||||
Default is
|
||||
.Dq yes .
|
||||
.It Cm AllowGroups
|
||||
This keyword can be followed by a number of group names, separated
|
||||
by spaces. If specified, login is allowed only for users whose primary
|
||||
by spaces.
|
||||
If specified, login is allowed only for users whose primary
|
||||
group matches one of the patterns.
|
||||
.Ql \&*
|
||||
and
|
||||
.Ql ?
|
||||
can be used as
|
||||
wildcards in the patterns. Only group names are valid, a numerical group
|
||||
id isn't recognized. By default login is allowed regardless of
|
||||
the primary group.
|
||||
wildcards in the patterns.
|
||||
Only group names are valid, a numerical group ID isn't recognized.
|
||||
By default login is allowed regardless of the primary group.
|
||||
.Pp
|
||||
.It Cm AllowUsers
|
||||
This keyword can be followed by a number of user names, separated
|
||||
by spaces. If specified, login is allowed only for users names that
|
||||
by spaces.
|
||||
If specified, login is allowed only for users names that
|
||||
match one of the patterns.
|
||||
.Ql \&*
|
||||
and
|
||||
.Ql ?
|
||||
can be used as
|
||||
wildcards in the patterns. Only user names are valid, a numerical user
|
||||
id isn't recognized. By default login is allowed regardless of
|
||||
the user name.
|
||||
wildcards in the patterns.
|
||||
Only user names are valid, a numerical user ID isn't recognized.
|
||||
By default login is allowed regardless of the user name.
|
||||
.Pp
|
||||
.It Cm CheckMail
|
||||
Specifies whether
|
||||
@ -256,27 +280,27 @@ and any
|
||||
parameter.
|
||||
.It Cm DenyGroups
|
||||
This keyword can be followed by a number of group names, separated
|
||||
by spaces. Users whose primary group matches one of the patterns
|
||||
by spaces.
|
||||
Users whose primary group matches one of the patterns
|
||||
aren't allowed to log in.
|
||||
.Ql \&*
|
||||
and
|
||||
.Ql ?
|
||||
can be used as
|
||||
wildcards in the patterns. Only group names are valid, a numerical group
|
||||
id isn't recognized. By default login is allowed regardless of
|
||||
the primary group.
|
||||
wildcards in the patterns.
|
||||
Only group names are valid, a numerical group ID isn't recognized.
|
||||
By default login is allowed regardless of the primary group.
|
||||
.Pp
|
||||
.It Cm DenyUsers
|
||||
This keyword can be followed by a number of user names, separated
|
||||
by spaces. Login is disallowed for user names that match
|
||||
one of the patterns.
|
||||
by spaces.
|
||||
Login is disallowed for user names that match one of the patterns.
|
||||
.Ql \&*
|
||||
and
|
||||
.Ql ?
|
||||
can be used as
|
||||
wildcards in the patterns. Only user names are valid, a numerical user
|
||||
id isn't recognized. By default login is allowed regardless of
|
||||
the user name.
|
||||
can be used as wildcards in the patterns.
|
||||
Only user names are valid, a numerical user ID isn't recognized.
|
||||
By default login is allowed regardless of the user name.
|
||||
.It Cm HostKey
|
||||
Specifies the file containing the private host key (default
|
||||
.Pa /etc/ssh/ssh_host_key ) .
|
||||
@ -292,7 +316,9 @@ files will not be used in authentication.
|
||||
.Pa /etc/hosts.equiv
|
||||
and
|
||||
.Pa /etc/ssh/shosts.equiv
|
||||
are still used. The default is
|
||||
.Pa /etc/shosts.equiv
|
||||
are still used.
|
||||
The default is
|
||||
.Dq yes .
|
||||
.It Cm IgnoreUserKnownHosts
|
||||
Specifies whether
|
||||
@ -305,10 +331,13 @@ The default is
|
||||
.Dq no .
|
||||
.It Cm KeepAlive
|
||||
Specifies whether the system should send keepalive messages to the
|
||||
other side. If they are sent, death of the connection or crash of one
|
||||
of the machines will be properly noticed. However, this means that
|
||||
other side.
|
||||
If they are sent, death of the connection or crash of one
|
||||
of the machines will be properly noticed.
|
||||
However, this means that
|
||||
connections will die if the route is down temporarily, and some people
|
||||
find it annoying. On the other hand, if keepalives are not send,
|
||||
find it annoying.
|
||||
On the other hand, if keepalives are not send,
|
||||
sessions may hang indefinitely on the server, leaving
|
||||
.Dq ghost
|
||||
users and consuming server resources.
|
||||
@ -316,25 +345,27 @@ users and consuming server resources.
|
||||
The default is
|
||||
.Dq yes
|
||||
(to send keepalives), and the server will notice
|
||||
if the network goes down or the client host reboots. This avoids
|
||||
infinitely hanging sessions.
|
||||
if the network goes down or the client host reboots.
|
||||
This avoids infinitely hanging sessions.
|
||||
.Pp
|
||||
To disable keepalives, the value should be set to
|
||||
.Dq no
|
||||
in both the server and the client configuration files.
|
||||
.It Cm KerberosAuthentication
|
||||
Specifies whether Kerberos authentication is allowed. This can
|
||||
be in the form of a Kerberos ticket, or if
|
||||
Specifies whether Kerberos authentication is allowed.
|
||||
This can be in the form of a Kerberos ticket, or if
|
||||
.Cm PasswordAuthentication
|
||||
is yes, the password provided by the user will be validated through
|
||||
the Kerberos KDC. Default is
|
||||
the Kerberos KDC.
|
||||
Default is
|
||||
.Dq yes .
|
||||
.It Cm KerberosOrLocalPasswd
|
||||
If set then if password authentication through Kerberos fails then
|
||||
the password will be validated via any additional local mechanism
|
||||
such as
|
||||
.Pa /etc/passwd
|
||||
or SecurID. Default is
|
||||
or SecurID.
|
||||
Default is
|
||||
.Dq yes .
|
||||
.It Cm KerberosTgtPassing
|
||||
Specifies whether a Kerberos TGT may be forwarded to the server.
|
||||
@ -343,15 +374,18 @@ Default is
|
||||
as this only works when the Kerberos KDC is actually an AFS kaserver.
|
||||
.It Cm KerberosTicketCleanup
|
||||
Specifies whether to automatically destroy the user's ticket cache
|
||||
file on logout. Default is
|
||||
file on logout.
|
||||
Default is
|
||||
.Dq yes .
|
||||
.It Cm KeyRegenerationInterval
|
||||
The server key is automatically regenerated after this many seconds
|
||||
(if it has been used). The purpose of regeneration is to prevent
|
||||
(if it has been used).
|
||||
The purpose of regeneration is to prevent
|
||||
decrypting captured sessions by later breaking into the machine and
|
||||
stealing the keys. The key is never stored anywhere. If the value is
|
||||
0, the key is never regenerated. The default is 3600
|
||||
(seconds).
|
||||
stealing the keys.
|
||||
The key is never stored anywhere.
|
||||
If the value is 0, the key is never regenerated.
|
||||
The default is 3600 (seconds).
|
||||
.It Cm ListenAddress
|
||||
Specifies what local address
|
||||
.Nm
|
||||
@ -363,7 +397,8 @@ Additionally, the
|
||||
options must precede this option.
|
||||
.It Cm LoginGraceTime
|
||||
The server disconnects after this time if the user has not
|
||||
successfully logged in. If the value is 0, there is no time limit.
|
||||
successfully logged in.
|
||||
If the value is 0, there is no time limit.
|
||||
The default is 600 (seconds).
|
||||
.It Cm LogLevel
|
||||
Gives the verbosity level that is used when logging messages from
|
||||
@ -379,8 +414,8 @@ The default is
|
||||
.Dq yes .
|
||||
.It Cm PermitEmptyPasswords
|
||||
When password authentication is allowed, it specifies whether the
|
||||
server allows login to accounts with empty password strings. The default
|
||||
is
|
||||
server allows login to accounts with empty password strings.
|
||||
The default is
|
||||
.Dq no .
|
||||
.It Cm PermitRootLogin
|
||||
Specifies whether the root can log in using
|
||||
@ -405,17 +440,19 @@ normally not allowed).
|
||||
.It Cm Port
|
||||
Specifies the port number that
|
||||
.Nm
|
||||
listens on. The default is 22.
|
||||
listens on.
|
||||
The default is 22.
|
||||
Multiple options of this type are permitted.
|
||||
.It Cm PrintMotd
|
||||
Specifies whether
|
||||
.Nm
|
||||
should print
|
||||
.Pa /etc/motd
|
||||
when a user logs in interactively. (On some systems it is also
|
||||
printed by the shell,
|
||||
when a user logs in interactively.
|
||||
(On some systems it is also printed by the shell,
|
||||
.Pa /etc/profile ,
|
||||
or equivalent.) The default is
|
||||
or equivalent.)
|
||||
The default is
|
||||
.Dq yes .
|
||||
.It Cm RandomSeed
|
||||
Obsolete - accepted and ignored with a warning.
|
||||
@ -423,8 +460,8 @@ Random number generation uses other techniques.
|
||||
.It Cm RhostsAuthentication
|
||||
Specifies whether authentication using rhosts or
|
||||
.Pa /etc/hosts.equiv
|
||||
files is sufficient. Normally, this method should not be permitted
|
||||
because it is insecure.
|
||||
files is sufficient.
|
||||
Normally, this method should not be permitted because it is insecure.
|
||||
.Cm RhostsRSAAuthentication
|
||||
should be used
|
||||
instead, because it performs RSA-based host authentication in addition
|
||||
@ -437,18 +474,21 @@ The default is
|
||||
Specifies whether rhosts or
|
||||
.Pa /etc/hosts.equiv
|
||||
authentication together
|
||||
with successful RSA host authentication is allowed. The default is
|
||||
with successful RSA host authentication is allowed.
|
||||
The default is
|
||||
.Dq no .
|
||||
.It Cm RSAAuthentication
|
||||
Specifies whether pure RSA authentication is allowed. The default is
|
||||
Specifies whether pure RSA authentication is allowed.
|
||||
The default is
|
||||
.Dq yes .
|
||||
.It Cm ServerKeyBits
|
||||
Defines the number of bits in the server key. The minimum value is
|
||||
512, and the default is 768.
|
||||
Defines the number of bits in the server key.
|
||||
The minimum value is 512, and the default is 768.
|
||||
.It Cm SkeyAuthentication
|
||||
Specifies whether
|
||||
.Xr skey 1
|
||||
authentication is allowed. The default is
|
||||
authentication is allowed.
|
||||
The default is
|
||||
.Dq yes .
|
||||
Note that OPIE authentication is enabled only if
|
||||
.Cm PasswordAuthentication
|
||||
@ -457,30 +497,35 @@ is allowed, too.
|
||||
Specifies whether
|
||||
.Nm
|
||||
should check file modes and ownership of the
|
||||
user's files and home directory before accepting login. This
|
||||
is normally desirable because novices sometimes accidentally leave their
|
||||
directory or files world-writable. The default is
|
||||
user's files and home directory before accepting login.
|
||||
This is normally desirable because novices sometimes accidentally leave their
|
||||
directory or files world-writable.
|
||||
The default is
|
||||
.Dq yes .
|
||||
.It Cm SyslogFacility
|
||||
Gives the facility code that is used when logging messages from
|
||||
.Nm sshd .
|
||||
The possible values are: DAEMON, USER, AUTH, LOCAL0, LOCAL1, LOCAL2,
|
||||
LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7. The default is AUTH.
|
||||
LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7.
|
||||
The default is AUTH.
|
||||
.It Cm UseLogin
|
||||
Specifies whether
|
||||
.Xr login 1
|
||||
is used. The default is
|
||||
is used.
|
||||
The default is
|
||||
.Dq no .
|
||||
.It Cm X11DisplayOffset
|
||||
Specifies the first display number available for
|
||||
.Nm sshd Ns 's
|
||||
X11 forwarding. This prevents
|
||||
X11 forwarding.
|
||||
This prevents
|
||||
.Nm
|
||||
from interfering with real X11 servers.
|
||||
The default is 10.
|
||||
.It Cm X11Forwarding
|
||||
Specifies whether X11 forwarding is permitted. The default is
|
||||
.Dq yes .
|
||||
Specifies whether X11 forwarding is permitted.
|
||||
The default is
|
||||
.Dq no .
|
||||
Note that disabling X11 forwarding does not improve security in any
|
||||
way, as users can always install their own forwarders.
|
||||
.El
|
||||
@ -535,12 +580,15 @@ Runs user's shell or command.
|
||||
The
|
||||
.Pa $HOME/.ssh/authorized_keys
|
||||
file lists the RSA keys that are
|
||||
permitted for RSA authentication. Each line of the file contains one
|
||||
permitted for RSA authentication.
|
||||
Each line of the file contains one
|
||||
key (empty lines and lines starting with a
|
||||
.Ql #
|
||||
are ignored as
|
||||
comments). Each line consists of the following fields, separated by
|
||||
spaces: options, bits, exponent, modulus, comment. The options field
|
||||
comments).
|
||||
Each line consists of the following fields, separated by
|
||||
spaces: options, bits, exponent, modulus, comment.
|
||||
The options field
|
||||
is optional; its presence is determined by whether the line starts
|
||||
with a number or not (the option field never starts with a number).
|
||||
The bits, exponent, modulus and comment fields give the RSA key; the
|
||||
@ -548,47 +596,58 @@ comment field is not used for anything (but may be convenient for the
|
||||
user to identify the key).
|
||||
.Pp
|
||||
Note that lines in this file are usually several hundred bytes long
|
||||
(because of the size of the RSA key modulus). You don't want to type
|
||||
them in; instead, copy the
|
||||
(because of the size of the RSA key modulus).
|
||||
You don't want to type them in; instead, copy the
|
||||
.Pa identity.pub
|
||||
file and edit it.
|
||||
.Pp
|
||||
The options (if present) consists of comma-separated option
|
||||
specifications. No spaces are permitted, except within double quotes.
|
||||
specifications.
|
||||
No spaces are permitted, except within double quotes.
|
||||
The following option specifications are supported:
|
||||
.Bl -tag -width Ds
|
||||
.It Cm from="pattern-list"
|
||||
Specifies that in addition to RSA authentication, the canonical name
|
||||
of the remote host must be present in the comma-separated list of
|
||||
patterns ('*' and '?' serve as wildcards). The list may also contain
|
||||
patterns negated by prefixing them with '!'; if the canonical host
|
||||
name matches a negated pattern, the key is not accepted. The purpose
|
||||
patterns
|
||||
.Pf ( Ql *
|
||||
and
|
||||
.Ql ?
|
||||
serve as wildcards).
|
||||
The list may also contain
|
||||
patterns negated by prefixing them with
|
||||
.Ql ! ;
|
||||
if the canonical host name matches a negated pattern, the key is not accepted.
|
||||
The purpose
|
||||
of this option is to optionally increase security: RSA authentication
|
||||
by itself does not trust the network or name servers or anything (but
|
||||
the key); however, if somebody somehow steals the key, the key
|
||||
permits an intruder to log in from anywhere in the world. This
|
||||
additional option makes using a stolen key more difficult (name
|
||||
permits an intruder to log in from anywhere in the world.
|
||||
This additional option makes using a stolen key more difficult (name
|
||||
servers and/or routers would have to be compromised in addition to
|
||||
just the key).
|
||||
.It Cm command="command"
|
||||
Specifies that the command is executed whenever this key is used for
|
||||
authentication. The command supplied by the user (if any) is ignored.
|
||||
authentication.
|
||||
The command supplied by the user (if any) is ignored.
|
||||
The command is run on a pty if the connection requests a pty;
|
||||
otherwise it is run without a tty. A quote may be included in the
|
||||
command by quoting it with a backslash. This option might be useful
|
||||
to restrict certain RSA keys to perform just a specific operation. An
|
||||
example might be a key that permits remote backups but nothing
|
||||
else. Notice that the client may specify TCP/IP and/or X11
|
||||
otherwise it is run without a tty.
|
||||
A quote may be included in the command by quoting it with a backslash.
|
||||
This option might be useful
|
||||
to restrict certain RSA keys to perform just a specific operation.
|
||||
An example might be a key that permits remote backups but nothing else.
|
||||
Notice that the client may specify TCP/IP and/or X11
|
||||
forwardings unless they are explicitly prohibited.
|
||||
.It Cm environment="NAME=value"
|
||||
Specifies that the string is to be added to the environment when
|
||||
logging in using this key. Environment variables set this way
|
||||
override other default environment values. Multiple options of this
|
||||
type are permitted.
|
||||
logging in using this key.
|
||||
Environment variables set this way
|
||||
override other default environment values.
|
||||
Multiple options of this type are permitted.
|
||||
.It Cm no-port-forwarding
|
||||
Forbids TCP/IP forwarding when this key is used for authentication.
|
||||
Any port forward requests by the client will return an error. This
|
||||
might be used, e.g., in connection with the
|
||||
Any port forward requests by the client will return an error.
|
||||
This might be used, e.g., in connection with the
|
||||
.Cm command
|
||||
option.
|
||||
.It Cm no-X11-forwarding
|
||||
@ -611,19 +670,21 @@ The
|
||||
.Pa /etc/ssh/ssh_known_hosts
|
||||
and
|
||||
.Pa $HOME/.ssh/known_hosts
|
||||
files contain host public keys for all known hosts. The global file should
|
||||
files contain host public keys for all known hosts.
|
||||
The global file should
|
||||
be prepared by the administrator (optional), and the per-user file is
|
||||
maintained automatically: whenever the user connects an unknown host
|
||||
its key is added to the per-user file.
|
||||
its key is added to the per-user file.
|
||||
.Pp
|
||||
Each line in these files contains the following fields: hostnames,
|
||||
bits, exponent, modulus, comment. The fields are separated by spaces.
|
||||
bits, exponent, modulus, comment.
|
||||
The fields are separated by spaces.
|
||||
.Pp
|
||||
Hostnames is a comma-separated list of patterns ('*' and '?' act as
|
||||
wildcards); each pattern in turn is matched against the canonical host
|
||||
name (when authenticating a client) or against the user-supplied
|
||||
name (when authenticating a server). A pattern may also be preceded
|
||||
by
|
||||
name (when authenticating a server).
|
||||
A pattern may also be preceded by
|
||||
.Ql !
|
||||
to indicate negation: if the host name matches a negated
|
||||
pattern, it is not accepted (by that line) even if it matched another
|
||||
@ -639,10 +700,13 @@ Lines starting with
|
||||
and empty lines are ignored as comments.
|
||||
.Pp
|
||||
When performing host authentication, authentication is accepted if any
|
||||
matching line has the proper key. It is thus permissible (but not
|
||||
matching line has the proper key.
|
||||
It is thus permissible (but not
|
||||
recommended) to have several lines or different host keys for the same
|
||||
names. This will inevitably happen when short forms of host names
|
||||
from different domains are put in the file. It is possible
|
||||
names.
|
||||
This will inevitably happen when short forms of host names
|
||||
from different domains are put in the file.
|
||||
It is possible
|
||||
that the files contain conflicting information; authentication is
|
||||
accepted if valid information can be found from either file.
|
||||
.Pp
|
||||
@ -673,7 +737,9 @@ does not start if this file is group/world-accessible.
|
||||
.It Pa /etc/ssh/ssh_host_key.pub
|
||||
Contains the public part of the host key.
|
||||
This file should be world-readable but writable only by
|
||||
root. Its contents should match the private part. This file is not
|
||||
root.
|
||||
Its contents should match the private part.
|
||||
This file is not
|
||||
really used for anything; it is only provided for the convenience of
|
||||
the user so its contents can be copied to known hosts files.
|
||||
These two files are created using
|
||||
@ -683,21 +749,22 @@ Contains the process ID of the
|
||||
.Nm
|
||||
listening for connections (if there are several daemons running
|
||||
concurrently for different ports, this contains the pid of the one
|
||||
started last). The contents of this file are not sensitive; it can be
|
||||
world-readable.
|
||||
started last).
|
||||
The contents of this file are not sensitive; it can be world-readable.
|
||||
.It Pa $HOME/.ssh/authorized_keys
|
||||
Lists the RSA keys that can be used to log into the user's account.
|
||||
This file must be readable by root (which may on some machines imply
|
||||
it being world-readable if the user's home directory resides on an NFS
|
||||
volume). It is recommended that it not be accessible by others. The
|
||||
format of this file is described above.
|
||||
volume).
|
||||
It is recommended that it not be accessible by others.
|
||||
The format of this file is described above.
|
||||
.It Pa "/etc/ssh/ssh_known_hosts" and "$HOME/.ssh/known_hosts"
|
||||
These files are consulted when using rhosts with RSA host
|
||||
authentication to check the public key of the host. The key must be
|
||||
listed in one of these files to be accepted.
|
||||
authentication to check the public key of the host.
|
||||
The key must be listed in one of these files to be accepted.
|
||||
The client uses the same files
|
||||
to verify that the remote host is the one we intended to
|
||||
connect. These files should be writable only by root/the owner.
|
||||
to verify that the remote host is the one we intended to connect.
|
||||
These files should be writable only by root/the owner.
|
||||
.Pa /etc/ssh/ssh_known_hosts
|
||||
should be world-readable, and
|
||||
.Pa $HOME/.ssh/known_hosts
|
||||
@ -705,9 +772,11 @@ can but need not be world-readable.
|
||||
.It Pa /etc/nologin
|
||||
If this file exists,
|
||||
.Nm
|
||||
refuses to let anyone except root log in. The contents of the file
|
||||
refuses to let anyone except root log in.
|
||||
The contents of the file
|
||||
are displayed to anyone trying to log in, and non-root connections are
|
||||
refused. The file should be world-readable.
|
||||
refused.
|
||||
The file should be world-readable.
|
||||
.It Pa /etc/hosts.allow
|
||||
If compiled with
|
||||
.Sy LIBWRAP
|
||||
@ -715,13 +784,16 @@ support, tcp-wrappers access controls may be defined here as described in
|
||||
.Xr hosts_access 5 .
|
||||
.It Pa $HOME/.rhosts
|
||||
This file contains host-username pairs, separated by a space, one per
|
||||
line. The given user on the corresponding host is permitted to log in
|
||||
without password. The same file is used by rlogind and rshd.
|
||||
line.
|
||||
The given user on the corresponding host is permitted to log in
|
||||
without password.
|
||||
The same file is used by rlogind and rshd.
|
||||
The file must
|
||||
be writable only by the user; it is recommended that it not be
|
||||
accessible by others.
|
||||
.Pp
|
||||
If is also possible to use netgroups in the file. Either host or user
|
||||
If is also possible to use netgroups in the file.
|
||||
Either host or user
|
||||
name may be of the form +@groupname to specify all hosts or all users
|
||||
in the group.
|
||||
.It Pa $HOME/.shosts
|
||||
@ -733,21 +805,26 @@ not used by rlogin and rshd, so using this permits access using SSH only.
|
||||
.It Pa /etc/hosts.equiv
|
||||
This file is used during
|
||||
.Pa .rhosts
|
||||
authentication. In the
|
||||
simplest form, this file contains host names, one per line. Users on
|
||||
authentication.
|
||||
In the simplest form, this file contains host names, one per line.
|
||||
Users on
|
||||
those hosts are permitted to log in without a password, provided they
|
||||
have the same user name on both machines. The host name may also be
|
||||
have the same user name on both machines.
|
||||
The host name may also be
|
||||
followed by a user name; such users are permitted to log in as
|
||||
.Em any
|
||||
user on this machine (except root). Additionally, the syntax
|
||||
user on this machine (except root).
|
||||
Additionally, the syntax
|
||||
.Dq +@group
|
||||
can be used to specify netgroups. Negated entries start with
|
||||
can be used to specify netgroups.
|
||||
Negated entries start with
|
||||
.Ql \&- .
|
||||
.Pp
|
||||
If the client host/user is successfully matched in this file, login is
|
||||
automatically permitted provided the client and server user names are the
|
||||
same. Additionally, successful RSA host authentication is normally
|
||||
required. This file must be writable only by root; it is recommended
|
||||
same.
|
||||
Additionally, successful RSA host authentication is normally required.
|
||||
This file must be writable only by root; it is recommended
|
||||
that it be world-readable.
|
||||
.Pp
|
||||
.Sy "Warning: It is almost never a good idea to use user names in"
|
||||
@ -755,8 +832,9 @@ that it be world-readable.
|
||||
Beware that it really means that the named user(s) can log in as
|
||||
.Em anybody ,
|
||||
which includes bin, daemon, adm, and other accounts that own critical
|
||||
binaries and directories. Using a user name practically grants the
|
||||
user root access. The only valid use for user names that I can think
|
||||
binaries and directories.
|
||||
Using a user name practically grants the user root access.
|
||||
The only valid use for user names that I can think
|
||||
of is in negative entries.
|
||||
.Pp
|
||||
Note that this warning also applies to rsh/rlogin.
|
||||
@ -766,20 +844,22 @@ This is processed exactly as
|
||||
However, this file may be useful in environments that want to run both
|
||||
rsh/rlogin and ssh.
|
||||
.It Pa $HOME/.ssh/environment
|
||||
This file is read into the environment at login (if it exists). It
|
||||
can only contain empty lines, comment lines (that start with
|
||||
This file is read into the environment at login (if it exists).
|
||||
It can only contain empty lines, comment lines (that start with
|
||||
.Ql # ) ,
|
||||
and assignment lines of the form name=value. The file should be writable
|
||||
and assignment lines of the form name=value.
|
||||
The file should be writable
|
||||
only by the user; it need not be readable by anyone else.
|
||||
.It Pa $HOME/.ssh/rc
|
||||
If this file exists, it is run with
|
||||
.Pa /bin/sh
|
||||
after reading the
|
||||
environment files but before starting the user's shell or command. If
|
||||
X11 spoofing is in use, this will receive the "proto cookie" pair in
|
||||
environment files but before starting the user's shell or command.
|
||||
If X11 spoofing is in use, this will receive the "proto cookie" pair in
|
||||
standard input (and
|
||||
.Ev DISPLAY
|
||||
in environment). This must call
|
||||
in environment).
|
||||
This must call
|
||||
.Xr xauth 1
|
||||
in that case.
|
||||
.Pp
|
||||
@ -808,12 +888,13 @@ readable by anyone else.
|
||||
Like
|
||||
.Pa $HOME/.ssh/rc .
|
||||
This can be used to specify
|
||||
machine-specific login-time initializations globally. This file
|
||||
should be writable only by root, and should be world-readable.
|
||||
machine-specific login-time initializations globally.
|
||||
This file should be writable only by root, and should be world-readable.
|
||||
.Sh AUTHOR
|
||||
OpenSSH
|
||||
is a derivative of the original (free) ssh 1.2.12 release by Tatu Ylonen,
|
||||
but with bugs removed and newer features re-added. Rapidly after the
|
||||
but with bugs removed and newer features re-added.
|
||||
Rapidly after the
|
||||
1.2.12 release, newer versions of the original ssh bore successively
|
||||
more restrictive licenses, and thus demand for a free version was born.
|
||||
This version of OpenSSH
|
||||
|
@ -13,7 +13,7 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
RCSID("$OpenBSD: sshd.c,v 1.88 2000/02/15 16:52:57 markus Exp $");
|
||||
RCSID("$OpenBSD: sshd.c,v 1.94 2000/03/23 22:15:34 markus Exp $");
|
||||
|
||||
#include "xmalloc.h"
|
||||
#include "rsa.h"
|
||||
@ -564,9 +564,6 @@ main(int ac, char **av)
|
||||
unmounted if desired. */
|
||||
chdir("/");
|
||||
|
||||
/* Close connection cleanly after attack. */
|
||||
cipher_attack_detected = packet_disconnect;
|
||||
|
||||
/* Start listening for a socket, unless started from inetd. */
|
||||
if (inetd_flag) {
|
||||
int s1, s2;
|
||||
@ -1288,7 +1285,8 @@ void
|
||||
do_authentication()
|
||||
{
|
||||
struct passwd *pw, pwcopy;
|
||||
int plen, ulen;
|
||||
int plen;
|
||||
unsigned int ulen;
|
||||
char *user;
|
||||
#ifdef LOGIN_CAP
|
||||
login_cap_t *lc;
|
||||
@ -1423,11 +1421,13 @@ do_authloop(struct passwd * pw)
|
||||
{
|
||||
int attempt = 0;
|
||||
unsigned int bits;
|
||||
BIGNUM *client_host_key_e, *client_host_key_n;
|
||||
RSA *client_host_key;
|
||||
BIGNUM *n;
|
||||
char *client_user, *password;
|
||||
char user[1024];
|
||||
int plen, dlen, nlen, ulen, elen;
|
||||
unsigned int dlen;
|
||||
int plen, nlen, elen;
|
||||
unsigned int ulen;
|
||||
int type = 0;
|
||||
void (*authlog) (const char *fmt,...) = verbose;
|
||||
#ifdef HAVE_LIBPAM
|
||||
@ -1584,21 +1584,24 @@ do_authloop(struct passwd * pw)
|
||||
client_user = packet_get_string(&ulen);
|
||||
|
||||
/* Get the client host key. */
|
||||
client_host_key_e = BN_new();
|
||||
client_host_key_n = BN_new();
|
||||
client_host_key = RSA_new();
|
||||
if (client_host_key == NULL)
|
||||
fatal("RSA_new failed");
|
||||
client_host_key->e = BN_new();
|
||||
client_host_key->n = BN_new();
|
||||
if (client_host_key->e == NULL || client_host_key->n == NULL)
|
||||
fatal("BN_new failed");
|
||||
bits = packet_get_int();
|
||||
packet_get_bignum(client_host_key_e, &elen);
|
||||
packet_get_bignum(client_host_key_n, &nlen);
|
||||
packet_get_bignum(client_host_key->e, &elen);
|
||||
packet_get_bignum(client_host_key->n, &nlen);
|
||||
|
||||
if (bits != BN_num_bits(client_host_key_n))
|
||||
if (bits != BN_num_bits(client_host_key->n))
|
||||
error("Warning: keysize mismatch for client_host_key: "
|
||||
"actual %d, announced %d", BN_num_bits(client_host_key_n), bits);
|
||||
"actual %d, announced %d", BN_num_bits(client_host_key->n), bits);
|
||||
packet_integrity_check(plen, (4 + ulen) + 4 + elen + nlen, type);
|
||||
|
||||
authenticated = auth_rhosts_rsa(pw, client_user,
|
||||
client_host_key_e, client_host_key_n);
|
||||
BN_clear_free(client_host_key_e);
|
||||
BN_clear_free(client_host_key_n);
|
||||
authenticated = auth_rhosts_rsa(pw, client_user, client_host_key);
|
||||
RSA_free(client_host_key);
|
||||
|
||||
snprintf(user, sizeof user, " ruser %s", client_user);
|
||||
xfree(client_user);
|
||||
@ -1684,6 +1687,21 @@ do_authloop(struct passwd * pw)
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if the user is logging in as root and root logins
|
||||
* are disallowed.
|
||||
* Note that root login is allowed for forced commands.
|
||||
*/
|
||||
if (authenticated && pw->pw_uid == 0 && !options.permit_root_login) {
|
||||
if (forced_command) {
|
||||
log("Root login accepted for forced command.");
|
||||
} else {
|
||||
authenticated = 0;
|
||||
log("ROOT LOGIN REFUSED FROM %.200s",
|
||||
get_canonical_hostname());
|
||||
}
|
||||
}
|
||||
|
||||
/* Raise logging level */
|
||||
if (authenticated ||
|
||||
attempt == AUTH_FAIL_LOG ||
|
||||
@ -1739,7 +1757,7 @@ do_fake_authloop(char *user)
|
||||
int plen;
|
||||
int type = packet_read(&plen);
|
||||
#ifdef SKEY
|
||||
int dlen;
|
||||
unsigned int dlen;
|
||||
char *password, *skeyinfo;
|
||||
/* Try to send a fake s/key challenge. */
|
||||
if (options.skey_authentication == 1 &&
|
||||
@ -1823,6 +1841,8 @@ do_authenticated(struct passwd * pw)
|
||||
int row, col, xpixel, ypixel, screen;
|
||||
char ttyname[64];
|
||||
char *command, *term = NULL, *display = NULL, *proto = NULL, *data = NULL;
|
||||
int plen;
|
||||
unsigned int dlen;
|
||||
int n_bytes;
|
||||
|
||||
/*
|
||||
@ -1846,7 +1866,6 @@ do_authenticated(struct passwd * pw)
|
||||
* or a command.
|
||||
*/
|
||||
while (1) {
|
||||
int plen, dlen;
|
||||
|
||||
/* Get a packet from the client. */
|
||||
type = packet_read(&plen);
|
||||
@ -1925,7 +1944,7 @@ do_authenticated(struct passwd * pw)
|
||||
if (display)
|
||||
packet_disconnect("Protocol error: X11 display already set.");
|
||||
{
|
||||
int proto_len, data_len;
|
||||
unsigned int proto_len, data_len;
|
||||
proto = packet_get_string(&proto_len);
|
||||
data = packet_get_string(&data_len);
|
||||
packet_integrity_check(plen, 4 + proto_len + 4 + data_len + 4, type);
|
||||
@ -1950,8 +1969,9 @@ do_authenticated(struct passwd * pw)
|
||||
xauthfile = NULL;
|
||||
goto fail;
|
||||
}
|
||||
restore_uid();
|
||||
strlcat(xauthfile, "/cookies", MAXPATHLEN);
|
||||
open(xauthfile, O_RDWR|O_CREAT|O_EXCL, 0600);
|
||||
restore_uid();
|
||||
fatal_add_cleanup(xauthfile_cleanup_proc, NULL);
|
||||
break;
|
||||
#else /* XAUTH_PATH */
|
||||
@ -2006,7 +2026,7 @@ do_authenticated(struct passwd * pw)
|
||||
goto do_forced_command;
|
||||
/* Get command from the packet. */
|
||||
{
|
||||
int dlen;
|
||||
unsigned int dlen;
|
||||
command = packet_get_string(&dlen);
|
||||
debug("Executing command '%.500s'", command);
|
||||
packet_integrity_check(plen, 4 + dlen, type);
|
||||
@ -2900,7 +2920,7 @@ do_child(const char *command, struct passwd * pw, const char *term,
|
||||
f = popen(XAUTH_PATH " -q -", "w");
|
||||
if (f) {
|
||||
fprintf(f, "add %s %s %s\n", display, auth_proto, auth_data);
|
||||
fclose(f);
|
||||
pclose(f);
|
||||
} else
|
||||
fprintf(stderr, "Could not run %s -q -\n", XAUTH_PATH);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user