形式手法のこれまでとこれから
2019年が終わろうとしています あけおめ~さて2020年になりました。歴史が長い形式手法の今後を占うため、過去と直近の出来事を振り返りたいと思います。
ツッコミやタレコミは私のTwitter宛かあなたのブログかその他経路でお願いします~
シンボリック実行は形式的であるため本稿では形式手法に含めることにします。 Fuzzing関連はサーベイが甘いので漏れが多いかもしれません。
形式手法・形式検証とは
形式検証とは、厳密に定義された意味論の下で仕様やプログラムが所定の性質を満たすことを形式的に検証するための手法をいいます。「形式的に」とは、検証が事前に定義された知識だけに基づいており、検証手順が決定的であることをいうと私は理解しています。 形式手法は、形式検証に加えて、形式的にプログラムの仕様を厳密に定義するための手法を包含します。
本記事では形式手法を以下の通り大きく3つに独自に分類します。MECEであるかは自信ないです。私はそこまで専門家ではありませんのであしからず。
- セマンティクスベース
- プログラムの意味論に従って状態の変化を追跡する形式手法
- 型ベース
- 型に着目する形式手法
- モデル検査
- システムを有限の個の状態を持つモデルで表現し、各状態・各状態遷移間でシステムが満たすべき性質が満たされることを機械的に網羅的に検査する手法
- 本稿では扱いません
これまで
セマンティクスベース
シンボリック実行
シンボリック実行の歴史の概略と個人的に重要と思っている論文などは以下の通り。 詳細は https://github.com/enzet/symbolic-execution/blob/master/README.md や A Survey of Symbolic Execution Techniques (arXiv 2018) を参照するとよい。
- シンボリック実行の発明(1976年)
- Symbolic Execution and Program Testing (1976)
- SMTとシンボリック実行エンジンの勃興(~2015年)
- STP 2007年→KLEE 2008年→S2E 2011年
- z3 2008年→angr 2015年、Triton 2015年
- シンボリック実行の効率化に着手する研究が隆盛(~2010年後半)
- エクスプロイト生成に着目する研究が隆盛(2011~2016年)
- シンボリック実行✕ファジング=Hybrid Fuzzing(2012年~?)
- Hybrid Fuzz Testing: Discovering Software Bugs via Fuzzing and Symbolic Execution(修士論文 2012) ※Hybrid Fuzzingの発明
- Driller: Augmenting Fuzzing Through Selective Symbolic Execution (NDSS 2016)
- QSYM; A Practical Concolic Execution Engine Tailored for Hybrid Fuzzing (USENIX Security 2018)
- シンボリック実行の簡易化(2019年~?)
- Neuro-Symbolic Execution: Augmenting Symbolic Execution with Neural Constraints (NDSS 2019)
勘がいい人は列挙している論文の著者に David Brumley 氏が多く紛れていることに気づいたかもしれません。そういうことです(彼ブルドーザーかよ~高速地ならしゴゴゴゴ~😇
シンボリック実行の簡易化が今後盛り上がるかはわからんです。2020年のS&P, NDSS, USENIX を見れば分かるでしょう。
ニューラルネットワークの検証
シンボリック実行の適用領域について新しい動きも見られるようになりました。
Symbolic Execution for Deep Neural Networks (arXiv 2018)
- 判断に影響のある重要なピクセルの特定し、1, 2ピクセルのflippingで攻撃を生成
- ニューラルネットワークの構成からパス制約などを構築するっぽい
- ソルバーはz3
- アブストを見た限り、Symbolic Execution for Attribution and Attack Synthesis in Neural Networks (ICSE 2019) と同じっぽい
Concolic Testing for Deep Neural Networks (ASE 2018)
プログラムの実装の正しさを形式検証(定理証明)
プログラムに対する事例は以下の通りです。この辺の話は形式検証では既定路線ですね。
-
- プログラムのモデル記述にOCamlを採用している模様 https://docs.imandra.ai/imandra-docs/notebooks/welcome/
- 記述したモデルが与えた仕様を満たすかを検証する
- 商用製品であり、Reasoning Engineがオンラインにあるため実装の詳細が不明
ブロックチェーンに対する事例は以下の通りです。これは想像ですが、ブロックチェーンで形式手法が積極的に取り入れられている理由は、一度導入されてしまうとバグによって生まれた不正な結果の取り消しが困難であり、金と時間をかけた従来型のテストを行ってもユーザーにそのコストを払ってもらうことは非現実的であるため安価に品質保証できる手法が求められている、といったところでしょうか。
IsabelleによるCBC CasperのSafetyの証明をしました - The curse of λ (2019/4/24)
https://scrapbox.io/layerx/Formal_verification_of_cryptographic_protocols
- LayerXの方がブロックチェーン✕Formal Methodの事例をまとめている
並列計算や分散システムに対する形式検証(定理証明)
2018年から私の目に入るようになったのが、並列計算や分散システムに対する形式検証です。産業系の場で取り組みの成果の共有が多くありました。
Alloyを用いた事例
- 形式手法を使って、 発見しにくいバグを一網打尽にしよう - Speaker Deck (2019/8/30)
- 社内のゲーム開発用のツールに対して、形式仕様記述をAlloyで、モデル検査をPromelaで行った話。WIP。
- 形式手法を使って、 発見しにくいバグを一網打尽にしよう - Speaker Deck (2019/8/30)
Verdiを用いた事例
- テスト駆動開発から証明駆動開発へ #JTF2019 / July Tech Festa 2019 - Speaker Deck (2019/12/8)
- 分散システムのメッセージングアルゴリズムに対してVerdiを適用する例を解説
- テスト駆動開発から証明駆動開発へ #JTF2019 / July Tech Festa 2019 - Speaker Deck (2019/12/8)
Behavioural Types を用いた事例
- 君の並行処理は実行するまでもなく間違っている #golangtokyo / golang.tokyo 20th - Speaker Deck(2018/12/18)
Go のチャネルによる並行処理は強力で魅力的な機能ですが、同時にバグが発生しやすくかつ発見しづらい部分でもあります。この論文では、Go プログラムからその挙動を形式的に記述した振舞い型 (behavioural types) を抽出することで、並行処理に潜むバグを静的に検出する手法が提案されています。
- 君の並行処理は実行するまでもなく間違っている #golangtokyo / golang.tokyo 20th - Speaker Deck(2018/12/18)
型ベース
BPF
BPFはプログラムが安全であることを検証するための検証器を持っています。検証器は型をベースに実装されています。
cf. BPFプログラムの作成方法、BPFの検証器、JITコンパイル機能 (2/3):Berkeley Packet Filter(BPF)入門(3) - @IT
これから
私が気になっているテーマや動きをまとめていきます。
(継続?)シンボリック実行とランダムテストの中間を攻める新しいソルバーの登場
2019年時点では、シンボリック実行エンジンの実装や、シンボリック実行の効率化に着手する研究やシンボリック実行だけでクスプロイト生成に着目する研究は落ち着いた(オワコン化)したように見えます。
エクスプロイト生成については、現在Fuzzingの文脈で語られることが多いため、今から研究する場合はFuzzingをメインとして行い、シンボリック実行は補助的に用いるのがいいかもしれません(が、QSYM という強力な解みたいのが出ているのできついかもしれません)。
シンボリック実行よりは処理が軽くて探索を効率化できるような手法として、私は型をベースにした何かが面白そうと感じていますが、どうですかね(サーベイしてない顔
(継続)ブロックチェーン✕形式手法
この組み合わせの盛り上がりは2020年以降もしばらく維持されると思います。
で、面白いのが、京大の末永先生(形式検証ガチ勢)やDaiLambda社たちに、Tezosから検証系の何かを開発するための助成金が下りたようです。ウォッチしたい動きですね。
https://tezos.foundation/news/tezos-foundation-issues-grants-for-tezos-smart-contract-projects
Led by Atsushi Igarashi, Ph.D., a professor at the Graduate School of Informatics, and Kohei Suenaga, Ph.D., an associate professor at the Graduate School of Informatics, the team will create an accessible development tool for these verification techniques and contribute to the growth of the Tezos ecosystem in Japan and the greater Asia region. Jun Furuse of DaiLambda and Tezos Japan collaborates with Kyoto University on this project.
(継続?)AIの学習済みモデルに対する形式検証
第三者がAIの品質を検証できるようにするという体は相変わらず今後維持されると思います。
関連研究が増加するとしたら、どんな成果が出てくるか私は想像がつかないですね…。面白いのが出てくるといいなぁ。
(継続)並列計算や分散システムに対する形式検証
このテーマは継続して取り組まれて、国内でゆるやかにコミュニティが出来上がってくるような気がしています。
私はこの辺をキャッチアップするのはまだできなそうなので、トピックを追うだけにしておこうと思います。
(継続?)形式検証を頑張る国内の会社の増加
形式検証を頑張る国内の会社の増加しました。国内で形式手法が盛り上がっていくといいですね。
- (継続?)DeNA
- ガチではなさそうだが継続しそう
- (継続)LayerX
- (新規)株式会社Proof Ninja(2019年設立)
proof ninjaは証明支援系Coqや関数型プログラミング言語OCamlを使って、確かなソフトウェアを提供します。 (会社HPより)
- 取引先がDaiLambdaなのでブロックチェーンがメインなのかしら
- ドワンゴから1000万円資金調達した [(株)proof ninjaが(株)ドワンゴから資金調達を実施 - にわとり小屋でのプログラミング](http://yosh.hateblo.jp/entry/2019/10/21/133617
- 社長のImaiさんが名大にいたらしいが、結縁研かな?
彼らからの情報発信は引き続き追っていきたいと思います。
気になっている個別トピック
挑戦的研究(萌芽)「数学の自動化を推進するための機械学習を用いた定理自動証明手法」が採択されました!がんばります.「数学の自動化」はだいぶ挑発的な言葉選びだったなあと反省していますが,実際は機械学習がどこまで自動証明タスクに強いかを見極めたい,という感じです.
— Kohei Suenaga (@ksuenaga) 2019年7月1日