Skip to content

Commit 4d326f6

Browse files
committed
Cordova-js: Event Listener Hijacking
Updated Code with Both Document and Window Event Handlers
1 parent ab52fd7 commit 4d326f6

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed

src/cordova.js

+74
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,80 @@ var m_window_removeEventListener = window.removeEventListener;
4343
var documentEventHandlers = {};
4444
var windowEventHandlers = {};
4545

46+
/**
47+
* Mitigation for Event Listener Hijacking
48+
*/
49+
(function() {
50+
var originalDocumentAddEventListener = document.addEventListener;
51+
var originalWindowAddEventListener = window.addEventListener;
52+
var documentEventHandlers = {};
53+
var windowEventHandlers = {};
54+
55+
document.addEventListener = function (evt, handler, capture) {
56+
var e = evt.toLowerCase();
57+
if (typeof documentEventHandlers[e] !== 'undefined') {
58+
if (typeof documentEventHandlers[e].subscribe === 'function') {
59+
documentEventHandlers[e].subscribe(handler);
60+
} else {
61+
console.warn('No subscribe function defined for event:', e);
62+
}
63+
} else {
64+
originalDocumentAddEventListener.call(document, evt, handler, capture);
65+
}
66+
};
67+
68+
window.addEventListener = function (evt, handler, capture) {
69+
var e = evt.toLowerCase();
70+
if (typeof windowEventHandlers[e] !== 'undefined') {
71+
if (typeof windowEventHandlers[e].subscribe === 'function') {
72+
windowEventHandlers[e].subscribe(handler);
73+
} else {
74+
console.warn('No subscribe function defined for event:', e);
75+
}
76+
} else {
77+
originalWindowAddEventListener.call(window, evt, handler, capture);
78+
}
79+
};
80+
81+
// Securely define your event handlers
82+
documentEventHandlers['click'] = {
83+
subscribe: function(handler) {
84+
var secureHandler = function(event) {
85+
// Perform necessary checks or actions before invoking the handler
86+
if (event && event.target) {
87+
var allowedElements = ['button', 'a', 'div'];
88+
if (allowedElements.includes(event.target.tagName.toLowerCase())) {
89+
handler(event);
90+
} else {
91+
console.warn('Click event handler ignored for disallowed element:', event.target.tagName);
92+
}
93+
} else {
94+
console.warn('Invalid event object in secure handler.');
95+
}
96+
};
97+
originalDocumentAddEventListener.call(document, 'click', secureHandler, false);
98+
}
99+
};
100+
101+
windowEventHandlers['resize'] = {
102+
subscribe: function(handler) {
103+
var secureHandler = function(event) {
104+
// Perform necessary checks or actions before invoking the handler
105+
if (event && event.target) {
106+
if (event.target === window) {
107+
handler(event);
108+
} else {
109+
console.warn('Resize event handler ignored for disallowed target:', event.target);
110+
}
111+
} else {
112+
console.warn('Invalid event object in secure handler.');
113+
}
114+
};
115+
originalWindowAddEventListener.call(window, 'resize', secureHandler, false);
116+
}
117+
};
118+
})();
119+
46120
document.addEventListener = function (evt, handler, capture) {
47121
var e = evt.toLowerCase();
48122
if (typeof documentEventHandlers[e] !== 'undefined') {

0 commit comments

Comments
 (0)