ほとんどのLinuxユーザーは、「ルート」を聞くと、コンピューターで可能な最大の特権について考えます。 rootがリング0で実行されていると考える人もいます。しかし、実際には、rootはリング3で実行されている通常のユーザーですが、カーネルが信頼するユーザーです(多くの機密カーネル操作は、if (!uid_eq(current_uid(), GLOBAL_ROOT_UID)) return -EPERM;
の行に沿ったチェックで保護されています)不正使用を防ぐため、uid != 0
の場合にエラーが返されます。
ほとんどのLinuxシステムでは、カーネルはrootを非常に信頼しているため、カーネルを簡単に悪用して、リング0に自由にアクセスできます。ただし、grsecurityやSELinuxなどのセキュリティツールを使用すると、ルートの危険な機能を減らし、カーネルレベルでこれらの制限を適用することで、これを防ぐことができます。
Rootがカーネルを悪用してカーネルモードとリング0にアクセスできる方法の一覧を列挙したいと思います。これまでのところ、これらは、これが発生する可能性があると私が考えた、または学んだ方法です。
ioperm()
およびiopl()
は、I/Oポートの許可を設定でき、カーネルが存在するメモリを含むメモリの任意の領域に書き込むために悪用される可能性があります。これらのsyscallは、syscallテーブルから削除するか、grsecurityを使用して無効にすることができます。/boot
内またはブロックデバイスを介してカーネルイメージを変更できます。 MACは、これらの両方へのルートのアクセスを制限できます。/dev/{k,}mem
は、rwが任意のメモリにアクセスできるように設計されています。これらは、grsecurityを使用するか、MACを使用して、カーネル構成で完全に無効にすることができます。kexec
を使用すると、rootはブートする代替カーネルを選択できます。これはオプションのカーネル機能であるため、kexec
をサポートせずにカーネルをコンパイルするだけで問題ありません。sysfs
は、多くのハードウェアへの低レベルのアクセスを提供します。これにより、多くの脆弱なシステムでロックダウンが不十分なBIOS/UEFIをハイジャックして、リング0またはリング-2のアクセスを取得できます。 MACは/sys
へのアクセスを制限でき、さまざまなツールがUEFI/BIOSの脆弱性を検出できます。明らかに、私はrootのチェーンから抜け出す可能性のあるすべての可能な方法をブラックリストに載せようとするのではなく、rootの最小特権のプリンシパルを使用します。カーネルの信頼を悪用する可能性のあるすべての方法を理解することは、それが依然として非常に有用であるという事実、および興味深いを変更することはありません。
そして、それが私の質問をもたらします:rootが0daysを使用せず、opsecのミスを利用せずにリング0にアクセスするために使用できる他の方法はありますか?
私はこれらを考えることができます: