
정적 및 동적 분석 도구로, 오픈소스 패키지의 악성, 취약, 위험 속성을 감사하며, 샌드박스 설치를 통해 공급망 공격을 방지합니다.
Packj (패키지로 발음)는 소프트웨어 공급망 공격을 완화하는 도구입니다. NPM, RubyGems, PyPI와 같은 인기 있는 오픈소스 패키지 레지스트리에서 악성, 취약, 유지보수 중단, 타이포스쿼팅 및 기타 "위험한" 패키지를 탐지할 수 있습니다. 노이즈를 최소화하기 위해 쉽게 사용자 정의할 수 있습니다. Packj는 박사 연구 프로젝트로 시작했으며 현재 다양한 정부 보조금으로 개발 중입니다.
참고 이번 달 말에 Packj 웹서버 및 여러 통합 기능이 제공됩니다. 👊 이 저장소를 지켜봐 주세요.

여러 배포 모델을 지원합니다:
Packj를 사용하여 풀 리퀘스트의 종속성을 감사합니다.```yaml
View on GitHub [marketplace](https://github.com/marketplace/actions/packj-security-audit). Example [PR run](https://github.com/ossillate-inc/packj-github-action-demo/pull/3#issuecomment-1274797138).
### 2. Docker 이미지 (권장)
Packj를 시도/테스트하는 가장 빠른 방법은 Docker를 사용하는 것입니다. Podman도 컨테이너화된(격리된) 실행을 위해 지원됩니다.```
docker run -v /tmp:/tmp/packj -it ossillate/packj:latest --help
이 저장소를 클론하세요,``` git clone https://github.com/ossillate-inc/packj.git && cd packj
의존성 설치```
bundle install && pip3 install -r requirements.txt
도움말로 시작하세요:``` python3 main.py --help
# 지원되는 에코시스템 #
Packj는 NPM, PyPI, Rust, PHP, Rubygems 패키지 레지스트리에서 게시된 패키지를 검증할 수 있습니다. Rust 및 PHP 지원은 진행 중입니다. 레지스트리 지원을 적극적으로 추가 중입니다.
또한 로컬(미게시) NPM 및 PyPI 패키지 검증도 지원합니다.
| 레지스트리 | 에코시스템 | 지원 여부 |
| --------- | ---------- | ------------------ |
| NPM | JavaScript | :white_check_mark: |
| PyPI | Python | :white_check_mark: |
| Cargo | Rust | :white_check_mark: |
| Rubygems | Ruby | :white_check_mark: |
| Packagist | PHP | :white_check_mark: |
| Docker | Docker | :x: |
| Nuget | .NET | :white_check_mark: |
| Maven | Java | :white_check_mark: |
| Cocoapods | Swift | :x: |
# 기능 #
Packj는 다음과 같은 도구를 제공합니다:
* [감사](#auditing-a-package) - 패키지의 "위험한" 속성을 검증합니다.
* [샌드박스](#sandboxed-package-installation) - 패키지의 안전한 설치를 위한 도구입니다.
## 패키지 감사 ##
Packj는 오픈소스 소프트웨어 패키지에서 공급망 공격에 취약하게 만드는 "위험한" 속성을 감사합니다. 예를 들어, 만료된 이메일 도메인(2FA 부족), 큰 릴리스 시간 간격, 민감한 API 또는 접근 권한 등을 가진 패키지는 위험으로 표시됩니다.
다음 감사가 지원됩니다:
- 여러 패키지: `python3 main.py audit -p pypi:requests rubygems:overcommit`
- 의존성 파일: `python3 main.py audit -f npm:package.json pypi:requirements.txt`
기본적으로 `audit`는 위험한 코드를 감지하기 위해 정적 코드 분석만 수행합니다. `-t` 또는 `--trace` 플래그를 전달하면 동적 코드 분석도 함께 수행하여 요청된 모든 패키지를 strace 아래에 설치하고 설치 시간 동작을 모니터링합니다. 아래 예제 출력을 참조하세요.
<details>
<summary><h4>예제 실행/출력 보기</h4></summary>
$ docker run -v /tmp:/tmp/packj -it ossillate/packj:latest audit --trace -p npm:browserify
[+] Fetching 'browserify' from npm..........PASS [ver 17.0.0]
[+] Checking package description.........PASS [browser-side require() the node way]
[+] Checking release history.............PASS [484 version(s)]
[+] Checking version........................RISK [702 days old]
[+] Checking release time gap............PASS [68 days since last release]
[+] Checking author.........................PASS [[email protected]]
[+] Checking email/domain validity.......RISK [expired author email domain]
[+] Checking readme.........................PASS [26838 bytes]
[+] Checking homepage.......................PASS [https://github.com/browserify/browserify#readme]
[+] Checking downloads......................PASS [2M weekly]
[+] Checking repo URL.......................PASS [https://github.com/browserify/browserify]
[+] Checking repo data...................PASS [stars: 14189, forks: 1244]
[+] Checking if repo is a forked copy....PASS [original, not forked]
[+] Checking repo description............PASS [browser-side require() the node.js way]
[+] Checking repo activity...............PASS [commits: 2290, contributors: 207, tags: 413]
[+] Checking for CVEs.......................PASS [none found]
[+] Checking dependencies...................RISK [48 found]
[+] Downloading package from npm............PASS [163.83 KB]
[+] Analyzing code..........................RISK [needs 3 perm(s): decode,codegen,file]
[+] Checking files/funcs....................PASS [429 files (383 .js), 744 funcs, LoC: 9.7K]
[+] Installing package and tracing code.....PASS [found 5 process,1130 files,22 network syscalls]
=============================================
[+] 5 risk(s) found, package is undesirable!
=> Complete report: /tmp/packj_54rbjhgm/report_npm-browserify-17.0.0_hlr1rhcz.json
{
"undesirable": [
"old package: 702 days old",
"invalid or no author email: expired author email domain",
"generates new code at runtime",
"reads files and dirs",
"forks or exits OS processes",
]
}
</details>
> 경고: 패키지가 설치 중에 악성 코드를 실행할 수 있으므로, `-t` 또는 `--trace`는 Docker 컨테이너나 가상 머신 내에서만 사용하는 것이 좋습니다.
감사는 Docker/Podman 컨테이너에서도 수행할 수 있습니다. 위험한 속성 및 사용 방법에 대한 자세한 내용은 [Audit README](https://github.com/ossillate-inc/packj/blob/main/packj/audit/README.md)를 참조하십시오.
## 샌드박스 패키지 설치 ##
Packj는 패키지의 `안전한 설치`를 위한 경량 샌드박싱을 제공합니다. 구체적으로, 악성 패키지가 민감한 데이터를 유출하거나, 민감한 파일(예: SSH 키)에 접근하거나, 악성 코드를 지속적으로 설치하는 것을 방지합니다.
설치 시간 스크립트(네이티브 컴파일 포함)를 샌드박싱합니다. **strace**를 사용합니다(즉, VM/컨테이너가 필요 없음).
샌드박싱 메커니즘 및 사용 방법에 대한 자세한 내용은 [Sandbox README](https://github.com/ossillate-inc/packj/blob/main/packj/sandbox/README.md)를 참조하십시오.
<details>
<summary><h4>예제 실행/출력 보기</h4></summary>