鳩小屋

落書き帳

コンテナセキュリティハンズオン5:Privilege Escalation

第5弾はコンテナ内特権昇格の演習です。

 

テーマ

・setuidフラグ
・no-new-privilegesオプション

 

補足

 $:ホストOS #:コンテナ内

setuidフラグの付与されたシェルの実行

setuidが付与されたファイルは実行者の権限ではなく、ファイル所有者の権限で動作します。そのため、所有者rootかつsetuidフラグが付与されたファイルは権限昇格に利用される可能性があります。

コンテナ内の一般ユーザがコンテナ内のrootユーザに昇格する例を下記に示します。

$ vi Dockerfile
FROM ubuntu:18.04
RUN cp /bin/bash /bin/mybash && chmod +s /bin/mybash
RUN useradd -ms /bin/bash newuser
USER newuser
CMD ["/bin/bash"]
$ sudo docker build -t escalation .
$ docker run --rm -it escalation

newuser@c4dda7d113f5:/# id
uid=1000(newuser) gid=1000(newuser) groups=1000(newuser)
newuser@c4dda7d113f5:/# ls -l
/bin/mybash -rwsr-sr-x 1 root root 1113504 Apr 19 11:16 /bin/mybash
newuser@c4dda7d113f5:/# /bin/mybash -p
mybash-4.4# id
uid=1000(newuser) gid=1000(newuser) euid=0(root) egid=0(root) groups=0(root) mybash-4.4# ps -auxf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
newuser 1 0.0 0.3 18516 3384 pts/0 Ss 11:17 0:00 /bin/bash
root 13 0.0 0.3 18516 3428 pts/0 S 11:19 0:00 /bin/mybash -p
root 15 0.0 0.2 34412 2952 pts/0 R+ 11:21 0:00 ¥_ ps -auxf

 コンテナ内の一般ユーザがコンテナ内のルート権限でシェルを起動していることが分かります。

コンテナ内権限昇格の防止

docker runコマンドのno-new-privilegesオプションを指定してコンテナを実行すると上記のような権限昇格を防ぐことができます。

$ docker run --security-opt=no-new-privileges:true --rm -it escalation

newuser@4ee756591f86:/$ id
uid=1000(newuser) gid=1000(newuser) groups=1000(newuser) newuser@4ee756591f86:/$ ls -l /bin/mybash
-rwsr-sr-x 1 root root 1113504 Apr 19 11:16 /bin/mybash
newuser@4ee756591f86:/$ ps -auxf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
newuser 1 0.1 0.3 18508 3428 pts/0 Ss 11:24 0:00 /bin/bash
newuser 12 0.0 0.3 18516 3484 pts/0 S 11:26 0:00 /bin/mybash -p
newuser 17 0.0 0.2 34412 2944 pts/0 R+ 11:26 0:00 ¥_ ps -auxf

 今度はnewuserの権限でシェルが動作していることが確認できます。

 

後片付け

作業が終わったら不要なコンテナは削除しましょう。

#すべてのコンテナを停止
docker stop `docker ps -a -q`
#すべてのコンテナを削除
docker rm `docker ps -a -q`