PACKJ (PRONOUNTED 패키지)는 소프트웨어 공급망 공격을 완화하는 데 도움이되는 도구입니다. NPM, Rubygems 및 PYPI와 같은 인기있는 오픈 소스 패키지 레지스트리의 악의적, 취약, 포기, 타이포 제곱 및 기타 "위험한"패키지를 감지 할 수 있습니다. 소음을 최소화하기 위해 쉽게 사용자 정의 할 수 있습니다. PACKJ는 박사 연구 프로젝트로 시작했으며 현재 다양한 정부 보조금으로 개발되고 있습니다.
자체 호스팅 된 Packj 웹 서버 및 이번 달 후반에 몇 가지 통합이 있습니까 ? 이 저장소가 최신 상태를 유지하도록 지켜보십시오.
여러 배포 모델을 지원합니다.
PACKJ를 사용하여 풀 요청에서 의존성을 감사하십시오.
- name : Packj Security Audit
uses : ossillate-inc/[email protected]
with :
# TODO: replace with your dependency files in the repo
DEPENDENCY_FILES : pypi:requirements.txt,npm:package.json,rubygems:Gemfile
REPO_TOKEN : ${{ secrets.GITHUB_TOKEN }}Github Marketplace에서보기. 예제 PR 실행.
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 패키지 레지스트리에서 Pubished 패키지를 조사 할 수 있습니다. 녹 및 PHP 지원이 WIP입니다. 우리는 레지스트리에 대한 지원을 적극적으로 추가하고 있습니다. 또한 현지 (미공개) NPM 및 PYPI 패키지를 지원합니다.
| 기재 | 생태계 | 지원 |
|---|---|---|
| NPM | 자바 스크립트 | ✅ |
| pypi | 파이썬 | ✅ |
| 뱃짐 | 녹 | ✅ |
| rubygems | 루비 | ✅ |
| Packagist | PHP | ✅ |
| 도커 | 도커 | |
| 너겟 | .그물 | ✅ |
| Maven | 자바 | ✅ |
| 코코 포드 | 스위프트 |
Packj는 다음과 같은 도구를 제공합니다.
Packj는 공급망 공격에 취약하게 만드는 "위험한"속성에 대한 오픈 소스 소프트웨어 패키지를 감사합니다. 예를 들어, 만료 된 이메일 도메인 (2FA 부족), 대규모 릴리스 시간 간격, 민감한 API 또는 액세스 권한 등이있는 패키지는 위험한 것으로 표시됩니다.
다음 감사가 지원됩니다.
python3 main.py audit -p pypi:requests rubygems:overcommitpython3 main.py audit -f npm:package.json pypi:requirements.txt 기본적으로 audit 위험한 코드를 감지하기 위해 정적 코드 분석 만 수행합니다. PAAS -t 또는 --trace 플래그를 통해 동적 코드 분석을 수행 할 수 있으며,이 코드 분석을 수행 할 수 있습니다.이 코드 분석은 Strace 아래에 요청 된 모든 패키지를 설치하고 패키지의 설치 시간 동작을 모니터링합니다. 아래의 출력 예를 참조하십시오.
$ 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",
]
}
경고 : 패키지는 설치 중에 악성 코드를 실행할 수 있으므로 Docker 컨테이너 또는 가상 머신 내부에서 실행할 때
-t또는--trace만 사용하는 것이 좋습니다.
감사는 Docker/Podman 컨테이너에서도 수행 할 수 있습니다. 위험한 속성에 대한 세부 정보와 감사 읽기에서 사용하는 방법을 찾으십시오.
PackJ는 패키지를 safe installation 위해 가벼운 샌드 박스를 제공합니다. 구체적으로, 민감한 민감한 데이터를 추방하는 악의적 인 패키지, 민감한 파일 (예 : SSH 키)에 액세스하고 지속적인 맬웨어를 방지합니다.
IT 샌드 박스는 기본 상응을 포함하여 설치 시간 스크립트입니다. Strace를 사용합니다 (즉, VM/컨테이너가 필요 하지 않음 ).
샌드 박스 메커니즘과 샌드 박스 readme에서 사용 방법에 대한 세부 정보를 찾으십시오.
$ python3 main.py sandbox gem install overcommit
Fetching: overcommit-0.59.1.gem (100%)
Install hooks by running `overcommit --install` in your Git repository
Successfully installed overcommit-0.59.1
Parsing documentation for overcommit-0.59.1
Installing ri documentation for overcommit-0.59.1
#############################
# Review summarized activity
#############################
[+] Network connections
[+] DNS (1 IPv4 addresses) at port 53 [rule: ALLOW]
[+] rubygems.org (4 IPv6 addresses) at port 443 [rule: IPv6 rules not supported]
[+] rubygems.org (4 IPv4 addresses) at port 443 [rule: ALLOW]
[+] Filesystem changes
/
└── home
└── ubuntu
└── .ruby
├── gems
│ ├── iniparse-1.5.0 [new: DIR, 15 files, 46.6K bytes]
│ ├── rexml-3.2.5 [new: DIR, 77 files, 455.6K bytes]
│ ├── overcommit-0.59.1 [new: DIR, 252 files, 432.7K bytes]
│ └── childprocess-4.1.0 [new: DIR, 57 files, 141.2K bytes]
├── cache
│ ├── iniparse-1.5.0.gem [new: FILE, 16.4K bytes]
│ ├── rexml-3.2.5.gem [new: FILE, 93.2K bytes]
│ ├── childprocess-4.1.0.gem [new: FILE, 34.3K bytes]
│ └── overcommit-0.59.1.gem [new: FILE, 84K bytes]
├── specifications
│ ├── rexml-3.2.5.gemspec [new: FILE, 2.7K bytes]
│ ├── overcommit-0.59.1.gemspec [new: FILE, 1.7K bytes]
│ ├── childprocess-4.1.0.gemspec [new: FILE, 1.8K bytes]
│ └── iniparse-1.5.0.gemspec [new: FILE, 1.3K bytes]
├── bin
│ └── overcommit [new: FILE, 622 bytes]
└── doc
├── iniparse-1.5.0
│ └── ri [new: DIR, 119 files, 131.7K bytes]
├── rexml-3.2.5
│ └── ri [new: DIR, 836 files, 841K bytes]
├── overcommit-0.59.1
│ └── ri [new: DIR, 1046 files, 1.5M bytes]
└── childprocess-4.1.0
└── ri [new: DIR, 272 files, 297.8K bytes]
[C]ommit all changes, [Q|q]uit & discard changes, [L|l]ist details:
TL; Dr Packj는 박사 연구 프로젝트로 시작했습니다. 그것은 다양한 정부 보조금으로 뒷받침됩니다.
PackJ는 학술 연구 프로젝트로 시작했습니다. 구체적으로, PACKJ에서 사용하는 정적 코드 분석 기술은 최첨단 사이버 보안 연구 : Georgia Tech의 연구 그룹의 Maloss Project를 기반으로합니다.
Packj는 NSF, Gra 및 Alinnovate의 관대 한 보조금으로 뒷받침됩니다.
TL; 최첨단 취약점 스캐너는 타사 오픈 소스 코드가 양성이라고 가정합니다. 따라서 이러한 모든 도구는 우발적 인 프로그래밍 버그 (LOG4J와 같은 CVE)의 위협 만 해결합니다. 그들은 의존성 혼동, 타이포 제기, 항의 조정 (Saboting), 계정 납치 및 사회 공학을 포함하여 공급 채널에서 새로운 취약점을 사용하여 나쁜 행위자에 의해 전파되는 고의적으로 나쁜 (일명 악의적) 코드로부터 Solarwinds와 같은 현대 소프트웨어 공급망 공격으로부터 보호하지 않습니다. 최근 (12 월) 예는 의존성 혼란 취약성 (CVE 할당 없음)을 사용하여 손상된 Pytorch 패키지입니다.
PACKJ는 CVE에 대한 감사뿐만 아니라 심층적 인 정적+동적 코드 분석 및 메타 데이터 검사를 수행하여 쉘의 산란, SSH 키 사용, GitHub 코드 대 패키지 코드 (출처)의 불일치, 2FA 부족 등과 같은 "위험한"동작 및 속성을 감지합니다. 이러한 불안한 속성은 CVE로 자격이 없으므로 기존 도구 중 어느 것도이를 표시 할 수 없습니다. PACKJ는 소프트웨어 공급망에서 악의적, 오타 제곱, 버려진, 취약 및 기타 불안한 의존성 (약한 링크)을 플래그 할 수 있습니다.
현재 소프트웨어 공급망 위협 모델은 타사 오픈 소스 코드가 양성이라고 가정하므로 보안 취약점은 우발적 인 프로그래밍 버그 (일명 CVE)에 대해서만 추적됩니다. 따라서 기존의 모든 오픈 소스 취약성 스캐너는 공개적으로 알려진 CVE 만보 고하고 우발적 인 버그의 위협을 양성 코드로 해결합니다.
우발적 인 프로그래밍 버그의 일반적인 예는 사용자 입력에 대한 누락 된 바운드 점검으로 코드가 버퍼 오버플로 공격에 취약 해집니다. 실제 인기있는 예로는 Log4J와 Heartbled가 포함됩니다. 공격자는 CVE를 트리거하기 위해 악용을 개발해야합니다 (예 : 심장이 가득한 경우, 버퍼 오버플로를 유발하기위한 수치 적으로 높은 입력의 경우 제작 된 TCP/IP 패킷). CVE는 라이브러리의 최신 버전으로 패치하거나 업그레이드하여 고정 될 수 있습니다 (예 : 최신 버전의 Log4J를 CVE 수정).
현대적인 소프트웨어 공급망 위협 환경은 태양 광선 공격 후에 바뀌 었습니다 . 나쁜 행위자들은 새로운 취약점을 발견했지만 이번에는 코드가 아닌 공급 채널에서. 의존성 혼란, 오타 제기, 항의 저기 (파괴), 계정 납치 및 사회 공학과 같은 이러한 새로운 취약점이 악성 코드를 전파하기 위해 악용되고 있습니다. 수천 개의 손상된 NPM/PYPI/RUBY 패키지 가보고되었습니다.
CVE와 달리 맬웨어는 의도적으로 나쁘다 (일명 악성) 코드. 또한 맬웨어 자체는 이용이며 최신 버전으로 업그레이드하여 패치하거나 고정 할 수 없습니다. 예를 들어, 의존성 혼란 공격은 의도적으로 악의적이었습니다. 코드에서 우발적 인 프로그래밍 버그를 악용하지 않았습니다. 마찬가지로, 전쟁에 항의하기 위해 자신의 코드를 방해하는 인기 패키지의 저자는 의도적이며 CVE를 악용하지 않습니다. 오타 제곱은 나쁜 행위자가 인기있는 오픈 소스 패키지 레지스트리에서 맬웨어를 전파하는 데 사용하는 또 다른 공격 벡터입니다.
기존 스캐너는 의도적으로 취약한 (악성) 코드에서 이러한 태양과 같은 최신 소프트웨어 공급망 공격을 감지 하지 못합니다 . 이 도구는 오픈 소스 종속성에 대한 소스 코드를 스캔하고 사용중인 모든 종속성 목록을 컴파일하며 데이터베이스 (예 : NVD)에서 각각 <의존성 이름, 종속성 버전> UP을보고 영향을받는 패키지 버전 (예 : Heartbled에 의해 영향을받는 Log4J, LiBSSL 버전의 취약한 버전)을보고합니다.
PACKJ는 CVE에 대한 감사뿐만 아니라 심층적 인 정적+동적 코드 분석 및 메타 데이터 검사를 수행하여 쉘의 산란, SSH 키 사용, GitHub 코드 대 패키지 코드 (출처)의 불일치, 2FA 부족 등과 같은 "위험한"동작 및 속성을 감지합니다. 이러한 불안한 속성은 CVE로 자격이 없으므로 기존 도구 중 어느 것도이를 표시 할 수 없습니다. PACKJ는 소프트웨어 공급망에서 악의적, 오타 제곱, 버려진, 취약 및 기타 불안한 의존성 (약한 링크)을 플래그 할 수 있습니다. Audit ReadMe에서 자세한 내용을 읽으십시오
PACKJ는 위협 모델에 쉽게 사용자 정의 할 수 있습니다 (제로 노이즈). Repo/Project의 상단 DIR에 .packj.yaml 파일을 추가하고 원치 않는 속성을 댓글을 달아 경고 피로를 줄입니다.
우리는이 도구를 사용하여 PYPI 및 Rubygems에서 각각 40 및 20 이상의 악성 패키지를 발견했습니다. 그들 중 다수가 무너졌습니다. 아래 예제를 참조하십시오.
$ python3 main.py audit pypi:krisqian
[+] Fetching 'krisqian' from pypi...OK [ver 0.0.7]
[+] Checking version...OK [256 days old]
[+] Checking release history...OK [7 version(s)]
[+] Checking release time gap...OK [1 days since last release]
[+] Checking author...OK [[email protected]]
[+] Checking email/domain validity...OK [[email protected]]
[+] Checking readme...ALERT [no readme]
[+] Checking homepage...OK [https://www.bilibili.com/bangumi/media/md140632]
[+] Checking downloads...OK [13 weekly]
[+] Checking repo_url URL...OK [None]
[+] Checking for CVEs...OK [none found]
[+] Checking dependencies...OK [none found]
[+] Downloading package 'KrisQian' (ver 0.0.7) from pypi...OK [1.94 KB]
[+] Analyzing code...ALERT [needs 3 perms: process,network,file]
[+] Checking files/funcs...OK [9 files (2 .py), 6 funcs, LoC: 184]
=============================================
[+] 6 risk(s) found, package is undesirable!
{
"undesirable": [
"no readme",
"only 45 weekly downloads",
"no source repo found",
"generates new code at runtime",
"fetches data over the network: ['KrisQian-0.0.7/setup.py:40', 'KrisQian-0.0.7/setup.py:50']",
"reads files and dirs: ['KrisQian-0.0.7/setup.py:59', 'KrisQian-0.0.7/setup.py:70']"
]
}
=> Complete report: pypi-KrisQian-0.0.7.json
=> View pre-vetted package report at https://packj.dev/package/PyPi/KrisQian/0.0.7
Packj는 소스 리포지토리가없고 패키지 설치 시간 (setup.py) 동안 민감한 API (네트워크, 코드 생성)의 사용으로 인해 Krisqian (v0.0.7)을 의심스럽게 표시했습니다. 우리는 더 깊이 살펴보기로 결정했고, 패키지가 악의적 인 것을 발견했습니다. https://packj.dev/malware/krisqian에서 자세한 분석을 찾으십시오.
우리가 찾은 맬웨어의 더 많은 예는 https://packj.dev/malware에 나열되어 있습니다. 전체 목록은 [email protected]으로 문의하십시오.
PACKJ 도구 또는 오픈 소스 소프트웨어 공급망 공격에 대한 자세한 내용은 당사를 참조하십시오.
보다 ? 이 저장소는 최신 상태를 유지합니다.
기능이나 지원 요청이 있습니까? 토론 및 요청을 위해 Github 토론 페이지를 방문하거나 Discord 커뮤니티에 가입하십시오.
PACKJ는 Ossillate Inc.의 Cybersecurity 연구원들과 외부 협력자들이 개발하여 개발자가 신뢰할 수없는 타사 오픈 소스 소프트웨어 의존성을 소싱 할 때 공급망 공격의 위험을 완화 할 수 있도록 도와주었습니다. 개발자와 공동 작업자에게 감사드립니다. 당신이 우리의 일을 좋아한다면 우리에게 감사의 말씀을주십시오.
우리는 열린 암으로 코드 기여를 환영합니다. Contributing.md 지침을 참조하십시오. 버그를 찾았습니까? 문제를여십시오. 보안 문제를보고하려면 Security.MD 가이드 라인을 참조하십시오.
Packj는 현재 "위험한"속성에 대한 NPM, PYPI 및 RubyGems 패키지를 수의사 할 수 있습니다. 우리는 Rust에 대한 지원을 추가하고 있습니다.
PACKJ는 종합 감사를 위해 정적 코드 분석, 동적 추적 및 메타 데이터 분석을 사용합니다. 정적 분석만으로도 코드 난독 화를 사용하여 더 잘 숨길 수있는 정교한 맬웨어를 표시하기에 충분하지 않습니다. 동적 분석은 strace 아래에 패키지를 설치하고 런타임 동작을 모니터링하여 수행됩니다. Audit ReadMe에서 자세한 내용을 읽으십시오.
이것은 매우 일반적인 악의적 인 행동입니다. PACKJ는 코드 난독 화 및 쉘 명령의 산란 (EXEC SYSTEM CALL)을 감지합니다. 예를 들어, Packj는 "런타임 코드 생성"을 나타내는 것처럼 getattr() 및 eval() API의 사용을 플래그 할 수 있습니다. 개발자는 가서 더 깊이 살펴볼 수 있습니다. 자세한 내용은 main.py를 참조하십시오.