← Back to News
sherlockscan added to PyPI

sherlockscan added to PyPI

sherlockscan · PyPI Skip to main content Switch to mobile version Warning Some features may not work without

JavaScript. Please try enabling it if you encounter problems. Search PyPI Search Help Docs Sponsors Log in Register Menu

Help Docs Sponsors Log in Register Search PyPI Search sherlockscan 0.2.0 Static supply-chain risk scanner for Python

packages. pip install sherlockscan Copy PIP instructions Description Download files Release history 🕵️

SherlockScan: Investigate Your Python Dependencies! Uncover hidden risks lurking within your Python packages before they

compromise your projects — especially crucial for Data Science, Machine Learning, and regulated environments. ❓ The

Mystery: What's Hiding in Your Dependencies? In the world of software development, especially in Python's rich

ecosystem, we often rely on third-party packages from sources like PyPI. We pip install them, trusting they do what they

claim. But what if they do more? Imagine inviting a helpful stranger into your house. They might fix your plumbing, but

they might also secretly copy your keys or map out your valuables. Similarly, Python packages can contain: Malicious

Code: Viruses, ransomware, or spyware hiding within seemingly useful functions. Hidden Backdoors: Secret ways for

attackers to access your systems later. Leaked Secrets: Hardcoded API keys, passwords, or tokens accidentally left in

the code. Unexpected Behavior: Code that sends your data to unknown servers or runs cryptocurrency miners during your ML

training jobs. These "supply chain attacks" are a growing threat. Regulated industries like banking and healthcare, and

sensitive fields like AI/ML dealing with valuable data and models, cannot afford to be compromised by a dependency. 🔍

Enter SherlockScan: Your Code Detective SherlockScan acts like a detective for your Python dependencies. It doesn't just

check for known vulnerabilities (like a standard security guard checking an ID list); it actively investigates the code

itself to find suspicious patterns, hidden logic, and potential malice before you integrate it deeply into your

projects. It's designed with Data Science and Machine Learning workflows in mind, looking for risks particularly

relevant to data handling, model integrity, and common DS/ML libraries — but its core analysis is valuable for any

Python project. ✨ Key Features 📜 Static Code Analysis (AST): Parses Python code to understand its structure and

identify dangerous function calls (eval, exec, pickle.load, os.system, subprocess), risky imports (networking, ctypes),

and suspicious patterns relevant to DS/ML. 🕵️ Heuristic Scanning: Uses configurable rules (regex, keywords, entropy

analysis) to find hardcoded secrets (API keys, passwords for AWS, GCP, Azure, common SaaS platforms), suspicious

comments, and potentially obfuscated code. 🔗 Dependency Vetting: Checks a package's direct dependencies against

configurable allow and block lists, ensuring you only rely on approved packages. 📦 Installation Script Analysis:

Examines setup.py and pyproject.toml for commands or custom build steps that might execute malicious code during

installation. ⚙️ Configurable Rules: Easily customize detection patterns, keywords, severity levels, and approved

dependencies via simple YAML files (risk_patterns.yaml, approved_packages.yaml). 📄 Multiple Report Formats: Generates

human-readable Markdown reports and machine-readable JSON reports. 🗣️ Explainable Results: Provides clear messages

explaining why something was flagged and an overall risk assessment with recommendations. 💻 CLI & Library: Use it

as a command-line tool or integrate its scanning functions into your own Python scripts and CI/CD pipelines. 🤔 Why

SherlockScan? While other tools exist (like SAST and SCA scanners), SherlockScan aims to fill a specific niche: Focus on

Intent & Hidden Logic: Goes beyond known CVEs to look for patterns suggesting malicious intent or dangerous

practices (like network calls on import, obfuscation, setup script execution). DS/ML Context Aware (Planned): While the

core is general, future development aims to add more checks relevant to data leakage, model tampering, and common ML

library vulnerabilities. Explainability: Provides clearer context on why a pattern is considered risky. Configuration

Flexibility: Easily tailor detection rules to your organization's specific needs and risk tolerance without complex

