首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用capsh复制setcap行为

用capsh复制setcap行为
EN

Unix & Linux用户
提问于 2022-09-02 11:51:47
回答 1查看 198关注 0票数 1

有一个不具备能力的程序,它至少需要cap_sys_admincap_dac_overridecap_dac_read_search。这一点可以证明如下:

代码语言:javascript
复制
sudo setcap 'all=ep cap_sys_admin-ep' ./binary`                        # ./binary doesn't work
sudo setcap 'all=ep cap_dac_override-ep' ./binary`                     # ./binary works
sudo setcap 'all=ep cap_dac_read_search-ep' ./binary                   # ./binary works
sudo setcap 'all=ep cap_dac_override,cap_dac_read_search-ep' ./binary  # ./binary doesn't work

我想使用capsh而不是setcap进行同样的检查。在进行这些检查之前,所有文件功能都将使用sudo setcap -r ./binary删除。第一棵树成功,结果与setcap匹配:

代码语言:javascript
复制
sudo capsh --user=jdoe --keep=1 --caps="all=eip" --addamb="all" --delamb="cap_sys_admin" -- -c ./binary
sudo capsh --user=jdoe --keep=1 --caps="all=eip" --addamb="all" --delamb="cap_dac_override" -- -c ./binary
sudo capsh --user=jdoe --keep=1 --caps="all=eip" --addamb="all" --delamb="cap_dac_read_search" -- -c ./binary

最后一次失败时,程序仍然工作,而它不应该:

代码语言:javascript
复制
sudo capsh --user=jdoe --keep=1 --caps="all=eip" --addamb="all" --delamb="cap_dac_override,cap_dac_read_search" -- -c ./binary

我没有注意到文件系统和进程功能之间有什么不同吗?如何正确地写出第三次考试?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2022-09-11 00:12:56

所以我认为你的问题的答案在于你的程序在做什么。(一般来说,提供一些简化的源代码来重现您所看到的内容总是很好的。)

我很快编写了一些代码(在Go中,因为它生成调试输出的代码略少于C和libcap,并且它提供了一个cap go包的工作示例)。

这是binary.go

代码语言:javascript
复制
package main

import (
    "log"
    "os"

    "kernel.org/pub/linux/libs/security/libcap/cap"
)

func confirm(c *cap.Set, val cap.Value) int {
    on, err := c.GetFlag(cap.Effective, val)
    if err != nil {
        log.Fatalf("unable to confirm %q in effective set: %v", val, err)
    }
    log.Printf("%q in effective set of %q is: %v", val, c, on)
    if on {
        return 0
    }
    return 1
}

func fail() {
    log.Print("FAILURE")
    os.Exit(1)
}

func main() {
    c := cap.GetProc()
    if confirm(c, cap.SYS_ADMIN) != 0 {
        fail()
    }
    if confirm(c, cap.DAC_OVERRIDE)+confirm(c, cap.DAC_READ_SEARCH) > 1 {
        fail()
    }
    log.Print("SUCCESS")
}

汇编如下:

代码语言:javascript
复制
$ go mod init binary
$ go mod tidy
$ go build binary.go
$ ./binary 
2022/09/10 16:45:56 "cap_sys_admin" in effective set of "=" is: false
2022/09/10 16:45:56 FAILURE
$ echo $?
1

这个程序,binary,拥有您所描述的所有属性,并且按照您期望的方式工作。在文件功能版本和环境继承版本(使用capsh的版本)之间存在差异的地方是,存在可继承的流程功能:

代码语言:javascript
复制
$ sudo setcap 'all=ep cap_dac_override,cap_dac_read_search-ep' ./binary
$ ./binary 
2022/09/10 16:50:37 "cap_sys_admin" in effective set of "=ep cap_dac_override,cap_dac_read_search-ep" is: true
2022/09/10 16:50:37 "cap_dac_override" in effective set of "=ep cap_dac_override,cap_dac_read_search-ep" is: false
2022/09/10 16:50:37 "cap_dac_read_search" in effective set of "=ep cap_dac_override,cap_dac_read_search-ep" is: false
2022/09/10 16:50:37 FAILURE
$ sudo setcap -r binary
$ sudo capsh --user=$(whoami) --keep=1 --caps="all=eip" --addamb="all" --delamb="cap_dac_override,cap_dac_read_search" -- -c ./binary
2022/09/10 16:52:21 "cap_sys_admin" in effective set of "=eip cap_dac_override,cap_dac_read_search-ep" is: true
2022/09/10 16:52:21 "cap_dac_override" in effective set of "=eip cap_dac_override,cap_dac_read_search-ep" is: false
2022/09/10 16:52:21 "cap_dac_read_search" in effective set of "=eip cap_dac_override,cap_dac_read_search-ep" is: false
2022/09/10 16:52:21 FAILURE

也就是说,在文件功能版本中可以看到"=ep",在Ambient版本中可以看到"=eip"".i."部件不是一种直接对程序有用的功能,它只在程序执行时起作用。

我认为您的代码可能正在检查可继承的进程功能。同样,这些都不是他们自己的特权。只有当它们与文件可继承功能或环境功能相结合时,它们才表示特权。我已经对能力继承如何在libcap分销网站上工作做了完整的描述。如果所有这些仍然令人困惑,那里的例子可能是有帮助的。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/715895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档