シンボリック実行および
Concolic Testing の手法を用いた
JavaScriptプログラムのテストケース
自動生成手法の検討および実装

2019-09-26 東京大学工学部電気電子工学科
2019年度卒業論文中間審査報告スライド

坂井・入江研究室 学部4年 高橋光輝

Agenda

  • 背景
  • 提案手法
  • 評価

背景

​近年、ソフトウェアセキュリティ及びソフトウェア
テスティングの観点から、シンボリック実行を用いた
静的解析の手法が注目されている。

  • ソフトウェアセキュリティ関連
    • Angr [Shoshitaishvili, 2016]
    • Driller [Stephens, 2016]
  • ソフトウェアテスティング関連
    • KLEE [Cader, 2008]
    • CREST [Burnim, 2008]
    • SAGE [Godefroid, 2008]
    • SPF [Păsăreanu, 2010]

背景

  • ​これら既存のシンボリックな解析手法は、多くが
    CやJavaなどの静的にコンパイルされる言語を
    対象としたものである。
  • しかし、特にウェブセキュリティなどの分野においては
    RubyやPythonなどのスクリプト言語や
    ブラウザで動作するJavaScriptなどの言語を
    解析できることが望ましい。
  • 本研究ではその中でも特にJavaScript言語に対する
    シンボリック実行、およびそれに基づく
    テストケースの自動生成について研究を進める。

テストケース自動生成

  • プログラムの関数に対する入力を生成する
  • プログラムに対して完全なコード網羅率を
    達成することが目的
  • とりわけシンボリック実行を用いた手法では、
    プログラム上の分岐を制約条件として記述することで、
    分岐を網羅するような条件を計算によって求める
function abs(n) {
  if (n > 0) {
    return n;
  }
  if (n < 0) {
    return -n;
  }
  return 0;
}
assert(abs(100) === 100);

assert(abs(-10) === 10);

assert(abs(0) === 0);

図1: 与えられたプログラム (左) に対してコードを網羅するようなテストケースの例 (右)

JavaScriptの特徴 (1)

  • JavaScriptはCやLLVMのような静的な言語でないため
    副作用が多く厳密な解析が難しい一方で、Rubyのように
    メタプログラミング的手法が用いられることが少ない。
    • Rubyに対するシンボリック実行の先行研究[Chaudhuri, 2010][Milicevic, 2014]では、
      プログラムからこれらメタプログラミング的挙動を
      除去することに多くの労力を費やしている。

JavaScriptの特徴 (2)

  • ES2015で導入されたconstキーワードによる
    ブロックスコープ内定数が頻繁に用いられるという意味で
    RubyやPythonなどと一線を画している。
    • 限定的なシチュエーションではあるが、
      すべての変数がconst変数でありなおかつ
      immutableである場合、関数内のすべての
      ブロックは副作用がないと仮定することができる。

Agenda

  • 背景
  • 提案手法
  • 評価

提案手法

本研究では先行研究であるSymJSを下敷きとして、
SpiderMonkeyのバイトコードを用いて
先行研究を追試するとともに、新たな試みとして
TypeScriptの型情報を用いた改良を試みる。

提案手法

  • JavaScriptコードに対するシンボリック実行、および
    Concolic Testing の先行研究として、富士通研究所の
    SymJS [Li, 2014] が挙げられる。
  • SymJSでは、独自の SMT Solver [Li, 2013] を用いて、
    Rhinoのバイトコードに対してシンボリックな
    解析が行われている。

[Li, 2014] より引用

提案手法

  • 生のJavaScriptコードではなく変換後のバイトコードに
    対して解析を行うのはシンボリック実行に置いて重要な
    命令の原子性を維持するという点からも妥当である。
  • しかし解析対象のJavaScriptエンジンにRhinoを用いるのは
    速度面や最新仕様への追従といった観点から疑問が残る。
  • また富士通研究所により「JavaScriptランタイムエンジンから
    Javaバイトコードへの変換を用いたシンボリック実行」
    という内容で特許が取得されている (US9038032B2)。

