シンボリック実行および
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]では、
プログラムからこれらメタプログラミング的挙動を
除去することに多くの労力を費やしている。
- 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の型情報および型推論機能を補助的に
用いることでより実用的なツールとなることを目指すものである。
- [Tanida, 2015] はSymJSに手動の型アノテーション (JSDoc) を付与することにより
[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,601