Como os recursos funcionam no Linux estão documentados em man 7 capabilities
.
Os recursos do processo no conjunto eficaz são contra os quais as verificações de permissão são concluídas. Recursos de arquivo são usados durante a chamada execv (que acontece quando você quer executar outro programa 1 ) para calcular os novos conjuntos de recursos para o processo.
Os arquivos têm dois conjuntos de recursos, permitido e hereditário e bit eficaz .
Os processos têm três conjuntos de recursos: efetivo , permitido e herdável . Há também um conjunto de limites, que limita quais recursos podem ser adicionados posteriormente ao processamento do conjunto herdado e afeta como os recursos são calculados durante execv . Os recursos só podem ser removidos do conjunto de limites , não adicionados.
As verificações de permissões para o processo são verificadas em relação ao processo ' conjunto efetivo . O processo pode aumentar suas capacidades de permitido para conjunto efetivo (usando capget e capset syscalls, a API recomendada é respectivamente cap_get_proc e cap_set_proc ).
Conjuntos Herdáveis e delimitadores e recursos de arquivos entram em jogo durante o execv syscall. Durante os conjuntos execv new efetivo e permitido são calculados e herdados set e conjunto de limites permanecer inalterado. O algoritmo é descrito na páginacapabilities
man:
P'(permitted) = (P(inheritable) & F(inheritable)) | (F(permitted) & cap_bset) P'(effective) = F(effective) ? P'(permitted) : 0 P'(inheritable) = P(inheritable) [i.e., unchanged]
Where P is old capability set, P' is capability set after execv and F is file capability set.
Se um recurso estiver em ambos os processos ' herdável conjunto e em arquivo herdado conjunto (intersecção / lógica AND) ele será adicionado ao conjunto permitido . O arquivo conjunto permitido é adicionado (união / lógica OR) a ele (se estiver dentro do conjunto de limites).
Se o bit efetivo nas capacidades dos arquivos for definido, todos os recursos permitidos serão elevados para efetivo após execv .
Os recursos no kernel são definidos para encadeamentos, mas, no que diz respeito a recursos de arquivos, essa distinção é geralmente relevante apenas se o processo alterar seus próprios recursos.
No seu exemplo, os recursos cap_net_raw
, cap_net_admin
e cap_dac_override
são adicionados aos conjuntos herdados e permitidos e eficaz bit é conjunto. Quando seu binário é executado, o processo terá esses recursos nos conjuntos efetivos e permitidos se eles não estiverem limitados por um conjunto de limites.
[1] Para o fork syscall, todos os recursos e o conjunto de limites são copiados do processo pai. As alterações no uid também têm sua própria semântica de como os recursos são definidos nos conjuntos efetivos e permitidos .