mal-2026-10704

osv_npm
Description

The npm package `@across-toolkit/typescript-config` is a dependency-confusion credential stealer targeting developers of Across Protocol (across.to). It masquerades as an internal ESLint/TypeScript config for the `across.to` toolkit and publishes an implausibly high version (`99.0.0`) so that a misconfigured install resolves it from the public npm registry instead of a private package of the same name — the standard dependency-confusion technique. A `postinstall` lifecycle hook (`postinstall: node postinstall.js`) executes automatically on `npm install`, before the package is ever imported. Using `os.homedir()`, the payload reads the host's AWS credentials (`~/.aws/credentials`), SSH private key (`~/.ssh/id_rsa`) and npm token (`~/.npmrc`), collects `process.env`, and exfiltrates the data via an HTTP `POST` to a hardcoded `webhook.site` endpoint (`https://webhook.site/a585f4ec-20f7-4bd1-bac7-f3e53799dc5f`). The payload is present in both the root `postinstall.js` and a nested `eslint-config/postinstall.js`, and uses `child_process`. Any developer workstation or CI runner that installs the package hands the operator AWS credentials, an SSH private key and an npm publish token. --- _-= Per source details. Do not edit below this line.=-_ ## Source: amazon-inspector (5580d26d1829c9faf6465962431399aee9804c8ed1264274b30b9ce42f274bd9) Package impersonates the across-protocol organization (published as @across-toolkit/typescript-config@99.0.0, a high-version dependency-confusion shape) and ships two postinstall stealer scripts that run automatically on npm install. postinstall.js and eslint-config/postinstall.js read installer-owned secrets from ~/.aws/credentials, ~/.aws/config, ~/.ssh/id_rsa, ~/.ssh/id_ed25519, ~/.npmrc, ~/.gitconfig,.env files, /etc/environment, /proc/1/environ, and gcloud application default credentials, and query cloud instance metadata services at http://metadata.google.internal/computeMetadata/v1/ (with the Metadata-Flavor: Google header) and http://169.254.169.254/ for IAM security credentials and OAuth tokens. The collected files, IMDS responses, and a base64-encoded copy of process.env (including NPM_TOKEN) are POSTed via https.request to two hardcoded webhook.site collectors (paths /a585f4ec-20f7-4bd1-bac7-f3e53799dc5f and /12b523e2-ee58-4598-8fe1-bbf1f3999550). The declared package purpose is a shared tsconfig; the network exfiltration and credential harvesting have no relation to that purpose.

Timeline
Published
unknown
Last Modified
unknown
CVSS Details

CVSS details not available.

Affected Products

No product information available.

Weaknesses (CWE)
References
Linked Vulnerabilities

No linked vulnerabilities found.

