
Rust로 작성된 파이썬 종속성 취약점 스캐너.
Pyscan은 Rust로 작성된 고성능 동시성 취약점 스캐너입니다. Python 프로젝트를 자동으로 탐색하고, 다양한 패키징 형식에서 의존성을 추출한 후, 단일 비동기 배치 요청으로 오픈소스 취약점(OSV) 데이터베이스와 상호 참조합니다.
Pyscan은 기존 Python 기반 보안 도구의 성능 및 메모리 병목 현상을 해결하기 위해 설계되었습니다.
pip-audit 및 safety 같은 업계 표준 도구 대비 최대 5.25배 속도 향상을 달성합니다. Pyscan의 실행 시간은 $O(\text{vulns})$ 시간 복잡도 모델로 작동하며, 실행 시간은 발견된 취약점 수에 비례하고 의존성 수에는 영향을 받지 않습니다.uv.lock, requirements.txt, pyproject.toml(Poetry, Hatch, PDM, Flit)에서 자동으로 의존성을 해결하고 추출하거나, 원시 .py 소스 코드를 파싱하여 동적으로 추출합니다.자세한 내용은 벤치마크 보고서에서 확인하세요.
Pyscan은 pipx, pip(컴파일된 Python 휠) 또는 cargo(네이티브 Rust 바이너리)를 통해 설치할 수 있습니다.
# pipx를 통한 설치 (권장) ("-rs" 접미사에 주의)
pipx install pyscan-rs
# pip를 통한 설치 ("-rs" 접미사에 주의)
pip install pyscan-rs
# Cargo를 통한 설치
cargo install pyscan
프로젝트 루트 디렉토리에서 pyscan을 실행하거나, 특정 소스 폴더를 지정하면 됩니다.
# 현재 디렉토리 스캔
pyscan
# 특정 디렉토리 스캔
pyscan -d path/to/src
여러 소스 파일이 존재하는 경우 Pyscan은 다음 우선순위 체인에 따라 의존성을 추출합니다.
bom.json, spdx.json)uv.lockrequirements.txtpyproject.toml.py)의존성이 엄격하게 고정된 버전 없이 발견된 경우 Pyscan은 최신 버전을 위해 PyPI에 폴백하여 질의합니다. 하지만 PEP-508 구문을 따를 것을 적극 권장합니다.
Pyscan은 Rust 툴체인 >= v1.70이 필요하며, reqwest와 tokio를 통한 비동기 네트워킹을 활용하여 OSV 쿼리를 병렬화하고 처리량을 극대화합니다. 파서와 스캐너의 구조에 관심이 있다면 아키텍처 개요를 확인하세요.
Pyscan은 고도로 최적화된 도구이지만, 아직 모든 엣지 케이스에서 충분히 검증되지 않았습니다. 이 도구가 모든 벡터로부터 코드를 100% 안전하게 보호한다고 보장하지는 않습니다. Dependabot, pip-audit, Trivy 같은 도구와 함께 계층적 보안 접근 방식을 사용하는 것을 적극 권장합니다. PR 및 이슈 제출은 언제나 환영합니다!
이 프로젝트는 제가 가난한 고등학생일 때 시작했고, 지금은 가난한 대학생입니다. Pyscan이 여러분의 CI/CD 파이프라인에서 소중한 시간과 RAM을 절약해 주었다면, 커피 한 잔 사주시는 건 어떨까요?