PROJECTS
UNDERWAY
FINISHED
WasmCFuzz: Structure-aware Fuzzing for Wasm Compilers
Recently, I’ve turned my attention to WebAssembly, which I think has a lot of potential and is now supported by all major browsers. I have implemented a generation-based fuzzer based on the file structure of wasm binary to fuzz the WebAssembly compiler of browsers.
My tool has found 9 and 3 WebAssembly-related bugs in JavaScriptCore and SpiderMonkey, respectively.
The workflow of WasmCFuzz:
PatchFuzz: Patch Fuzzing for JavaScript Engines
PatchFuzz: I am a major contributor to this project, and the code will be available to the public after the paper has been accepted.
The workflow of PatchFuzz:
Here are two bugs to share:
CVE-2020-9983 | CVE-2020-9802 |
---|---|
const ITERATIONS=1000000; function f(n){ n&=0xffffffff if(n<-1){ let v=(-n)&0xffffffff; let i=Math.abs(n); let arr=new Array(10); arr.fill(42.42); if(i<arr.length){ return arr[i]; } } } for(let i=0;i<ITERATIONS;i++){ let isLastIteration= i==ITERATIONS-1; let n=-(i%10); if(isLastIteration){ n=-2147483648; } f(n); } | const ITERATIONS=1000000; function f(n){ n&=0xffffffff-1 if(n<-1){ let v=(-n)&0xffffffff; let i=Math.abs(n); let arr=new Array(10); arr.fill(42.42); if(i<arr.length){ return arr[i]; } } } for(let i=0;i<ITERATIONS;i++){ let isLastIteration= i==ITERATIONS-1; let n=-(i%10); if(isLastIteration){ n=-2147483648; } f(n); } |
FuzzJIT: Oracle-Enhanced Fuzzing for JavaScript Engine JIT Compiler
FuzzJIT: It is a fuzzing tool for JavaScript engines JIT compiler, built on top of Fuzzilli. I was the only student involved in this project. The main contributors to this work are my mentor and zhiyi. I was responsible for the calculation of some evaluative metrics, such as code coverage. I also used FuzzJIT to find several interesting logic bugs.
The workflow of FuzzJIT:
Here are two bugs to share:
- v8_unsigned_number_optimization (I forgot to submit it.)
function opt(){ var a=new Float32Array(3300000000); a[-1000000000]=666; var b=a[-1000000000]; var c=a[3294967296];// -1000000000 = u3294967296 for(let i=1;i<1000;i++){ } return c; } opt(); print(opt()); // output: 0 %OptimizeFunctionOnNextCall(opt); print(opt()); // output: 666
- jsc_issue_228068
function opt() { return parseInt ("−0"); } let r1 = opt() ; print (Object. is(r1 , −0)); // output : True for ( let i = 0; i < 1000; i++) { opt() ; } let r2 = opt() ; print (Object. is(r2 , −0)); // output : False