setup. ⚙️ How It Works: The Investigation Process SherlockScan follows a multi-stage process to analyze a target

package: graph TD A[Input: Package Target - Name/Path] --> B{Resolve Package Target}; B --> C{Find/Extract Package

Source}; C --> D[Scan Install Scripts - setup.py, pyproject.toml]; C --> E[Scan Dependencies - Metadata +

Allow/Block List]; C --> F[Find Python Files .py]; F --> G[For Each .py File]; G -- AST Analysis --> H(Identify

Risky Calls/Imports); G -- Heuristic Analysis --> I(Find Secrets, Keywords, Entropy); D --> J{Aggregate Findings};

E --> J; H --> J; I --> J; J --> K{Calculate Summary & Risk Level}; K --> L[Generate Explanation]; L

--> M{Format Report - JSON/MD}; M --> N[Output: Report - Console/File]; style B

fill:#f9f,stroke:#333,stroke-width:2px style J fill:#ccf,stroke:#333,stroke-width:2px style K

fill:#ccf,stroke:#333,stroke-width:2px style M fill:#fcf,stroke:#333,stroke-width:2px style N

fill:#9f9,stroke:#333,stroke-width:2px Stage-by-stage breakdown: Resolve Package Target: Determines if the input is a

local directory, an archive file, or a package name from PyPI. Downloads and extracts if necessary using pip download

and standard archive libraries. Finds the package source root. Scan Install Scripts: Analyzes setup.py (using AST) and

pyproject.toml (using TOML parsing) for risky commands or configurations executed during build/installation. Scan

Dependencies: Parses package metadata (using importlib.metadata on the installed package) to find direct dependencies.

Checks these against approved_packages.yaml. Scan Source Files: Recursively finds all .py files. AST Analysis: Parses

each file into an Abstract Syntax Tree. Traverses the tree to find specific function calls (eval, pickle.load,

os.system, etc.) and module imports (requests, socket, subprocess, etc.) defined as risky. Heuristic Analysis: Reads

each file line-by-line. Applies regex patterns (from risk_patterns.yaml) to detect secrets. Checks for suspicious

keywords. Calculates Shannon entropy to flag potentially obfuscated lines/strings. Aggregate & Report: Collects all

findings from all stages. Calculates a summary (counts by severity) and determines an overall risk level. Generates a

human-readable explanation. Formats the final report in JSON or Markdown. 🚀 Installation Ensure you have Python 3.8+

installed. You can install SherlockScan using pip: pip install sherlockscan Or install directly from source: git clone

https://github.com/yourusername/sherlockscan.git # TODO: Update URL cd sherlockscan pip install . SherlockScan requires

the following libraries, which are installed automatically: typer (for the CLI) PyYAML (for configuration files)

packaging (for dependency parsing) toml (for pyproject.toml parsing) 💻 Usage Command Line Interface (CLI) The primary

way to use SherlockScan is via the sherlockscan command: sherlockscan scan <package_target> [OPTIONS] Arguments:

PACKAGE_TARGET: (Required) The package to scan. This can be: A package name from PyPI (e.g., requests) A path to a local

directory containing the package source A path to a local archive file (.whl, .tar.gz, .zip) Options: Flag Description

-o, --output PATH Path to save the report file. If omitted, the report is printed to the console. -f, --format [json|md]

Output format. Default is md (Markdown). -c, --config PATH Path to the directory containing configuration files

(risk_patterns.yaml, approved_packages.yaml). Defaults to ./config. -s, --severity [CRITICAL|HIGH|MEDIUM|LOW|INFO]

Minimum severity level to report. Default is INFO (shows all). --include-tests Include bundled test and fixture code.

Tests are excluded by default to reduce noise. --sbom PATH Write a CycloneDX 1.5 JSON software bill of materials.

Examples: # Scan 'requests' from PyPI, print Markdown report to console (showing all findings) sherlockscan scan

requests # Scan a local package directory, save JSON report, show only HIGH severity or above sherlockscan scan

./my_local_package/ -f json -o report.json -s HIGH # Scan a downloaded wheel file using custom config, print MD to

