Security Alert: Confirmed Malware
AI Trainer Dev Tools
ID: afogdibhhjckdhmkhgdplbkgpiknefdn
Supported Languages
Extension Info & Metadata
Publisher Contextual Analysis
- Author
- https://travisbytes.comView Profile
- MX records exist
- Yes
- Domain exists
- Yes
- Is disposable
- No
- Is role-based
- No
- Mailbox exists
- Yes
- Website
- Visit
AI Trainer Dev Tools
AI Trainer Dev Tools for Conductify platform (https://studio.conductify.ai/) Features: - Rich textbox to edit prompt - Beautify JSON format - Python code preview Configuration: - Enable / Disable for specific sites
This file (auto-injected into every site visited) attaches `window.getReactProps` and `window.getReactPropsByElement` to the global scope of the page. These helpers walk React internals (`__reactFiber$`/`__reactInternalInstance$`) and return memoizedProps, which commonly contain form values, user identifiers, tokens, and other sensitive component state. Exposing them on `window` of every page means any first-party or third-party page script can invoke them to harvest internal React state — an unauthorized data-collection / privilege amplification primitive. Mixed Vietnamese/English comments are also a minor OPSEC indicator.
window.getReactPropsByElement = function(element) { if (!(element instanceof HTMLElement)) { console.error('The provided argument is not a valid DOM element:', element) return } const key = Object.keys(element) .find( key => key.startsWith('__reactInternalInstance$') || key.startsWith('__reactFiber$'), ) if (!key) { console.error('No React internal instance found on this element:', element) return } const internalInstance = element[key] const props = internalInstance.memoizedProps return props}window.getReactProps = function(selector) { const element = document.querySelector(selector) ... const internalInstance = element[key] const props = internalInstance.memoizedProps console.log('Props:', props) return props}The extension is named 'AI Trainer Dev Tools' and only declares the host permission for studio.conductify.ai, yet its content_scripts and web_accessible_resources match `<all_urls>`. This causes contentScript.js (and its always-on injection of functions.js) to load into every webpage the user visits, granting the extension a far broader DOM/page surface than its stated purpose. Manifest scope mismatch is a common over-privileging pattern.
"permissions": [ "https://studio.conductify.ai/*", "storage", "scripting" ], ... "content_scripts": [ { "matches": [ "<all_urls>" ], "js": [ "contentScript.js" ], "run_at": "document_end" } ], "web_accessible_resources": [ { "resources": [ "initEditor.js", "functions.js", "highlight/*", "tinymce/*", "easyMDE/*", "style.css" ], "matches": [ "<all_urls>" ] } ]`functions.js` is unconditionally injected into the page world of every site visited by the user (because of the `<all_urls>` content_script match), regardless of whether the user explicitly enabled the extension on that domain. This converts a privileged extension resource into a script accessible to the page's MAIN world JavaScript context on every site, expanding attack surface beyond the extension's stated AI Trainer use case.
function injectScript(file, node) { const script = document.createElement('script'); script.src = chrome.runtime.getURL(file); script.type = 'text/javascript'; script.async = false; (document.head || document.documentElement) .appendChild(script);}...function injectCommonScriptAndStyle() { injectScript('functions.js', document.head);}// Apply TinyMCE to all textareas if the domain/path is enabledfunction applyEnhancements() { injectCommonScriptAndStyle(); chrome.storage.sync.get(['enabledDomains'], function(data) { const currentDomain = window.location.hostname; const currentPath = window.location.pathname; const settings = data.enabledDomains?.[currentDomain]; if (settings?.enabled && (!settings.path || currentPath.includes(settings.path))) { injectScriptAndStyle(); } });}On toolbar-icon click the service worker uses `chrome.scripting.executeScript` to inject contentScript.js into whichever tab is active, regardless of origin. Combined with the `<all_urls>` content_script registration this is duplicative and acts as a manual cross-origin injector, allowing the same DOM-mutation/React-introspection logic to run on any site the user happens to be on, even sites the user has not enabled in popup settings.
chrome.action.onClicked.addListener((tab) => { console.log('Extension icon clicked for tab:', tab.id); chrome.scripting.executeScript({ target: { tabId: tab.id }, files: ['contentScript.js'] });});By severity
Versions scanned
Showing 1 of 1 scanned version with more than one unique finding. Counts are unique findings that include each version.
| Extension Version | Code Review Findings |
|---|---|
| 1.1 | 4 |
Files with findings
4 distinct paths — top paths by unique finding count:
- background.js1
- contentScript.js1
- functions.js1
- manifest.json1
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.
Browse and explore files within this extension package
Gain full insight into all external connections.
Upgrade for full visibility.