在基于 Busybox 的最小系统上启动功能有限的流程

在基于 Busybox 的最小系统上启动功能有限的流程

在一个基于 Busybox 的 Linux 系统中,如果可以访问 root 用户,如何使用Linux 的特定有限集能力(7)除了 busybox 之外不需要任何工具?

答案1

所以,首先,这确实需要一些libcap以非默认方式从源代码构建的工具 - 所以我承认这不是您所希望的答案(只是 busybox)...但是,二进制文件很小,这里是一种探索方法:

libcap发行版有一个子目录,它使用 busybox 来测试从源代码构建的内核。libcap多年来我一直用它来分类一些内核错误和修复/功能。您可以在这里探索:

https://git.kernel.org/pub/scm/libs/libcap/libcap.git/tree/kdebug

所做的事情之一就是运行quicktest.sh libcap在 busybox 目标内启动时的兼容性测试套件。它假设您在此相对位置有一些内核源代码,kdebug/../../linux/以便构建要测试的系统。基本思想是解压/git 克隆libcap源代码并执行以下操作:

$ git clone git://git.kernel.org/pub/scm/libs/libcap/libcap.git
$ cd libcap/kdebug
$ make

第一次尝试这个时,它可能会构建失败,因为它有一大堆依赖项qemu等来启动这个 busybox 目标(枚举这些应该在自述文件中真正解释)。但安装后的二进制文件busybox非常少。

qemu如果您可以使上述工作正常运行,那么您还可以在测试完成后使用此命令行与托管系统进行交互:

$ make shell

[exit 和 Ctrl-d 都会退出 qemu]。

如果您尝试做一些微妙的事情,quicktest.sh有很多示例演示如何使用自定义构建./capsh./setcap二进制文件在基于总线盒的系统内以特权运行事物。如果您的主机系统上有静态文件glibc可供链接,capsh并且setcap都是完全静态的二进制文件,则从源代码构建。

话虽如此,在该系统中,您可以执行以下操作:

# ./capsh --iab="^cap_net_raw" --secbits=15 == --print
Current: cap_net_raw=eip
Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,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,cap_audit_read,cap_perfmon,cap_bpf,cap_checkpoint_restore
Ambient set =cap_net_raw
Current IAB: ^cap_net_raw
Securebits: 017/0xf/4'b1111 (no-new-privs=0)
 secure-noroot: yes (locked)
 secure-no-suid-fixup: yes (locked)
 secure-keep-caps: no (unlocked)
 secure-no-ambient-raise: no (unlocked)
uid=0(root) euid=0(root)
gid=0(root)
groups=0(root)
Guessed mode: UNCERTAIN (0)

这演示了如何root对单一cap_net_raw功能的权限进行限制。对于您想要运行的任何任务,您有两种选择:

  • 将一些文件功能放在二进制文件上并更改用户(从root)来运行它:
# ./setcap cap_net_raw=ep ./yourbinary
# ./capsh --user=nobody -- -c "./yourbinary"
  • 或者使用上述capsh机制来删除root特权并使用环境功能来限制特权nobody用户在运行程序时:
# ./capsh --user=nobody --iab="^cap_net_raw" -- -c "./yourbinary"

相关内容