Security Alert: Malware Risk Confirmed
ParrotTalks抄筆記
ID: kkodiihpgodmdankclfibbiphjkfdenh
Supported Languages
Extension Info & Metadata
Publisher Contextual Analysis
- Author
- https://parrottalks.com/View Profile
- Privacy
- Privacy Policy
- Help
- Help Center
- MX records exist
- Yes
- Domain exists
- Yes
- Is disposable
- No
- Is role-based
- Yes
- Mailbox exists
- Yes
- Website
- Visit
一點即查,無需複製、貼上、另闢查詢網頁 - 給你更流暢的閱讀體驗。
----- 與抄筆記有關的重要小事 ❤ ----- ➤ 經實際測試,查一個單字快 400 倍 ➤ 有效促進大量閱讀(歡迎自行嘗試) ➤ 也支援看 PDF 檔案 - 網友們叫它:論文神器 ----- 為什麼抄筆記? ----- 單字連同文本原句 作成專屬你的筆記 然後 用腦科學記憶法複習 這是一套 不可分開的流程 帶你走向 抄筆記美好未來 因為 單字默默記住 就再也不用查了 ----- 預設快速鍵 ----- e ─ 啟用「抄筆記」/ 快速查詢選取範圍 r ─ 單字發音 R ─ 句子發音 z ─ 啟用/關閉 功能:「斷開超連結功能」 q ─ 切換「抄筆記」視窗大小 esc ─ 關閉「抄筆記」 w ─ 「抄筆記」視窗上移 s ─ 「抄筆記」視窗下移 a ─ 「抄筆記」視窗左移 d ─ 「抄筆記」視窗右移 ----- 版本記錄 ----- 1.16.6 - 後台程式最佳化 1.16.5 - 重新上架 - 查詢介面邊緣顯示微調 1.16.1 - 修正無法啟動的錯誤 (Manifest v3 相關) 1.16.0 - 更新支援 Manifest v3 1.15.3 - 改進翻譯流暢度 1.15.2 - 修正部分UI顯示 1.15.1 - 修正 Chrome 76 後在 Windows 下 PDF 無法開啟 - 修正部分UI顯示 1.15.0 - 查詢速度增強
The extension fetches JavaScript from https://www.parrottalks.com/js/calc-gttk.js (PTNT.URL_CALC_GTTK) and executes it with eval(), replacing the PTNT.calcGTTk function. A chrome.alarms job re-runs this every 10 minutes (line 10666), so the developer's server can push arbitrary code into 30,000 installations at any time. This is classic remote code loading and violates Chrome Web Store policy.
}, updateCalcGTTk = function() { var success; return success = function(code) { var e, oldFn; if (oldFn = PTNT.calcGTTk, code) try { return PTNT.calcGTTk = eval(code) } catch (_error) { return e = _error, PTNT.calcGTTk = oldFn } }, UTIL.xhrGet(PTNT.URL_CALC_GTTK, success)}, updateCalcGTTk(),The Google Translate response body (from https://translate.google.com/translate_a/single) is passed directly to eval() as JavaScript. Any MITM, DNS hijack, or malicious proxy that tampers with that response achieves arbitrary code execution in the extension's service-worker context with full <all_urls> privileges.
success = function(data, status) {var e;try { data = eval(data)} catch (_error) { e = _error, data = null}return _cache[key] = UTIL.extend(!0, {}, data), dfd.resolve(data)}, error = function(a, b) {return dfd.reject([a, b])}, UTIL.xhrGet(get_url, success, error), dfd.promise)The raw response body from the Google Scribe dictionary endpoint (https://www.googleapis.com/scribe/v1/research?...) is eval()'d as JavaScript. Because the API key is hard-coded client-side and the response is eval'd without parsing, any response tampering becomes code execution in the background context.
success = function(res) { var data, e; data = res.data; try { data = eval(data) } catch (_error) { e = _error, data = null } return _cache[key] = UTIL.extend(!0, {}, data), data}The POS tagger scrapes HTML from the unencrypted endpoint http://nlp.stanford.edu:8080/corenlp/process, pulls text between <pre>...</pre>, and feeds it into window.eval(). Cleartext HTTP plus eval() of third-party-controlled text is a trivial remote code execution vector for anyone who can MITM the connection.
return c = pDefer(), d = "http://nlp.stanford.edu:8080/corenlp/process", b = { outputFormat: "json", input: a, Process: "Submit" }, UTIL.xhrPost(d, b, null, null, { timeout: 3e3 }) .then(function(b) { var c, d, e, f, g; return d = b.data, g = d.substr(d.search("<pre>")), g = g.substring(0, g.search("</pre>") + 6), c = $(g), e = a, window.eval("var __buf = " + c.text()), f = __buf, {The background service worker exposes an ACTION_BG_XHR RPC that performs arbitrary cross-origin XHR (any URL, any method, any body) and returns the full response to the caller. The content script installed.js (injected on parrottalks.com and localhost) relays this via window.postMessage, letting any JavaScript on parrottalks.com bypass the same-origin policy through the extension's <all_urls> privilege. No URL allowlist, no origin check.
case PTNT.ACTION_BG_XHR: return p = function(a, b, d) { c({ success: !0, status: b, data: a, headers: d }), chrome.runtime.lastError }, f = function(a, b, d) { c({ status: b, data: a, headers: d }), chrome.runtime.lastError }, UTIL.xhr(a.url, a.method, a.body, p, f, a.options), !0;Uses a webRequest blocking redirect to encode the current frameId into a synthetic GIF, then calls b.eval(e) inside each subframe to run an arbitrary script string. This is a DOM-injection technique that effectively re-implements tabs.executeScript in subframes, bypassing the documented script-injection APIs, and runs caller-supplied JavaScript strings in any http/https/file frame the page contains.
chrome.webRequest.onBeforeRequest.addListener(function(a) { var b = a.frameId + 1, c = String.fromCharCode(255 & b, b >> 8 & 255), d = String.fromCharCode((b >> 16) + 1, 0), e = "data:image/gif;base64," + btoa("GIF89a" + c + d + "\0\xff\0,\0\0\0\0" + c + d + "\0D\0;"); return { redirectUrl: e } }, { urls: [b + "*"], types: ["image"] }, ["blocking"]), ... try { a = b.eval(e) } finally { ... }This content script (injected on *.parrottalks.com and localhost) accepts any window.postMessage with message === PAGE_MESSAGE_XHR_REQUEST and proxies it to the background ACTION_BG_XHR handler, which performs cross-origin XHR with <all_urls> privileges. No origin/source verification on the message. Any script that can execute on parrottalks.com (including a compromised third-party tag or XSS) can issue authenticated fetches to any domain through the extension.
window.addEventListener("message", function(k) { var l; try { l = JSON.parse(k.data) } catch (m) {} if (l && l.message) switch (l.message) { ... case PTNT.PAGE_MESSAGE_XHR_REQUEST: h(l); break; ... }}, !1)By severity
Versions scanned
Showing 1 of 7 scanned versions with more than one unique finding. Counts are unique findings that include each version.
| Extension Version | Code Review Findings |
|---|---|
| 1.16.0 | 7 |
Files with findings
2 distinct paths — top paths by unique finding count:
- js/background.js6
- content/installed.js1
URLs
View the external URLs this extension communicates with to understand its network activity and data interactions.
Gain full insight into all external connections.
Upgrade for full visibility.
Gain full insight into all external connections.
Upgrade for full visibility.
Code Diff
Compare extension code between any two versions.
No comparable text files found between these versions.
Browse and explore files within this extension package
Gain full insight into all external connections.
Upgrade for full visibility.