[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6AEK2S5047YW4D0H9Y43134":3,"skill-same:01M6AEK2S5047YW4D0H9Y43134":130},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":59,"commitSha":60,"skillDirectory":61,"forksCount":62,"repositoryHtmlUrl":63,"repositoryHomepageUrl":64,"ownerHtmlUrl":65,"ownerBlogUrl":66,"ownerDescription":67,"updatedAt":68,"install":69,"resources":82},"01M6AEK2S5047YW4D0H9Y43134","detecting-typosquatting-packages",null,"Flag misspelled, brandjacked, and typosquatted package names across npm, PyPI, and crates.io before installation, using edit-distance, keyboard-proximity, and known-target corpus matching with typomania, Microsoft OSSGadget's oss-find-squats, and pypi-scan. Use before adding a new dependency, as a CI\u002FCD gate on pull requests, when reviewing an AI-generated (\"slopsquatting\") dependency list, or when auditing a lockfile diff for a swapped package.","mukul975\u002FAnthropic-Cybersecurity-Skills","mukul975","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F42860185?v=4","01M6ADEQR8T5M4EEG6C67BQCWF","Mahipal","01M6ADJPMYWG1E5GM1FWBE3128",36146,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fdetecting-typosquatting-packages\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"detecting typosquatting packages","packages","typosquatting","ci","dependency-screening","ossgadget","typomania","package-registry","supply-chain-security","supply-chain","lockfile","security","pypi","package","npm","pull","registry","pull requests","microsoft","cybersecurity","2026-11-10 10:12:30",false,"---\nname: detecting-typosquatting-packages\ndescription: Flag misspelled, brandjacked, and typosquatted package names across npm, PyPI, and crates.io before installation, using edit-distance, keyboard-proximity, and known-target corpus matching with typomania, Microsoft OSSGadget's oss-find-squats, and pypi-scan. Use before adding a new dependency, as a CI\u002FCD gate on pull requests, when reviewing an AI-generated (\"slopsquatting\") dependency list, or when auditing a lockfile diff for a swapped package.\ndomain: cybersecurity\nsubdomain: supply-chain-security\ntags:\n- supply-chain-security\n- typosquatting\n- package-registry\n- npm\n- pypi\n- typomania\n- ossgadget\n- dependency-screening\nversion: '1.0'\nauthor: mahipal\nlicense: Apache-2.0\nnist_csf:\n- ID.RA-09\nmitre_attack:\n- T1195.002\n---\n# Detecting Typosquatting Packages\n\n> **Authorized Use Only:** This skill is for defensive software-supply-chain security, package screening, and authorized research. Use the corpus-matching and registry-query techniques here only against registries you are permitted to query at scale and packages you intend to evaluate for your own organization. Mass automated registry scraping may violate registry terms of service.\n\n## Overview\n\nTyposquatting is a software-supply-chain attack (MITRE ATT&CK **T1195.002 — Supply Chain Compromise: Compromise Software Supply Chain**) in which an adversary publishes a malicious package whose name is a near-miss of a popular legitimate package — `reqeusts` for `requests`, `python-sqlite` for `sqlite3`, `crossenv` for `cross-env`. A developer who fat-fingers the name, copies a name from a poisoned tutorial, or trusts an AI-generated dependency list (the \"slopsquatting\" variant, where models hallucinate package names attackers then register) installs the squat instead. Because most ecosystems execute install-time scripts (`postinstall` in npm, `setup.py`\u002Fbuild hooks in PyPI), the payload runs immediately with the developer's privileges.\n\nThis skill covers proactive, pre-installation detection: screening a candidate package name against a corpus of popular\u002Fknown-good names using the same name-mutation primitives attackers use, then triaging high-risk matches. The canonical open-source detector is **typomania** (Rust Foundation), a Rust port of the academic **typogard** tool (\"Defending Against Package Typosquatting\", University of Kansas); typomania powers crates.io's live typosquatting checks. Cross-ecosystem coverage comes from **Microsoft OSSGadget's `oss-find-squats`** and, for PyPI, **IQTLabs `pypi-scan`**. The ecosyste-ms **typosquatting-dataset** provides a curated ground-truth corpus of known squats mapped to their legitimate targets.\n\nSources: Rust Foundation `typomania` (https:\u002F\u002Fgithub.com\u002Frustfoundation\u002Ftypomania), Microsoft OSSGadget, ecosyste-ms typosquatting-dataset, and OWASP CI\u002FCD \u002F SLSA supply-chain guidance.\n\n## When to Use\n\n- Before adding a new dependency to `package.json`, `requirements.txt`, `pyproject.toml`, or `Cargo.toml`\n- As a CI\u002FCD gate that screens every newly introduced dependency name in a pull request\n- When triaging an AI-generated or tutorial-sourced dependency list (\"slopsquatting\" review)\n- During security review of a lockfile diff to catch a swapped or newly-pinned squat\n- When building a registry-side or proxy-side guardrail that blocks installs of suspected squats\n\n## Prerequisites\n\n- Rust toolchain (`cargo`) to build\u002Fuse typomania, or a prebuilt OSSGadget release\n- Python 3.8+ for pypi-scan and the helper script in this skill\n- Network access to the target registry's public API (npmjs.org, pypi.org, crates.io)\n- A corpus of \"popular\" package names for the ecosystem (download counts or a top-N list)\n\nInstall the tooling:\n\n```bash\n# typomania (library + example harness) — Rust Foundation\ngit clone https:\u002F\u002Fgithub.com\u002Frustfoundation\u002Ftypomania\ncd typomania\ncargo build --release\ncargo run --example registry   # demonstrates the Harness against a fake registry\n\n# OSSGadget (Microsoft) — cross-ecosystem squat finder\n# Download a release binary, then:\noss-find-squats pkg:npm\u002Frequests          # purl syntax\noss-find-squats pkg:pypi\u002Freqeusts\n\n# pypi-scan (IQTLabs) — PyPI typosquat enumerator\ngit clone https:\u002F\u002Fgithub.com\u002FIQTLabs\u002Fpypi-scan\ncd pypi-scan\npip install -r requirements.txt\n\n# ecosyste-ms ground-truth dataset of known squats\ngit clone https:\u002F\u002Fgithub.com\u002Fecosyste-ms\u002Ftyposquatting-dataset\n```\n\n## Objectives\n\n- Generate the candidate squat set for a given legitimate name using the standard mutation primitives\n- Screen a candidate package name against a popular-name corpus and flag near-misses\n- Enrich each suspected squat with registry metadata (age, downloads, maintainer, install scripts)\n- Score and triage findings to suppress false positives (legitimate forks, scoped packages)\n- Wire the check into CI\u002FCD as a blocking gate on new dependencies\n\n## MITRE ATT&CK Mapping\n\n| Technique ID | Name | Tactic |\n|--------------|------|--------|\n| T1195.002 | Supply Chain Compromise: Compromise Software Supply Chain | Initial Access |\n\nA typosquatted dependency is the delivery vehicle for T1195.002: the attacker compromises the victim's supply chain not by breaching a real package but by getting a malicious look-alike installed in its place. Related downstream behavior frequently includes T1059 (Command and Scripting Interpreter) via install hooks and T1041\u002FT1567 (Exfiltration) of tokens and environment variables.\n\n## Workflow\n\n### Step 1: Build the popular-name corpus\nThe detector needs a reference set of legitimate names to compare against. Pull top packages by download count for the ecosystem.\n\n```bash\n# PyPI: top packages dataset (Hugo van Kemenade's top-pypi-packages)\ncurl -s https:\u002F\u002Fhugovk.github.io\u002Ftop-pypi-packages\u002Ftop-pypi-packages.min.json \\\n  -o top-pypi-packages.json\n\n# npm: query the registry's most-depended-upon search\ncurl -s 'https:\u002F\u002Fregistry.npmjs.org\u002F-\u002Fv1\u002Fsearch?text=not:unstable&popularity=1.0&size=250' \\\n  -o npm-top.json\n\n# crates.io: top crates by downloads\ncurl -s 'https:\u002F\u002Fcrates.io\u002Fapi\u002Fv1\u002Fcrates?sort=downloads&per_page=100' \\\n  -H 'User-Agent: typosquat-screen (security@example.com)' -o crates-top.json\n```\n\n### Step 2: Generate candidate squats with the standard mutation primitives\ntypomania\u002Ftypogard apply a fixed set of name transformations that mirror real attacker behavior. Reproduce them to understand what a screen must catch:\n\n```text\n1. Repeated characters     requests  -> reqquests\n2. Omitted characters      requests  -> requsts\n3. Swapped\u002Ftransposed      requests  -> reqeusts\n4. Swapped words           python-dateutil -> dateutil-python\n5. Common typos (1-edit)   requests  -> rewuests   (keyboard adjacency)\n6. Homophones \u002F vowel swap requests  -> requeasts\n7. Version \u002F suffix tricks lodash    -> lodashs, lodash-js\n8. Delimiter swaps         cross-env -> crossenv, cross_env\n9. Scope confusion (npm)   @types\u002Fnode -> types-node\n```\n\nRun typomania's harness, which implements these as reusable primitives behind the `Corpus` and `Harness` traits:\n\n```bash\n# In the typomania checkout: feed your popular corpus, then check a name.\n# The Harness::check method (parallelized via rayon) compares the candidate\n# against every corpus entry using the squatting primitives.\ncargo run --example registry -- --corpus top-pypi-packages.json --name reqeusts\n```\n\n### Step 3: Screen with OSSGadget oss-find-squats\nOSSGadget queries the live registry, generates mutations of the supplied package, and reports which mutated names actually exist as published packages.\n\n```bash\n# Find names that squat on a legitimate package, checking which exist in the registry\noss-find-squats pkg:npm\u002Flodash\noss-find-squats pkg:pypi\u002Frequests\n\n# Reverse direction: given a SUSPECT name, find the legitimate package it mimics\noss-find-squats --quiet pkg:npm\u002Floadsh\n```\n\n### Step 4: Enumerate PyPI squats with pypi-scan\n```bash\ncd pypi-scan\n# Find candidate typosquats of a specific package\npython pypi_scan.py -p requests\n\n# Scan the top-N most-downloaded PyPI packages for existing squats\npython pypi_scan.py -n 50\n```\n\n### Step 5: Enrich suspected squats with registry metadata\nA near-miss name is only suspicious if it is also young, low-download, or ships install scripts. Pull metadata to triage:\n\n```bash\n# npm package metadata: creation time, maintainers, scripts\ncurl -s https:\u002F\u002Fregistry.npmjs.org\u002Floadsh | \\\n  python -c 'import sys,json;d=json.load(sys.stdin);v=d[\"dist-tags\"][\"latest\"];print(\"created:\",d[\"time\"][\"created\"]);print(\"scripts:\",d[\"versions\"][v].get(\"scripts\",{}))'\n\n# npm download counts (last week)\ncurl -s https:\u002F\u002Fapi.npmjs.org\u002Fdownloads\u002Fpoint\u002Flast-week\u002Floadsh\n\n# PyPI JSON API: release history and author\ncurl -s https:\u002F\u002Fpypi.org\u002Fpypi\u002Freqeusts\u002Fjson | \\\n  python -c 'import sys,json;d=json.load(sys.stdin);i=d[\"info\"];print(i[\"name\"],i[\"author\"],i[\"home_page\"]);print(\"releases:\",list(d[\"releases\"].keys()))'\n```\n\n### Step 6: Score, triage, and confirm\nCombine signals into a risk score. High risk = small edit distance to a popular name AND (package age \u003C 90 days OR downloads \u003C 1000 OR presence of `postinstall`\u002F`preinstall`\u002Fsetup-time network calls). Cross-check against the ecosyste-ms known-squats dataset:\n\n```bash\n# Is this name a documented squat?\ngrep -i 'loadsh' typosquatting-dataset\u002Fdata\u002F*.csv\n```\n\nConfirm malicious intent by inspecting (in a sandbox\u002FVM only) the install scripts and source tarball — never `npm install` or `pip install` a suspect on your workstation.\n\n### Step 7: Enforce in CI\u002FCD\nAdd a blocking gate that screens every new dependency name introduced by a PR:\n\n```yaml\n# .github\u002Fworkflows\u002Ftyposquat-gate.yml\nname: typosquat-gate\non: [pull_request]\njobs:\n  screen:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - name: Screen new dependencies\n        run: |\n          git diff origin\u002F${{ github.base_ref }}...HEAD -- package.json requirements.txt \\\n            | grep '^+' | python scripts\u002Fagent.py screen --ecosystem npm --corpus top.json --stdin\n```\n\n## Tools and Resources\n\n| Tool | Purpose | Source |\n|------|---------|--------|\n| typomania | Rust typosquat-detection library (powers crates.io) | https:\u002F\u002Fgithub.com\u002Frustfoundation\u002Ftypomania |\n| OSSGadget `oss-find-squats` | Cross-ecosystem squat finder (purl) | https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FOSSGadget |\n| pypi-scan | PyPI typosquat enumerator | https:\u002F\u002Fgithub.com\u002FIQTLabs\u002Fpypi-scan |\n| ecosyste-ms typosquatting-dataset | Curated known-squat ground truth | https:\u002F\u002Fgithub.com\u002Fecosyste-ms\u002Ftyposquatting-dataset |\n| top-pypi-packages | PyPI popular-name corpus | https:\u002F\u002Fhugovk.github.io\u002Ftop-pypi-packages\u002F |\n| OWASP CI\u002FCD Security Top 10 | Supply-chain control guidance | https:\u002F\u002Fowasp.org\u002Fwww-project-top-10-ci-cd-security-risks\u002F |\n\n## Mutation Primitives Reference\n\n| Primitive | Legit | Squat | Why it works |\n|-----------|-------|-------|--------------|\n| Transposition | requests | reqeusts | Common typing slip |\n| Omission | requests | requsts | Dropped character |\n| Repetition | requests | reqquests | Stuck key |\n| Delimiter swap | cross-env | crossenv | Hyphen vs none ambiguity |\n| Word order | python-dateutil | dateutil-python | Reordered compound name |\n| Homoglyph\u002Fvowel | requests | requeasts | Visual\u002Fphonetic similarity |\n| Suffix\u002Fscope | lodash | lodash-js, loadsh | Plausible \"official\" variant |\n\n## Validation Criteria\n\n- [ ] Popular-name corpus downloaded for each in-scope ecosystem\n- [ ] Mutation primitives reproduced and a known squat (e.g., `loadsh`) is correctly flagged\n- [ ] typomania \u002F OSSGadget \u002F pypi-scan run against at least one real package\n- [ ] Suspected squats enriched with age, download, and install-script metadata\n- [ ] Findings cross-checked against the ecosyste-ms known-squats dataset\n- [ ] Risk scoring suppresses obvious false positives (legit scoped\u002Fforked packages)\n- [ ] CI\u002FCD gate screens new dependency names on every pull request\n- [ ] No suspect package installed outside a disposable sandbox\n","# Detecting Typosquatting Packages\n\n> **Authorized Use Only:** This skill is for defensive software-supply-chain security, package screening, and authorized research. Use the corpus-matching and registry-query techniques here only against registries you are permitted to query at scale and packages you intend to evaluate for your own organization. Mass automated registry scraping may violate registry terms of service.\n\n## Overview\n\nTyposquatting is a software-supply-chain attack (MITRE ATT&CK **T1195.002 — Supply Chain Compromise: Compromise Software Supply Chain**) in which an adversary publishes a malicious package whose name is a near-miss of a popular legitimate package — `reqeusts` for `requests`, `python-sqlite` for `sqlite3`, `crossenv` for `cross-env`. A developer who fat-fingers the name, copies a name from a poisoned tutorial, or trusts an AI-generated dependency list (the \"slopsquatting\" variant, where models hallucinate package names attackers then register) installs the squat instead. Because most ecosystems execute install-time scripts (`postinstall` in npm, `setup.py`\u002Fbuild hooks in PyPI), the payload runs immediately with the developer's privileges.\n\nThis skill covers proactive, pre-installation detection: screening a candidate package name against a corpus of popular\u002Fknown-good names using the same name-mutation primitives attackers use, then triaging high-risk matches. The canonical open-source detector is **typomania** (Rust Foundation), a Rust port of the academic **typogard** tool (\"Defending Against Package Typosquatting\", University of Kansas); typomania powers crates.io's live typosquatting checks. Cross-ecosystem coverage comes from **Microsoft OSSGadget's `oss-find-squats`** and, for PyPI, **IQTLabs `pypi-scan`**. The ecosyste-ms **typosquatting-dataset** provides a curated ground-truth corpus of known squats mapped to their legitimate targets.\n\nSources: Rust Foundation `typomania` (https:\u002F\u002Fgithub.com\u002Frustfoundation\u002Ftypomania), Microsoft OSSGadget, ecosyste-ms typosquatting-dataset, and OWASP CI\u002FCD \u002F SLSA supply-chain guidance.\n\n## When to Use\n\n- Before adding a new dependency to `package.json`, `requirements.txt`, `pyproject.toml`, or `Cargo.toml`\n- As a CI\u002FCD gate that screens every newly introduced dependency name in a pull request\n- When triaging an AI-generated or tutorial-sourced dependency list (\"slopsquatting\" review)\n- During security review of a lockfile diff to catch a swapped or newly-pinned squat\n- When building a registry-side or proxy-side guardrail that blocks installs of suspected squats\n\n## Prerequisites\n\n- Rust toolchain (`cargo`) to build\u002Fuse typomania, or a prebuilt OSSGadget release\n- Python 3.8+ for pypi-scan and the helper script in this skill\n- Network access to the target registry's public API (npmjs.org, pypi.org, crates.io)\n- A corpus of \"popular\" package names for the ecosystem (download counts or a top-N list)\n\nInstall the tooling:\n\n```bash\n# typomania (library + example harness) — Rust Foundation\ngit clone https:\u002F\u002Fgithub.com\u002Frustfoundation\u002Ftypomania\ncd typomania\ncargo build --release\ncargo run --example registry   # demonstrates the Harness against a fake registry\n\n# OSSGadget (Microsoft) — cross-ecosystem squat finder\n# Download a release binary, then:\noss-find-squats pkg:npm\u002Frequests          # purl syntax\noss-find-squats pkg:pypi\u002Freqeusts\n\n# pypi-scan (IQTLabs) — PyPI typosquat enumerator\ngit clone https:\u002F\u002Fgithub.com\u002FIQTLabs\u002Fpypi-scan\ncd pypi-scan\npip install -r requirements.txt\n\n# ecosyste-ms ground-truth dataset of known squats\ngit clone https:\u002F\u002Fgithub.com\u002Fecosyste-ms\u002Ftyposquatting-dataset\n```\n\n## Objectives\n\n- Generate the candidate squat set for a given legitimate name using the standard mutation primitives\n- Screen a candidate package name against a popular-name corpus and flag near-misses\n- Enrich each suspected squat with registry metadata (age, downloads, maintainer, install scripts)\n- Score and triage findings to suppress false positives (legitimate forks, scoped packages)\n- Wire the check into CI\u002FCD as a blocking gate on new dependencies\n\n## MITRE ATT&CK Mapping\n\n| Technique ID | Name | Tactic |\n|--------------|------|--------|\n| T1195.002 | Supply Chain Compromise: Compromise Software Supply Chain | Initial Access |\n\nA typosquatted dependency is the delivery vehicle for T1195.002: the attacker compromises the victim's supply chain not by breaching a real package but by getting a malicious look-alike installed in its place. Related downstream behavior frequently includes T1059 (Command and Scripting Interpreter) via install hooks and T1041\u002FT1567 (Exfiltration) of tokens and environment variables.\n\n## Workflow\n\n### Step 1: Build the popular-name corpus\nThe detector needs a reference set of legitimate names to compare against. Pull top packages by download count for the ecosystem.\n\n```bash\n# PyPI: top packages dataset (Hugo van Kemenade's top-pypi-packages)\ncurl -s https:\u002F\u002Fhugovk.github.io\u002Ftop-pypi-packages\u002Ftop-pypi-packages.min.json \\\n  -o top-pypi-packages.json\n\n# npm: query the registry's most-depended-upon search\ncurl -s 'https:\u002F\u002Fregistry.npmjs.org\u002F-\u002Fv1\u002Fsearch?text=not:unstable&popularity=1.0&size=250' \\\n  -o npm-top.json\n\n# crates.io: top crates by downloads\ncurl -s 'https:\u002F\u002Fcrates.io\u002Fapi\u002Fv1\u002Fcrates?sort=downloads&per_page=100' \\\n  -H 'User-Agent: typosquat-screen (security@example.com)' -o crates-top.json\n```\n\n### Step 2: Generate candidate squats with the standard mutation primitives\ntypomania\u002Ftypogard apply a fixed set of name transformations that mirror real attacker behavior. Reproduce them to understand what a screen must catch:\n\n```text\n1. Repeated characters     requests  -> reqquests\n2. Omitted characters      requests  -> requsts\n3. Swapped\u002Ftransposed      requests  -> reqeusts\n4. Swapped words           python-dateutil -> dateutil-python\n5. Common typos (1-edit)   requests  -> rewuests   (keyboard adjacency)\n6. Homophones \u002F vowel swap requests  -> requeasts\n7. Version \u002F suffix tricks lodash    -> lodashs, lodash-js\n8. Delimiter swaps         cross-env -> crossenv, cross_env\n9. Scope confusion (npm)   @types\u002Fnode -> types-node\n```\n\nRun typomania's harness, which implements these as reusable primitives behind the `Corpus` and `Harness` traits:\n\n```bash\n# In the typomania checkout: feed your popular corpus, then check a name.\n# The Harness::check method (parallelized via rayon) compares the candidate\n# against every corpus entry using the squatting primitives.\ncargo run --example registry -- --corpus top-pypi-packages.json --name reqeusts\n```\n\n### Step 3: Screen with OSSGadget oss-find-squats\nOSSGadget queries the live registry, generates mutations of the supplied package, and reports which mutated names actually exist as published packages.\n\n```bash\n# Find names that squat on a legitimate package, checking which exist in the registry\noss-find-squats pkg:npm\u002Flodash\noss-find-squats pkg:pypi\u002Frequests\n\n# Reverse direction: given a SUSPECT name, find the legitimate package it mimics\noss-find-squats --quiet pkg:npm\u002Floadsh\n```\n\n### Step 4: Enumerate PyPI squats with pypi-scan\n```bash\ncd pypi-scan\n# Find candidate typosquats of a specific package\npython pypi_scan.py -p requests\n\n# Scan the top-N most-downloaded PyPI packages for existing squats\npython pypi_scan.py -n 50\n```\n\n### Step 5: Enrich suspected squats with registry metadata\nA near-miss name is only suspicious if it is also young, low-download, or ships install scripts. Pull metadata to triage:\n\n```bash\n# npm package metadata: creation time, maintainers, scripts\ncurl -s https:\u002F\u002Fregistry.npmjs.org\u002Floadsh | \\\n  python -c 'import sys,json;d=json.load(sys.stdin);v=d[\"dist-tags\"][\"latest\"];print(\"created:\",d[\"time\"][\"created\"]);print(\"scripts:\",d[\"versions\"][v].get(\"scripts\",{}))'\n\n# npm download counts (last week)\ncurl -s https:\u002F\u002Fapi.npmjs.org\u002Fdownloads\u002Fpoint\u002Flast-week\u002Floadsh\n\n# PyPI JSON API: release history and author\ncurl -s https:\u002F\u002Fpypi.org\u002Fpypi\u002Freqeusts\u002Fjson | \\\n  python -c 'import sys,json;d=json.load(sys.stdin);i=d[\"info\"];print(i[\"name\"],i[\"author\"],i[\"home_page\"]);print(\"releases:\",list(d[\"releases\"].keys()))'\n```\n\n### Step 6: Score, triage, and confirm\nCombine signals into a risk score. High risk = small edit distance to a popular name AND (package age \u003C 90 days OR downloads \u003C 1000 OR presence of `postinstall`\u002F`preinstall`\u002Fsetup-time network calls). Cross-check against the ecosyste-ms known-squats dataset:\n\n```bash\n# Is this name a documented squat?\ngrep -i 'loadsh' typosquatting-dataset\u002Fdata\u002F*.csv\n```\n\nConfirm malicious intent by inspecting (in a sandbox\u002FVM only) the install scripts and source tarball — never `npm install` or `pip install` a suspect on your workstation.\n\n### Step 7: Enforce in CI\u002FCD\nAdd a blocking gate that screens every new dependency name introduced by a PR:\n\n```yaml\n# .github\u002Fworkflows\u002Ftyposquat-gate.yml\nname: typosquat-gate\non: [pull_request]\njobs:\n  screen:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - name: Screen new dependencies\n        run: |\n          git diff origin\u002F${{ github.base_ref }}...HEAD -- package.json requirements.txt \\\n            | grep '^+' | python scripts\u002Fagent.py screen --ecosystem npm --corpus top.json --stdin\n```\n\n## Tools and Resources\n\n| Tool | Purpose | Source |\n|------|---------|--------|\n| typomania | Rust typosquat-detection library (powers crates.io) | https:\u002F\u002Fgithub.com\u002Frustfoundation\u002Ftypomania |\n| OSSGadget `oss-find-squats` | Cross-ecosystem squat finder (purl) | https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FOSSGadget |\n| pypi-scan | PyPI typosquat enumerator | https:\u002F\u002Fgithub.com\u002FIQTLabs\u002Fpypi-scan |\n| ecosyste-ms typosquatting-dataset | Curated known-squat ground truth | https:\u002F\u002Fgithub.com\u002Fecosyste-ms\u002Ftyposquatting-dataset |\n| top-pypi-packages | PyPI popular-name corpus | https:\u002F\u002Fhugovk.github.io\u002Ftop-pypi-packages\u002F |\n| OWASP CI\u002FCD Security Top 10 | Supply-chain control guidance | https:\u002F\u002Fowasp.org\u002Fwww-project-top-10-ci-cd-security-risks\u002F |\n\n## Mutation Primitives Reference\n\n| Primitive | Legit | Squat | Why it works |\n|-----------|-------|-------|--------------|\n| Transposition | requests | reqeusts | Common typing slip |\n| Omission | requests | requsts | Dropped character |\n| Repetition | requests | reqquests | Stuck key |\n| Delimiter swap | cross-env | crossenv | Hyphen vs none ambiguity |\n| Word order | python-dateutil | dateutil-python | Reordered compound name |\n| Homoglyph\u002Fvowel | requests | requeasts | Visual\u002Fphonetic similarity |\n| Suffix\u002Fscope | lodash | lodash-js, loadsh | Plausible \"official\" variant |\n\n## Validation Criteria\n\n- [ ] Popular-name corpus downloaded for each in-scope ecosystem\n- [ ] Mutation primitives reproduced and a known squat (e.g., `loadsh`) is correctly flagged\n- [ ] typomania \u002F OSSGadget \u002F pypi-scan run against at least one real package\n- [ ] Suspected squats enriched with age, download, and install-script metadata\n- [ ] Findings cross-checked against the ecosyste-ms known-squats dataset\n- [ ] Risk scoring suppresses obvious false positives (legit scoped\u002Fforked packages)\n- [ ] CI\u002FCD gate screens new dependency names on every pull request\n- [ ] No suspect package installed outside a disposable sandbox\n",{"name":5,"tags":52,"author":53,"domain":46,"license":15,"version":54,"nist_csf":55,"subdomain":35,"description":7,"mitre_attack":57},[35,29,34,41,39,33,32,31],"mahipal","1.0",[56],"ID.RA-09",[58],"T1195.002","main","54a798831d2266a3ca61ce68a7acb80b81160d57","skills\u002Fdetecting-typosquatting-packages",4425,"https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills","https:\u002F\u002Fmahipal.engineer\u002FAnthropic-Cybersecurity-Skills\u002F","https:\u002F\u002Fgithub.com\u002Fmukul975","Mahipal.engineer","🔐 Cybersecurity | 💻 Dev | 📷 Street Photographer\r\n🎓 MSc | 📚 Research & AI Security","2026-08-31 12:32:44",{"source":8,"skillName":5,"commands":70,"prompt":80,"zipAvailable":81},[71,74,77],{"tool":72,"command":73},"npx","npx skills add mukul975\u002FAnthropic-Cybersecurity-Skills --skill detecting-typosquatting-packages",{"tool":75,"command":76},"bunx","bunx skills add mukul975\u002FAnthropic-Cybersecurity-Skills --skill detecting-typosquatting-packages",{"tool":78,"command":79},"pnpm","pnpm dlx skills add mukul975\u002FAnthropic-Cybersecurity-Skills --skill detecting-typosquatting-packages","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fdetecting-typosquatting-packages\u002FSKILL.md",true,[83,89,93,97,102,108,112,116,120,124],{"path":84,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":87,"sourceHtmlUrl":88},"assets\u002FFORMATTING_GUIDE.md","ASSET","资产文件",19304,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fhypothesis-generation\u002Fassets\u002FFORMATTING_GUIDE.md",{"path":90,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":91,"sourceHtmlUrl":92},"assets\u002Fhypothesis_generation.sty",7625,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fhypothesis-generation\u002Fassets\u002Fhypothesis_generation.sty",{"path":94,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":95,"sourceHtmlUrl":96},"assets\u002Fhypothesis_report_template.tex",20148,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fhypothesis-generation\u002Fassets\u002Fhypothesis_report_template.tex",{"path":98,"resourceType":98,"resourceTypeDesc":99,"sizeBytes":100,"sourceHtmlUrl":101},"LICENSE","许可证",11255,"https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fdetecting-typosquatting-packages\u002FLICENSE",{"path":103,"resourceType":104,"resourceTypeDesc":105,"sizeBytes":106,"sourceHtmlUrl":107},"references\u002Fapi-reference.md","REFERENCE","参考文档",2166,"https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fdetecting-typosquatting-packages\u002Freferences\u002Fapi-reference.md",{"path":109,"resourceType":104,"resourceTypeDesc":105,"sizeBytes":110,"sourceHtmlUrl":111},"references\u002Fexperimental_design_patterns.md",14208,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fhypothesis-generation\u002Freferences\u002Fexperimental_design_patterns.md",{"path":113,"resourceType":104,"resourceTypeDesc":105,"sizeBytes":114,"sourceHtmlUrl":115},"references\u002Fhypothesis_quality_criteria.md",8051,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fhypothesis-generation\u002Freferences\u002Fhypothesis_quality_criteria.md",{"path":117,"resourceType":104,"resourceTypeDesc":105,"sizeBytes":118,"sourceHtmlUrl":119},"references\u002Fliterature_search_strategies.md",16656,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fhypothesis-generation\u002Freferences\u002Fliterature_search_strategies.md",{"path":121,"resourceType":104,"resourceTypeDesc":105,"sizeBytes":122,"sourceHtmlUrl":123},"references\u002Fstandards.md",1582,"https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fdetecting-typosquatting-packages\u002Freferences\u002Fstandards.md",{"path":125,"resourceType":126,"resourceTypeDesc":127,"sizeBytes":128,"sourceHtmlUrl":129},"scripts\u002Fagent.py","SCRIPT","脚本",7505,"https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fdetecting-typosquatting-packages\u002Fscripts\u002Fagent.py",[131,154,178,206,231,258],{"skillNo":132,"name":133,"nameZh":6,"description":134,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":135,"categories":136,"keywords":138,"publishedAt":47},"01M6AGDM3HJXTKXX15ZZ0ZVCJ3","verifying-build-provenance-with-slsa-sigstore","Verifies artifact signatures and SLSA provenance using Sigstore's cosign (verify, verify-attestation, verify-blob-attestation) and slsa-verifier (verify-artifact), enforcing keyless OIDC builder identity and source repo against SLSA Build levels. Use in CI\u002FCD before deploying artifacts, when consuming third-party attestations, establishing a SLSA Build L3 pipeline, or confirming provenance during incident response or admission control.","https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fverifying-build-provenance-with-slsa-sigstore\u002FSKILL.md",[137],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[139,140,141,142,38,46,143,144,145,146,147,30,36,148,35,149,150,151,152,153],"sigstore","provenance","slsa","verifying build provenance with slsa sigstore","incident response","identity","pr","code","artifacts","pipeline","t1195","attestation","code-signing","cosign","keyless",{"skillNo":155,"name":156,"nameZh":6,"description":157,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":161,"publishedAt":47},"01M6AGDGBPWYVZ2F11GFKJ4HZ9","validating-tpm-measured-boot-attestation","Verifies TPM 2.0 measured-boot integrity and remote attestation with tpm2-tools -- reading PCRs (tpm2_pcrread), replaying the boot event log, generating and checking signed quotes (tpm2_quote\u002Ftpm2_checkquote), and sealing secrets to a PCR policy. Use to confirm a system booted trusted firmware\u002Fkernel for Zero Trust device posture, detect boot-chain tampering via PCR drift, or build a golden-value baseline for fleet attestation.","https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fvalidating-tpm-measured-boot-attestation\u002FSKILL.md",[160],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[162,150,163,164,38,165,46,145,166,167,168,169,170,171,172,173,174,175,176,177],"boot","TPM","validating tpm measured boot attestation","policy","verification","ZeRO","firmware","Tools","measured-boot","PCR","integrity","secrets","remote-attestation","tpm2-tools","integrity-verification","trusted-computing",{"skillNo":179,"name":180,"nameZh":6,"description":181,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":182,"categories":183,"keywords":188,"publishedAt":47},"01M6AGDCW0Y4FXZ3362GT1941M","validating-backup-integrity-for-recovery","Validates backup integrity through cryptographic hash verification, automated restore testing, corruption detection, and recoverability checks to confirm backups are reliable for disaster recovery and ransomware response. Use before relying on backups for recovery, when building post-backup validation pipelines, auditing backup infrastructure for compliance, or checking immutable\u002Fair-gapped backups for silent corruption or tampering.","https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fvalidating-backup-integrity-for-recovery\u002FSKILL.md",[184,187],{"categoryNo":185,"categoryName":186,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[172,189,190,191,192,46,193,194,166,195,196,197,198,199,200,201,202,203,204,205],"backup","recovery","validating backup integrity for recovery","testing","infrastructure","validation","compliance","hash-verification","incident-response","ransomware","cryptocurrency","detection","t1078","t1490","immutable","disaster-recovery","restore-testing",{"skillNo":207,"name":208,"nameZh":6,"description":209,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":210,"categories":211,"keywords":213,"publishedAt":47},"01M6AGD9GBG2KZ336AE763J3WH","triaging-windows-with-kape","Runs KAPE (Kroll Artifact Parser and Extractor) to collect targeted forensic artifacts (registry hives, $MFT, event logs, prefetch, browser data) via Targets and parse them with Modules wrapping Eric Zimmerman's EZ Tools (PECmd, MFTECmd, RECmd). Use during early incident containment\u002Ftriage when full disk imaging is impractical but a defensible, parseable Windows artifact set is needed quickly, including at-scale remote collection.","https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills\u002Fblob\u002Fmain\u002Fskills\u002Ftriaging-windows-with-kape\u002FSKILL.md",[212],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[214,215,216,46,43,217,218,219,220,221,222,223,224,225,226,227,169,228,229,230],"windows","kape","triaging windows with kape","browser","logs","windows-forensics","dfir","mft","mftecmd","data","prefetch","eric-zimmerman","digital-forensics","SET","collection","pecmd","artifact-collection",{"skillNo":232,"name":233,"nameZh":6,"description":234,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":235,"categories":236,"keywords":238,"publishedAt":47},"01M6AGD5PW5J4EVZM958WD74ZQ","triaging-vulnerabilities-with-ssvc-framework","Triages and prioritizes vulnerabilities with CISA's Stakeholder-Specific Vulnerability Categorization (SSVC) decision tree, weighing exploitation status (via the CISA KEV catalog and FIRST EPSS API), technical impact, automatability, and mission prevalence to output Track\u002FTrack*\u002FAttend\u002FAct decisions. Use when prioritizing vulnerability scan results (OpenVAS, Nessus, Qualys) for remediation planning beyond raw CVSS scores.","https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills\u002Fblob\u002Fmain\u002Fskills\u002Ftriaging-vulnerabilities-with-ssvc-framework\u002FSKILL.md",[237],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[239,240,241,46,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257],"vulnerabilities","framework","triaging vulnerabilities with ssvc framework","status","planning","CISA","vulnerability-management","risk-management","nessus","qualys","openvas","cvss","remediation","risk","vulnerability","api","prioritization","ssvc","decision-tree",{"skillNo":259,"name":260,"nameZh":6,"description":261,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":262,"categories":263,"keywords":265,"publishedAt":47},"01M6AGD24TTQQM4CXG69E3B9TJ","triaging-security-incident","Performs initial triage of security incidents using the NIST SP 800-61r3 and SANS PICERL frameworks, classifying incident type, assigning priority by business impact, and routing to the appropriate response team. Use when a SIEM\u002FEDR alert needs human classification, concurrent alerts must be prioritized, or a user report or threat-intel IOC match requires initial incident categorization.","https:\u002F\u002Fgithub.com\u002Fmukul975\u002FAnthropic-Cybersecurity-Skills\u002Fblob\u002Fmain\u002Fskills\u002Ftriaging-security-incident\u002FSKILL.md",[264],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[38,266,46,267,268,269,270,271,272,273,274,201,275,202,276,277,278,279,280,281],"triaging security incident","siem","file","ioc","soc","NIST-800-61","NIST","severity","edr","execution","analysis","classification","severity-classification","incident-triage","SANS-PICERL","SOC-operations"]