Dockerコンテナーでアプリを実行しようとしています。アプリを実行するには、root権限が必要です。
Sudo docker run --restart always --network Host --cap-add NET_ADMIN -d -p 53:53/udp my-image
私の質問は、NET_ADMIN機能を--network Hostオプションと一緒に追加する場合のリスクは何ですか?.
攻撃者が何らかの方法でアプリからコード実行を取得できる場合、私はそれをrootとして実行しているので無制限の能力を持っているのですか、それともカーネルのネットワーク部分にしかアクセスできないのですか?もしそうなら、彼の攻撃面は何でしょうか(つまり、NET_ADMIN機能のみが設定されている私のホストOSでrootを獲得できますか?)
はい(場合によっては)。
CAP_NET_ADMIN
を使用すると、名前空間内の任意のネットワークデバイスでSIOCETHTOOL
ioctl()を使用できます。これには、ETHTOOL_FLASHDEV
、つまりethtool -f
などのコマンドが含まれます。
それがゲームです。以下の引用にもう少し説明があります。
commit 5e1fccc0bfac 、 "net:ネットワークスタックのコアのusernsルート制御を許可する"ので、SIOCETHTOOL
はすべてのネットワーク名前空間内で許可されます。それ以前は、「ルート」ネットワーク名前空間のCAP_NET_ADMIN
のみが可能でした。当時指摘されていたセキュリティ上の考慮事項のため、これは興味深いものです。私は カーネルバージョン5.0のコード を見て、次のコメントがまだ当てはまると思います。
Re:[PATCH net-next 09/17] net:ユーザーがネットワークスタックのコアをrootで制御できるようにします。
同じ理由で、user_nsごとの
CAP_NET_ADMIN
に基づいて、どのethtoolコマンドが許可されるかについて非常に選択する必要があります。開始を検討してください:
ETHTOOL_SEEPROM
=> NICをブリックETHTOOL_FLASHDEV
=> NICをブリックします。 IOMMUを使用していない場合はシステムを所有するこれらは、デフォルトで実際のハードウェアにアクセスできないことにより防止されます。物理ネットワークインターフェイスにアクセスするには、物理ネットワークインターフェイスをネットワーク名前空間に移動する必要があります。
はい、わかりました。問題は、物理的なネットデバイスが割り当てられている場合でも、コンテナー内の何かがそれらのことを実行できると期待するかどうかです。
実際には、コンテナを考慮せずに同じ問題があります-
CAP_NET_ADMIN
は、ハードウェアがネットワークハードウェアであるという理由だけで、ハードウェアを低レベルで制御する必要がありますか?これらのethtool操作の一部、および非標準のMDIOレジスタへのアクセスには、おそらく追加の機能(CAP_SYS_ADMIN
またはCAP_SYS_RAWIO
?)が必要になると思います。
lockdown 機能にも同様の問題があると思います。検索中に、結果にロックダウンパッチが表示されていることに気付きませんでした。ロックダウン機能のソリューションは、ロックダウンで署名されたカーネルモジュールのみが許可されるのと同様の、ある種のデジタル署名であると思います。
私はこれをあなたのコマンドに固有のより狭いケースとして分割しています-
Sudo docker run --restart always --network Host --cap-add NET_ADMIN -d -p 53:53/udp my-image
機能だけでなく、docker
コマンドもseccompの制限を課す必要があります。また、システム(SELinuxまたはAppArmor)で使用可能な場合は、LSMベースの制限が課される場合もあります。ただし、これらのいずれもSIOCETHTOOL
には適用されないようです。
seccomp-bpf
を使用してSIOCETHTOOL
をブロックできると思います。ただし、 dockerのデフォルトのseccomp構成 は、ioctl()呼び出しのフィルタリングを試みません。
そして、私が調べたカーネル関数にLSMフックがあることに気づきませんでした。
ベン・ハッチングスは良い点を作ったと思います。理想的な解決策は、これをCAP_SYS_RAWIO
に制限することです。しかし、あなたがそのようなものを変更し、あまりに多くの人々が「気づく」場合-つまり、それは彼らの設定を壊します-そしてあなたは怒っているLinusがあなたに向かって叫ぶことになります:-P。 (特に「セキュアブート」のためにこれに取り組んでいる場合)。その後、変更が元に戻され、最も醜いハックが何であるかがわかります。
つまりカーネルは下位互換性を維持するように強制され、ルート名前空間にCAP_NET_ADMIN
を持つプロセスを許可する場合があります。その場合でも、Dockerコマンドを保護するにはseccomp-bpf
が必要です。 (一部の)コンテナーのみを保護するため、この場合はカーネルを変更する価値があるかどうかはわかりません。また、docker
のようなコンテナランタイムは、デフォルトでSIOCETHTOOL
をブロックするように修正できます。それはLXC/systemd-nspawnのような「OSコンテナ」の実行可能なデフォルトでもあるかもしれません。