PackJ (แพ็คเกจเด่นชัด) เป็นเครื่องมือในการช่วยลดการโจมตีห่วงโซ่อุปทานซอฟต์แวร์ มันสามารถตรวจจับความเป็นอันตรายเสี่ยงถูกทอดทิ้งการพิมพ์ผิดพลาดและแพ็คเกจ "เสี่ยง" อื่น ๆ จากการลงทะเบียนแพ็คเกจโอเพนซอร์ซยอดนิยมเช่น NPM, Rubygems และ PYPI สามารถปรับแต่งได้ง่ายเพื่อลดเสียงรบกวน PackJ เริ่มต้นเป็นโครงการวิจัยระดับปริญญาเอกและกำลังได้รับการพัฒนาภายใต้ Govt Grants ต่างๆ
หมายเหตุ PackJ Webserver ที่โฮสต์ตนเองและการรวมเข้าด้วยกันหลายครั้งในปลายเดือนนี้? ดู repo นี้เพื่อติดตามข่าวสารล่าสุด
เราสนับสนุนรูปแบบการปรับใช้หลายแบบ:
ใช้ 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 ตัวอย่างการดำเนินการประชาสัมพันธ์
วิธีที่เร็วที่สุดในการลอง/ทดสอบ PackJ คือการใช้ Docker Podman ยังได้รับการสนับสนุนสำหรับการวิ่งแบบคอนเทนเนอร์ (แยก)
docker run -v /tmp:/tmp/packj -it ossillate/packj:latest --help
โคลน repo นี้
git clone https://github.com/ossillate-inc/packj.git && cd packj
ติดตั้งการพึ่งพา
bundle install && pip3 install -r requirements.txt
เริ่มต้นด้วยความช่วยเหลือ:
python3 main.py --help
แพ็คเจสามารถสัตวแพทย์แพ็คเกจที่ตีพิมพ์ได้จาก NPM, PYPI, Rust, PHP และ Rubygems Package Registries การสนับสนุนสนิมและ PHP คือ WIP เรากำลังเพิ่มการสนับสนุนสำหรับการลงทะเบียน นอกจากนี้ยังรองรับแพ็คเกจ NPM และ PYPI ที่ไม่ได้ตีพิมพ์ในท้องถิ่น (ไม่ได้เผยแพร่)
| การลงทะเบียน | ระบบนิเวศ | ที่ได้รับการสนับสนุน |
|---|---|---|
| NPM | จาวาสคริปต์ | |
| Pypi | งูหลาม | |
| สินค้า | สนิม | |
| Rubygems | ทับทิม | |
| นักบรรจุหีบห่อ | PHP | |
| นักเทียบท่า | นักเทียบท่า | |
| นูเกต | .สุทธิ | |
| หนอง | ชวา | |
| โกโก้ | ฉับพลัน |
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 Flag เพื่อทำการวิเคราะห์รหัสแบบไดนามิกเช่นกันซึ่งจะติดตั้งแพ็คเกจที่ร้องขอทั้งหมดภายใต้ 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",
]
}
คำเตือน: เนื่องจากแพ็คเกจสามารถเรียกใช้รหัสที่เป็นอันตรายได้ในระหว่างการติดตั้งจึงขอแนะนำให้ใช้เฉพาะ
-tหรือ--traceเมื่อทำงานภายในคอนเทนเนอร์ Docker หรือเครื่องเสมือน
การตรวจสอบสามารถทำได้ในคอนเทนเนอร์ Docker/Podman โปรดค้นหารายละเอียดเกี่ยวกับคุณลักษณะที่มีความเสี่ยงและวิธีการใช้งานที่ Audit ReadMe
PackJ นำเสนอ Sandboxing ที่มีน้ำหนักเบาสำหรับ safe installation โดยเฉพาะมันป้องกันแพ็คเกจที่เป็นอันตรายจากข้อมูลที่ละเอียดอ่อน exfiltrating การเข้าถึงไฟล์ที่ละเอียดอ่อน (เช่นคีย์ SSH) และมัลแวร์ที่ยังคงอยู่
มันเป็นสคริปต์ที่ติดตั้ง Sandboxes รวมถึงการปฏิบัติตามคำประกอบการดั้งเดิม มันใช้ Strace (เช่น ไม่ จำเป็นต้องใช้ VM/คอนเทนเนอร์)
โปรดค้นหารายละเอียดเกี่ยวกับกลไก Sandboxing และวิธีการใช้ที่ Sandbox 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 นั้นขึ้นอยู่กับการวิจัยความปลอดภัยทางไซเบอร์ที่ทันสมัย: โครงการ Maloss โดยกลุ่มวิจัยของเราที่ Georgia Tech
Packj ได้รับการสนับสนุนจากทุนที่มีน้ำใจจาก NSF, Gra และ Alinnovate
TL; DR สแกนเนอร์ช่องโหว่ที่ล้ำสมัยสันนิษฐานว่ารหัสโอเพ่นซอร์สของบุคคลที่สามนั้นเป็นพิษเป็นภัย ดังนั้นเครื่องมือดังกล่าวทั้งหมดที่อยู่เฉพาะภัยคุกคามจากข้อบกพร่องการเขียนโปรแกรมโดยไม่ตั้งใจในรหัสที่อ่อนโยน (aka CVE เช่น log4j) พวกเขาไม่ได้ป้องกันการโจมตีโซ่ซัพพลายเชนที่ทันสมัยที่ทันสมัยเหมือนโซลาร์ลมไฟจากรหัสที่ไม่ดี (อาคาที่เป็นอันตราย) ที่แพร่กระจายโดยนักแสดงที่ไม่ดีโดยใช้ช่องโหว่ใหม่ในช่องทางจัดหารวมถึงความสับสนในการพึ่งพา ตัวอย่างล่าสุด (Dec'22) คือแพ็คเกจ Pytorch ที่ถูกบุกรุกโดยใช้ช่องโหว่ความสับสนในการพึ่งพา (ไม่มีการกำหนด CVE)
PackJ ไม่เพียง แต่ตรวจสอบสำหรับ CVEs เท่านั้น แต่ยังทำการวิเคราะห์รหัสแบบคงที่+แบบไดนามิกอย่างลึกล้ำรวมถึงการตรวจสอบข้อมูลเมตาเพื่อตรวจจับพฤติกรรมและคุณลักษณะที่มีความเสี่ยงใด ๆ เช่นการวางไข่ของเชลล์การใช้คีย์ SSH ไม่ตรงกันของรหัส GitHub เทียบกับรหัสแพ็คแพคเกจ คุณลักษณะที่ไม่ปลอดภัยดังกล่าวไม่ได้มีคุณสมบัติเป็น CVES ซึ่งเป็นสาเหตุที่ไม่มีเครื่องมือใดที่สามารถตั้งค่าสถานะได้ PackJ สามารถตั้งค่าสถานะเป็นอันตรายการพิมพ์ผิดพลาดถูกทอดทิ้งเสี่ยงและการพึ่งพาที่ไม่ปลอดภัยอื่น ๆ (ลิงก์ที่อ่อนแอ) ในห่วงโซ่อุปทานซอฟต์แวร์ของคุณ
รูปแบบการคุกคามห่วงโซ่อุปทานซอฟต์แวร์ปัจจุบัน สันนิษฐาน ว่ารหัสโอเพ่นซอร์สของบุคคลที่สามนั้นเป็นพิษเป็นภัยดังนั้นจึงมีการติดตามช่องโหว่ด้านความปลอดภัยสำหรับข้อบกพร่องในการเขียนโปรแกรมโดยไม่ตั้งใจเท่านั้น (AKA CVES) เช่นนี้สแกนเนอร์ช่องโหว่โอเพนซอร์สที่มีอยู่ทั้งหมดรายงาน เฉพาะ CVES ที่รู้จักกันอย่างเปิดเผยและที่อยู่ภัยคุกคามจากข้อบกพร่องโดยไม่ตั้งใจในรหัสที่อ่อนโยน
ตัวอย่างทั่วไปของข้อผิดพลาดการเขียนโปรแกรมโดยไม่ตั้งใจคือขอบเขตที่ขาดหายไปตรวจสอบการป้อนข้อมูลผู้ใช้ซึ่งทำให้รหัสมีความเสี่ยงต่อการโจมตีบัฟเฟอร์ล้น ตัวอย่างที่เป็นที่นิยมในโลกแห่งความเป็นจริง ได้แก่ log4j และ Heartbleed ผู้โจมตีจำเป็นต้องพัฒนาประโยชน์ในการเรียกใช้ CVES (เช่นแพ็คเก็ต TCP/IP ที่สร้างขึ้นในกรณีที่มีความใจร้อนหรืออินพุตที่สูงเป็นตัวเลขเพื่อทำให้เกิดบัฟเฟอร์ล้น) CVE สามารถแก้ไขได้โดยการแก้ไขหรืออัปเกรดเป็นไลบรารีรุ่นใหม่ (เช่น Log4j เวอร์ชันใหม่กว่าแก้ไข CVE)
ภูมิทัศน์การคุกคามของห่วงโซ่อุปทานซอฟต์แวร์ที่ทันสมัย เปลี่ยนไป หลังจากการโจมตีของ Solarwinds นักแสดงที่ไม่ดีได้พบช่องโหว่ใหม่ แต่คราวนี้อยู่ในช่องทางซัพพลายไม่ใช่รหัส ช่องโหว่ใหม่เหล่านี้เช่นความสับสนในการพึ่งพาการพิมพ์ผิดพลาดการประท้วง (การก่อวินาศกรรม) การจี้บัญชีและวิศวกรรมสังคมกำลังถูกเอาเปรียบเพื่อเผยแพร่มัลแวร์ มีรายงานแพ็คเกจ NPM/PYPI/Ruby ที่ถูกบุกรุกนับพัน
ตรงกันข้ามกับ CVES มัลแวร์นั้นไม่ดี (อาคาที่เป็นอันตราย) โดยเจตนา ยิ่งไปกว่านั้นมัลแวร์เองก็เป็นประโยชน์และไม่สามารถแก้ไขหรือแก้ไขได้โดยการอัพเกรดเป็นเวอร์ชันที่ใหม่กว่า ตัวอย่างเช่นการโจมตีด้วยความสับสนในการพึ่งพานั้นเป็นอันตรายโดยเจตนา มันไม่ได้ใช้ประโยชน์จากข้อผิดพลาดการเขียนโปรแกรมโดยไม่ตั้งใจในรหัส ในทำนองเดียวกันผู้เขียนแพ็คเกจยอดนิยมก่อวินาศกรรมรหัสของตัวเองเพื่อประท้วงต่อต้านสงครามนั้นมีความตั้งใจอย่างมากและไม่ได้ใช้ประโยชน์จาก CVE ใด ๆ Typo-Squatting เป็นเวกเตอร์การโจมตีอีกครั้งที่นักแสดงที่ไม่ดีใช้ในการเผยแพร่มัลแวร์ในการลงทะเบียนแพ็คเกจโอเพนซอร์ซยอดนิยม: มันใช้ประโยชน์จากการพิมพ์ผิดและการไม่มีประสบการณ์ของ devs ไม่ใช่ข้อบกพร่องในการเขียนโปรแกรมโดยไม่ตั้งใจหรือ CVEs ในรหัส
สแกนเนอร์ที่มีอยู่ ล้มเหลว ในการตรวจจับการโจมตีโซ่ซัพพลายเชนซอฟต์แวร์ที่ทันสมัยที่มีลักษณะคล้ายแสงอาทิตย์เหล่านี้จากรหัสที่มีความเสี่ยง (เป็นอันตราย) โดยเจตนา เครื่องมือเหล่านี้สแกนซอร์สโค้ดสำหรับการพึ่งพาโอเพนซอร์ซรวบรวมรายการของการพึ่งพาทั้งหมดที่ใช้และดูแต่ละ <การพึ่งพา-ชื่อการพึ่งพาอาศัยกัน> ในฐานข้อมูล (เช่น NVD) เพื่อรายงานเวอร์ชันแพคเกจที่ได้รับผลกระทบ
PackJ ไม่เพียง แต่ตรวจสอบสำหรับ CVEs เท่านั้น แต่ยังทำการวิเคราะห์รหัสแบบคงที่+แบบไดนามิกอย่างลึกล้ำรวมถึงการตรวจสอบข้อมูลเมตาเพื่อตรวจจับพฤติกรรมและคุณลักษณะที่มีความเสี่ยงใด ๆ เช่นการวางไข่ของเชลล์การใช้คีย์ SSH ไม่ตรงกันของรหัส GitHub เทียบกับรหัสแพ็คแพคเกจ คุณลักษณะที่ไม่ปลอดภัยดังกล่าวไม่ได้มีคุณสมบัติเป็น CVES ซึ่งเป็นสาเหตุที่ไม่มีเครื่องมือใดที่สามารถตั้งค่าสถานะได้ PackJ สามารถตั้งค่าสถานะเป็นอันตรายการพิมพ์ผิดพลาดถูกทอดทิ้งเสี่ยงและการพึ่งพาที่ไม่ปลอดภัยอื่น ๆ (ลิงก์ที่อ่อนแอ) ในห่วงโซ่อุปทานซอฟต์แวร์ของคุณ โปรดอ่านเพิ่มเติมได้ที่ Audit Readme
PackJ สามารถปรับแต่งได้ง่าย (เสียงรบกวนศูนย์) กับโมเดลภัยคุกคามของคุณ เพียงเพิ่มไฟล์. packj.yaml ในส่วนบนสุดของ repo/project ของคุณและลดความเหนื่อยล้าจากการแจ้งเตือนโดยแสดงความคิดเห็นที่ไม่พึงประสงค์
เราพบแพ็คเกจที่เป็นอันตรายมากกว่า 40 และ 20 ชุดบน PYPI และ Rubygems ตามลำดับโดยใช้เครื่องมือนี้ จำนวนของพวกเขาถูกถอดออก อ้างถึงตัวอย่างด้านล่าง:
$ 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 Flagged Krisqian (v0.0.7) เป็นที่น่าสงสัยเนื่องจากไม่มี repo แหล่งที่มาและการใช้ APIs ที่ละเอียดอ่อน (เครือข่ายการสร้างรหัส) ในระหว่างเวลาการติดตั้งแพ็คเกจ (ใน setup.py) เราตัดสินใจที่จะมองลึกลงไปและพบแพ็คเกจที่เป็นอันตราย โปรดค้นหาการวิเคราะห์โดยละเอียดของเราที่ https://packj.dev/malware/krisqian
ตัวอย่างเพิ่มเติมของมัลแวร์ที่เราพบแสดงอยู่ที่ https://packj.dev/malware โปรดติดต่อเราที่ [email protected] สำหรับรายการเต็ม
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับเครื่องมือ PackJ หรือการโจมตีซัพพลายเชนซอฟต์แวร์โอเพนซอร์ซโปรดดูที่ของเรา
ดู ? repo นี้เพื่อติดตามข่าวสารล่าสุด
มีคุณสมบัติหรือคำขอสนับสนุน? กรุณาเยี่ยมชมหน้าการสนทนา GitHub ของเราหรือเข้าร่วมชุมชน Discord ของเราสำหรับการอภิปรายและคำขอ
PackJ ได้รับการพัฒนาโดยนักวิจัยด้านความปลอดภัยทางไซเบอร์ที่ Ossillate Inc. และผู้ทำงานร่วมกันภายนอกเพื่อช่วยให้นักพัฒนาลดความเสี่ยงของการโจมตีห่วงโซ่อุปทานเมื่อจัดหาซอฟต์แวร์โอเพ่นซอร์สของบุคคลที่สามที่ไม่น่าเชื่อถือ เราขอขอบคุณนักพัฒนาและผู้ทำงานร่วมกันของเรา แสดงความขอบคุณโดยให้เราถ้าคุณชอบงานของเรา
เรายินดีต้อนรับการมีส่วนร่วมของรหัสด้วย Open Arms ดูแนวทางการสนับสนุน. MD พบข้อผิดพลาด? กรุณาเปิดปัญหา อ้างถึงแนวทางการรักษาความปลอดภัยของเราเพื่อรายงานปัญหาความปลอดภัย
ปัจจุบัน PackJ สามารถตรวจสอบ NPM, PYPI และ RubyGems แพ็คเกจสำหรับแอตทริบิวต์ "เสี่ยง" เรากำลังเพิ่มการสนับสนุนสำหรับสนิม
PackJ ใช้การวิเคราะห์รหัสแบบคงที่การติดตามแบบไดนามิกและการวิเคราะห์ข้อมูลเมตาสำหรับการตรวจสอบที่ครอบคลุม การวิเคราะห์แบบคงที่เพียงอย่างเดียวนั้นไม่เพียงพอที่จะตั้งค่าสถานะมัลแวร์ที่มีความซับซ้อนซึ่งสามารถซ่อนตัวเองได้ดีขึ้นโดยใช้การทำให้งงงวยรหัส การวิเคราะห์แบบไดนามิกดำเนินการโดยการติดตั้งแพ็คเกจภายใต้ strace และตรวจสอบพฤติกรรมรันไทม์ โปรดอ่านเพิ่มเติมที่ Audit ReadMe
นี่เป็นพฤติกรรมที่เป็นอันตรายที่พบบ่อยมาก PackJ ตรวจพบการทำให้งงงวยรหัสเช่นเดียวกับการวางไข่ของคำสั่งเชลล์ (การเรียกระบบ EXEC) ตัวอย่างเช่น PackJ สามารถตั้งค่าสถานะการใช้งานของ getattr() และ eval() API ตามที่ระบุว่า "การสร้างรหัสรันไทม์"; นักพัฒนาสามารถไปดูได้ลึกซึ้งยิ่งขึ้น ดู Main.py สำหรับรายละเอียด