มาตรวจดูกันว่า iOS Project เราใช้ dependencies อะไรที่เป็นอันรายหรือไม่ด้วย OWASP Dependency-Check
Tags: ios, security
Published: 2020-04-19 08:18:17

# OWASP Dependency-Chek

td;lr ไปดูตัวอย่าง repo ได้ที่นี่ https://github.com/PH9/MadeForScan

## ทำความรู้จัก OWASP [Dependency-Check](https://owasp.org/www-project-dependency-check/)

เป็นเครื่องมือตรวจสอบว่าเราใช้ dependencies ที่มีช่องโหว่ที่รู้แล้ว (Common Vulnerabilities and Exposures: CVE) หรือไม่ เมื่อตรวจสอบแล้วจะทำการสร้างรายงานให้เราดูต่อไป

โดย Dependency-Check เกิดขึ้นมาเพราะว่า OWASP Top 10 (การจัดอันดับสิ่งที่นักพัฒนาชอบทำพลาด ซึ่งส่งผลให้เกิดให้ช่องโหว่ และการโจมตี) ในปี ค.ศ. 2013 พบว่ามีการใช้งานเครื่องมือ หรือชุดคำสั่งที่มีช่องโหว่ อยู่ในลำดับที่ 9

## ทำยังไง

1. ติดตั้ง `dependency-check` โดยสามารถติดตั้งผ่าน [Homebrew](https://brew.sh) ด้วยคำสั่ง `brew install dependency-check`
2. ทำการ scan ด้วยคำสั่ง `dependency-check --enableExperimental -s . -o .`

ง่ายมะ... แต่เดี๋ยวก่อน!

### อธิบายคำสั่ง

- `--enableExperimental` เป็นการเรียกใช้ features ของ Dependency-Check อยู่ยังอยู่ระหว่างการทดสอบ ซึ่ง Coacoapods และ Swift Package Manager ยังเป็น experimental อยู่
- `-s, --scan <path>` คือการบอกว่าให้ทำการตรวจสอบที่ path นี้
- `-o, --out <path>` คือให้ออกรายงานที่ path นี้

โดย default แล้วรายงานจะออกมาเป็น html โดยเราสามารถเลือกได้เป็น HTML, XML, CSV, JSON, JUNIT, หรือ ALL (ทั้งหมด) ด้วยคำสั่ง `-f, --format <format>`

### ทำอะไรได้เพิ่มอีกบ้าง

- `--junitFailOnCVSS <score>` ระบุว่าจะให้ต้อง score เท่าไหร่ถึงจะผ่านถ้าเอาไปใส่ใน build pipelines ซึ่งจะมีตั้งแต่ 0-10 (ยิ่งต่ำยิ่งดี) ถ้าไม่ระบุ default จะอยู่ที่ 11 ซึ่งแปลว่าผ่านตลอดนั่นเอง โดยคำสั่งนี้จะต้องไว้ข้างหน้า `-s <path>` ไม่งั้นอาจจะไม่ทำงานได้
- `--suppression <file>` เป็นการให้ dependency-check ไปอ่านไฟล์ที่รวบรวมรายชื่อ CVE ที่ไม่สนใจได้ โดยโครงสร้างของไฟล์หน้าตาประมาณนี้

```xml
<?xml version="1.0" encoding="UTF-8"?>
<suppressions xmlns="https://jeremylong.github.io/DependencyCheck/dependency-suppression.2.3.xsd">
    <suppress>
        <notes><![CDATA[
        file name: GoogleUtilities/AppDelegateSwizzler:6.5.2
        ]]></notes>
        <sha1>368d339f66194780a65f3e55481ef29a35971cc2</sha1>
        <cve>CVE-2005-0036</cve>
    </suppress>
    <suppress>
        <notes><![CDATA[
        file name: GoogleUtilities/AppDelegateSwizzler:6.5.2
        ]]></notes>
        <sha1>368d339f66194780a65f3e55481ef29a35971cc2</sha1>
        <cve>CVE-2005-0861</cve>
    </suppress>
</suppressions>
```

ถามว่าเราจะรู้ได้ไงว่าจะ ignore ยังไง ตอนที่ Dependency-Check ออก report ถ้าเป็น HTML จะมี ปุ่มสีเทา ๆ เขียนว่า `suppress` ให้คลิก และสามารถคัดลอก xml เพื่อมาใส่ได้

### ถ้าในโปรเจคคุณมี Gemfile, Gemfile.lock

- คุณอาจจะต้องติดตั้ง bundle-audit ด้วย โดยสามารถติดตั้งได้โดยคำสั่ง `[sudo] gem install bundle-audit` เพื่อให้สามารถตรวจสอบได้ เพราะ Dependency-Check ใช้โปรแกรม bundle audit ในการตรวจสอบ gem
- หรือใช้คำสั่ง `--disableBundleAudit` ไปซะเลย เพราะยังไง gem จะไม่ถูกรวมเข้าไปใน ipa อยู่แล้ว

**อ่านต่อ:** [เราไม่ควรใช้ “sudo gem”!!](https://medium.com/@phai/e1c37a0a02e4)

## Dependencies อะไรที่เกี่ยวกับการพัฒนา iOS แล้ว scan ไม่ได้

- Dependencies ที่มาจาก [Carthage](https://github.com/Carthage/Carthage)
- Dependencies ที่มาจาก [Homebrew](https://brew.sh) ซึ่งก็ไม่น่าเป็นห่วง เพราะส่วนนี้ไม่ได้ใช้ในโปรเจคอยู่แล้ว
- Dependencies ที่มาจากการ copy ไฟล์ `.framework`, `.a`, `.o` มาวาง
- และจาก Git Submodules

สรุปคือตรวจได้แค่ใน `Gemfile.lock` กับ `Podfile.lock` และจาก Swift Package Manager เท่านั้น 🤣🤣

## รู้ว่ามีช่องโหว่ แล้วเอาไปทำอะไรได้บ้าง

- ใช้เป็นข้ออ้างว่า dependencies มีช่องโหว่ เพื่อทำการอัพเดท dependencies ที่ใช้ เพราะบางที่ไม่ยอมให้อัพบ่อย ๆ
- หรือกลับกัน บางที่นักพัฒนาเองทำงานไปเรื่อย ๆ ไม่เคยอัพเดท dependencies เลย
- ยกระดับมาตรฐานของโปรแกรมที่พัฒนา
- ออกคำเตือนสำหรับผู้ใช้โปรแกรมเวอร์ชั่นเก่า ๆ ให้ทำการอัพเดท

ส่วนใหญ่ถ้า CVE ออก มันจะมีการแก้ไขก่อนเปิดเผย หรือแก้ไขตามมาในไม่นาน และหลาย ๆ ครั้งการแก้บัคใน open-sources จะมี commit ให้ดูว่าแก้ตรงไหนไป ทำให้ hacker สามารถ reverse engineer ดูได้ง่ายว่าจะทำการโจมตีอย่างไร

## ป.ล.

- จะบอกก่อนว่าตัวที่ทำ static scan นั้น มีหลายตัวมาก แต่เจิม dev.to ด้วย OWASP Dependency-Check ก่อนแล้วกัน
- OWASP Dependency-Check ตรวจสอบโปรเจคอื่น ๆ นอกจาก iOS ได้ด้วยนะ เยอะเลยลองไปเล่นกันอยู่ได้
- dev.to ใช้ Markdown format ซึ่งผมชอบเป็นการส่วนตัวอยู่แล้ว แต่พอบทความเป็นภาษาไทยมันจะดูอ่านยากแปลก ๆ นะ 555