Capabilities (Português)
As capacidades (POSIX 1003.1e, capabilities(7)) fornecem controle refinado sobre permissões de superusuário, permitindo que o usuário root seja evitado. Os desenvolvedores de software são incentivados a substituir os usos do poderoso atributo setuid em um sistema binário com um conjunto mais mínimo de capacidades. Muitos pacotes utilizam capacidades, como CAP_NET_RAW
, sendo usada para o binário ping
fornecido pelo iputils. Isso permite, por exemplo, ping
ser executado por um usuário normal (como no método setuid), ao mesmo tempo em que limita as consequências de segurança de uma possível vulnerabilidade no ping
.
Implementação
Capacidades são implementadas no Linux usando atributos estendidos (xattr(7)) no espaço de nomes de segurança. Atributos estendidos são suportados por todos os principais sistemas de arquivos do Linux, incluindo Ext2, Ext3, Ext4, Btrfs, JFS, XFS e Reiserfs. O exemplo a seguir imprime as capacidades do ping com getcap
e, em seguida, imprime os mesmos dados em seu formato codificado usando getfattr
:
$ getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep
$ getfattr -d -m "^security\\." /usr/bin/ping
# file: usr/bin/ping security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=
Atributos estendidos são copiados automaticamente por cp -a
, mas alguns outros programas requerem um sinalizador especial: rsync -X
.
As capacidades são definidas por scripts de instalação de pacotes no Arch (por exemplo, iputils.install
).
Administração e manutenção
É considerado um bug se um pacote tiver capacidades excessivamente permissivas; portanto, esses casos devem ser relatados em vez de serem listados aqui. Uma capacidade essencialmente equivalente ao acesso root (CAP_SYS_ADMIN
) ou permitir trivialmente o acesso root (CAP_DAC_OVERRIDE
) não conta como um bug, pois o Arch não suporta nenhum sistema MAC/RBAC.
Outros programas que se beneficiam de capacidades
Os pacotes a seguir não possuem arquivos com o atributo setuid, mas requerem privilégios de root para funcionar. Ao ativar algumas capacidades, usuários comuns podem usar o programa sem elevação de privilégios.
beep
# setcap cap_dac_override,cap_sys_tty_config+ep /usr/bin/beep
chvt
# setcap cap_dac_read_search,cap_sys_tty_config+ep /usr/bin/chvt
iftop
# setcap cap_net_raw+ep /usr/bin/iftop
mii-tool
# setcap cap_net_admin+ep /usr/bin/mii-tool
mtr
# setcap cap_net_raw+ep /usr/bin/mtr-packet
nethogs
# setcap cap_net_admin,cap_net_raw+ep /usr/bin/nethogs
wavemon
# setcap cap_net_admin+ep /usr/bin/wavemon
Comandos úteis
Encontrar arquivos com setuid-root:
$ find /usr/bin /usr/lib -perm /4000 -user root
Encontrar arquivos com setgid-root:
$ find /usr/bin /usr/lib -perm /2000 -group root