{
  "affected": [
    {
      "database_specific": {
        "cwes": [
          {
            "cweId": "CWE-506",
            "description": "The product contains code that appears to be malicious in nature.",
            "name": "Embedded Malicious Code"
          },
          {
            "cweId": "CWE-506",
            "description": "The product contains code that appears to be malicious in nature.",
            "name": "Embedded Malicious Code"
          }
        ],
        "indicators": {
          "evidence_files": [
            {
              "path": "postinstall.js",
              "sha256": "41f31f3699b60c7002b6957e89cac446dbd840b87bac4852f76a56a3a7e7a08b",
              "tlsh": "bd5183d42df2706816d3fa59e25fa805a127e10b7d06e9d4f9dc08200f9e52ca6b29dc"
            },
            {
              "path": "eslint-config/postinstall.js",
              "sha256": "236544b401ec5b4c50544816f0a4a577fc2c8a08f7bf490ff8386ca19f92bdd3",
              "tlsh": "e9311fe20aba162002d3f691d75f68206216e2677d0bf8c0fd5819524f5c62c87f2cfd"
            },
            {
              "path": "package.json",
              "sha256": "250de4cf58511ed5a60b02b297584a71ae11718252574c1599c95e9fd8552a0b",
              "tlsh": "49e022158e268e7368c48e578833421bfe394f9b1469ac0c36e7b2340b2d9375e3620d"
            }
          ],
          "package_integrity": [
            {
              "filename": "typescript-config-99.0.0.tgz",
              "hashes": {
                "sha1": "e8e3e02115c42548b0b2b876f09b261de643b82e",
                "sha512_sri": "sha512-AtZBWRn1BrC1xu2NlhMQcSQcaQ4Sg3fSVc/T6ZGF7qs3lo5G504OlYoMfWFjwgxuXt7pcc04BjpmPHRLr/iJlw=="
              }
            }
          ]
        },
        "source": "https://github.com/ossf/malicious-packages/blob/main/osv/malicious/npm/@across-toolkit/typescript-config/MAL-2026-10704.json"
      },
      "package": {
        "ecosystem": "npm",
        "name": "@across-toolkit/typescript-config",
        "purl": "pkg:npm/%40across-toolkit/typescript-config"
      },
      "versions": [
        "99.0.0",
        "99.0.1"
      ]
    }
  ],
  "credits": [
    {
      "contact": [
        "inspector-research@amazon.com"
      ],
      "name": "Amazon Inspector",
      "type": "FINDER"
    },
    {
      "contact": [
        "https://research.codelake.dev/advisories/clr-2026-3036-across-toolkit-typescript-config"
      ],
      "name": "codelake Research",
      "type": "FINDER"
    }
  ],
  "database_specific": {
    "iocs": {
      "hashes": [
        "sha256:396023e88ed887f45495ab2fc1d6f2ce91186e4f888136d0f7000639ca758511"
      ],
      "urls": [
        "https://webhook.site/a585f4ec-20f7-4bd1-bac7-f3e53799dc5f"
      ]
    },
    "malicious-packages-origins": [
      {
        "id": "IN-MAL-2026-010699",
        "import_time": "2026-07-16T18:53:59.831945562Z",
        "modified_time": "2026-07-16T18:34:08Z",
        "sha256": "5580d26d1829c9faf6465962431399aee9804c8ed1264274b30b9ce42f274bd9",
        "source": "amazon-inspector",
        "versions": [
          "99.0.0"
        ]
      },
      {
        "id": "IN-MAL-2026-010701",
        "import_time": "2026-07-16T18:53:59.941024553Z",
        "modified_time": "2026-07-16T18:34:25Z",
        "sha256": "76463f7af786d538f929fe7f1644dc5ec072a7a9bdf4e0c4b7482fa510450c44",
        "source": "amazon-inspector",
        "versions": [
          "99.0.1"
        ]
      }
    ]
  },
  "details": "The npm package `@across-toolkit/typescript-config` is a dependency-confusion credential stealer targeting developers of Across Protocol (across.to). It masquerades as an internal ESLint/TypeScript config for the `across.to` toolkit and publishes an implausibly high version (`99.0.0`) so that a misconfigured install resolves it from the public npm registry instead of a private package of the same name — the standard dependency-confusion technique.\n\nA `postinstall` lifecycle hook (`postinstall: node postinstall.js`) executes automatically on `npm install`, before the package is ever imported. Using `os.homedir()`, the payload reads the host's AWS credentials (`~/.aws/credentials`), SSH private key (`~/.ssh/id_rsa`) and npm token (`~/.npmrc`), collects `process.env`, and exfiltrates the data via an HTTP `POST` to a hardcoded `webhook.site` endpoint (`https://webhook.site/a585f4ec-20f7-4bd1-bac7-f3e53799dc5f`). The payload is present in both the root `postinstall.js` and a nested `eslint-config/postinstall.js`, and uses `child_process`. Any developer workstation or CI runner that installs the package hands the operator AWS credentials, an SSH private key and an npm publish token.\n---\n_-= Per source details. Do not edit below this line.=-_\n\n## Source: amazon-inspector (5580d26d1829c9faf6465962431399aee9804c8ed1264274b30b9ce42f274bd9)\nPackage impersonates the across-protocol organization (published as @across-toolkit/typescript-config@99.0.0, a high-version dependency-confusion shape) and ships two postinstall stealer scripts that run automatically on npm install. postinstall.js and eslint-config/postinstall.js read installer-owned secrets from ~/.aws/credentials, ~/.aws/config, ~/.ssh/id_rsa, ~/.ssh/id_ed25519, ~/.npmrc, ~/.gitconfig,.env files, /etc/environment, /proc/1/environ, and gcloud application default credentials, and query cloud instance metadata services at http://metadata.google.internal/computeMetadata/v1/ (with the Metadata-Flavor: Google header) and http://169.254.169.254/ for IAM security credentials and OAuth tokens. The collected files, IMDS responses, and a base64-encoded copy of process.env (including NPM_TOKEN) are POSTed via https.request to two hardcoded webhook.site collectors (paths /a585f4ec-20f7-4bd1-bac7-f3e53799dc5f and /12b523e2-ee58-4598-8fe1-bbf1f3999550). The declared package purpose is a shared tsconfig; the network exfiltration and credential harvesting have no relation to that purpose.\n",
  "id": "MAL-2026-10704",
  "modified": "2026-09-11T04:00:06.543016200Z",
  "published": "2026-07-16T00:00:00Z",
  "references": [
    {
      "type": "PACKAGE",
      "url": "https://www.npmjs.com/package/@across-toolkit/typescript-config/v/99.0.0"
    },
    {
      "type": "PACKAGE",
      "url": "https://www.npmjs.com/package/@across-toolkit/typescript-config/v/99.0.1"
    },
    {
      "type": "ADVISORY",
      "url": "https://research.codelake.dev/advisories/clr-2026-3036-across-toolkit-typescript-config"
    }
  ],
  "schema_version": "1.9.0",
  "summary": "Malicious code in @across-toolkit/typescript-config (npm)"
}
View JSON API Download JSON