Rhinoのパース性能

  • Rhinoのパーサー性能を検証するため、JavaScriptの著名なリポジトリに対して
    実際のプロジェクトに含まれるJavaScriptファイルがパース可能か実験を行った
  • 対象は Node.js, jQuery, npmの参照数上位5件のモジュール
  • RhinoはECMAScriptの最新の仕様への追従が追いついていないため、
    特にNode.jsの標準ライブラリのような新しい文法が積極的に用いられる
    プロジェクトでは、Rhinoを用いたプログラムの検証は実質的に不可能
リポジトリ Rhino
nodejs/node 29/182 (15.93%)
jquery/jquery 172/177 (97.18%)
lodash/lodash 1/702 (0.14%)
chalk/chalk 2/15 (13.33%)
request/request 74/74 (100.00%)
tj/commander.js 63/71 (88.73%)
facebook/react 216/1183 (18.26%)

表1: プロジェクトに含まれるJavaScriptファイル数に対するパース可能なファイル数の割合

提案手法 (1)

  • 本研究では、Rhinoではなく、Firefoxで採用されている
    JavaScriptエンジン、SpiderMonkeyのバイトコードを用いて
    シンボリック実行を試みる。
  • 第一に先行研究の追試を行い、SpiderMonkeyと
    既存の SMT Solver を組み合わせたシンボリック実行が
    実用的かどうかを確かめる。

SpiderMonkeyによるパース性能向上

  • 特にNode.jsの標準ライブラリなどに対してパース性能の向上が見られた
リポジトリ Rhino SpiderMonkey
nodejs/node 29/182 (15.93%) 174/182 (95.60%)
jquery/jquery 172/177 (97.18%) 176/177 (99.44%)
lodash/lodash 1/702 (0.14%) 1/702 (0.14%)
chalk/chalk 2/15 (13.33%) 8/15 (53.33%)
request/request 74/74 (100.00%) 74/74 (100.00%)
tj/commander.js 63/71 (88.73%) 71/71 (100.00%)
facebook/react 216/1183 (18.26%) 347/1183 (29.33%)

表2: プロジェクトに含まれるJavaScriptファイル数に対するパース可能なファイル数の割合

提案手法 (2)

  • また、[Tanida, 2015] において、
    動的に型付けされたJavaScriptコードに対して
    適切な型アノテーションを手動で付与することで
    シンボリック実行の精度を向上させられる可能性が
    示唆されている。
  • 本研究では、発展的手法として、
    TypeScriptの型情報を用いて、これらの型アノテーションを
    半自動的に解析に適用する方法についても試みる。
  • TypeScriptの型推論機能により開発者は型アノテーションの
    労力を大幅に下げることができることに加え、
    付与した型情報の整合性を実際のプログラムに即して
    統一的に検証することができる

先行研究との比較

  • シンボリック実行を初めてJavaScriptのテストケース自動生成に導入した
    SymJS [Li, 2014] が主な先行研究である。
    • [Tanida, 2015] はSymJSに手動の型アノテーション (JSDoc) を付与することにより
      カバレッジの向上を目指した。
    • 本研究は型アノテーションにTypeScriptの型情報および型推論機能を補助的に
      用いることでより実用的なツールとなることを目指すものである。

[Andreasen, 2017] より引用

Agenda

  • 背景
  • 提案手法
  • 評価

評価手法

  • 先行研究 [Li, 2014] 同様、JavaScriptテストスイートに対して
    自動的に生成されたテストケースによるコードカバレッジを
    評価指標として用いる。

[Li, 2014] より引用

評価手法

  • 先行研究が比重を置いている、DOM API に対する
    シンボリック実行に関しては、開発にかかる工数から
    一旦スコープから外し、これらに関しては評価対象外とする

[Li, 2014] より引用

まとめ

まとめ

  • 近年注目されているシンボリック実行の解析手法を
    JavaScriptのプログラムに適用する
  • 具体的には、SymJSを下敷きにSpiderMonkeyを用いた
    実装を行い、テストケースの自動生成を行う
  • さらに、TypeScriptによる型アノテーションを用いて
    シンボリック実行の精度を向上させる実験を行う

