Khi scan CodeQL với default settings thì tìm được 2 findings có giá trị.
Incomplete URL Substring Sanitization
Finding đầu tiên là việc kiểm tra xem domain có chứa alvarotrigo.com hay không để in ra warning cho biết rằng domain không hợp lệ.
// Location: src/js/console.js:11
doc.domain.indexOf("al" + "varotri" + "go" + "." + "com") > -1Tuy nhiên, nó lại sử dụng indexOf. Dẫn đến, attacker có thể dùng domain chẳng hạn như aalvarotrigo.com để bypass. Để demo, có thể chỉnh sửa file hosts để trỏ 127.0.0.1 đến aalvarotrigo.com hoặc cũng có thể mua domain này ở trên GoDaddy với giá là 0.01 USD: GoDaddy Domain Name Search.
Unsafe HTML Constructed from Library Input
Finding thứ hai là nó xây dựng HTML sử dụng user input mà cụ thể là field navigationTooltips trong object options.
// Location: dist/fullpage.js:2389
li += '<div class="' + SECTION_NAV_TOOLTIP + ' fp-' + getOptions().navigationPosition + '">' + tooltip + '</div>';
}
li += '</li>';Hàm getOptions() trả về biến global của options hoặc option mặc định:
function getOptions() {
return g_options || defaultOptions
}Giá trị g_options được thiết lập thông qua hàm setOptions():
function setOptions(options) {
g_options = deepExtend({}, defaultOptions, options)
originals = Object.assign({}, g_options)
}Và hàm này được gọi trong constructor của thư viện fullpage.js:
function fullpage(containerSelector, options) {
setCache(); //only once my friend!
if (hasClass($html, ENABLED)) {
displayWarnings();
return;
}
setOption('touchWrapper', typeof containerSelector === 'string' ? $(containerSelector)[0] : containerSelector); // Creating some defaults, extending them with any options that were provided
setOptions(options);Mặc dù có thể cấu hình field navigationTooltips để chứa malicious payload nhằm tấn công XSS nhưng điều này khá phi thực tế vì developer sẽ không tự tấn công chính họ:
new fullpage("#fullpage", {
navigation: true,
navigationPosition: '"><iframe/onload=alert(1)><!--',
anchors: ["section1", "section2", "section3", "section4"],
navigationTooltips: ["First Page", "Second Page", "Third Page", "Fourth Page"],
licenseKey: "<YOUR_LICENSE_KEY>",
})