Introduction: Python Static Analyzer (Pysa)

Datafarm
3 min readOct 14, 2020

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 ส่วน

  1. sources
  2. sinks
  3. features
  4. 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

--

--

No responses yet