Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

Linuxのカーネルに潜む脆弱性をつぶすパッチ

実例で学ぶ脆弱性対策コーディング 第5回

  • LINEで送る
  • このエントリーをはてなブックマークに追加

 本連載では、脆弱性を含むサンプルコードを題材に、修正方法の例を解説していきます。今回はLinuxカーネルのソースコードに注目してセキュリティコードレビューを行いたいと思います。

目次

 今回はLinuxカーネルのソースコードに注目してセキュリティコードレビューを行いたいと思います。Linuxのカーネルはネタの宝庫!といってもよいほど数多くの脆弱性が発見・修正されており、NIST(米国国立標準技術研究所)のNational Vulnerability Databaseで「Linux kernel」をキーワードに単純に検索するだけでも過去に624件の脆弱性が見つかっていることが分かります(執筆時点)。また、2010年は既に42件の脆弱性が登録されています。

サンプルコード

 以下のコードはLinuxカーネル2.6.30のdrivers/net/tun.cから抜粋したものです。それでは、このコードのどこに問題があるか考えてみましょう。

/* Poll */
static unsigned int tun_chr_poll(struct file *file, poll_table * wait)
{
        struct tun_file *tfile = file->private_data;
        struct tun_struct *tun = __tun_get(tfile);
        struct sock *sk = tun->sk;
        unsigned int mask = 0;

        if (!tun)
                return POLLERR;

        DBG(KERN_INFO "%s: tun_chr_poll\n", tun->dev->name);

        poll_wait(file, &tun->socket.wait, wait);

        if (!skb_queue_empty(&tun->readq))
                mask |= POLLIN | POLLRDNORM;

        if (sock_writeable(sk) ||
            (!test_and_set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags) &&
             sock_writeable(sk)))
                mask |= POLLOUT | POLLWRNORM;

        if (tun->dev->reg_state != NETREG_REGISTERED)
                mask = POLLERR;

        tun_put(tun);
        return mask;
}

 Linuxのtunデバイスはソフトウェア的にネットワークインターフェイスを実現するもので、VPNの実装などに使われています。上に挙げた関数tun_chr_poll()はtunデバイスに対してpoll()システムコールをかけたときに呼び出される関数です。tunデバイスが生きていることを確認した後(if(!tun)という行)、tunデバイスの状態に応じてPOLLINやPOLLOUTなどのビットマスクをローカル変数maskに設定していき、最後に関数自体の返り値としています。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

バックナンバー

連載:実例で学ぶ脆弱性対策コーディング

もっと読む

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5