Pysa เป็น Open Source Static Analysis Tool ซึ่งใช้ในการช่วยตรวจสอบปัญหาทางด้าน Security และ Privacy สำหรับภาษา Python ซึ่งได้รับแรงบันดาลใจมาจาก Zoncolan ซึ่งเป็น Static Analysis Tool ที่ใช้ตรวจสอบปัญหาทางด้าน Security ของภาษา Hack
Pysa เป็นตัวช่วยในการทดสอบความปลอดภัยโดยการทดสอบว่า Source สามารถเข้าไป Execute ที่ Sink ได้หรือไม่ หากสามารถ Execute ได้จะมีการแสดง Issue ตาม Rule ที่เรากำหนดขึ้นมา
ในบทวามนี้ผู้เขียนใช้ OS Xubuntu 20.04
Requirements
- Git
- Python เวอร์ชัน 3.6 หรือใหม่กว่า
- Watchman
ลงโปรแกรมทั้งหมดบน Debian Based Distro
sudo apt-get install git python3 python3-pip python3-venv watchman
ทำการ Clone โปรเจค Pyre จาก Git Repository
git clone https://github.com/facebook/pyre-check.gitcd pyre-check/pysa_tutorial
สร้าง Python Environment สำหรับใช้งาน Pyre
python3 -m venv tutorialsource tutorial/bin/activatepip3 install pyre-checkpip3 install click click-log ipython==7.6.1 munch pygments SQLAlchemy ujson~=1.35 xxhash~=1.3.0 prompt-toolkit~=2.0.9 flask flask_cors flask_graphql graphene graphene_sqlalchemy
ทดลองใช้ Pysa กับตัวอย่างโค้ด Python
เข้าสู่โฟลเดอร์ exercise1
cd exercise1ls -a
จะพบไฟล์ดังนี้
- README.md
- taint.config
- .pyre_configuration
- source_sinks.pysa
- views.py
ไฟล์ views.py
เป็นไฟล์ Code Python ที่เราต้องการตรวจสอบ ซึ่งในกรณีนี้พบว่า request.GET เก็บข้อมูลมาจาก User และ eval สามารถนำมันมา Execute ได้ จึงสามารถทำให้เกิด RCE ได้
ในกรณีนี้เราต้องการจะทดสอบมันด้วย Pysa เป็นกรณีศึกษาว่าเราสามารถพบช่องโหว่นี้ได้จากการใช้ Pysa หรือไม่
ไฟล์ sources_sinks.pysa
Taint models เป็นตัวเชื่อมระหว่าง views.py และ taint.config
ในกรณีนี้จึงมีการเชื่อม
request.GET -> CustomUserControlled
eval -> CodeExecution
ไฟล์ taint.config
จากภาพจะสังเกตได้ว่า ภายในไฟล์ taint.config นั้นแบ่งออกเป็น 4 ส่วน
- sources
- sinks
- features
- rules
sources คือ จุดเริ่มต้นที่มีการรับข้อมูลเข้ามาสู่ระบบ
sinks คือ จุดที่มีการนำข้อมูลที่รับเข้ามา มาใช้งาน
features หรือ breadcrumbs ใช้เพื่อช่วยกรองผลลัพธ์ที่ผิดพลาดหรือ false positive
rules คือ การกำหนด ชื่อจุดประสงค์ของการทดสอบ, code, source และ sink ที่เราต้องการทดสอบ ซึ่งถ้าหาก source สามารถเชื่อมต่อไปถึง sink ได้จะมีการแจ้ง issue ออกมาตามที่เรากำหนด
ในกรณีนี้กฎเขียนว่า หาก CustomUserControlled(Source) สามารถไปถึง CodeExecution(Sink) ได้ แสดงว่าสามารถเกิด RCE ได้
ไฟล์ทั้ง 3 มีการเชื่อมโยงกันดังนี้
ไฟล์ .pyre_configuration
จากภาพจะสังเกตได้ว่ามี 3 parameters สำคัญภายในไฟล์
“source_directories”: [“.”] เป็นการบอก Pysa ว่าให้ analyze code ใน Directory ปัจจุบัน
“taint_models_path”: [“.”] เป็นการบอก Pysa ว่าให้หา .pysa และไฟล์ taint.config ใน directory ปัจจุบัน
“search_path”: [“../../stubs/”] เป็นการบอก Directory เพื่อให้ Pysa ไปค้นหา Stub Files จาก directory นั้น
ทดลองรันคำสั่ง pyre analyze
สุดท้ายพบว่า Source สามารถไป Execute ที่ Sink ได้ดังนั้นจึงมีการรายงานว่าเป็น Issue Possible RCE ตามที่กำหนดเอาไว้ในไฟล์ Config