พอดีช่วงก่อนหน้านี้ผมไปหาลูกค้ามาหลายๆที่พบว่า ยังคงมีความไม่เข้าใจในเรื่องเครื่องมือสำหรับทำ Application security testing ว่าเครื่องมือต่างๆที่ใช้ในการตรวจสอบความปลอดภัยนั้นมีความแตกต่างกันยังไง วันนี้ก็เลยมาเล่าให้ฟังครับ
Application Security Testing Category
โดยปกติแล้วเครื่องมือที่ใช้ในการตรวจสอบความปลอดภัยของ Application จะแบ่งการตรวจสอบแบ่งเป็น 2 แบบคือ
1. Static Analysis
Static Analysis คือการตรวจสอบ source code ซึ่งยังไม่ได้อยู่ขณะ runtime โดยปกติมักจะดู pattern ของ source code ว่าการเขียนนั้นมีช่องโหว่หรือไม่ เช่น การใช้งาน parameter นำมาต่อเข้ากับ query string เลย ก็น่าจะเป็น SQL injection, การรับค่าทั้ง POST Body เข้าไป parsing ใน XMLParser เลย อาจจะเกิด XXE ได้ เป็นต้น ซึ่งผลลัพธ์ทั้งหมดอย่างที่เห็นว่าไม่จำเป็นเสมอไปว่าจะเป็นช่องโหว่จริงๆเสมอไป เพราะอย่าง XXE (XML External Entity) มันคือการใช้งาน(อ้างอิง) Entity ภายนอก โดยการกระทำแบบนั้นได้ จำเป็นต้องเปิดการใช้งาน XML external entity และ DTD processing ใน XML parser ก่อนนั่นเอง ซึ่งแน่นอนว่าถ้ามันมีการปิดการใช้งาน XML external entity และ DTD processing ไว้ก็จะทำให้ไม่เกิดช่องโหว่ XXE นั่นเอง (รายละเอียดเพิ่มเติม OWASP Link) หรือปัญหาสุด classic ที่จะเจอผลลัพธ์ผิดๆ (false positive) จาก Static Analysis คือ Password ใน comment ซึ่งไอ้ password ใน comment นั้นอาจจะแค่เป็นการบอกว่า
1 2 |
# Example # password="ggez" |
จะเห็นว่าจริงๆแล้วใน quote นั้นไม่ได้เป็นการเขียน password ไว้ใน password แต่เป็นแค่การบอกว่า password จะมีลักษณะอย่างไรเท่านั้น ดังนั้นจะเห็นว่า Static Analysis นั้นมีความเป็นไปได้ที่จะเจอ false positive เยอะมากๆเสมอ
โดยในตลาดก็จะมีเครื่องมือ static analysis อยู่หลายๆตัวไม่ว่าจะเป็น
- Checkmarx
- IBM AppScan
- Micro Focus Fortify
- Synopsis
นอกเหนือจากนี้ก็จะมี static analysis tool นั้นมีตัวที่เป็นตัวฟรีเหมือนกัน (ที่เหลือไปตามใน Reference ด้านล่างสุดนะครับ)
- SonarQube
- Graudit
และช่องโหว่ที่ไม่สามารถตรวจพบได้ใน Static Analysis Tool ก็มีเยอะแยะมากมายไม่ว่าจะเป็น authentication problems, access control issues, insecure use of cryptography และอื่นๆ ซึ่งเป็นเพราะตัวเครื่องมือนั้นไม่ทราบว่าส่วนไหนคือส่วนที่จำเป็นต้อง authentication เข้าไปก่อน หรือส่วนไหนจำเป็นต้องมีสิทธิ์แบบใดจึงจะเข้าถึงได้นั่นเอง
แล้วทีนี้ Static Analysis นั้นมันควรทำตอนไหนล่ะ โดยปกติแล้ว Static Analysis ควรกระทำในขณะที่กำลังอยู่ในช่วง develop อยู่ครับ เพื่อให้สามารถ fix ก่อนที่จะนำไป deploy นั่นเอง
2. Dynamic Analysis
ส่วน Dynamic Analysis นั้นจะแตกต่างกับ Static Analysis Tool อย่างชัดเจน สืบเนื่องด้วย Static Analysis เป็นการดู source code ของ Application โดยตรง แต่ Dynamic Analysis จะเน้นดูผลการตอบกลับมาจาก Web Application หลังจากการส่ง Request การโจมตีต่างๆไปยัง Application แทนมากกว่า พร้อมกันนั้น Static Analysis Tool จำเป็นต้องทราบภาษาที่เขียนเพื่อให้สามารถอ่านโค้ดของ Application ได้อย่างเข้าใจ โดยผลลัพธ์ของการตรวจสอบจาก Dynamic Analysis tool นั้นก็มีโอกาสเกิด false positive ได้(อาจจะไม่เยอะเท่า Static Analysis Tool แต่ก็ยังมีอยู่เช่นกันครับ) และอาจจะไม่สามารถตรวจสอบช่องโหว่บางช่องโหว่เช่นเดียวกับ Static Analysis Tool ได้ด้วยเช่นกัน ทั้งนี้ Application ทั้งในเชิง Commercial และ Open Source ของ Dynamic Analysis นั้นมีเยอะมากมาย เช่น
- Acunetix
- Net Sparker
- IBM AppScan
- Micro Focus WebInspect
- OWASP ZAP
- Burp Suite
- Arachni
(สามารถดูผลการเปรียบเทียบทั้งเรื่อง false positive และความเหมาะสมในการทดสอบได้จาก https://www.techsuii.com/2017/10/31/comparison-report-for-web-vulnerability-assessment-tools/)
และช่องโหว่ที่ไม่สามารถตรวจพบได้ใน Dynamic Analysis Tool ก็มีเยอะแยะมากมายเช่นกัน เพราะสืบเนื่องด้วยตัวเครื่องมือทดสอบนั้นก็จะทดสอบแค่เท่าที่ Application นั้นทำงาน อีกทั้งไม่เห็นด้วยว่า Application นั้นเขียนอย่างไร จึงตกหล่นมากมายเกี่ยวกับการสร้าง,ใช้งาน และทำลาย parameter ใดๆที่ถูกใช้ใน Application นันเอง
แล้วถ้าเป็น Dynamic Analysis Tool ล่ะควรจะใช้ในช่วงไหน ตัว Dynamic Analysis tool ควรจะถูกนำไปใช้ทดสอบตอนที่ Application นั้นอยู่ในขั้นตอนการทำ Testing นั่นเองครับ
แล้ว Penetration Test ยังจำเป็นต้องมีอยู่หรือไม่
จากข้อมูลข้างต้นจะเห็นว่า Static Analysis นั้นจะแตกต่างกันโดยสิ้นเชิง ไม่ว่าจะเป็นเรื่องลักษณะการตรวจสอบ หรือช่องโหว่ที่สามารถตรวจสอบได้ก็มีข้อยกเว้นทั้ง 2 แบบ
ทีนี้พอมาถึงจุดที่คนมาตั้งคำถามว่า หาก Application นั้นได้ถูกทดสอบทั้ง Static Analysis Tool และ Dynamic Analysis Tool แล้ว ยังจำเป็นต้องทำการทดสอบเจาะระบบหรือ Penetration Test (Pentest: PT) หรือไม่ ก็ต้องตอบว่าจำเป็นครับ เพราะการทดสอบทั้ง 2 แบบนั้นมันก็ยังไม่ใช่อยู่ใน environment จริงๆ ดังนั้นก็มีความเป็นไปได้ที่จะมีหลายๆอย่างที่จะเกิดขึ้นได้ เช่น การตั้ง password ที่เป็น weak password, การไม่กำหนด session time out เป็นต้น เพราะตัว Server Configuration ที่แตกต่างกันนั่นเอง รวมถึงจุดสำคัญจริงๆของการทำ Pentest ที่แตกต่างกับการทำ Vulnerability Assessment คือการเรียนรู้ถึงพฤติกรรมของ Application และพยายามบิดเบือนหรือใช้ผลประโยชน์จากพฤติกรรมเหล่านั้น ยกตัวอย่างเช่น หากระบบมีการให้ส่ง SMS OTP (One Time Password) มายังมือถือของเรา แล้วไม่ได้ทำการ lock จำนวนครั้งไว้ หรือไม่มีการ generate session key สำหรับ activity ดังกล่าวไว้ จะทำให้ user สามารถร้องขอ SMS OTP นั้นได้เรื่อยๆ โดยไม่มี limit ซึ่งเมื่อเป็นแบบนั้น ลองคิดถึงสภาพว่าถ้าเราทำการส่ง request เพื่อขอ SMS OTP ซักประมาณ 1 ล้านครั้งจะเกิดอะไรขึ้น นั่นคือสิ่งที่ Static Analysis และ Dynamic Analysis tool ไม่สามารถที่จะตรวจสอบพบได้ เป็นต้น
สรุป
เราจะเห็นว่าความแตกต่างของ Static Analysis และ Dynamic Analysis นั้นมีความแตกต่างกันอยู่ ไม่ว่าจะทั้งเรื่องช่องโหว่ที่ต่างคนต่างไม่สามารถที่จะหาได้ ไหนจะเรื่องช่วงที่เหมาะสมสำหรับการนำไปใช้อีก และอีกจุดหนึ่งที่แตกต่างอย่างมากก็คือเรื่องของจำนวนผลลัพธ์ที่เป็น false positive นั้นตัว Static Analysis tool นั้นจะสูงกว่ามาก Dynamic Analysis tool นั่นเอง
ก็หวังว่าบทความนี้จะทำให้ทุกๆคนเห็นภาพในเรื่องการใช้งานเครื่องมือสำหรับ Application Security Testing กันนะครับ
Source::