Agora estou pensando que isso é um bug e relacionado à maneira como o upstart inicia serviços com "expect daemon" (ou seja, serviços que são bifurcados duas vezes na inicialização). Percebo que, se eu usar strace em um processo que está usando recursos (7), os recursos também serão ignorados. Eu suspeito que o upstart, a fim de determinar o PID para esperar, rastreia um serviço especificado com "esperar daemon" tempo suficiente para obter o PID, e isso está causando o mecanismo de capacidades do kernel para falhar. Portanto, o bug está no modo como os recursos interagem com o rastreio do processo e o fato de que o upstart usa o rastreio do processo ao iniciar um serviço com o "espere daemon" (isso é suposição).
Como um teste simples:
- Escreva um pequeno C PROGRAM para ligar à porta 443 (você não pode usar uma linguagem interpretada como python com recursos (7)).
- Execute-o como não-raiz e veja se ele não é vinculado devido à falta de privilégio.
- Defina o recurso CAP_NET_BIND_SERVICE para seu PROGRAM (como a execução raiz
setcap 'cap_net_bind_service+epi' PROGRAM
) - Execute como não-raiz e veja que agora é bem-sucedido.
- Agora, execute-o com strace e veja que agora ele falha.
(observe que na etapa 3, estritamente falando, o conjunto de recursos herdados ( i
flag) não precisa ser modificado para este teste, mas para um processo que forks()
, como meu daemon).
Vou registrar um bug contra o kernel sobre isso, já que nada na página do manual capabilities (7) diz que ele não deve funcionar com o rastreio do processo.