Microsoft Edge Add-ons Verified

Flash Player 2026

2c7938f6-2a1b-5660-ac4c-49bf945fd114 | v1.9.3
65/ 100
MEDIUM risk
Analyst verdict
Confirmed risk

From the RiskyPlugins AI security review of the observed evidence.

Analysis record

Analysed
7 months ago
Version
v1.9.3
Source
Findings (non-IoC)

Evidence ledger

Ranked by severity · findings with a source location link to the code viewer

113 detail rows
Showing 25 of 46 · highest severity first

YARA Rule Matches

11 rules
SeverityRuleHitsFilesMetadata
HIGHUntrustedContentShouldNotBeIncluded

Including content in your site from an untrusted source can expose your users to attackers and even compromise your own site. For that reason, this rule raises an issue for each non-relative URL. For more information checkout the OWASP A1:2017 (https://owasp.org/www-project-top-ten/2017/A1_2017-Injection.html) advisory.

1
ruffle/ruffle.js
FP 20%
HIGHpostinstall crypto operations

Cryptographic operations detected

8
ruffle/ruffle.jsruffle/3011bcc495d95ccdb484.wasmruffle/81d63abfb638f19f765a.wasm +5 more
Risky Plugins Authors FP 30%
HIGHDebuggerStatementsShouldNotBeUsed

The debugger statement can be placed anywhere in procedures to suspend execution. Using the debugger statement is similar to setting a breakpoint in the code. By definition such statement must absolutely be removed from the source code to prevent any unexpected behavior or added vulnerability to attacks in production. For more information checkout the CWE-489 (https://cwe.mitre.org/data/definitions/489.html) advisory.

2
ruffle/3011bcc495d95ccdb484.wasmruffle/81d63abfb638f19f765a.wasm
FP 10%
HIGHpostinstall system command

System command execution detected

6
ruffle/3011bcc495d95ccdb484.wasmbg.jsruffle/core.ruffle.42e9812376a772a5def7.js +3 more
Risky Plugins Authors FP 10%
HIGHpostinstall file manipulation

File system manipulation detected

9
ruffle/core.ruffle.e69ba15208200a5d72ea.jscs.jsruffle/core.ruffle.42e9812376a772a5def7.js +6 more
Risky Plugins Authors FP 20%
HIGHpostinstall network communication

Network communication detected

16
ruffle/core.ruffle.42e9812376a772a5def7.jsmv3-upgrade.jsbg.js +13 more
Risky Plugins Authors FP 30%
HIGHpostinstall persistence mechanism

Persistence mechanism detected

2
ruffle/3011bcc495d95ccdb484.wasmruffle/81d63abfb638f19f765a.wasm
Risky Plugins Authors FP 20%
HIGHLocalStorageShouldNotBeUsed

Session storage and local storage are HTML 5 features which allow developers to easily store megabytes of data client-side, as opposed to the 4Kb cookies can accommodate. While useful to speed applications up on the client side, it can be dangerous to store sensitive information this way because the data is not encrypted by default and any script on the page may access it. This rule raises an issue when the localStorage and sessionStorage API's are used. For more information checkout the OWSAP A3:2017 (https://owasp.org/www-project-top-ten/2017/A3_2017-Sensitive_Data_Exposure.html) advisory.

1
ruffle/ruffle.js
FP 5%
HIGHpostinstall obfuscation

Code obfuscation techniques detected

9
bg.jsruffle/ruffle.jsruffle/core.ruffle.e69ba15208200a5d72ea.js +6 more
Risky Plugins Authors FP 20%
HIGHpostinstall registry modification

Windows registry modification detected

4
ruffle/core.ruffle.42e9812376a772a5def7.jsruffle/core.ruffle.e69ba15208200a5d72ea.jsruffle/81d63abfb638f19f765a.wasm +1 more
Risky Plugins Authors FP 30%
HIGHpostinstall file download

File download activity detected

9
player-embed.jscs.jsplayer.js +6 more
Risky Plugins Authors FP 30%

Network Indicators

Concrete URLs, domains, IPs, emails, and hashes extracted from the analyzed artifact.

1,052 total

Loading network indicators

IoC detail rows are loaded outside the initial page render.

Publisher Evidence

Limited evidence

ModernKit.one

Publisher identity, store signals, distribution reach, and warning signals used for context. Treat this as supporting evidence, not a clean bill of health.

Edge does not expose the same publisher verification data as IDE stores, so this score is deliberately conservative.

52
Noisy-finding weight
x1.00
Publisher domain
modernkit.one
Observed
Store verification signal
Limited signal
Limited
Extension portfolio
15
Portfolio

12 evidence rows available.

Finding Categories

67
Malware Signatures
2
Obfuscation
10
Network
1,052
IoC Indicators

YARA Rules Matched

11 rules(67 hits)
UntrustedContentShouldNotBeIncluded postinstall crypto operations DebuggerStatementsShouldNotBeUsed postinstall system command postinstall file manipulation postinstall network communication postinstall persistence mechanism LocalStorageShouldNotBeUsed postinstall obfuscation postinstall registry modification postinstall file download

AI Security Report

AI Security Review

Evidence context: threat category supply chain; evidence quality strong.

Architectural red flags in a working Flash emulator

This extension bundles the real Ruffle WASM Flash emulator and it does correctly play .swf files. The problem is not the Flash emulation — it's the infrastructure wrapped around it.

Remote-controlled content script injection

On a 1-hour alarm, bg.js calls https://api.modernkit.one/ext-activations/get-features with a device-unique UUID and receives a response field called alternateDetectionConfigv2. Each entry in that list contains a base64-encoded hostname. The extension decodes those hosts at runtime (atob(alternateConfig.host)) and calls chrome.scripting.registerContentScripts() to inject detection-alternate.js into every matching site, in the MAIN world, at document_start.

This means the publisher — not the store, not the user, not a code audit — decides at runtime which websites this extension injects code into. No extension update is required to re-target. The base64 encoding of the target list in the API response is consistent with deliberately obscuring the target set from static review.

XHR interception on the server-chosen targets

The injected detection-alternate.js overrides XMLHttpRequest.prototype.open and inspects every response body matching a server-provided regex:

var mk1CheckPath = atob(mk1AlternateConfig.path);
var mk1CheckBody = atob(mk1AlternateConfig.body);
// ...
window.XMLHttpRequest.prototype.open = function (method, url, isAsync) {
    if (url.indexOf(mk1CheckPath) > -1) {
        this.addEventListener('load', () => {
            // walks response body, extracts fields by server-provided key paths
        });
    }
    return mk1OriginalXHROpen.apply(this, arguments);
};

The fields that get stripped before data leaves the page are also controlled by the server, via an excludeKeys list. If the server returns an empty exclude list, the full response body flows out through an invisible <iframe id='mk1PageBridge'>.

Privileges far in excess of stated purpose

The manifest requests:

  • <all_urls> host permissions
  • declarativeNetRequestWithHostAccess — can rewrite network requests
  • scripting — can inject arbitrary scripts at runtime
  • Content scripts at document_start in the MAIN world on every HTTP(S) page

A Flash emulator only needs to replace <object type="application/x-shockwave-flash"> elements where Flash is actually embedded. It does not need to modify network requests, dynamically register content scripts, or run at document_start on every site.

The exclude list is security theater

The manifest exclude_matches carves out banking and auth sites (authentication.td.com, sso.godaddy.com, duosecurity.com) from the static content scripts, which looks compliant on audit. But the dynamically-registered scripts from registerContentScripts() do not inherit this exclude list. Whatever hosts modernkit.one pushes into alternateDetectionConfigv2 get the injection, regardless of what the static manifest promises.

Telemetry and attribution

  • Device-unique UUID stored in chrome.storage and sent with every API call
  • Install, post-install, and uninstall URLs include UTM parameters that identify the extension and the installation channel
  • /stats endpoint called on multiple lifecycle events
  • /ext-activations/check-utm endpoint sends tracking data back on a 1-hour schedule

Assessment

Even if the current server-side target list is benign — say, extracting Flash content from specific video sharing sites — the architecture itself is a remote-controlled backdoor. The publisher reserves the right to inject arbitrary JavaScript into any website of their choosing, intercept XHR responses there, and exfiltrate fields of their choosing, all without any extension update or user consent after install.

This is not a “false positive YARA rule” case. The malicious capability is intentional, documented in code, and gated only by whatever modernkit.one decides to do with their admin panel. A future update to the API response could retarget this to banking sites, crypto exchanges, or auth portals.

Do not install. If you already have it installed, uninstall it. If you run an enterprise environment, block the extension ID fgenmmklgkdemhpgdppmldmkemplbcko and the domain modernkit.one.

Key Reasons

  • Dynamically registers MAIN-world content scripts on a remote-provided, base64-encoded target list
  • Overrides XMLHttpRequest.prototype.open on server-chosen sites to sniff response bodies
  • Manifest exclude_matches is bypassed by runtime-registered scripts
  • Privileges (all_urls, scripting, declarativeNetRequest) vastly exceed what a Flash emulator needs
  • Device fingerprinting and UTM attribution telemetry unrelated to Flash playback

Reviewed 2026-04-14; recommended action: takedown request; model confidence 90%.

Frequently Asked Questions