Is Web Lock | App lock for websites safe?
Web Lock | App lock for websites is medium risk. We observed the password lock screen fetch a JSON file from khokonm.github.io and write its url and banner fields into a link and image tag with no sanitization, on every page you configure Web Lock to protect.
Who publishes itkhokon - no other listings under this identity
khokon - no other listings under this identity
What this publisher told the store about itself, and the other listings that told it the same thing.
AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.
Publishers can request a review.
Findings
Lock screen loads a sponsor link and banner from external JSON, unsanitized
We observed the password lock screen fetch a JSON file from khokonm.github.io and write its url and banner fields into a link and image tag with no sanitization, on every page you configure Web Lock to protect.
- Severity
- Medium unwanted
- Type
- Unexpected
- CWE
- CWE-829
- Source
- Dynamic sandbox
You open a URL you configured Web Lock to protect.
The extension blanks the page with a password form, then fetches a sponsor name, link, and banner from an external JSON file and writes those values in with no sanitization.
sponsor.js writes the fetched url and banner filename straight into the DOM
sponsor.js (readable)
assets/js/sponsor.jschrome.runtime.sendMessage({ sponsors: true }, (response) => { const nameEl = document.querySelector(".sponsor-name"); const linkEl = document.querySelector(".footer .banner a"); const imgEl = document.querySelector(".footer .banner img"); const sponsors = response.sponsors; const chosen = sponsors[Math.floor(Math.random() * sponsors.length)]; if (nameEl) { nameEl.textContent = chosen.name; linkEl.href = chosen.url; // written as-is, no validation imgEl.src = "https://khokonm.github.io/sponsors/banners/" + chosen.banner; // written as-is }});background.js message handler (readable)
assets/js/background.jschrome.runtime.onMessage.addListener((message, sender, sendResponse) => { if (message.installed) { chrome.runtime.setUninstallURL(baseURL + "/uninstalled?email=" + message.email); sendResponse({ success: true }); } else if (message.sponsors) { (async () => { const sponsorData = await (await fetch("https://khokonm.github.io/sponsors/data.json")).json(); sendResponse(sponsorData); // returned as-is, no field validation })(); return true; // keep the message channel open for the async response }});200 OK. JSON body with a sponsors[] array of {name, logo, banner, slogan, url} objects; one entry observed: name "ReadAway", url a Chrome Web Store listing, banner "readaway-banner.png". The lock screen's sponsor name, link, and banner image were populated from this response.
- Sponsor nameReadAway
Text shown next to "sponsored by" on the lock screen.
- Sponsor link URLhttps://chromewebstore.google.com/detail/read-away/cnlncbpcennfcghdcbghaondmgohbfbl
Destination when the banner is clicked; assigned to the link's href with no check on scheme or host.
- Banner image filenamereadaway-banner.png
Appended to a hardcoded base URL and loaded as the banner image's source.
- khokonm.github.io
GitHub Pages site tied to the developer's branding; serves the sponsors JSON and banner images shown on locked pages, updatable outside the extension's release process.
What it can do
Permissions this extension asks for, as declared in version 1.34. Asking for a permission is not a finding on its own - it is what the extension can do if it chooses to.
Store data in your browser
storage
Store an unlimited amount of data in your browser
unlimitedStorage