ioctlは実際にはカーネルに登録されません。ファイルのようなオブジェクトのタイプごとに、使用可能なioctlのセットが異なります。
ほとんどの場合、これらはswitchステートメントを使用して実装されます。
したがって、実際に行う必要があるのは次のとおりです。
- どのデバイス/ファイルタイプのセットがセキュリティに関連しているかを把握します-ルートによってのみ開くことができるデバイスは、おそらくルートエクスプロイトをチェックする必要はありません。
- 使用可能なioctlを調べます。
実際には、使用可能なioctlを見つけることは簡単ではありません。多くのデバイスには、それらをリストするマニュアルページがありますが、そうでないものもあり、リストは不完全である可能性があります。
通常、大きなswitchステートメントを持つ関数がどこかにあります。ただし、ある種の「継承」があり、多くのデバイスには、さまざまなレベルで実装されたいくつかの異なる種類のioctlがあります。
同じ「種類」のドライバーは通常、いくつかの異なるタイプのハードウェアに実装されており、多くの場合、かなり多くのコードを共有しています。
たとえば、シリアルポートには、http://lxr.linux.no/#linux+v2.6.35/drivers/serial/serial_core.c#L1107で定義されている独自のioctlがあります。
ただし、シリアルポートにはドライバーごとに定義されたioctlも含まれる可能性がありますが、それらはttyであるため、ttyioctlにも応答します。
サブシステムごとに動作が異なるため、サブシステムごとに構造が異なります。