SHARE Twitter Facebook はてなブックマーク LinkedIn

逃げるsyzbot、追うカーネル開発者たち

株式会社NTTデータ ニューソン
基盤サービス事業部 基盤ソフトウェアBU

主任 半田 哲夫

Linuxカーネルの品質向上を支えているsyzbotが、注目を集めてきている。その理由と、Linux 5.1で達成される小さな改善について紹介する。

■OSカーネルの品質を向上することが急務

Google社が開発したファジングテスト(※1)用システムであるsyzbotが、LinuxなどのOSカーネルの不具合をものすごい勢いで発見し続けて(※2)います。(図1) あまりにも次から次へと不具合を発見してしまうことから、Linuxカーネル開発者コミュニティでは、今年のエイプリルフールのネタ(※3)にされてしまったほどです。

図1:syzbotの動作イメージ

図1:syzbotの動作イメージ

「コンテナ」による仮想化方式(※4)では、「仮想マシン」による仮想化方式とは異なり、ゲストを動かすためのOSカーネルを使用しません。これは、アプリやミドルウェアの脆弱性により攻撃者に乗っ取られてしまった場合に、ホストを動かすためのOSカーネルに対して攻撃者がダイレクトに攻撃できてしまうことを意味しています。仮想マシンという隔壁が存在しない分、他のコンテナへの影響伝搬を防ぐために、ホストを動かすためのOSカーネルの品質を向上させることが求められます。 そのため、syzbotなどによるファジングテストを通じて不具合を発見するための努力と、発見された不具合を修正していくための努力が続けられています。

■問題が発生したことを捕捉するための小さな一歩

ファジングテストでは、普段行われないような動作を繰り返したり、普段指定しないような値を意図的に指定したりするので、大量のカーネルメッセージが出力されます。(図2) 問題が発生したかどうかを判定するためには、問題に関連したメッセージを確実に抽出できることが重要になりますが、大量のカーネルメッセージの海に埋もれてしまい、うまく抽出できませんでした。(図3)

図2:複数のスレッドが同時にカーネルメッセージを出力してしまうことがある。

図2:複数のスレッドが同時にカーネルメッセージを出力してしまうことがある。

図3:Linux 5.0までは、スレッド毎に分離できなかったため、解析に失敗することが多かった。

図3:Linux 5.0までは、スレッド毎に分離できなかったため、解析に失敗することが多かった。

2019年5月にリリースされるであろうLinux 5.1カーネルには、カーネルが出力するメッセージを機械的に処理しやすくするためのパッチ(※5)が採用され、問題に関連したメッセージを抽出する能力が飛躍的に向上(※6)します。(図4) syzbotが「問題が起きたようだけど何が起きたのかを理解できなかった」と報告していた状況が改善され、新しい不具合を発見し、原因となったパッチを特定する上で活躍することが期待されています。

図4:Linux 5.1からは、スレッド毎に分離できるようになるため、解析の成功率が向上する。

図4:Linux 5.1からは、スレッド毎に分離できるようになるため、解析の成功率が向上する。

syzbotをどんどん活用して、不具合の改善につなげ、OSカーネルの不具合に追い回されることのない未来(※7)を目指してみませんか?

  1. (※1)普通の使い方では用いられないような「予想外の入力値」を与えることで、入力値の検査やエラーハンドリングなどが適切に行われているかどうかを確認するための試験です。適切に行われていなかった場合、プロセスがハングアップしたりクラッシュしたりするなどの形で不具合が表面化します。
  2. (※2)syzbotが見つけたLinuxカーネルに対する不具合の内、未修正の不具合の一覧をhttps://syzkaller.appspot.com/upstream(外部リンク)から、修正済みの不具合の一覧をhttps://syzkaller.appspot.com/upstream/fixed(外部リンク)から参照できます。
    https://github.com/google/syzkaller/issues/491(外部リンク)によると、およそ1回/秒のペースでクラッシュが発生するほどの規模(並列度)で稼働しているようです。
  3. (※3)不具合報告の嵐を終わらせるために、ファジングテストを行うプロセスがファイルをオープンすることを拒否するパッチhttps://lkml.kernel.org/r/20190401090113.22946-1-jthumshirn@suse.de(外部リンク)が投稿されました。なお、エイプリルフールパッチなので、鵜呑みにしないようにご注意ください。
  4. (※4)注目を集める仮想化技術「コンテナ」、そのセキュリティ対策とは?
    http://www.nttdata.com/jp/ja/insights/blog/20190131.html
  5. (※5)printk: Add caller information to printk() output.
    https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=15ff2069cb7f967d(外部リンク)
  6. (※6)pkg/report: support CONFIG_PRINTK_CALLER
    https://github.com/google/syzkaller/commit/7da2392541a49c3f17b2e7d24e04b84d72b965fb(外部リンク)
  7. (※7)syzbotの能力が向上することで、ますますOSカーネル開発者たちがsyzbotに追い回されるようになるという説も…?

Profile

半田 哲夫
株式会社NTTデータ ニューソン
基盤サービス事業部 基盤ソフトウェアBU
主任 半田 哲夫

企画から保守まで一人で行う、プログラミング歴25年のプログラマ。
Linux向けアクセス制御モジュールTOMOYO Linux/AKARI/CaitSithの作者。
いろんなOSSプログラムの不具合を見つけては報告/修正している。