Я сделал модуль pam для тестов и демонстраций, и в этом модуле я получаю пароль от пользователя и проверяю, хорош ли он, например:
bool authenticateUser( const char *user, char *pass )
{
char *encrypted, *p;
struct passwd *pwd;
struct spwd *spwd;
bool authOk;
pwd = getpwnam( user );
if (pwd == NULL)
{
pam_syslog(pamh, LOG_ERR, "my_pam : pwd == NULL");
return false;
}
spwd = getspnam( user );
if (spwd == NULL && errno == EACCES)
{
pam_syslog(pamh, LOG_ERR, "my_pam : spwd == NULL && errno == EACCES");
return false;
}
if (spwd != NULL) // If there is a shadow password record
pwd->pw_passwd = spwd->sp_pwdp; // Use the shadow password
encrypted = crypt(pass, pwd->pw_passwd);
memset(pass, '\0', strlen(pass));
if (encrypted == NULL)
{
pam_syslog(pamh, LOG_ERR, "my_pam : encrypted == NULL");
return false;
}
authOk = strcmp(encrypted, pwd->pw_passwd) == 0;
if (!authOk)
{
pam_syslog(pamh, LOG_ERR, "my_pam : !authOk");
return false;
}
return true;
}
Все нормально, если я использую его из на панели подключения GDM или с консоли будет работать команда типа 'sudo ls'. Моя проблема возникает, когда я хочу использовать свой модуль из заставки, появляется такой системный журнал:
"my_pam : spwd == NULL && errno == EACCES"
И из того, что я понимаю, кажется, что пользователь, вызывающий модуль, не имеет достаточных прав.
Я также пытаюсь установить бит suid следующим образом:
chmod u+s my_pam.so
И это больше ничего не делает. После этого мне удалось передать пароль к стандартному модулю "pam_ unix .so" следующим образом:
// set the password in the pam stack, it will be transmited to other module
pam_set_item(pamh, PAM_AUTHTOK, (const void **)(const void*)&clearPass);
memset(clearPass, '\0', 100);
И он работает как обаяние, но я буду чувствовать себя лучше, если пойму, что с ним не так Мой первый метод, даже если он не самый лучший.
PS: Другая информация может быть полезной:
Linux debian-alde 4.19.0-5-amd64 #1 SMP Debian 4.19.37-5+deb10u2 (2019-08-08) x86_64 GNU/Linux
Distributor ID: Debian
Description: Debian GNU/Linux 10 (buster)
Release: 10
Codename: buster
MATE Desktop Environment 1.20.4