[Samba] pam_winbind bug?

Timo Benk tik at talicom.de
Tue Aug 6 01:02:24 GMT 2002


Hi,

I noticed the following problem in samba 2.2.5:

the pam winbind module floods the system with
sockets until the ulimits are reached under some 
circumstances.

I attached a simple program to demonstrate
the problem. The problem only occurs with
pam_winbind, if i use another pam module, pam_unix
for example, everything works fine.

Does anybody can tell me if this is a problem
in my code or a bug in pam_winbind?

Thanks in advance,
-timo
-------------- next part --------------
// leider fehlt bei den SuSE 7.3 PAM header Dateien die extern Anweisung
extern "C" {
#include <security/pam_appl.h>
#include <security/pam_misc.h>
}
#include <iostream>

// der Service f?r PAM (der Name der Datei in /etc/pam.d/)
#define SERVICE "cdsrv"

/**
 * die conversation function f?r PAM (_authenticate()) 
 */
int own_conv(int num_msg, const pam_message *msg[], pam_response *response[], void *appdata_ptr)
{
	pam_response *reply    = new pam_response[num_msg];     

	for( int x = 0; x < num_msg; x++ )
	{
		reply[x].resp_retcode = 0;
		reply[x].resp         = strdup((char*)appdata_ptr);
	}

	response[0] = reply;

	return PAM_SUCCESS;
}

/**
 * pr?ft gegen PAM ob das user/password pair stimmt und gibt
 * true zur?ck wenn es stimmt, ansonsten false.
 *
 * (Ist auf KEINEN Fall geeignet um generelle PAM Unterst?tzung
 * zu integrieren, lediglich zur simplen user/passwd 
 * authentifizierung. F?r erweiterte Authentifizierungs-Mechanismen
 * wie z.B.: Chipkarten m?sste der Code entsprechend erweitert 
 * werden. Funktioniert nur gegen die shadow Datei wenn die Berechtigungen
 * stimmen, funktioniert allerdings problemlos gegen winbindd)
 *
 * damit libpam.so von der java engine geladen werden kann muss LD_PRELOAD 
 * gesetzt sein:
 * export LD_PRELOAD=/usr/lib/libpam.so
 */
bool _authenticate( char *user, char *passwd )
{
	pam_handle_t *pamh = NULL;

	/* das password f?r die conversation function setzen */
	pam_conv conv;
	conv.appdata_ptr = (void*)passwd;
	conv.conv        = own_conv;

	/* PAM session initialisieren */
	int retval = pam_start(SERVICE, user, &conv, &pamh);

	/* user authentifizieren */
	if (retval == PAM_SUCCESS)
	{
		retval = pam_authenticate(pamh, 0);    
	}
	
	/* pam session schliessen */
	/* TODO: was ist wenn die session nicht wieder geschlossen werden kann */
	int t = pam_end(pamh,retval);

	if( retval == PAM_SUCCESS )
	{
		return(true);
	}
	else
	{
		return(false);
	}
}

void main(int argc, char ** argv)
{
	while( true )
	{
		if( _authenticate( argv[1], argv[2] ) )
		{
			cout << argv[1] << ":" << argv[2] << " is authenticated" << endl;
		}
		else
		{
			cout << argv[1] << ":" << argv[2] << " is not authenticated" << endl;
		}
	}
}	
-------------- next part --------------
#%PAM-1.0
auth		required	pam_winbind.so
#account		required	pam_warn.so	debug
#account		required	pam_deny.so	debug
#session		required	pam_warn.so	debug
#session		required	pam_deny.so	debug
#password	required	pam_warn.so	debug
#password	required	pam_deny.so	debug



More information about the samba mailing list