LINUX.ORG.RU

Вопрос по getpwnam()


0

1

Вот тут мне не ответили - http://www.linux.org.ru/forum/talks/5824709 , поэтому спрашиваю в правильном месте.

Программа запущена от непривелегированного пользователя. Почему на FreeBSD следующий вызов

struct passwd * p = getpwnam( username );

в p->pw_passwd возвращает «*», в то время как под Linux возвращается хэш пароля?

Как проверить авторизацию на FreeBSD?

★★★

Помню в старинном солярисе такой баг был, точно точно! Это ещё во фраке описано. А в Linux такого быть не должно, если пользователь действительно непривилегированный. Что за Linux у вас?

anonymous
()

Ну точно, все красиво. Проверил только что. Возвращает «x» в качестве пароля в Linux (У меня ядро 2.6.26, но думаю во всех не окончательно древних ядрах будет также без всяких патчей).

anonymous
()

Так что проверьте:

1) версию ядра и дистрибутив (ибо некоторые разработчики ядро сами дополнительно патчат)

2) права доступа на /etc/shadow, его владельца, группу

3) права доступа на запускаемый бинарник, в котором вы вызываете getpwent() (проверьте suid бит)

4) имя и группу пользователя от имени которого запускаете бинарник, эффективные uid и gid перед запуском

Может чего-то ещё забыл. Короче - права доступа на все, что с эти связано.

anonymous
()
Ответ на: комментарий от anonymous
	static int doPASS( FTPServerSession * self, char * buff )
	{
		self->m_access_granted = false;
		char	str[120];

		strcpy( self->m_password, buff );
	 
		do 
		{
			struct passwd * p = getpwnam( self->m_username );
			if( !p ) 
			{
				printf( "Unable get passwd for %s@%s \n", self->m_username, self->m_hostname );
				break;
			}

#if defined(POSIX)
			if (strcmp( p->pw_passwd, crypt(self->m_password, p->pw_passwd) ) != 0 ) 
			{
//				printf( "Compaing passwords '%s' and '%s'\n", self->m_password, p->pw_passwd );
				break;
			}
#endif
			// TO-DO: Check home directory permission

			self->m_access_granted = true;
			strncpy( self->m_current_directory, p->pw_dir, sizeof(self->m_current_directory) );
			char *pls = strrchr( self->m_current_directory, '/' );
			if( !pls || pls[1] != '\0' ) strcat( self->m_current_directory, "/" );

			chdir(p->pw_dir);
			printf( "FTP access granted to %s@%ss:\n", self->m_username, self->m_hostname );
			self->m_uid = p->pw_uid;
			self->m_gid = p->pw_gid;


		} while(false);

		if( self->m_access_granted )
		{
			snprintf( str, 120,  "230 User %s@%s logged in.\n", self->m_username, self->m_hostname );
		}
		else
		{
			snprintf( str, 120,  "530 Access denied for %s@%s\n", self->m_username, self->m_hostname );
		}

		self->m_rest = 0;
		return self->send_string_to_socket( self->m_command_socket, str);
	}

Как сделать чтобы под непривелегированным пользователем работать или подскажите другой способ.

alman ★★★
() автор топика
Ответ на: комментарий от anonymous

> 3) права доступа на запускаемый бинарник, в котором вы вызываете getpwent() (проверьте suid бит)

Только не это. Фишка как раз в том, чтобы бинарник не был suid'ным. Нужно от простого пользователя.

alman ★★★
() автор топика

Как проверить авторизацию на FreeBSD?

Точно так же, как и в Linux, - при помощи PAM. Про getpwnam забудь.

Deleted
()
Ответ на: комментарий от alman

Только не это. Фишка как раз в том, чтобы бинарник не был suid'ным. Нужно от простого пользователя.

Простые пользователи не должны видеть хеши паролей, даже своих. Более того, никаких паролей и хешей может и не быть, так как существуют и другие стредства аутентификации. Как я сказал выше - PAM.

Deleted
()

> Программа запущена от непривелегированного пользователя
> под Linux возвращается хэш пароля

4.2. функция читает данные из файла /etc/passwd; хэша пароля в нём нет уже очень много лет.

arsi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.