更新时间:2022-09-20 19:19:56
docker run
或者docker create
命令时,通过-u
或者-user
参数,可以以任意已经存在在目标镜像里的非root用户启动容器。可以先用docker history
查看容器命令历史记录,在其中查找adduser
命令,这样可以查出现存用户。可以查看USER
命令确定是否设定了默认用户。或者,直接从镜像启动一个容器并进入shell命令行直接手动检查。如果你不喜欢这么查来查去,通常也可以直接使用“nobody”用户。"-rwxr-xr-x 1 root root" (or 755)
"-rwsr-xr-x 1 root root"
"-rwxr-sr-x 1 root root"
ping
命令。我喜欢这个例子因为它有时候显得很微不足道而无害。ping
要求root权限因为它要使用ICMP协议。一个典型的Linux安装后会包含多个这样的工具。在ubuntu:latest镜像里有22个带有SUID设置的程序。/sbin/unix_chkpwd /usr/bin/chage /usr/bin/passwd /usr/bin/mail-touchlock /usr/bin/mail-unlock /usr/bin/gpasswd /usr/bin/crontab /usr/bin/chfn /usr/bin/newgrp /usr/bin/sudo /usr/bin/wall /usr/bin/mail-lock /usr/bin/expiry /usr/bin/dotlockfile /usr/bin/chsh /usr/lib/eject/dmcrypt-get-device /usr/lib/pt_chown /bin/ping6 /bin/su /bin/ping /bin/umount /bin/mount
FROM ubuntu:latest RUN chmod u+s /usr/bin/whoami RUN adduser --system --no-create-home --disabled-password --disabled-login --shell /bin/sh example USER example CMD printf "Container running as: %s\n" `id -u -n` && printf "Effectively running whoami as: %s\n" `whoami`
docker build -t tutumblog/suid_whoami . \ && docker run --rm tutumblog/suid_whoami … Container running as: example Effectively running whoami as: root
whoami
命令设置上SUID参数。然后为这个镜像添加example用户,并且设置其为从此镜像创建出的容器的默认用户。可以看出问题是,展示了两个不同的当前用户。当example用户执行whoami
时,因为其带有SUID参数设置,Linux用root用户执行它,所以显示文件的拥有者是root。whoami
不是一个需要由其拥有者才能执行的程序。实际上它显示了错误的结果。现在需要解决的问题是:“在运行时里我需要带有SUID设置的程序吗?”我认为大部分时候的回答是:“不需要。”crontab
。有些人需要ping
来诊断问题。但是如果这22个程序的其中某个程序有bug怎么办?如果这个程序设置了SUID参数,黑客又探测到这个bug,那么他们将控制整个容器。FROM ubuntu:latest RUN adduser --system --no-create-home --disabled-password --disabled-login --shell /bin/sh example RUN for i in `find / -perm +6000 -type f`; do chmod a-s $i; done USER example CMD /bin/bash
… RUN for i in `find / -perm +6000 -type f`; do rm -f $i; done …