นักวิจัยจากจุดตรวจสอบ
เพื่อให้การโจมตีสำเร็จ จำเป็นต้องสามารถแก้ไขไฟล์ฐานข้อมูลของแอปพลิเคชันที่ถูกโจมตีได้ ซึ่งจะจำกัดวิธีการโจมตีแอปพลิเคชันที่ใช้ฐานข้อมูล SQLite เป็นรูปแบบสำหรับการขนส่งและป้อนข้อมูล วิธีการนี้ยังสามารถใช้เพื่อขยายการเข้าถึงในพื้นที่ที่มีอยู่ได้ เช่น เพื่อรวมประตูหลังที่ซ่อนอยู่ในแอปพลิเคชันที่ใช้ เช่นเดียวกับการหลีกเลี่ยงกลไกความปลอดภัยเมื่อวิเคราะห์มัลแวร์โดยนักวิจัยด้านความปลอดภัย การดำเนินการหลังจากการทดแทนไฟล์จะดำเนินการในขณะที่แอปพลิเคชันดำเนินการแบบสอบถาม SELECT แรกกับตารางในฐานข้อมูลที่แก้ไข
ตัวอย่างเช่น เราแสดงให้เห็นถึงความสามารถในการรันโค้ดใน iOS เมื่อเปิดสมุดที่อยู่ ไฟล์ที่มีฐานข้อมูล “AddressBook.sqlitedb” ได้รับการแก้ไขโดยใช้วิธีการที่เสนอ การโจมตีดังกล่าวใช้ช่องโหว่ในฟังก์ชัน fts3_tokenizer (CVE-2019-8602, ความสามารถในการอ้างอิงตัวชี้) ซึ่งแก้ไขแล้วในการอัพเดต SQLite 2.28 เดือนเมษายน พร้อมด้วยช่องโหว่อื่น
วิธีการโจมตีนั้นใช้เทคนิคสองอย่างคือ "Query Hijacking" และ "Query Oriented Programming" ซึ่งอนุญาตให้ใช้ประโยชน์จากปัญหาที่กำหนดเองซึ่งนำไปสู่ความเสียหายของหน่วยความจำในกลไก SQLite สาระสำคัญของ "Query Hijacking" คือการแทนที่เนื้อหาของฟิลด์ "sql" ในตารางบริการ sqlite_master ซึ่งกำหนดโครงสร้างของฐานข้อมูล ฟิลด์ที่ระบุประกอบด้วยบล็อก DDL (Data Definition Language) ที่ใช้เพื่ออธิบายโครงสร้างของอ็อบเจ็กต์ในฐานข้อมูล คำอธิบายถูกระบุโดยใช้ไวยากรณ์ SQL มาตรฐาน เช่น ใช้โครงสร้าง "สร้างตาราง"
ซึ่งดำเนินการระหว่างกระบวนการเริ่มต้นฐานข้อมูล (ระหว่างการเปิดตัวครั้งแรก
ฟังก์ชัน sqlite3LocateTable เพื่อสร้างโครงสร้างภายในที่เกี่ยวข้องกับตารางในหน่วยความจำ
แนวคิดก็คือ จากการแทนที่ "CREATE TABLE" ด้วย "CREATE VIEW" คุณจะสามารถควบคุมการเข้าถึงฐานข้อมูลได้โดยการกำหนดมุมมองของคุณเอง การใช้ "CREATE VIEW" การดำเนินการ "SELECT" จะถูกผูกไว้กับตาราง ซึ่งจะถูกเรียกแทน "CREATE TABLE" และช่วยให้คุณเข้าถึงส่วนต่างๆ ของล่าม SQLite ถัดไป วิธีการโจมตีที่ง่ายที่สุดคือการเรียกใช้ฟังก์ชัน "load_extension" ซึ่งช่วยให้คุณสามารถโหลดไลบรารี่ที่มีส่วนขยายได้ตามใจชอบ แต่ฟังก์ชันนี้จะถูกปิดใช้งานตามค่าเริ่มต้น
ในการโจมตีเมื่อเป็นไปได้ที่จะดำเนินการ "SELECT" จะมีการเสนอเทคนิค "Query Oriented Programming" ซึ่งทำให้สามารถใช้ประโยชน์จากปัญหาใน SQLite ที่นำไปสู่ความเสียหายของหน่วยความจำได้ เทคนิคนี้ชวนให้นึกถึงการเขียนโปรแกรมเชิงผลตอบแทน (
ที่มา: opennet.ru