You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下setcap设置超过18个capability异常问题咨询

问题分析与解决:Linux 3.10内核setcap分配超过18个capability时异常

问题现象

在Linux内核3.10.0环境下,使用setcap通过capability编号分配权限时:

  • 当指定的cap编号数量≤18个时,操作正常,getcap返回正确的cap集合:
$ setcap "0,1,2,3,4,5,6,7,8,10,12,13,14,16,17,18,19,21"+eip test_app
$ getcap test_app
test_app cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_admin=eip
  • 当指定的cap编号数量超过18个时,getcap返回完全不匹配的cap集合:
$ setcap "0,1,2,3,4,5,6,7,8,10,12,13,14,16,17,18,19,21,23"+eip test_app
$ getcap test_app
test_app =eip cap_linux_immutable,cap_net_broadcast,cap_ipc_owner,cap_sys_pacct,cap_sys_boot,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend-eip

原因

这是老版本libcap工具(对应3.10内核的配套版本)的解析bug:
当通过逗号分隔的cap编号列表指定超过18个权限时,工具内部对编号列表的位掩码转换逻辑出现错误,导致生成的capability位掩码被错误反转或映射,最终getcap读取到的是完全不符合预期的cap集合。

解决办法

  1. 改用capability名称指定权限
    替换编号为对应的cap名称,避免编号解析的bug,示例:

    $ setcap "cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_admin,cap_sys_pacct"+eip test_app
    

    可通过capsh --list查看所有cap名称与编号的对应关系。

  2. 直接使用十六进制位掩码赋值
    计算所有目标cap的位掩码总和,直接用掩码值分配:
    将每个目标编号对应的位设为1,转换为十六进制后执行命令,示例格式:

    $ setcap "0xXXXXXXXX"+eip test_app
    

    (注:需自行计算正确的十六进制值,可通过简单脚本或位运算工具生成)

  3. 升级libcap工具版本
    该bug在后续的libcap版本(如2.25及以上)中已被修复,在兼容3.10内核的前提下,升级libcap包后,使用编号列表分配权限即可恢复正常。

内容的提问来源于stack exchange,提问作者ByeongYoon So

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 23:12:06