3

ポインターが、ドライバーがインターフェースの一部として期待/指定したものとは異なるタイプ/サイズのポインターを使用してioctl呼び出しを発行するユーザースペースアプリから保護するために、ドライバーは何を防御的に実行できますか。

たとえば、IOCTL xは(struct foo *)を期待しますが、呼び出し元は(unsigned long)((struct bar *)&bar)でそれを発行します。copy_from_userはシステムの安定性を爆破/危うくしますか?

たぶん1つの方法は、呼び出し元がCAP_SYS_ADMINを持ち、暗黙の信頼を持っていることを期待することですが、別の/より良い方法はありますか?

ありがとう。

4

1 に答える 1

4

copy_to/from_uservoidポインターを使用します。これは、渡すデータ型を認識しないことを意味します。そして、あなたの例を考えると、彼らがデータ型を知っていたとしても、あなたはまだあなたのユーザーを信頼することはできません:彼は単にあなたが望むタイプにキャストすることができます:

struct bar *x;
copy_to_kernel_aware_of_foo((struct foo*)x);

呼び出し元に何らかのroot権限または機能があることを期待しても、問題は解決しません。rootは、間違いを犯したり、悪意を持ったりする可能性もあります。

少し役立つことがあります:

  • copy_to/from_user型指定されていないバイトバッファをコピーするためにのみ使用します。複雑なデータ構造の同じ概念を持つカーネルとユーザースペースに依存しないでください。
  • データ型が誤って間違っていることだけを心配している場合は、データ構造にタグを付けて、「実際の」データの間にいくつかの魔法の値が含まれるようにすることを検討してください。ただし、これは、発信者が意図的にデータを偽造することに対しては役立ちません。
  • 攻撃対象領域に関しては、攻撃者はおそらく間違ったデータ型を渡してあなたを攻撃するのではなく、間違った値を提供します。ユーザースペースから渡されたすべてのデータを適切に検証する以外に、役立つことは何もありません。チェックせずに何も信用しないでください!
于 2012-08-17T18:02:03.667 に答える