はじめに
Dockerを語る上でセキュリティは気になるポイントですがCVE-2019-5736と呼ばれる脆弱性が報告されたことがありました。現在は既に修正版がリリースされていますが、昔話としてどのような話だったのかを簡単に解説します。
何が問題?
この問題は「runC」という機能の脆弱性をついたものでした。
発動条件としては悪意あるユーザが用意したイメージを使ったコンテナの起動で発生し、それによってホスト上でrootとしてコマンド実行が可能になります。
下記の記事にもある通りコンテナはホストの上に隔離された環境として存在するにも関わらず、ホストに影響のある形でコマンド発行ができてしまうため、例えばマルウェアの実行等の懸念が発生して問題になりました。
runCとdockerの関係は?
上にも記載した通り、runCに見つかった脆弱性が原因でしたが、runCとDockerにどのような関係があるのでしょうか?
Dockerのようなコンテナ実行基盤はrunCというツールを利用しています。
イメージとしては、ユーザが操作しやすいように機能を厚くしたのがDockerで、その中の核となるより低いレイヤーのコンテナ実行基盤がrunCです。よって、Docker以外のコンテナ環境でもrunCは利用されたりします。
何が脆弱性を引き起こしたの?
詳細は割愛しますが、/proc/xxxx/exe
に関連する処理により、悪意あるコンテナ起動のタイミングでrunCのバイナリを上書きしてホスト上でrootとしてコードが実行できてしまいます。
要は、runCのバイナリが意図せず上書きされてしまうことが根本の原因です。
ちなみに、上に記載したprocファイルシステムはLinuxの仮想ファイルシステムで、各プロセス毎に独自のディレクトリが作成されています。
例えばcronのプロセスIDが以下だとすると
$ ps -ef | grep cron root 457 1 0 ... ? 00:00:17 /usr/sbin/cron -f
以下のようにディレクトリが存在し、exeファイルは実行コマンドのシンボリックリンクになっています。
$ ls -l /proc/457| grep exe lrwxrwxrwx 1 root root 0 ... exe -> /usr/sbin/cron
脆弱性をつくことにより、悪意ある攻撃者がrunCプロセスのこのシンボリックリンクである/proc/xxx/exe
を実行させることで冒頭で述べたルートによるコマンド発行に繋げていくようです。
終わりに
まとめると「runCの脆弱性」とは
- Dockerで利用されているrunCという技術の脆弱性により
- 悪意あるコンテナを起動するとrootでコマンド実行されてしまう
というあたりを覚えておけば、話にはついていけると思います。
以上、ご参考になれば幸いです。