#007High2026-04-03

Slack Webhook Credential Stealer with Double Encoding

@sbxapps/sbx-operations-administration-fieldservicetools-ui@45.0.5

Verdict:MALICIOUS — Credential exfiltration to Slack

▸Overview

Ships fake React components (Button, Card, Modal) as cover for a 33KB obfuscated credential stealer in scripts/preflight-check.js. Exfiltrates system information, environment variables, and credentials to a Slack webhook using double base64 + charCode encoding, with hash-based deduplication to avoid sending duplicates.

33KB
Payload Size
2x
Base64 Encoding Layers
Slack
Exfil Channel
50KB
Chunk Size

▸Attack Flow

Fake Components
Trivial React components (Button, Card, Modal) serve as disguise for a legitimate-looking UI library.
Obfuscated Payload
33KB preflight-check.js uses double base64 + charCode arrays to hide the Slack webhook URL from scanners.
Data Exfiltration
Collects all environment variables, system info, and credentials. Sends to Slack webhook in 50KB chunks with hash-based deduplication.

▸MITRE ATT&CK Mapping

T1027Obfuscated Files — double base64 + charCode encoding
T1567.002Exfiltration to Cloud Storage — Slack webhook
T1036.005Masquerading — fake React component library
T1552.001Credentials In Files — environment variable theft

▸Tags

Credential StealerSlackObfuscationReactEnvironment Variables

▸Full Report

Credential Stealer Hidden in Fake React UI Library

TL;DR

@sbxapps/sbx-operations-administration-fieldservicetools-ui@45.0.5 ships fake React components (Button, Card, Modal) as cover for a 33KB obfuscated credential stealer that exfiltrates data to a Slack webhook via double base64 + charCode encoding.

Package

Structure

dist/components/Button.js    — 800B (real but trivial React component)
dist/components/Card.js      — 635B
dist/components/Modal.js     — 726B
dist/components/Input.js     — 92B
dist/index.js                — 575B
scripts/preflight-check.js   — 33,612B  ← THE PAYLOAD
scripts/postflight-verify.js — 1,358B

Attack (verified — decoded the obfuscation)

Slack Webhook Extraction

The payload uses double base64 + charCode arrays to hide a Slack webhook:

var s=[_d([97,72,82,48,99,72,77,54,76,121,...]),  // base64 of base64
      _d([86,68,65,120,77,86,100,76,85,70,...]),
      _d([81,106,66,66,85,84,81,119,86,107,...]),
      _d([81,85,49,106,101,72,74,50,99,107,...])];

Decoded result:

https://hooks.slack.com/services/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

Exfiltration

The payload collects system information, environment variables, and credentials, then sends them to the Slack webhook in 50KB chunks. Uses hash-based deduplication to avoid sending the same data twice.

What Makes This Novel

The double base64 + charCode encoding is specifically designed to evade both string-matching scanners and simple base64 decoders. Our scanner caught it because of the fromCharCode pattern, but the actual webhook URL required two rounds of decoding to extract.

IOCs

  • hooks.slack.com/services/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
  • Slack workspace: T011WKPUSQK
  • Repository URL points to github.com/internal/ (non-existent)

Credits

Detected by: npm-sentinel automated scanner Date: 2026-04-03