References (1)

  • [Shoshitaishvili, 2016] Shoshitaishvili, Yan, et al. "Sok:(state of) the art of war: Offensive techniques in binary analysis." 2016 IEEE Symposium on Security and Privacy (SP). IEEE, 2016.
  • [Stephens, 2016] Stephens, Nick, et al. "Driller: Augmenting Fuzzing Through Selective Symbolic Execution." NDSS. Vol. 16. No. 2016. 2016.
  • [Cader, 2008] Cadar, Cristian, Daniel Dunbar, and Dawson R. Engler. "KLEE: Unassisted and Automatic Generation of High-Coverage Tests for Complex Systems Programs." OSDI. Vol. 8. 2008.
  • [Burnim, 2008] Burnim, Jacob, and Koushik Sen. "Heuristics for scalable dynamic test generation." Proceedings of the 2008 23rd IEEE/ACM international conference on automated software engineering. IEEE Computer Society, 2008.
  • [Codefroid, 2008] Godefroid, Patrice, Michael Y. Levin, and David A. Molnar. "Automated Whitebox Fuzz Testing." NDSS. Vol. 8. 2008.
  • [Păsăreanu, 2010] Păsăreanu, Corina S., and Neha Rungta. "Symbolic PathFinder: symbolic execution of Java bytecode." Proceedings of the IEEE/ACM international conference on Automated software engineering. ACM, 2010.
  • [Saxena, 2010] Saxena, Prateek, et al. "A symbolic execution framework for javascript." 2010 IEEE Symposium on Security and Privacy. IEEE, 2010.
  • [Li, 2014] Li, Guodong, Esben Andreasen, and Indradeep Ghosh. "SymJS: automatic symbolic testing of JavaScript web applications." Proceedings of the 22nd ACM SIGSOFT International Symposium on Foundations of Software Engineering. ACM, 2014.
  • [Mirshokraie, 2015] Mirshokraie, Shabnam, Ali Mesbah, and Karthik Pattabiraman. "Jseft: Automated javascript unit test generation." 2015 IEEE 8th International Conference on Software Testing, Verification and Validation (ICST). IEEE, 2015.

References (2)

  • [Li, 2013] Li, Guodong, and Indradeep Ghosh. "PASS: string solving with parameterized array and interval automaton." Haifa Verification Conference. Springer, Cham, 2013.
  • [Deng, 2007] Deng, Xianghua, and John Hatcliff. "Kiasan/KUnit: Automatic test case generation and analysis feedback for open object-oriented systems." Testing: Academic and Industrial Conference Practice and Research Techniques-MUTATION (TAICPART-MUTATION 2007). IEEE, 2007.
  • [Andreasen, 2017] Andreasen, Esben, et al. "A survey of dynamic analysis and test generation for JavaScript." ACM Computing Surveys (CSUR) 50.5 (2017): 66.
  • [Chaudhuri, 2010] Chaudhuri, Avik, and Jeffrey S. Foster. "Symbolic security analysis of ruby-on-rails web applications." Proceedings of the 17th ACM conference on Computer and communications security. ACM, 2010.
  • [Milicevic, 2014] Milicevic, Aleksandar, Ido Efrati, and Daniel Jackson. "αRby—An embedding of Alloy in Ruby." International Conference on Abstract State Machines, Alloy, B, TLA, VDM, and Z. Springer, Berlin, Heidelberg, 2014.
  • [Tanida, 2014] Tanida, Hideo, et al. "Automatic unit test generation and execution for javascript program through symbolic execution." Proceedings of the Ninth International Conference on Software Engineering Advances. 2014.
  • [King, 1976] King, James C. "Symbolic execution and program testing." Communications of the ACM 19.7 (1976): 385-394.

シンボリック実行および Concolic Testing の手法を用いたJavaScriptプログラムのテストケース自動生成手法の検討および実装

By Koki Takahashi

シンボリック実行および Concolic Testing の手法を用いたJavaScriptプログラムのテストケース自動生成手法の検討および実装

2019-09-26 東京大学工学部電気電子工学科 2019年度卒業論文中間審査報告スライド

  • 1,469