Skip to main content

Supply Chain Security Scanner

A comprehensive security tool to detect compromised NPM packages in your Git repositories across multiple platforms (GitHub, GitLab, Bitbucket).

🚨 Background: The Growing Supply Chain Threat

The Problem

Software supply chain attacks have become one of the most critical cybersecurity threats facing organizations today. These attacks involve compromising legitimate packages in public repositories (like NPM, PyPI, or RubyGems) to distribute malicious code to downstream users.

Recent Statistics:

  • Supply chain attacks increased by 300% in 2021-2024
  • Over 200,000 malicious packages discovered in NPM alone
  • Average time to detect: 97 days
  • Cost per incident: $4.45M on average

The Shai-Hulud Attack (September 2025)

The most recent and significant supply chain attack, dubbed "Shai-Hulud," compromised approximately 200 NPM packages between September 14-16, 2025. This sophisticated worm-like malware:

  • Targets: Popular packages like @ctrl/tinycolor (8M+ monthly downloads), @crowdstrike/* packages, ngx-bootstrap, and others
  • Method: Uses postinstall scripts to execute malicious payload via Webpack bundle
  • Payload: Steals developer credentials (NPM tokens, GitHub PATs, AWS/GCP keys) using TruffleHog
  • Propagation: Self-replicates by publishing malicious versions of other packages using stolen credentials
  • Data Exfiltration: Creates "ShaiHulud" repositories in victim's accounts and sends data to webhook.site

Impact on Organizations:

  • Credential theft leading to further compromise
  • Source code exposure through repository conversion
  • CI/CD pipeline infiltration
  • Lateral movement across development infrastructure
  • Supply chain contamination affecting downstream users

💡 Why This Tool Exists

Traditional vulnerability scanners often miss supply chain attacks because:

  1. Time Gap: Packages appear legitimate until discovered
  2. Version Confusion: Organizations struggle to track which versions are affected
  3. Scale Challenge: Large organizations have hundreds of repositories
  4. Platform Fragmentation: Code scattered across GitHub, GitLab, etc.
  5. Manual Process: Security teams need hours to audit dependencies manually

This tool solves these problems by providing:

  • Automated scanning across multiple Git platforms
  • Flexible package definitions via external configuration
  • Multiple output formats for integration with security workflows
  • Comprehensive reporting with project-level details
  • Real-time detection capability for new threats

🎯 Use Cases

Immediate Response (Active Incident)

When a supply chain attack is announced:

  1. Update the compromised packages list
  2. Run scanner across all repositories
  3. Generate reports for affected teams
  4. Coordinate remediation efforts

Proactive Monitoring

  • Regular scans for known compromised packages
  • Integration with CI/CD for new project validation
  • Compliance reporting for security audits
  • Supply chain risk assessment

Threat Intelligence

  • Custom package lists based on threat intel
  • Historical tracking of compromised dependencies
  • Risk scoring based on usage patterns

🚀 Features

  • ✅ Multi-Platform Support: GitHub, GitLab (Bitbucket coming soon)
  • ✅ Multiple Output Formats: CSV, JSON, YAML
  • ✅ Configurable Package Lists: External file support
  • ✅ Comprehensive Scanning: All package.json files in repositories
  • ✅ Detailed Reporting: Project, version, and location information
  • ✅ Risk Assessment: Automatic risk level assignment
  • ✅ API Integration: RESTful APIs with proper authentication
  • ✅ Error Handling: Robust error handling and logging
  • ✅ Performance: Efficient scanning with progress tracking

📦 Installation

Prerequisites

  • Python 3.8+
  • Git platform API token (GitHub/GitLab)

Install Dependencies

pip install requests pyyaml

Download

git clone https://github.com/security-community/supply-chain-scanner.git
cd supply-chain-scanner

🔧 Configuration

API Tokens

GitHub Token

  1. Go to GitHub Settings → Developer Settings → Personal Access Tokens
  2. Generate new token with repo scope
  3. Use token: ghp_xxxxxxxxxxxxxxxxxxxx

GitLab Token

  1. Go to GitLab Profile Settings → Access Tokens
  2. Create token with read_repository scope
  3. Use token: glpat-xxxxxxxxxxxxxxxxxxxx

Compromised Packages File

Create a custom packages file (optional):

packages.txt (one package per line):

@ctrl/tinycolor
ngx-toastr
angulartics2
# Comments supported
@crowdstrike/foundry-js

packages.json:

{
  "attack_name": "Shai-Hulud",
  "date": "2025-09-14",
  "packages": [
    "@ctrl/tinycolor",
    "ngx-toastr",
    "angulartics2"
  ]
}

🎮 Usage

Basic Usage

Scan GitLab Projects

python scanner.py --provider gitlab --token glpat-xxxxxxxxxxxxxxxxxxxx

Scan GitHub Repositories

python scanner.py --provider github --token ghp-xxxxxxxxxxxxxxxxxxxx

Self-hosted Instances

# GitLab self-hosted
python scanner.py --provider gitlab --token TOKEN --url https://gitlab.company.com

# GitHub Enterprise
python scanner.py --provider github --token TOKEN --url https://github.company.com/api/v3

Advanced Usage

Custom Package List

python scanner.py --provider gitlab --token TOKEN --packages compromised_packages.txt

Different Output Formats

# JSON output
python scanner.py --provider github --token TOKEN --format json --output results.json

# YAML output  
python scanner.py --provider gitlab --token TOKEN --format yaml --output results.yaml

Verbose Logging

python scanner.py --provider gitlab --token TOKEN --verbose

Complete Example

# Comprehensive scan with custom packages and JSON output
python scanner.py \
  --provider gitlab \
  --token glpat-xxxxxxxxxxxxxxxxxxxx \
  --url https://gitlab.company.com \
  --packages shai_hulud_packages.txt \
  --format json \
  --output security_scan_$(date +%Y%m%d).json \
  --verbose

📊 Output Examples

CSV Output

project,project_id,package,version,file_path,dependency_type,risk_level,repository_url,scan_timestamp
frontend/dashboard,123,ngx-toastr,^19.0.0,package.json,dependencies,CRITICAL,https://gitlab.com/company/frontend/dashboard,2025-09-17T14:30:00

JSON Output

{
  "scan_info": {
    "timestamp": "2025-09-17T14:30:00.123456",
    "total_vulnerabilities": 5,
    "scanner_version": "1.0.0"
  },
  "vulnerabilities": [
    {
      "project": "frontend/dashboard",
      "project_id": 123,
      "package": "ngx-toastr", 
      "version": "^19.0.0",
      "file_path": "package.json",
      "dependency_type": "dependencies",
      "risk_level": "CRITICAL",
      "repository_url": "https://gitlab.com/company/frontend/dashboard",
      "scan_timestamp": "2025-09-17T14:30:00.123456"
    }
  ]
}

🛠️ Integration

CI/CD Pipeline

# GitLab CI example
security_scan:
  stage: test
  script:
    - python scanner.py --provider gitlab --token $GITLAB_TOKEN --format json
    - if [ -s results.json ]; then exit 1; fi  # Fail if vulnerabilities found
  artifacts:
    reports:
      junit: results.json
    when: always

Scheduled Monitoring

# Cron job for daily scans
0 2 * * * /usr/bin/python3 /path/to/scanner.py --provider gitlab --token $GITLAB_TOKEN --output /var/log/security/daily_scan.csv 2>&1 | logger -t supply-chain-scanner

🔍 Understanding Results

Risk Levels

  • CRITICAL: Package in compromised list, immediate action required
  • HIGH: Suspicious version patterns or timing
  • MEDIUM: Related packages or dependencies
  • LOW: Historical vulnerabilities, monitoring recommended

Recommended Actions

  1. CRITICAL findings:

    • Stop all deployments immediately
    • Downgrade to safe versions
    • Rotate all credentials
    • Scan systems for compromise indicators
  2. Investigation:

    • Check NPM logs for postinstall execution
    • Look for unexpected repositories
    • Review CI/CD logs for anomalies

📈 Performance

Typical Performance

  • Small org (50 repos): 2-5 minutes
  • Medium org (200 repos): 10-15 minutes
  • Large org (1000+ repos): 45-60 minutes

Optimization Tips

  • Use API tokens with appropriate scopes only
  • Run during off-peak hours for large organizations
  • Filter repositories by activity date if needed
  • Use parallel processing for very large deployments

🤝 Contributing

We welcome contributions from the security community!

How to Contribute

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/new-provider)
  3. Make your changes
  4. Add tests for new functionality
  5. Submit a pull request

Areas for Contribution

  • New Git Providers: Bitbucket, Azure DevOps, etc.
  • Package Managers: PyPI, RubyGems, Maven, etc.
  • Output Formats: XML, HTML reports, etc.
  • Integrations: Slack notifications, JIRA tickets, etc.
  • Performance: Async scanning, caching, etc.

Code Style

  • Follow PEP 8 for Python code
  • Include type hints where applicable
  • Add docstrings for all public methods
  • Write tests for new features

🔒 Security Considerations

Token Security

  • Store tokens in environment variables, not code
  • Use tokens with minimal required scopes
  • Rotate tokens regularly
  • Monitor token usage in audit logs

Network Security

  • Tool makes HTTPS API calls only
  • No data stored locally except output files
  • Respect rate limits to avoid blocking
  • Use corporate proxies if required

Privacy

  • Tool only reads package.json files
  • No source code content is accessed
  • Minimal metadata collected
  • No telemetry or tracking

📚 Threat Intelligence Sources

Staying Updated

Subscribe to security advisories:

  • NPM Security Advisory Database
  • GitHub Advisory Database
  • Snyk Vulnerability Database
  • MITRE CVE Database
  • Sonatype Security Research

Package List Maintenance

# Update default packages with new threats
curl -s https://api.github.com/advisories | jq '.[] | select(.ecosystem=="npm") | .package.name' >> new_threats.txt

🆘 Incident Response Workflow

Phase 1: Detection (0-1 hour)

  1. Run scanner with latest threat intelligence
  2. Generate reports in multiple formats
  3. Identify affected teams and projects
  4. Assess scope and potential impact

Phase 2: Containment (1-4 hours)

  1. Stop CI/CD pipelines for affected projects
  2. Revoke and rotate all potentially compromised credentials
  3. Block malicious package versions at network level
  4. Communicate with affected teams

Phase 3: Eradication (4-24 hours)

  1. Downgrade packages to safe versions
  2. Scan systems for compromise indicators
  3. Review access logs for unauthorized activity
  4. Update security policies and controls

Phase 4: Recovery (1-7 days)

  1. Test applications with safe package versions
  2. Resume CI/CD operations with additional controls
  3. Monitor for reinfection or lateral movement
  4. Conduct lessons learned session

📋 Compliance and Reporting

Regulatory Requirements

  • SOX: Document supply chain risk management
  • PCI DSS: Secure development lifecycle controls
  • GDPR: Data protection in development tools
  • ISO 27001: Information security management

Audit Reports

Generate compliance-ready reports:

# Weekly compliance scan
python scanner.py --provider gitlab --token $TOKEN --format json --output compliance_$(date +%Y_week_%U).json

# Executive summary
python reporter.py --input compliance_*.json --summary --format pdf

🐛 Troubleshooting

Common Issues

Authentication Errors

Error: 401 Unauthorized

Solution: Check token validity and permissions

# Test GitLab token
curl -H "PRIVATE-TOKEN: $TOKEN" "https://gitlab.com/api/v4/user"

# Test GitHub token  
curl -H "Authorization: token $TOKEN" "https://api.github.com/user"

Rate Limiting

Error: 429 Too Many Requests

Solution: Add delays or use multiple tokens

# Add to scanner configuration
RATE_LIMIT_DELAY = 1  # seconds between requests

Large Repository Timeouts

Error: Timeout reading package.json

Solution: Increase timeout values

# Modify timeout in provider classes
response = self.session.get(url, timeout=60)

Debug Mode

python scanner.py --provider gitlab --token TOKEN --verbose 2>&1 | tee debug.log

📊 Analytics and Metrics

Key Metrics to Track

  • Number of vulnerable projects over time
  • Mean time to remediation (MTTR)
  • Repeat violations by team
  • Coverage percentage of repositories
  • False positive rates

Dashboards

Integrate with monitoring tools:

  • Grafana dashboards for trending
  • Splunk searches for log analysis
  • ELK stack for centralized logging

🌟 Success Stories

"This tool helped us identify 47 compromised packages across 200+ repositories in under 10 minutes during the Shai-Hulud incident. Without it, manual review would have taken days."

- CISO, Fortune 500 Financial Services

"We integrated the scanner into our CI/CD pipeline and prevented 12 supply chain compromises before they reached production."

- Security Engineer, Tech Startup

📞 Support

Community Support

  • GitHub Issues: Report bugs and request features
  • Discussions: Ask questions and share experiences
  • Wiki: Community-maintained documentation

Professional Support

For enterprise deployments:

  • Custom integrations and extensions
  • On-site training and consultation
  • SLA-backed support agreements
  • Threat intelligence integration

📄 License

MIT License - see LICENSE file for details.

🙏 Acknowledgments

  • Security researchers who discovered the Shai-Hulud attack
  • Open source community for package vulnerability reporting
  • Platform providers (GitHub, GitLab) for robust APIs
  • Organizations sharing threat intelligence

🔮 Roadmap

v1.1 (Q4 2025)

  • Bitbucket support
  • Async scanning for better performance
  • Risk scoring algorithms
  • Integration with security orchestration platforms

v1.2 (Q1 2026)

  • Python package scanning (PyPI)
  • Historical vulnerability tracking
  • Machine learning for anomaly detection
  • REST API server mode

v2.0 (Q2 2026)

  • Multi-language support (Go, Rust, Java)
  • Enterprise SSO integration
  • Advanced reporting and analytics
  • Real-time monitoring capabilities

⚠️ Remember: Supply chain security is a shared responsibility. Stay vigilant, keep dependencies updated, and respond quickly to emerging threats.

Metadata

Release files for supply-chain-scanner 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for supply-chain-scanner 1.0.0
File Size Uploaded Provenance Actions
supply_chain_scanner-1.0.0.tar.gz 38.9 kB Without provenance Details for supply_chain_scanner-1.0.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for supply-chain-scanner 1.0.0
File Interpreter ABI Platform Actions
supply_chain_scanner-1.0.0-py3-none-any.whl Python 3 none any Details for supply_chain_scanner-1.0.0-py3-none-any.whl

Total release size: 56.1 kB

Release files / supply_chain_scanner-1.0.0.tar.gz

Download URL supply_chain_scanner-1.0.0.tar.gz
Size 38.9 kB
Tags Source
SHA-256 checksum
How to use checksums
ba34812674e4618c9371d670054a1579de5bf31f340298944b27b3060245dc7a
BLAKE2b-256 checksum
How to use checksums
42db17715da6db32e9f8ea4d251c16bc7786161f2d06254d89a87cba6ff68d78
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.6

Release files / supply_chain_scanner-1.0.0-py3-none-any.whl

Download URL supply_chain_scanner-1.0.0-py3-none-any.whl
Size 17.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8b80959167abe09818ad268762511978fce63a291aaf28f31f0263c12b8fa3de
BLAKE2b-256 checksum
How to use checksums
935ac83facd92a1400ea0f94d5f878d64024ceafbf9af2054558effa772c808d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.6

Security for supply-chain-scanner 1.0.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page