การเขียนสคริปต์ข้ามแอป

หมวดหมู่ OWASP: MASVS-CODE: คุณภาพโค้ด

ภาพรวม

WebView เป็นคอมโพเนนต์เบราว์เซอร์ที่ฝังอยู่ในแอปพลิเคชัน Android ซึ่งช่วยให้แสดงเนื้อหาเว็บภายในแอปได้ โดยจะแสดงผล HTML, CSS และ JavaScript ภายในอินเทอร์เฟซผู้ใช้ของแอป

Cross-App Scripting เกี่ยวข้องกับการเรียกใช้โค้ดที่เป็นอันตรายในบริบทของแอปพลิเคชันเหยื่อโดยทั่วไป สำหรับเอกสารนี้ เราจะจำกัดขอบเขตเฉพาะการแทรกโค้ด JavaScript ที่เป็นอันตรายลงใน WebView ที่มีช่องโหว่

เมื่อแอปยอมรับ JavaScript ที่เป็นอันตรายลงใน WebView โดยไม่มีการตรวจสอบหรือล้างข้อมูลที่เพียงพอ แอปพลิเคชันนั้นจะมีช่องโหว่ต่อการถูกโจมตีแบบ Cross-App Scripting

ผลกระทบ

ช่องโหว่ Cross-App Scripting อาจถูกใช้ประโยชน์ได้เมื่อมีการส่งเนื้อหา JavaScript ที่ผู้โจมตีควบคุมไปยัง WebView ของแอปที่มีช่องโหว่โดยไม่มีการตรวจสอบหรือล้างข้อมูล ด้วยเหตุนี้ โค้ด JavaScript ที่ผู้โจมตีให้มาจึงถูกเรียกใช้ในบริบทของ WebView ของแอปพลิเคชันเหยื่อ จากนั้นโค้ด JavaScript ที่เป็นอันตรายจะใช้สิทธิ์เดียวกันกับแอปของเหยื่อ ซึ่งอาจนำไปสู่การขโมยข้อมูลผู้ใช้ที่ละเอียดอ่อนและการยึดบัญชี

การบรรเทาผลกระทบ

ปิดใช้ JavaScript

หากแอปพลิเคชันไม่จำเป็นต้องใช้ JavaScript การปิดใช้ JavaScript จะช่วยให้มั่นใจได้ว่า JavaScript จะไม่กลายเป็นภัยคุกคาม

Kotlin

// Get the WebView Object
val webView = findViewById<WebView>(R.id.webView)
val webSettings = webView.settings

// Disable JavaScript
webSettings.javaScriptEnabled = false

Java

// Get the WebView Object
WebView webView = (WebView) findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();

// Disable JavaScript for the WebView
webSettings.setJavaScriptEnabled(false);

หากแอปพลิเคชันจำเป็นต้องใช้ JavaScript ให้ตรวจสอบว่าคุณเป็นเจ้าของหรือควบคุม JavaScript ที่ส่งไปยัง WebView หลีกเลี่ยงการอนุญาตให้ WebView เรียกใช้ JavaScript ที่กำหนดเองได้ โปรดดูคำแนะนำในส่วนถัดไป

ตรวจสอบว่ามีการโหลดเฉพาะเนื้อหาที่คาดไว้ลงใน WebView

เมื่อใช้เมธอดต่างๆ เช่น shouldOverrideUrlLoading(), loadUrl() หรือ evaluateJavascript(), ให้ตรวจสอบว่า URL ที่ส่งไปยังเมธอดเหล่านั้นได้รับการ ตรวจสอบแล้ว ดังที่กล่าวไว้ก่อนหน้านี้ JavaScript ที่ส่งไปยัง WebView ควรมาจากโดเมนที่คาดไว้เท่านั้น ดังนั้นจึงควรตรวจสอบสิ่งที่กำลังโหลด

โปรดดูเอกสารประกอบเกี่ยวกับการตรวจสอบอินพุตของ OWASP เอกสาร และรายการตรวจสอบ ความปลอดภัย ของ Android สำหรับ WebView เพื่อดูคำแนะนำและตัวอย่างที่ดี

ตั้งค่าการเข้าถึงไฟล์ที่ปลอดภัยสำหรับ WebView

การตรวจสอบว่าไฟล์ไม่สามารถเข้าถึงได้จะช่วยป้องกันไม่ให้มีการเรียกใช้ JavaScript ที่กำหนดเองภายใน WebView โดยคุณควรพิจารณา WebSettings ต่อไปนี้เมื่อรักษาความปลอดภัยในการเข้าถึงไฟล์

  • ปิดใช้การเข้าถึงไฟล์ โดยค่าเริ่มต้น setAllowFileAccess จะตั้งค่าเป็น True ใน ระดับ API 29 ลงไป ซึ่งจะอนุญาตให้เข้าถึงไฟล์ในเครื่อง ในระดับ API 30 ขึ้นไป ค่าเริ่มต้นจะเป็น False หากต้องการตรวจสอบว่าไม่อนุญาตให้เข้าถึงไฟล์ ให้ตั้งค่า setAllowFileAccess เป็น False อย่างชัดเจน
  • ปิดใช้การเข้าถึงเนื้อหา การตั้งค่าเริ่มต้นของ setAllowContentAccess คือ True การเข้าถึง URL ของเนื้อหาช่วยให้ WebView โหลดเนื้อหาจากผู้ให้บริการเนื้อหาที่ติดตั้งในระบบได้ หากแอปไม่จำเป็นต้องเข้าถึงเนื้อหา ให้ตั้งค่า setAllowContentAccess เป็น False เพื่อป้องกันการใช้ในทางที่ผิดที่อาจเกิดขึ้นในกรณีที่มีการโจมตีแบบ Cross-App Scripting

  • kotlin kotlin webView.settings.javaScriptEnabled = false webView.settings.domStorageEnabled = true webView.settings.allowFileAccess = false webView.settings.allowContentAccess = false

  • java java webView.getSettings().setJavaScriptEnabled(false); webView.getSettings().setDomStorageEnabled(true); webView.getSettings().setAllowFileAccess(false); webView.getSettings().setAllowContentAccess(false);

เปิดใช้งาน Google Safe Browsing

เปิดใช้งาน Google Safe Browsing ใน AndroidManifest.xml เพื่อสแกน URL ที่ส่งไปยัง WebView หาโดเมนฟิชชิงหรือโดเมนที่เป็นอันตราย

<meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
   android:value="true" />

แหล่งข้อมูล