setcap을 실행한 후에도 여전히 tar를 사용할 수 없고 "작업이 허용되지 않음" 오류가 발생하는 이유는 무엇입니까?

setcap을 실행한 후에도 여전히 tar를 사용할 수 없고 "작업이 허용되지 않음" 오류가 발생하는 이유는 무엇입니까?

질문

저는 컨테이너 보안 분야에서 인턴으로 근무하고 있으며 최근 몇 가지 테스트를 수행하기 위해 보안 문제가 있는 컨테이너를 구축해야 했습니다. 이것은 내 도커 파일입니다

FROM dockerfiles/centos-lamp
WORKDIR /var/www/html
RUN wget https://github.com/RandomStorm/DVWA/archive/v1.0.8.tar.gz -O- | tar xvz --strip-components=1
RUN service mysqld start && mysqladmin -uroot password p@ssw0rd && service mysqld stop
EXPOSE 80
USER root
COPY ./Centos-vault-6.10.repo /home
COPY ./here_u_r.txt /root
WORKDIR /home
RUN rm -rf /etc/yum.repos.d/*
RUN cp -r ./Centos-vault-6.10.repo /etc/yum.repos.d/CentOS-Base.repo
RUN yum clean all
RUN yum makecache
RUN cp /bin/tar .
WORKDIR /var/www/html
RUN rpm --rebuilddb && yum install -y sudo && yum install -y gcc
RUN usermod -aG wheel apache && \
        chmod u+s $(which find) && \
        chmod 700 $(which getcap) && \
        setcap 'cap_dac_read_search=ep' /home/tar
CMD ["supervisord", "-n"]

마지막 줄에서 두 번째 줄에서 /home 디렉터리에 있는 tar 실행 파일에 파일을 읽을 수 있는 기능을 제공하고 싶다는 것을 알 수 있습니다. 그런데 tar 파일을 사용하여 압축하면 오류가 발생합니다. 누구든지 나를 도와줄 수 있나요?

추신: 이 파일의 기능을 확인할 때 왜 받는지 이해할 수 없습니다.cap_dac_read_search+ep, 누구나. setcap 'cap_dac_read_search+ep' /home/tar를 사용하는 대신 setcap을 사용합니다.'cap_dac_read_search=ep'/home/tar.gz

내 셸의 작업 + 반환된 결과

bash-4.1$ ls -la /home/tar
ls -la /home/tar
-rwxr-xr-x. 1 root root 390616 Aug 24 22:56 /home/tar

bash-4.1$ find 1 -exec getcap /home/tar \;
find 1 -exec getcap /home/tar \;
/home/tar = cap_dac_read_search+ep

bash-4.1$ pwd
pwd
/home
bash-4.1$ ./tar -cvf /tmp/my.tar /tmp/1 /tmp/pip-build-root
./tar -cvf /tmp/my.tar /tmp/1 /tmp/pip-build-root
bash: ./tar: Operation not permitted

답변1

표시되는 이유:

bash-4.1$ ./tar -cvf /tmp/my.tar /tmp/1 /tmp/pip-build-root
./tar -cvf /tmp/my.tar /tmp/1 /tmp/pip-build-root
bash: ./tar: Operation not permitted

cap_dac_read_search쉘의 기능을 거부하는 경계 세트입니다 .

일반적인 상황에서 다음을 시도하면 다음과 같은 결과를 얻을 수 있습니다.

bash$ grep CapBnd /proc/self/status
CapBnd: 000001ffffffffff
bash$ capsh --decode=000001ffffffffff
0x000001ffffffffff=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

컨테이너 아래에서 동일한 시퀀스를 시도하면 더 많은 0이 포함된 16진수 값을 얻게 될 수 있지만 이는 --decode포괄적이지 않습니다 cap_dac_read_search.

오류가 표시되는 이유는 bash허용한 함수 때문에 커널이 호출 시도를 거부했기 때문입니다.tar필요하다실행 시간( )에 적용하려면 cap_dac_read_search=ep적용할 수 없습니다. 커널은 필요한 유효 기능이 부족하여 바이너리가 정체되는 것을 허용하지 않고 다음 권한을 거부합니다.구현하다바이너리 파일. 이는 20년 전 처음으로 Sendmail을 대상으로 한 공격 클래스에 대한 보호입니다. 이에 대한 자세한 내용을 읽을 수 있습니다.여기.

함수의 작동 방식에는 많은 이상한 점이 있습니다. 일부가 나열되어 있습니다.여기.

관련 정보