console sherlockscan scan ./downloads/some_package-1.0-py3-none-any.whl -c ./my_configs/ # Generate a report and a

CycloneDX SBOM for CI or an audit trail sherlockscan scan requests --format json --output report.json --sbom

sbom.cdx.json Library Usage You can also integrate SherlockScan's core logic into your own Python scripts. ⚠️ Note:

The library API is less stable in early versions and may change. import os from sherlockscan import utils from

sherlockscan.scanner import ast_scanner, heuristics, deps, install_script_analyzer from sherlockscan.scanner import

explainer from sherlockscan.report import json_formatter # or markdown_formatter # 1. Resolve the package target to get

its source directory, name, version. # WARNING: The current implementation returns a path in a temp dir # which needs

manual cleanup after use. try: if hasattr(utils, 'resolve_package_target') and callable(utils.resolve_package_target):

pkg_dir, pkg_name, pkg_version = utils.resolve_package_target("requests") else: raise

ImportError("utils.resolve_package_target not found or not callable.") except Exception as e: print(f"Error resolving

package: {e}") exit() # Define config paths config_dir = "./config" # Or your custom path risk_patterns_path =

os.path.join(config_dir, "risk_patterns.yaml") approved_packages_path = os.path.join(config_dir,

"approved_packages.yaml") # 2. Run scanners all_findings = []

all_findings.extend(install_script_analyzer.scan_install_scripts(str(pkg_dir))) if hasattr(deps, 'scan_dependencies')

and callable(deps.scan_dependencies): all_findings.extend(deps.scan_dependencies(pkg_name, approved_packages_path))

else: print("Warning: Dependency scanner not found.") if hasattr(utils, 'find_python_files') and

callable(utils.find_python_files): python_files = utils.find_python_files(pkg_dir) for py_file in python_files:

all_findings.extend(ast_scanner.scan_file_ast(str(py_file)))

all_findings.extend(heuristics.scan_file_heuristics(str(py_file), risk_patterns_path)) else: print("Warning: Python file

finder not found.") # 3. Process results # summary = _calculate_summary(all_findings) # overall_risk_level =

_determine_overall_risk(summary) # explanation = explainer.generate_overall_explanation(...) # 4. Format report #

json_report = json_formatter.format_report_json(...) # Remember to clean up temporary directories created by

resolve_package_target! 🔧 Configuration SherlockScan uses YAML files in a configuration directory (default ./config/)

for customization. risk_patterns.yaml Defines regex patterns for secret detection (e.g., API keys, passwords). Defines

suspicious keywords to search for in code and comments. Sets the entropy_threshold for detecting potentially obfuscated

code. Allows specifying type, severity, and message for each pattern/keyword. settings: entropy_threshold: 4.0

regex_patterns: - name: AWS Access Key ID type: Hardcoded Secret pattern: '(A3T[A-Z0-9]|AKIA|...)[A-Z0-9]{16}' severity:

CRITICAL message: "Potential AWS Access Key ID detected." # ... more patterns keywords: - name: TODO Security type:

Security Comment keyword: "TODO: security" severity: LOW message: "Comment indicates a potential security task." # ...

more keywords approved_packages.yaml (Optional) Defines an allowlist of explicitly approved dependency package names. If

present and non-empty, any dependency not on this list will be flagged. Defines a blocklist of explicitly forbidden

dependency package names. Any dependency on this list will be flagged with high severity. The DS/ML allowlist is

supplied as a policy template. Set enforce_allowlist: true only when you want dependencies outside that policy to be

reported. Safety and report semantics SherlockScan does not install or import the package it analyzes. Downloads are

extracted into a temporary directory with path traversal, links/devices, member-count, and uncompressed-size checks. Run

the scanner in an isolated environment when investigating untrusted artifacts. Severity filtering controls the detailed

findings shown in a report. The overall risk and full_summary always cover the complete scan, so a filtered report

remains auditable even when lower-severity findings are hidden. Package names are canonicalized (lowercase, hyphens)

before comparison. allowlist: - numpy - pandas - requests # ... more approved packages blocklist: - malicious-lib -

outdated-insecure-package # ... more blocked packages 📊 Output Formats SherlockScan provides two output formats:

Markdown (md): (Default) Human-readable report suitable for documentation, manual review, or pasting into issues/wikis.

Includes a summary table and detailed findings with code snippets. JSON (json): Machine-readable format suitable for

integration with other tools, dashboards, or automated processing. Contains all report details in a structured format. {

"package_name": "example-package", "package_version": "1.0.0", "scan_timestamp": "2025-04-13T21:00:00Z",

"overall_risk_level": "CRITICAL", "findings": [ { "type": "Hardcoded Secret", "severity": "CRITICAL", "file_path":

"src/config.py", "line_number": 15, "code_snippet": "API_KEY = \"sk_live_...\"", "message": "Potential Stripe API Key

detected." } ], "summary": { "total_findings": 5, "by_severity": { "CRITICAL": 1, "HIGH": 2, "MEDIUM": 1, "LOW": 1 } },

"explanation": "Package analysis resulted in overall risk level CRITICAL..." } 🤝 Contributing Contributions are

welcome. Please see CONTRIBUTING.md for guidelines on reporting issues, proposing features, and submitting pull

requests. Key areas for contribution: Adding more detection rules (regex, keywords, AST patterns) Improving accuracy and

reducing false positives of existing rules Enhancing the resolve_package_target utility for better robustness Adding

support for analyzing C extensions Developing dynamic analysis (sandboxing) capabilities Improving report formatting and

explainability Adding more tests! 📜 License This project is licensed under the MIT License — see the LICENSE file

for details. Project links Data verified by PyPI on Aug 22, 2026 Data provided by the project maintainers, verified at

the time the release was uploaded to PyPI. Homepage Issues Key dates PyPI data Data sourced directly from PyPI's

database. Released: Aug 22, 2026 Latest release 1 maintainer PyPI data Data sourced directly from PyPI's database.

itsual Credits Author: Arockia Liborious GitHub Statistics Data verified by PyPI on Aug 22, 2026 The GitHub source

repository was provided by the project maintainers and verified by PyPI at the time of upload. Stars, forks, and open

issues/PRs are derived from that repository and have not been independently verified. Repository Stars: Forks: Open

issues: Open PRs: License MIT Requires Python >=3.8 Provides Extra dev Classifiers Development Status 4 - Beta

Intended Audience Developers Programming Language Python :: 3 Python :: 3 :: Only Python :: 3.9 Python :: 3.10 Python ::

3.11 Python :: 3.12 Topic Security Report project as malware Download files Download the file for your platform. If

you're not sure which to choose, learn more about installing packages. Source Distribution sherlockscan-0.2.0.tar.gz

(49.8 kB view details) Uploaded Aug 22, 2026 Source Built Distribution Filter files by name, interpreter, ABI, and

platform. If you're not sure about the file name format, learn more about wheel file names. The dropdown lists show the

available interpreters, ABIs, and platforms. Enable javascript to be able to filter the list of wheel files. Copy a

direct link to the current filters Copy File name Interpreter Interpreter py3 ABI ABI none Platform Platform any

sherlockscan-0.2.0-py3-none-any.whl (49.6 kB view details) Uploaded Aug 22, 2026 Python 3 File details Details for the

file sherlockscan-0.2.0.tar.gz. File metadata Download URL: sherlockscan-0.2.0.tar.gz Upload date: Aug 22, 2026 Size:

49.8 kB Tags: Source Uploaded using Trusted Publishing? Yes Uploaded via: twine/7.0.0 CPython/3.13.14 File hashes Hashes

for sherlockscan-0.2.0.tar.gz Algorithm Hash digest SHA256

c643c2e9b9a4f988cdf45feff48c56dd05664cf6f87f426a1189889b39379231 Copy MD5 13031e33d70409322edca88d4936e434 Copy

BLAKE2b-256 fb915d9e703c0a97290012c72d82b4ef19c5ca8f57e68526dedecefe4f5c8988 Copy See more details on using hashes here.

Provenance The following attestation bundles were made for sherlockscan-0.2.0.tar.gz: Publisher: publish.yml on

itsual/sherlockscan Attestations: Values shown here reflect the state when the release was signed and may no longer be

current. Statement: Statement type: https://in-toto.io/Statement/v1 Predicate type:

https://docs.pypi.org/attestations/publish/v1 Subject name: sherlockscan-0.2.0.tar.gz Subject digest:

c643c2e9b9a4f988cdf45feff48c56dd05664cf6f87f426a1189889b39379231 Sigstore transparency entry: 2560770260 Sigstore

integration time: Aug 22, 2026 Source repository: Permalink:

itsual/sherlockscan@4ee76f4564d7f2c835ff51a45dbbf2fb1a83960c Branch / Tag: refs/heads/main Owner:

https://github.com/itsual Access: public Publication detail: Token Issuer: https://token.actions.githubusercontent.com

Runner Environment: github-hosted Publication workflow: publish.yml@4ee76f4564d7f2c835ff51a45dbbf2fb1a83960c Trigger

Event: workflow_dispatch File details Details for the file sherlockscan-0.2.0-py3-none-any.whl. File metadata Download

URL: sherlockscan-0.2.0-py3-none-any.whl Upload date: Aug 22, 2026 Size: 49.6 kB Tags: Python 3 Uploaded using Trusted

Publishing? Yes Uploaded via: twine/7.0.0 CPython/3.13.14 File hashes Hashes for sherlockscan-0.2.0-py3-none-any.whl

Algorithm Hash digest SHA256 f584b71bfcc11b05592830ae89a3feb9b718d6db396359129af22a73c2003189 Copy MD5

8b7bf93e689edae260c0474bf000a6d6 Copy BLAKE2b-256 0825307f9622fe291d5bcb7c643b7b2ff59bd07aeb7a1b957886c21a09025ae8 Copy

See more details on using hashes here. Provenance The following attestation bundles were made for

sherlockscan-0.2.0-py3-none-any.whl: Publisher: publish.yml on itsual/sherlockscan Attestations: Values shown here

reflect the state when the release was signed and may no longer be current. Statement: Statement type:

https://in-toto.io/Statement/v1 Predicate type: https://docs.pypi.org/attestations/publish/v1 Subject name:

sherlockscan-0.2.0-py3-none-any.whl Subject digest: f584b71bfcc11b05592830ae89a3feb9b718d6db396359129af22a73c2003189

Sigstore transparency entry: 2560770275 Sigstore integration time: Aug 22, 2026 Source repository: Permalink:

itsual/sherlockscan@4ee76f4564d7f2c835ff51a45dbbf2fb1a83960c Branch / Tag: refs/heads/main Owner:

https://github.com/itsual Access: public Publication detail: Token Issuer: https://token.actions.githubusercontent.com

Runner Environment: github-hosted Publication workflow: publish.yml@4ee76f4564d7f2c835ff51a45dbbf2fb1a83960c Trigger

Event: workflow_dispatch Release history Release notifications | RSS feed This release 0.2.0 This release Aug 22, 2026 2

files Help Installing packages Uploading packages User guide Project name retention FAQs About PyPI PyPI Blog

Infrastructure dashboard Statistics Logos & trademarks Our sponsors Contributing to PyPI Bugs and feedback Contribute on

GitHub Translate PyPI Sponsor PyPI Development credits Using PyPI Terms of Service Report security issue Code of conduct

Privacy Notice Acceptable Use Policy Status: all systems operational Developed and maintained by the Python community,

for the Python community. Donate today! "PyPI", "Python Package Index", and the blocks logos are registered trademarks

of the Python Software Foundation. © 2026 Python Software Foundation Site map Deployed from 6b62157 Switch to desktop

version English español français 日本語 português (Brasil) українська Ελληνικά Deutsch 中文

(简体) 中文 (繁體) русский עברית Esperanto 한국어 Supported by AWS Cloud computing and Security

Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging

StatusPage Status page

Source: pypi.org