web-dev-qa-db-ja.com

再利用攻撃防御(RAP)はどのように機能しますか?

grsecurity 人々 リリースされたばかり を含む4.5 Linuxカーネルのテストパッチ 差出人住所 リターン指向プログラミング(ROP)に対する保護技術である再利用攻撃保護(RAP)。

彼らの slides は、現時点では理解できません。誰かが簡単に言えば、RAPの仕組みとそれが提供する保護の程度(確率的)か)を説明できますか?

編集:スライドでRAPは「Return Address Protection」の略で、Brad Spenglerはgrsecurityチームは、それが実際に「再利用攻撃保護」のためであることを確認しました(これも 多項式の回答 で確認されています)。

5
jotik

RAPは、ROPを防ぐように設計されていることを除いて、スタックカナリアと非常に似ています。

[〜#〜] edit [〜#〜]:grsecurityの消費者と話した後、ここで説明しているのはRAP機能のサブセットであることがわかりました。具体的には、戻りポインタの保護。 RAPは、実際には「再利用攻撃保護機能」と呼ばれ、あらゆる形式の間接呼び出しから保護するように設計されています。リンクしたペーパーでは、RAP内の機能の一部について説明しています。RAPには、リターンポインター保護機能とICFG機能の両方が含まれています。

紙から次のアセンブリを見ることができます:

Push %rbx
mov 8(%rsp),%rbx
xor %r12,%rbx
...
xor %r12,%rbx
cmp %rbx,8(%rsp)
jnz .error
pop %rbx
retn
.error:
ud2

そこでの最初のブロックはRAP cookieをセットアップします:

; store the old value of rbx
Push %rbx
; read the top value on the stack (the return pointer) and put it in rbx
mov 8(%rsp),%rbx
; xor rbx with a random value stored in r12
; rbx now contains the RAP canary
xor %r12,%rbx

次に、関数の最後で、retの前に、

; xor the RAP canary in rbx with the random value in r12
; this "decrypts" the stack pointer from the RAP canary
xor %r12,%rbx
; compare the top value on the stack (the return pointer)
; with the value decrypted from the RAP canary
cmp %rbx,8(%rsp)
; if the comparison fails, jump to error
jnz .error
; restore the original value of rbx
pop %rbx
; return
retn
.error:
; an error occured, quit the process
ud2

ROPの背後にある考え方は、必要な命令(ガジェット)の後に戻り命令が続くということです。この保護機能は、各リターンの前の最後の命令が常にpop %rbxになるように関数を書き換え、以前の命令を使用してRAPカナリアを検証します。これにより、整列されていない命令の外側にあるROPガジェット(つまり、通常の整列の外側にある命令のバイナリ解釈のためにたまたま存在するガジェット)を見つけるのが非常に難しくなります。

保護は、ユーザーモードとカーネルの両方に適用できます。 Cookie値(%r12の値)は、タスクごと、システムコールごと、および一部の無限ループ(イベントハンドラーやディスパッチループなど)の反復ごとに再生成されます。 最後の理由は、無限ループはしばしばretを使用してループから抜け出すためです。 (これはまったく正しくありません)。

編集:これについて支出者と話し合った後、説明が出るのを待つことをお勧めします。この機能の動作には多くの微妙な点があり、紙とIRCに関する簡単な説明から正確に説明できるかどうかはわかりません。それが終わったら、この回答を更新して、それが何をするのかをよりよく理解できるようにします。

5
Polynomial