[論文筆記] Analysis of JavaScript Programs: Challenges and Research Trends
JavaScript 的特點
JavaScript 的語言特點
“動態(tài)”特性,使得靜態(tài)分析不好進行(難以找到合適的抽象)
-
動態(tài)類型的(dynamically typed)并且支持廣泛的隱式類型轉(zhuǎn)換的使用
-
基于原型的面向?qū)ο螅≒rototype-based OOP),可以動態(tài)增減實例上的屬性
-
動態(tài)生成代碼,動態(tài)作用域,屬性名的動態(tài)計算等動態(tài)特性
-
“函數(shù)式”特性
JavaScript 的運行環(huán)境特點
-
HTML + CSS + JS,DOM 和 JS 進行交互,DOM API 是動態(tài)、異步和復雜的
-
大多數(shù)的 Web 應用包含第三方代碼或者動態(tài)加載的 JS 腳本
-
Node.js 提供了使用 JS 開發(fā)服務端代碼的可能
類型錯誤與安全缺陷
-
JS 在語法中定義了
TypeError和ReferenceError -
四種安全缺陷:cross-site scripting, open redirect, information leakage, code injection
JavaScript 分析的研究趨勢
靜態(tài)分析
靜態(tài)分析是服務端 JavaScript 代碼的主要研究主題。JavaScript 的動態(tài)特性和 Web 應用的運行環(huán)境造成了如下挑戰(zhàn):
動態(tài)語言特性:
-
動態(tài)類型:靜態(tài)分析不好預測
-
動態(tài)生成的代碼:不可能精確的分析代碼
-
動態(tài)對象:Object 上屬性值的任意增減
Web 運行環(huán)境:
-
DOM 和 Events:需要通過靜態(tài)分析來處理大量DOM API,并探索用戶驅(qū)動的事件流的龐大搜索空間
-
外部庫:使用大規(guī)模的庫,這些庫包含復雜的代碼模式
五個 JS 靜態(tài)分析的研究趨勢:
- 擴展研究范圍:從 JS 的一個子集開始,研究者們正在擴展研究范圍使得研究包含更多的 JS 特性:
-
JavaScript 子集:\(\text{JavaScript}_{safe} \rightarrow \text{JavaScript}_\text{GK}\) 從一個安全的語言子集出發(fā),添加某些動態(tài)特性
-
動態(tài)加載的代碼:分階段的信息流分析/指針分析 Staged Analysis
-
動態(tài)特性:靜態(tài)地追蹤被傳遞給
eval()的字符串常量,然后按字符串常量的類型重寫eval;運行時動態(tài)收集字符串實參,對于常見模式消除eval;重寫 with 代碼塊 -
DOM 和 Events:把 DOM 對象做抽象,考慮所有的 event calls 的組合(sound but not precise enough);把動態(tài)階段得到的具體 DOM 值喂給靜態(tài)分析器使用;為每個 DOM 節(jié)點生成單一的抽象對象,并更準確地刻畫 DOM 樹結(jié)構(gòu)
-
分析 libraries:在程序運行時收集“確定性事實”,并用這些事實對程序進行特化;采用純靜態(tài)方式挖掘確定性事實;在運行時收集庫函數(shù)返回的對象及其屬性訪問信息
- 提升分析精度:
-
動態(tài)特性:許多混合方法使用動態(tài)信息幫助靜態(tài)分析:運行時分析,收集動態(tài)信息特化程序后做靜態(tài)分析,特化路徑;
-
動態(tài)對象:不精確指針分析;把“最新分配的對象”與“舊對象”區(qū)分開來;相關(guān)性追蹤;狀態(tài)敏感指針分析;Heap with Open Objects 抽象
-
循環(huán):循環(huán)也是導致 JavaScript 精度下降的主要結(jié)構(gòu)之一,靜態(tài)確定性分析;循環(huán)敏感分析
- 提升分析可擴展性:隨著軟件規(guī)模的上升,分析算法的開銷增長太快,難以接受
-
移除不必要的計算:懶惰傳播,稀疏數(shù)據(jù)流分析
-
使用 unsound 的調(diào)用圖:IDE 中的靜態(tài)分析更喜歡 scalability 而非 soundness;field-based,only function-objects,ignore dynamic property accesses;JSBAF
-
提升分析性能:并行化;更大的 k-CFA 和更精細的上下文敏感技術(shù)
-
提升分析框架可用性:TAJS, WALA, SAFE, JSAI
-
擴展分析的下游應用:
-
類型錯誤檢查:從早期純 JS 程序到真實 Web 應用,tscheck, Aurebesh
-
安全漏洞檢查:四類 JS 安全漏洞:跨站腳本、開放重定向、信息泄露、代碼注入;核心方法是信息流分析
-
程序理解:指 IDE “理解” 程序,重構(gòu) Refactoring,代碼變更影響分析,內(nèi)存泄漏
動態(tài)分析
-
測試技術(shù):重點關(guān)注 DOM 操作,動態(tài)抽取 DOM 不變式,關(guān)注 DOM 狀態(tài),自動生成 DOM test fixtures;借鑒和擴展 contrasts
-
爬取和動態(tài)符號執(zhí)行:通過觸發(fā) Web 應用的各種事件來收集 DOM 狀態(tài);用符號約束+求解來系統(tǒng)地探索未覆蓋路徑,同時結(jié)合隨機/污點技術(shù)提升事件序列構(gòu)造效率
-
程序理解和錯誤檢查:軌跡提取、事件可視化和內(nèi)存剖析,AutoFLox/Vejovis,IDE 支持
其他研究趨勢
形式化和推理

類型安全和 JIT 優(yōu)化


Web 應用安全性


浙公網(wǎng)安備 33010602011771號