FEATURE: ANALYSIS OF REAL-WORLD JAVASCRIPT
Toward Analysis and Bug Finding in JavaScript Web Applications in the Wild
Sukyoung Ryu, Jihyeok Park, and Joonyoung Park,
Korea Advanced Institute of Science and Technology
// We present our journey to analyze and find bugs in JavaScript web applications in the wild. We describe technical challenges in analyzing them and our solutions to address the challenges via a series of open source analysis frameworks, the scalable analysis framework for ECMAScript (SAFE) family. //
an interpreter if the devices have a browser.
However, the expressivity and portability of JavaScript also intro- duce various errors and vulnerabili- ties, collectively known as bugs, in JavaScript web applications. Unlike statically typed languages, such as C and Java, JavaScript does not pre- vent type-related errors, such as call- ing functions with wrong numbers or wrong types of arguments, which results in frequent type-related er- rors by developers. In addition, be- cause JavaScript web applications often use third-party libraries on browsers, they are vulnerable to se- curity attacks.
Our long-term goal is to develop a tool that can analyze and detect bugs in real-world JavaScript web applica- tions. This article reports on our recent significant progress toward the goal, the SAFE family illustrated in Figure 1. We put the series of ef- forts into context, providing a big picture of the JavaScript analysis for practitioners. In the rest of this ar- ticle, we incrementally present each of the technical challenges and their proposed solutions, summarized in Table 1 using the SAFE family, share our experiences in both academia and industry, and discuss the current limitations and the path forward.
Analysis of JavaScript Programs
JavaScript has various characteris- tics that make program analysis es-
JavaScript Web Applications in the Wild
JavaScript was first developed as a sim- ple scripting language, and, now, it is the de facto standard language for web programming. It is highly expressive
Digital Object Identifier 10.1109/MS.2018.110113408 Date of publication: 16 April 2019
thanks to function values and dynamic code generation; JavaScript func- tions can take callback functions as their arguments, and they can gen- erate code to execute during evalu- ation. Also, JavaScript is extremely portable. It can run on any device, such as smart TVs or smart watches, without installation of a compiler or
pecially difficult. It does not have a compile-time type system. A JavaS- cript variable may have a value of any six types—undefined, null, Bool- ean, number, string, and object— at any point of program evaluation, and it may be implicitly converted to different types depending on its sur- rounding contexts, according to the
74 IEEE S O F T WAR E | PU BLI S H E D BY T H E I E E E CO M PU T E R S O CI E T Y 074 0 - 74 5 9 / 19 copy; 2 0 19 I E E E
FIGURE 1. Architectural overview of the SAFE family. API: application programming interface. DOM: Document Object Model.
CFG
Builder
CFG
Analyzer
SAFE
Abstract States
Bug Detector
Bug Report
JavaScript Code
Abstract Heap
SAFEWApp
HTML
Parser
DOM
Tree
Heap Modeler
SAFEWAPI
Heap Extractor
Platform Heap
Spec Parser
API
Info
Web App
API
Spec
language specification. Such behav- iors give much freedom to JavaScript developers, but at the same time, they often introduce type-related errors. JavaScript provides multiple ways to generate code at runtime; several functions, such as eval, take string arguments that represent JavaScript code, realize them at runtime, and run them. Because such dynamically generated code fragments are not available at compile time, they are not in the targets of static analysis. In addition, JavaScript is not statically scoped; one language construct, the with statement, introduces scopes dynamically, which is a challenge for static analysis. Because JavaScript programs use various libraries, such as jQuery, which use loops and first- class property names extensively, precise analysis of loops and string values becomes critical.
Table 1. An analysis of real-world JavaScript web applications via the SAFE family. |
||
Analysis Targets |
Technical Challenges |
Analysis Techniques |
JavaScript programs |
Dynamic code generation Dynamic scoping via with statements Join of analysis results for loops First-class property names |
Rewriting simple code with rewriting Loop-sensitive analysis Regular expression domain |
Web applications |
DOM objects and APIs Dynamic file loading |
Modeling DOM objects and APIs Analysis with dynamic browser information Analysis with dynamically loaded files |
Hybrid applications |
Platform APIs |
Modeling platform APIs API misuse detection |
Let us consider the JavaScript code in Figure 2 . The with state- ment on lines 7–9 shows that all of the properties in the object o (line 7)
become local variables within the body of the statement (line 8); thus, the names a, b, and c are dynamically introduced within the body of the statement. The eval function call on line 12 shows that the string literal rsquo;o[name] = o[name]();rsquo; becomes Java- Script code to evaluate at runtime.
Also, the for-in loop on lines 11–13 reveals that the property names of the object o are first-class values that are generated by iterati
剩余内容已隐藏,支付完成后下载完整资料
对Javascript Web应用程序中的分析和错误查找
Sukyoung Ryu, Jihyeok Park,Joonyoung Park,
韩国高级科学技术研究所
摘要:我们介绍了我们在分析和查找Javascript Web应用程序中的错误的旅程。我们通过一系列开放源代码分析框架(ECMAScript(SAFE)系列的可扩展分析框架)来描述分析它们时遇到的技术挑战和解决方案。
1 Javascript Web应用程序
Javascript最初是作为一种简单的脚本语言开发的,现在它已经成为Web编程的事实上的标准语言。由于函数值和动态代码生成,它具有很高的表现力;Javascript函数可以将回调函数作为参数,并且可以在评估期间生成要执行的代码。另外,Javascript是非常可移植的。它可以在任何设备上运行,如智能电视或智能手表,如果设备有浏览器,则无需安装编译器或解释器。
然而,Javascript的表现力和可移植性也引入了各种错误和漏洞,统称为缺陷,出现在Javascript Web应用程序中。与静态类型语言(如C和Java)不同,Javascript不预先排除与类型相关的错误,例如错误的调用函数或错误类型的参数,这会导致开发人员频繁地与类型相关的ER。此外,因为Javascript Web应用程序经常在浏览器上使用第三方库,它们容易受到安全攻击。
我们的长期目标是开发一种工具,可以分析和检测现实世界中的Javascript Web应用程序中的错误。本文报告了我们最近在实现这一目标方面取得的重大进展,如图1所示的安全家庭。我们将一系列的尝试放到上下文中,为从业者提供了一个Javascript分析的大图。在本文的其余部分中,我们将逐步介绍表1中总结的每一项技术挑战及其建议的解决方案(使用安全家庭),分享我们在学术界和工业界的经验,并讨论当前的局限性和前进的道路。
CFG生成器
CFG
分析器
安全的
抽象类States
缺陷Detector
缺陷Report
Javascript Code
抽象类Heap
安全应用程序
HTML
语法分析器
DOM
树
堆Modeler
安全应用程序
堆Extractor
网络Heap
制造Parser
API
信息
网页App
API
制造
图1 安全家庭的建筑概况 应用程序编程接口 dom:文档对象模型
表1.通过安全系列对真实的Javascript web应用程序进行分析。 |
||
分析指标 |
技术挑战 |
技术挑战 |
Javascript程序 |
动态代码生成 循环第一类属性名称的动态范围界定和语句连接分析结果 |
重写简单代码 改写 环敏感分析正则表达式域 |
互联网应用程序 |
DOM对象和API 动态文件加载 |
建模DOM对象和API 动态浏览器信息分析动态加载文件分析 |
混合应用 |
平台API |
建模平台API API误用检测 |
2 Javascript程序分析
Javascript有各种各样的特性,这使得程序分析特别困难。它没有编译时类型的系统。根据语言规范,Javascript变量在程序评估的任何时候都可以有六种类型的值:undefined、null、boolean、number、string和object,并且可以隐式转换为不同的类型,具体取决于它的舍入上下文。这样的行为给了Javascript开发人员很大的自由,但同时,它们常常引入与类型相关的错误。Javascript提供了多种在运行时生成代码的方法;一些函数,例如eval,获取表示Javascript代码的字符串参数,在运行时实现它们,然后运行它们。因为这种动态生成的代码片段在编译时不可用,所以它们不在静态分析的目标中。另外,Javascript不是静态作用域;一种语言结构WITH语句动态引入作用域,这对静态分析来说是一个挑战。因为Javascript程序使用各种库,例如jQuery,它广泛使用循环和一级属性名,所以对循环和字符串值的精确分析变得至关重要。
让我们考虑一下图2中的Javascript代码。第7-9行的附有声明表明对象o(第7行)中的所有属性都成为语句体(第8行)中的局部变量;因此,名称a、b和c在语句体中动态引入。第12行上的EVE函数调用显示字符串文字“o[No]=o[No](),成为运行时评估的Java脚本代码。此外,行11到13中的for循环显示了O对象的属性名称是通过O的正确性迭代生成的一级值。
为了解决在静态分析Javascript程序中的挑战,我们开发了一个用于Javascript安全的开源分析框架。图1中最里面的框给出了SAFE的体系结构概述。它需要一个Javascript程序,并像传统的程序分析框架那样处理它。此外,cfg builder将具有字符串文字参数的eval-like函数调用重写为参数所表示的Javascript代码,并以合理的方式用其他语言结构替换大多数语句。分析器使用抽象值根据抽象解释框架执行静态分析。它可以表示所有六种Javascript值类型,并为字符串分析提供循环敏感的分析和正则表达式域。因此,它可以分析图2中的代码,即使存在WITH语句、eval函数调用和for in循环,也可以使用第一类属性名。最后,缺陷检测器使用分析结果查找与类型相关的缺陷,例如导致Javascript中引用错误异常的未定义变量访问,以及导致类型错误异常的具有非函数值的函数调用。注意,SAFE提供了“可靠”的分析。例如,它不能分析参数不是字符串文本的eval函数调用。
37
38
39
36
35
34
32
33
29
30
31
28
27
25
26
24
23
22
19
20
21
17
18
16
15
13
14
12
11
9
10
8
7
6
5
4
3
1
2
webapis.calendar.ge tCalendars('EVENT', calendarListCallba ck);
calendars.map(c alendar =gt; calendar .type);
}
return elem. tagName. match(/^w /) === rsquo;DIV rsquo;;
/**** Analysis of Javascript Hybrid Applications ************* **/ function calendarListCallba ck(calendars) {
}
// wrong usage of rsquo;===rsquo;
function isDiv(elem) {
window. setTimeout(callback , 1000/ 60);
};
use strict;
// Old Ope ra
// IE
window .msRequestAnimationFrame ||
function (callback) {
window .oRequestAnimationFram e ||
window .mozRequestAnimationFrame || // FireFox
window .webkitRequestAnimationFrame || // Chrome , Ope ra
window .requestAnimationFrame ||
window .requestAnimationFrame =
eval(rsquo;o[name] = o[ name]();rsquo;);
/**** Analysis of Javascript Web Applications *******************/
}
for (name in o) {
a= f; b= g; c= h;
};
with(o) {
function h(){ return 2; }
var o={a: 0,b : 1,c :2 };
function g(){ return 1; }
function f(){ return 0; }
/**** Analysis of Javascript Programs ***************************/
图2一个名为sample.js的运行示例,用于分析实际的Javascript Web应用程序
3 Javascript Web应用程序分析
分析真实的JavascriptWeb应用程序的第一步是分析嵌入在HTML文档中的Javascript代码。Javascript程序通常在主机环境中执行,最广泛使用的主机环境是Web浏览器。网页或Web应用程序的HTML文档可能包含Javascript代码片段;Web浏览器将HTML文档结构表示为称为文档对象模型(DOM)的宿主对象,而DOM应用程序编程接口(API)提供了Javascript代码使用宿主对象的方法。因此,分析Javascript Web应用程序不仅需要了解Javascript语义,还需要了解DOM结构的含义以及DOM和Javascript之间的交互。此外,Web应用程序通常动态加载Javascript文件,并且在各种浏览器上运行的Javascript代码片段使用特定于浏览器的API,从而导致静态分析的不精确性。此外,Javascript Web应用程序通过事件处理功能与用户交互。Javascript事件函数可以作为HTML属性(如onload或onclick)注册到HTML文档中,并在程序执行期间通过addEventListener等函数进行注册。然后,用户可以异步调用Javascript事件函数。类似地,对于名义上生成的Java脚本代码和动态加载的文件,在程序执行之前,用户输入调用的事件函数调用是不可用的。因此,纯静态分析会从分析目标中漏掉它们,导致分析结果不准确。为了可靠地分析这些动态事件,大多数现有的静态分析程序都假定可以任何顺序调用任何事件函数。
再次考虑图2中的代码示例。由于不同的浏览器可能使用具有类似功能的不同API功能,如果全局函数requestAnimationFrame(第17行)尚未初始化(第18行),则它将初始化为特定于浏览器的API函数(第19-22行)或默认函数(第23-26行)。尽管代码支持不同版本和不同浏览器之间的浏览器兼容性,但大多数静态分析程序都会考虑所有可能的情况,以便对它们进行可靠的分析,从而降低精度。然后,它定义了一个名为div的函数(第28-31行),该函数接受一个dom元素,并检查其标记名是否为“div”。当用户单击图3中第3-4行的DOM元素时,将调用函数isdiv。函数调用第4行和第5行,分别计算为true和false。注意,正如图2第29行的注释所述,函数is-div包含一个缺陷。尽管标记名匹配的值是一个对象或空值,但div的值是一个字符串。由于strict equals运算符(==)总是返回false,如果两个操作数的类型不同,则条件表达式的计算结果总是为false。实际上,这段代码是维基百科网页的简化版本。当用户从维基百科页面点击语言选择按钮时,会调用一个名为setlang的Javascript函数,它包含ISDIV复制的缺陷。我们向维基百科的开发人员报告了这个缺陷,他们确认了这个缺陷,并立即通过===代替==修复了它。由于不同的维基媒体项目共享代码,许多网页中都存在相同的缺陷。有趣的是,这只虫子不到一年就复活了!我们在评估另一种针对维基百科页面的分析技术时再次发现了同样的错误,并再次报告了它。发生的是,一个开发人员修改了一些与setlang无关的代码,但是一个简单的语法检查程序jshint警告用==替换===被认为更好。检查情况后,维基百科开发人员以另一种方式修改了代码,使用==正确。因此,分析Javascript Web应用程序并检测他们,我们用dom mod扩展了safewapp利用各种动态信息进行分析。图1中的中间框显示了我们对SAFE的扩展。除了分析Javascript程序之外,safewapp可以分析Web应用程序;它以HTML文档为输入,提取嵌入的Javascript代码片段,使用safe构建它们的cfg,构造dom models,使用saf
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[19681],资料为PDF文档或Word文档,PDF文档可免费转换为Word
课题毕业论文、文献综述、任务书、外文翻译、程序设计、图纸设计等资料可联系客服协助查找。
您可能感兴趣的文章
- 基于ElasticSearch的面向社交网络的公众舆论监控平台外文翻译资料
- 基于卷积神经网络的智能车牌识别系统研究外文翻译资料
- 基于深度卷积神经网络的ImageNet分类外文翻译资料
- Android 开发的代码推荐:它是如何工作的以及可以改进的地方?外文翻译资料
- 基于传感器网络的城市天然气泄漏在线监测系统外文翻译资料
- 基于深度学习的微博文本情感分析外文翻译资料
- 定义增强现实系统的需求,以克服在协同设计会议中创建和使用设计表示的挑战外文翻译资料
- 为什么人们会玩基于地理位置的增强现实游戏:基于宝可梦Go的研究外文翻译资料
- 基于JSP和PHP的动态Web服务器性能分析与仿真建模外文翻译资料
- GNU libmicrohttpd 库教程外文翻译资料