나는 POSIX 기능적 원리와 execve() 동안의 변환을 좀 더 구체적으로 이해하려고 노력하고 있습니다. 일부를 인용하겠습니다.문서내가 물었을 때 :
P'(ambient) = (file is privileged) ? 0 : P(ambient)
P'(permitted) = (P(inheritable) & F(inheritable)) |
(F(permitted) & P(bounding)) | P'(ambient)
P'(effective) = F(effective) ? P'(permitted) : P'(ambient)
P'(inheritable) = P(inheritable) [i.e., unchanged]
P'(bounding) = P(bounding) [i.e., unchanged]
where:
P() denotes the value of a thread capability set before the
execve(2)
P'() denotes the value of a thread capability set after the
execve(2)
F() denotes a file capability set
이를 바탕으로 먼저 실행 파일에 권한이 있는지 확인합니다.특권파일은 해당 기능이 있거나 set-user-ID 또는 set-group-ID 비트가 활성화된 파일로 정의됩니다.
When determining the transformation of the ambient set during execve(2),
a privileged file is one that has capabilities or
has the set-user-ID or set-group-ID bit set.
그런 다음 파일의 유효한 비트가 활성화되어 있는지 확인합니다. 이제 두 가지 확인을 기반으로 4가지 상황이 있습니다.
- 권한 있는 파일에는 유효한 비트가 활성화되어 있습니다. -> 파일에 고려해야 할 기능이 있습니다. -> 새로운 기능을 계산합니다.
- 권한이 없는 파일에는 유효한 비트가 비활성화되어 있습니다. -> 파일에 기능이 없습니다. -> 스레드를 사용하여 환경이 설정되었습니다.
- 권한 있는 파일에는 유효한 비트가 비활성화되어 있습니다. -> 파일에는 setuid/setguid 비트가 활성화되어 있을 수 있습니다. 이것이 의미하는 바는 기능을 전혀 사용해서는 안 되고, 두 가지 다른 권한 도구를 혼합해서는 안 된다는 것입니다. -> 유효 스레드 세트는 0이 됩니다.
하지만 네 번째 경우는 이해할 수 없습니다. 권한이 없는 파일에는 유효한 비트가 활성화되어 있습니다. 기능이 없습니다(권한이 없기 때문에).
- 권한이 없는 파일이 유효한 비트를 활성화하는 것이 어떻게 가능합니까?
- 유효한 비트가 파일의 권한 상태에 영향을 미치지 않더라도 왜 권한이나 유효한 기능 없이 활성화하도록 설정하겠습니까?
그래서 제 질문은 어떤 구체적인 상황이 네 번째 시나리오로 이어질 수 있느냐는 것입니다.
답변1
이런 일은 없을 거라 생각했는데,즉허용되거나 상속된 기능이 없으면 유효한 비트를 설정할 수 없습니다.
나타난 동작은 setcap
다음을 확인하는 것 같습니다.
$ sudo setcap cap_chown=ep mybinary
$ getcap mybinary
mybinary = cap_chown+ep
$ sudo setcap cap_chown=e mybinary
$ getcap mybinary
mybinary =
그러나 당신이 발견한 바와 같이,예저장된 기능이 없더라도 유효한 비트를 설정할 수 있습니다.
$ xattr -l mybinary
0000 01 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 ................
0010 00 00 00 00 ....
이 값은구조vfs_cap_data
, 버전 2(0x02000001). 첫 번째 32비트 값의 마지막 비트는 이것이 유효한 기능임을 나타내기 위해 설정되지만 기능(상속 및 허용)은 0으로 설정됩니다.