web-dev-qa-db-ja.com

USBへの物理的アクセスによる攻撃(DMA ...?)

かなり安全なコンピュータに物理的にアクセスできる人がUSBを悪用できるのではないかと思います。たとえば、キオスク、または机に接続されたラップトップ。

明らかに、起動シーケンスは安全でなければなりません(BIOS/UEFIが「内部ディスクのみ」に設定され、パスワードで保護されています...)。また、マウントオプションはnodev,nosuid,noexecで制限する必要があります。また、ファイルはウイルス対策/マルウェア対策で分析する必要があります。 .. 等々。

私は DMA攻撃 のようなエクスプロイトについて本当に心配しています。この場合、ユーザーはメモリ内の情報を抽出するためにUSBデバイスを接続する必要があります。

マウスとキーボードを引き続き許可し、攻撃対象を減らすために無効にできる機能はどれですか?

11
Franklin Piat

始める前に、USBの動作について簡単に説明します。 USBデバイスは、コンピューター内のUSBホストコントローラーと呼ばれるハードウェアに接続します。これは、TCPなどのネットワークプロトコルと同様に、パケット、チェックサム、SYNやACKなどに相当する複雑なUSBプロトコルをデコードします。USBホストコントローラーは、接続されている個々のUSBデバイスをデコードし、オペレーティングシステムに提示します。必要に応じてそれを解釈できます(たとえば、ブロックデバイス、マウス、またはダイヤルアップモデムとして、名前を付けます)。 USBコントローラ自体は、PCIを介してPCH(リレーステーションのようなもの)に接続します。かさばるPCIスロットではありませんが、それでもPCIです。 USBコントローラーは、システムでlspciの出力を見て、USBについて言及しているときに表示されます。おそらくいくつかのUSBコントローラがあり、それぞれがPCIを介してPCHに接続されています。 PCHはCPUに接続します。 this USBコントローラの構造の非常に優れたグラフィカルな説明があるStack Exchangeの投稿を参照してください。

次に、可能なタイプの攻撃を3つの部分に分けましょう。

意図的な動作

ほとんどのLinuxディストリビューションは、ファイルシステムを備えたUSBデバイスを自動マウントします。デフォルトで有効になっていることはめったにありませんが、自動実行機能を備えているものもあります。これは、昔のWindowsの問題であり、Linuxの問題ではありませんでした。ただし、USB 3.1はDMAをサポートしているため、それを避けたい場合があります。デフォルトでは無効になっていると思いますので、大きなリスクではありません。 USBコントローラが許可していることに注意してください。

悪用ソフトウェア

パーティションテーブル解析コードに複数の脆弱性のインスタンスがあり、USBスティックをプラグインするだけで、特別に設計されたが破損したパーティションテーブルを介してシステムを悪用することができます。それはかなりまれですが(私が知っているのは、任意のコード実行が可能な2つだけです)、ファイルシステムの自動マウントの脆弱性は、非常に複雑なファイルシステムであることを考えると、はるかに一般的です。大量の構造を解析し、パフォーマンスを最優先します。そのため、必要でない限り、サニティチェックは行われません。これにより、脆弱性の数が増加します。しかし、これらのいずれにも影響を受けていない場合でも、お気に入りのデスクトップ環境と、サムネイル生成などのフォルダーコンテンツの表示を管理する方法には多くの脆弱性があります...つい最近、ffmpegにそれを可能にする脆弱性がありました任意のサーバーへの電話ホーム、およびその前に、任意のコード実行を許可するlibpngの脆弱性。

ハードウェアの悪用

これは、はるかに恐ろしく、緩和するのが最も難しいことです。 (ほとんどの)USBプロトコルはDMAを許可せず、デフォルトではDMAを許可しませんが、USBコントローラーはPCIを介してPCHに接続され、DMA機能があります。USBコントローラーは、もちろん、悪を行うこと、そしてプロトコルに従うことを拒否した場合、それが意味のあるUSBデバイスにfsckをオフにするように通知することを約束しますが、不正なUSBデバイスによってコントローラーがハイジャックされ、パケットが破損している可能性があります。プロトコルを制御できるようになると、完全にDMAになり、必要な処理をすべて実行できます。これを防ぐ唯一の方法は、IOMMUを使用してPCIデバイスを分離することです。いくつかの方法があります。これを行うには、Qubes OSを使用しますが、その欠点はいくつかありますが、このようなハードウェアの攻撃から保護するように特別に設計されています。あるいは、創造的な方法で作成することもできます。私は自分の小さな起動可能なLinuxディストリビューションを作成しました。 QEMU/KVM、VFIOと呼ばれるテクノロジー、usbipと呼ばれるドライバー、およびいくつかのカスタムsと組み合わせて使用問題を軽減するクリプトとプログラム。ただし、IOMMUを使用して保護する場合は、それが割り込みの再マッピングをサポートしていることを確認してください。それ以外の場合は、かなり簡単にバイパスでき、セキュリティ上の利点はほとんどありません。

USB 3.0は特に問題となる可能性があります。 3.1がDMAでホストがOKと言ったときにカーネルの外で実行することを許可することについて話しているのではありません。USB3.0は、Intel Management Engineのように、BIOSでバイナリblobとして実行されます。 this および this 。これには非常に大きな攻撃対象領域があり、USBホストコントローラーハードウェアのすでに大きな表面領域に追加されます。多くのBIOSでは、通常、 「xHCIコントローラー」のような名前です。これを実行すると、すべての3.0ポートが2.0ポートに効果的に変換されて速度が低下しますが、セキュリティは少し向上します。偏執的なセキュリティの観点から、1.0は良くない、2.0は悪い、3.0は悪夢。

Linuxカーネルのセキュリティを大幅に向上させる多数のセキュリティ機能を備えたgrsecurityと呼ばれるカーネルパッチがあります。セキュリティ機能の1つは、「新しいUSBデバイスへのアクセスを拒否する」ことです。一方向の設定を切り替えた後、または起動後に、すべての新しいUSBデバイスはアクセスを許可されなくなります。 USBデバイスを処理する複雑で潜在的に脆弱なカーネルコードはすべて無効になっています。最初の2つの問題を完全に軽減しますが、残念ながら3番目の問題を軽減することはできません。カスタムカーネルをコンパイルしてUSBドライバーを削除しても、3番目の問題は軽減されません。

12
forest