
Linuxカーネルptraceデバッグレジスタ破損(CVE-2018-1000199)の概念実証エクスプロイトであり、ブレークポイント仮想化における誤ったエラーハンドリングを示す。
Linuxのptraceコードはデバッグレジスタへのアクセスを仮想化しますが、その仮想化コードには誤ったエラーハンドリングがあります。つまり、例えばDR0に不正な値を書き込んだ場合、ptrace()呼び出しは-EINVALを返すにもかかわらず、カーネルのブレークポイント追跡の内部状態が破損する可能性があります。
例として、x86カーネルの/proc/kallsymsでdo_debugのアドレスを探し、そのアドレスを添付のPoCに渡すことができます。x86以外のアーキテクチャも影響を受ける可能性があると考えられますが、私はそれを悪用しようとはしていません。このバグ自体はカーネルの汎用コードおよびアーキテクチャ固有コードのあらゆる場所に存在します。
このバグを使った特権昇格の明白な方法は見つかっていませんが、存在する可能性はあります。例えば、このバグを使ってperf NMIハンドラを標的にすると、NMIスタックのオーバーフローを引き起こし、様々な形の破損を招く可能性があります。x86のブレークポイントの動作しか知らないため、非x86アーキテクチャへの影響は分析していませんが、バグの影響は大きく異なる可能性があります。
Linusは主に上流のコミット f67b15037a7a50c57f72e69a6d59941ad90a0f0f でこの問題を修正しました。このコミットを適用すると、エラーハンドリングは依然として誤っていますが、欠陥により不正なブレークポイントではなく無効なブレークポイントが発生するようになります。
http://man7.org/linux/man-pages/man2/ptrace.2.html
使用例: $ ./PoC.exe ffffffff81b44400