![执行setcap后,为什么我仍然无法使用tar并出现“不允许操作”错误?](https://linux22.com/image/223842/%E6%89%A7%E8%A1%8Csetcap%E5%90%8E%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E4%BB%8D%E7%84%B6%E6%97%A0%E6%B3%95%E4%BD%BF%E7%94%A8tar%E5%B9%B6%E5%87%BA%E7%8E%B0%E2%80%9C%E4%B8%8D%E5%85%81%E8%AE%B8%E6%93%8D%E4%BD%9C%E2%80%9D%E9%94%99%E8%AF%AF%EF%BC%9F.png)
问题
我正在实习,从事容器安全方面的工作,最近我需要构建一个有安全问题的容器来做一些测试。这是我的 dockerfile
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 文件压缩某些内容时出现错误。有人可以帮我吗?
PS:我不明白为什么当我检查这个文件的能力时,我得到cap_dac_read_search+ep, 任何一个。我没有使用 setcap 'cap_dac_read_search+ep' /home/tar,而是 setcap'cap_dac_read_search=ep'/home/tar.gz
我的 shell 中的操作 + 返回的结果
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
您的 shell 的功能。
在正常环境下,如果您尝试以下操作,您将得到:
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
如果您在容器下尝试相同的序列,您可能会获得一个包含更多零的十六进制值,并且它--decode
的 不包括cap_dac_read_search
。
您看到错误的原因是内核拒绝了bash
调用的尝试,因为您所允许的功能tar
要求要在执行时间( )生效cap_dac_read_search=ep
,不能生效。内核不会允许二进制文件在其所需的有效功能不足的情况下陷入困境,而是拒绝以下权限:执行二进制文件。这是针对 20 多年前首次针对 Sendmail 进行的一类攻击的防护措施。您可以阅读更多有关该内容的详细信息这里。
关于功能的行为方式存在许多怪癖。有的已列出这里。