Se o seu glibc estiver razoavelmente atualizado e devpts estiver configurado corretamente, não será necessário chamar o pt_chown
helper.
Você pode estar se deparando com um problema conhecido / potencial removendo o setuid-root de pt_chown
.
grantpt()
suportado devfs
de glibc-2.7 , as alterações foram feitas em glibc-2.11 embora, em vez de verificar explicitamente por DEVFS_SUPER_MAGIC
, verifica em vez disso, para ver se ele precisa fazer algum trabalho antes de tentar chown()
ou voltar a invocar pt_chown
.
De glibc-2.17/sysdeps/unix/grantpt.c
...
uid_t uid = __getuid ();
if (st.st_uid != uid)
{
if (__chown (buf, uid, st.st_gid) < 0)
goto helper;
}
...
Uma sub-rotina semelhante é usada para verificar o gid e as permissões.
O problema é que o uid, gid e mode devem corresponder às expectativas (você, tty e exatamente 620; confirme com /usr/libexec/pt_chown --help
). Se não, chown()
(o que exigiria recursos CAP_CHOWN, CAP_FOWNER do processo / binário de chamada) é tentado e, se isso falhar, o assistente externo pt_chown
(que deve ser root setuid) é tentado. Para que pt_chown
seja capaz de usar recursos, ele (e, portanto, seu glibc) deve ter sido compilado com HAVE_LIBCAP
. No entanto , parece que pt_chown
é (como em glibc-2.17 , e como você notou que você não declarou a versão) codificado para querer geteuid()==0
independentemente de HAVE_LIBCAP
, código relevante de glibc-2.17/login/programs/pt_chown.c
:
...
if (argc == 1 && euid == 0)
{
#ifdef HAVE_LIBCAP
/* Drop privileges. */
if (uid != euid)
...
#endif
/* Normal invocation of this program is with no arguments and
with privileges. */
return do_pt_chown ();
}
...
/* Check if we are properly installed. */
if (euid != 0)
error (FAIL_EXEC, 0, gettext ("needs to be installed setuid 'root'"));
(Esperar geteuid()==0
antes de tentar usar recursos não parece estar realmente no espírito das capacidades, eu iria com o registro de um bug em um presente.)
Uma possível solução alternativa pode ser dar CAP_CHOWN, CAP_FOWNER aos programas afetados, mas eu realmente não recomendo isso, já que você não pode restringir isso a ptys, é claro.
Se isso não ajudar você a resolvê-lo, aplicar sshd
e screen
será um pouco menos desagradável do que corrigir o glibc. Já que o problema está no glibc, uma abordagem mais limpa seria o uso seletivo de de injeção de DLL para implementar um dummy grantpt()
.