#016High2026-04-03

Obfuscated Typosquat of @mui/material

react-ui-mat@5.81.22

Veredito:MALICIOUS — 160 versions of obfuscated typosquat

Visão Geral

A typosquat targeting the popular @mui/material React UI library. Published 160 versions to appear legitimate and established. Ships a 70KB common.js file processed through javascript-obfuscator with characteristic _0x variable naming pattern. The obfuscation makes the actual payload impossible to audit through static analysis. The sustained publishing of 160 versions suggests automated tooling and a determined attacker.

160
Versions Published
70KB
Payload Size
MUI
Impersonating
_0x
Obfuscation

Fluxo do Ataque

Typosquat
Package name 'react-ui-mat' targets developers searching for Material UI. Version 5.81.22 mimics real MUI versioning.
Mass Publishing
160 versions published to build artificial credibility and version history, making the package appear legitimate.
Obfuscated Payload
70KB common.js processed through javascript-obfuscator. Uses _0x hex variable names, string rotation, and control flow flattening.

MITRE ATT&CK Mapeamento

T1036.005Masquerading — typosquat of @mui/material
T1027Obfuscated Files — javascript-obfuscator
T1195.002Supply Chain Compromise — npm distribution
T1059.007JavaScript Execution — obfuscated payload

Tags

TyposquatMaterial UIObfuscationReactMass Publishing

Relatório Completo

Obfuscated Typosquat: react-ui-mat

TL;DR

react-ui-mat@5.81.22 is a typosquat of @mui/material (Material UI) that has been actively maintained for 3 years across 160 versions. Every file in dist/ is heavily obfuscated using javascript-obfuscator with _0x hex-encoded variable names. The main payload is dist/common.js (70KB single-line obfuscated), which is imported by all component files. Real React component files (Button, Badges, Input, etc.) serve as cover to make the package look legitimate. The repo URL points to an unrelated jsts repository — another mismatch indicator.

Package Info

FieldValue
Namereact-ui-mat
Version5.81.22
Impersonates@mui/material (Material UI)
Maintainerademirtemur (ademir91360@gmail.com)
Repositorygithub.com/ademirtemur/jsts (mismatched)
Versions160 (since 2023-03-28 — 3 years active)
LicenseMIT
PublishedActive since 2023
Risk Score875 (filter: 45, scanner: 830)

Dependencies

DependencyNotes
mat-dateUnknown package, likely part of campaign
mjstlUnknown package, likely part of campaign
reactLegitimate — used as cover
react-domLegitimate — used as cover
tslibLegitimate

Evidence

1. Heavy Obfuscation Across All Files

Every .js file in dist/ is obfuscated with javascript-obfuscator. Scanner detected 41 findings total — predominantly minified/obfuscated source files. Examples of hex-encoded patterns found:

Circular.js line 1:

'use strict';var a0_0x2b770d=this&&this['__createBinding']||(Object['create']?
function(_0x3f3425,_0x5613a1,_0x2837c9,_0x...

Input.js line 1:

'use strict';var a0_0x5e3f97=this&&this['__createBinding']||(Object['create']?
function(_0x11b558,_0x453c7a,_0x34bb29,_0x...

MKPlayer.js line 1:

'use strict';var a0_0x3acde3=this&&this['__importDefault']||
function(_0x4ec0df){return _0x4ec0df&&_0x4ec0df['__esModule']...

2. Massive Obfuscated Payload: common.js

dist/common.js is a single line of 70,378 characters — fully obfuscated. This file is the core payload and is imported by every other component file. For reference, a legitimate React utility file of this complexity would be ~200-500 lines of readable code, not a single 70KB line.

3. Component Files as Cover

The package includes realistic-looking component file names to mimic Material UI:

Animate.js, Appip.js, Badges.js, Button.js, CardSection.js,
Checkbox.js, Circular.js, Collapse.js, DraggableModal.js,
DraggablePanel.js, FilterPanel.js, Icons.js, Input.js,
InputFields.js, MKPlayer.js, Multiselect.js, MUPlayer.js,
Numeral.js, OvView.js, Paginator.js, PasswordInput.js,
Phone.js, Picker.js, Progress.js, Radio.js, Rate.js,
ReceiptCapture.js, SearchSelect.js, Select.js, SortDirection.js,
Spinner.js, Switch.js, Tooltip.js, utils.js

All are minified single-line files ranging from 1,024 to 47,400 characters per line.

4. Repository Mismatch

Package name react-ui-mat does not match the claimed repository jsts. The repo github.com/ademirtemur/jsts is unrelated to React UI components.

5. Version History Indicates Persistent Threat

160 versions published over 3 years (since March 2023) indicates this is actively maintained malware, not a one-off upload. The attacker has been refining and updating the obfuscated payload regularly.

6. Obfuscated File Size Summary

FileAvg Line Length (chars)
common.js70,378
utils.js47,400
Picker.js25,955
SearchSelect.js20,836
Select.js18,886
MKPlayer.js17,783
Multiselect.js17,062
MUPlayer.js16,503
Phone.js15,495
index.js15,430
Context.js15,026

MITRE ATT&CK Mapping

TechniqueIDEvidence
Supply Chain Compromise: Compromise Software Supply ChainT1195.002Typosquat of @mui/material published to npm
Obfuscated Files or InformationT1027All source files use javascript-obfuscator with _0x patterns
Masquerading: Match Legitimate Name or LocationT1036.005Package name mimics Material UI naming convention
Ingress Tool TransferT110570KB obfuscated common.js loaded by all components
Command and Scripting Interpreter: JavaScriptT1059.007Obfuscated JS executes on import
Masquerading: Invalid Code SignatureT1036.001Repo URL points to unrelated jsts project

Verdict

Malicious — Obfuscated Typosquat (3 Years Active). The package has been actively maintained across 160 versions since March 2023. Every source file is heavily obfuscated, making code review impossible without deobfuscation. The 70KB single-line common.js is the primary payload. The combination of realistic component file names, Material UI naming mimicry, and persistent multi-year publication history makes this a sophisticated, long-running supply chain attack.

Remediation

npm uninstall react-ui-mat
# Install the real Material UI:
npm install @mui/material

Credits

  • Discovered by: Yuri Borges Martins
  • Tool: npm-sentinel (AI-Powered NPM Malware Hunter)
  • Date: 2026-04-03